Cet article présente le code détaillé de Java pour convertir Geohash en coordonnées de latitude et de longitude correspondantes. Il est partagé avec vous pour votre référence. Le contenu spécifique est le suivant
package com.lulei.geo; import java.util.arraylist; import java.util.arrays; import java.util.hashmap; Importer java.util.list; import com.lulei.geo.bean.locationBean; import com.lulei.util.jsonutil; classe publique Geohash {emplacement privé de l'emplacement de l'emplacement; / ** * 1 2500 km; 2 630 km; 3 78 km; 4 30 km * 5 2,4 km; 6 610m; 7 76m; 8 19m * / private int hashlength = 8; // latitude et la longitude sont converties en longueur de geohash private int latlength = 20; // latitude et la longitude sont converties en longueur binaire privé int lngnglefther = 20; // latitude et la longitude sont converties en longueur binaire privée double minlat; // Taille de l'unité de chaque Double Minlng privé de latitude; // Taille de l'unité de chaque Latitude privée statique final char [] chars = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'B', 'C', ',', 'e', 'f', 'G', ',', ',', ',', 'M', 'M', «M» «s», «t», «u», «v», «w», «x», «y», «z»}; Hashmap statique privé <caractère, entier> charsmap; statique {charsmap = new hashmap <caractère, entier> (); for (int i = 0; i <chars.length; i ++) {charsmap.put (chars [i], i); }} public geoHash (double lat, double lng) {location = new locationBean (lat, lng); setMinlatlng (); } public int gethashLength () {return hashLength; } / ** * @Author: Lulei * @Description: Définissez l'unité minimale de latitude et de la longitude * / private void setMinlatlng () {minlat = locationbean.maxlat - locationbean.minlat; pour (int i = 0; i <latLength; i ++) {minlat / = 2.0; } minlng = locationbean.maxlng - locationbean.minlng; for (int i = 0; i <lngLength; i ++) {minlng / = 2.0; }} / ** * @return * @Author: Lulei * @description: trouvez les neuf points de coordonnées et points environnants * / Liste publique <string> getGeoHashBase32For9 () {double gauche = location.getlat () - minlat; Double RightLat = Location.GetLat () + Minlat; double uplng = location.getlng () - minlng; double downlng = location.getlng () + minlng; List <string> base32for9 = new ArrayList <string> (); // les trois chaînes à gauche de haut en bas de gauche = GetGeoHashBase32 (LeftLat, Uplng); if (! (dufUp == null || "" .equals (dufUp))) {base32for.Add (sauf); } String LeftMid = GetGeoHashBase32 (LeftLat, Location.getlng ()); if (! (LeftMid == null || "" .equals (LeftMID))) {Base32For9.Add (LeftMID); } String Leftdown = GetGeoHashBase32 (LeftLat, Downlng); if (! (La gauche == NULL || "" .Equals (gauche))) {Base32For9.Add (gauche); } // Les 3 chaînes de haut en bas au milieu du milieu = GetGeoHashBase32 (location.getlat (), uplng); if (! (midup == null || "" .equals (midup))) {base32for9.add (midup); } String midmid = getGeoHashBase32 (location.getlat (), location.getlng ()); if (! (midmid == null || "" .equals (midMid))) {base32for.Add (midmid); } String middown = getGeoHashBase32 (location.getlat (), downlng); if (! (middown == null || "" .equals (middown))) {base32for9.add (middown); } // 3 chaînes de haut en bas sur le côté droit droite = GetGeoHashBase32 (droite, uplng); if (! (justup == null || "" .equals (justup))) {base32for9.add (justup); } String RightMid = GetGeoHashBase32 (droite, emplacement.getlng ()); if (! (droitemid == null || "" .equals (droiteMID))) {base32for.Add (droiteMID); } String rightdown = getGeoHashBase32 (droitelat, downlng); if (! (droite == null || "" .equals (droite))) {base32for.Add (droite); } return Base32For9; } / ** * @param longueur * @return * @author: Lulei * @Description: définissez la latitude et la longitude sur la longueur de Geohash * / public booléen sethashlength (int longueur) {if (longueur <1) {return false; } HashLength = longueur; latLength = (longueur * 5) / 2; if (longueur% 2 == 0) {lnglength = latLength; } else {lnglong = latLength + 1; } setminlatlng (); Retour Vrai; } / ** * @return * @author: LULEI * @Description: Obtenez la chaîne de base32 de latitude et de longitude * / chaîne publique GetGeoHashBase32 () {return getGeoHashBase32 (emplacement.getlat (), location.getlng ()); } / ** * @param lat * @param lng * @return * @author: Lulei * @description: obtenez la chaîne de latitude et la chronditude privée de la base32 * / private getGeoHashBase32 (double lat, double lng); if (bools == null) {return null; } StringBuffer sb = new StringBuffer (); for (int i = 0; i <bools.length; i = i + 5) {boolean [] base32 = new boolean [5]; pour (int j = 0; j <5; j ++) {base32 [j] = bools [i + j]; } char cha = getBase32Char (base32); if ('' == cha) {return null; } sb.append (cha); } return sb.toString (); } / ** * @param base32 * @return * @author: Lulei * @description: convertir le binaire cinq bits à la base32 * / private char getBase32char (boolean [] base32) {if (base32 == null || base32.Length! = 5) {return ''; } int num = 0; for (boolean bool: base32) {num << = 1; if (bool) {num + = 1; }} Retour Chars [num% chars.length]; } / ** * @param i * @return * @author: LULEI * @Description: Convertez les numéros en chaîne binaire * / chaîne privée getBase32BinaryString (int i) {if (i <0 || i> 31) {return null; } String str = Integer.TobinaryString (i + 32); return str.substring (1); } / ** * @param geohash * @return * @Author: Lulei * @Description: Convert GeoHash en chaîne binaire * / chaîne privée getGeoHashbinaryString (String geoHash) {if (geohash == null || "" .equals (geohash)) {return null; } StringBuffer sb = new StringBuffer (); for (int i = 0; i <geohash.length (); i ++) {char c = geohash.charat (i); if (charsmap.containsKey (c)) {String cstr = getBase32BinaryString (charsmap.get (c)); if (cstr! = null) {sb.append (cstr); }}} return sb.toString (); } / ** * @param geohash * @return * @author: Lulei * @Description: renvoyez les coordonnées correspondant à Geohash * / public locationbean getLocation (String geohash) {String geohashbinarystr = getGeoHashBinaryString (GeoHash); if (geohashbinarystr == null) {return null; } StringBuffer lat = new StringBuffer (); StringBuffer lng = new StringBuffer (); for (int i = 0; i <geohashbinarystr.length (); i ++) {if (i% 2! = 0) {lat.append (geohashbinarystr.charat (i)); } else {lng.append (geohashbinarystr.charat (i)); }} double latvalue = getGeoHashmid (lat.toString (), locationbean.minlat, locationbean.maxlat); double lngValue = getGeoHashmid (lng.toString (), locationbean.minlng, locationbean.maxlng); LocationBean Location = New LocationBean (latvalue, lngValue); emplacement.setGeohash (geohash); Emplacement de retour; } / ** * @param binarystr * @param min * @param max * @return * @author: Lulei * @description: renvoie la valeur intermédiaire correspondant au binaire * / private double getGeoHashmid (String binarystr, double min, double max) {if (binarystr == null || binarystr.Length () <1) {return (min + max) / 2.0; } if (binarystr.charat (0) == '1') {return getGeoHashmid (binarystr.substring (1), (min + max) / 2.0, max); } else {return getGeoHashmid (binarystr.substring (1), min, (min + max) / 2.0); }} / ** * @param lat * @param lng * @return * @Author: Lulei * @Description: Obtenez la chaîne géo-binaire de coordonnées * / private booléen [] getGeobinary (double lat, double lng) {Boolean [] lAtArray = gethasharray (lat, stocyBean.Minlat, emplacementBean.maxlat, latrolter); Boolean [] lngArray = Gethasharray (lng, locationbean.minlng, locationbean.maxlng, lnglonghength); Retour Merge (LatArray, lngarray); } / ** * @param latarray * @param lngarray * @return * @author: Lulei * @description: fusion latitude et longitude binaire * / private booléen [] fusionner (booléen [] latarray, booléen [] lngarray) {if (latarray == null || lngarray == null) {retour null; } boolean [] result = new boolean [lngArray.length + latArray.length]; Arrays.filt (résultat, false); for (int i = 0; i <lngArray.length; i ++) {result [2 * i] = lngArray [i]; } pour (int i = 0; i <latArray.length; i ++) {result [2 * i + 1] = latArray [i]; } Retour Résultat; } / ** * @param valeur * @param min * @param max * @return * @author: Lulei * @Description: convertir les nombres en chaîne binaire GeoHash * / private booléen [] gethasharray (double valeur, double min, double max, int le long) {if (valeur <min || value> max) {return null; } if (longueur <1) {return null; } boolean [] result = new boolean [longueur]; pour (int i = 0; i <length; i ++) {double mid = (min + max) / 2.0; if (valeur> mid) {result [i] = true; min = mid; } else {result [i] = false; max = mid; }} Retour Résultat; } public static void main (String [] args) {// TODO Méthode générée automatique Stume Geohash G = new GeoHash (40.221227, 116.24875); String geoHash = g.getGeoHashBase32 (); System.out.println (GeoHash); LocationBean Bean = G.getLocation (GeoHash); System.out.println (jsonutil.parsejson (bean)); System.out.println (new GeoHash (bean.getlat (), bean.getlng ()). GetGeoHashBase32 ()); System.out.println (DistanceUtil.getDistance (bean.getlat (), bean.getlng (), bean.getlat (), bean.getlat () - g.minlat, bean.getlng () - g.minlng))); }}Ce qui précède est le contenu détaillé de cet article, j'espère que cela sera utile à l'apprentissage de chacun.