Este artículo presenta el código detallado de Java para convertir Geohash en coordenadas de latitud y longitud correspondientes. Se comparte con usted para su referencia. El contenido específico es el siguiente
paquete com.lulei.geo; import java.util.arrayList; importar java.util.arrays; import java.util.hashmap; import java.util.list; import com.lulei.geo.bean.locationbean; import com.lulei.util.jsonutil; clase pública Geohash {ubicación privada ubicación de BeBean; /** * 1 2500km; 2 630km; 3 78km; 4 30km * 5 2.4km; 6 610m; 7 76m; 8 19m */ private int hashlength = 8; // Latitud y longitud se convierten en longitud de geohash private int latlength = 20; // Latitud y longitud se convierten en longitud binaria privada int lnglength = 20; // Latitud y longitud se convierten en longitud binaria Minlat privado privado; // tamaño de unidad de cada minlng doble privado de latitud; // tamaño de la unidad de cada latitud static final final char [] chars = {'0', '1' ',' 2 ',' 3 ',' 4 ',' 5 ',' 6 ',' 7 ',' 8 ',' 9 ',' b ',' c ',' d ',' e ',' f ',' g ',' h ',' j ',' k ',' m ',' n ',' p ',', ',', ',', ',', ',', ',', ',', ',', ',' P ',' P ',' P ',', ',', ',', ',', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'}; Hashmap estático privado <carácter, entero> charsmap; static {charsMap = new HashMap <caracteres, integer> (); for (int i = 0; i <chars.length; i ++) {charsmap.put (chars [i], i); }} public geohash (doble lat, doble lng) {ubicación = nueva ubicaciónBean (lat, lng); setminlatlng (); } public int gethashLength () {return HashLength; } / *** @author: lulei* @description: establezca la unidad mínima de latitud y longitud* / private void setMinlatlng () {minlat = ubicación.maxlat - ubicación.minlat; para (int i = 0; i <latlength; i ++) {minlat /= 2.0; } minlng = ubicaciónbean.maxlng - ubicaciónbean.minlng; for (int i = 0; i <lnglength; i ++) {minlng /= 2.0; }} / ** * @return * @author: lulei * @Description: Encuentre los nueve puntos de coordenadas y los puntos circundantes * / public List <String> getGeoHashBase32for9 () {double LeftLat = Ubuse.getLat () - Minlat; double rightlat = ubicación.getLat () + minlat; doble uplng = ubicación.getlng () - minlng; doble downlng = ubicación.getlng () + minlng; Lista <String> base32FOR9 = new ArrayList <String> (); // Las tres cadenas a la izquierda de arriba a abajo izquierda = getGeoHashBase32 (LeftLat, Uplng); if (! (izquierda == null || "" .equals (izquierda))) {base32FOR9.Add (izquierda); } String LeftMid = getGeoHashBase32 (LeftLat, ubicación.getLng ()); if (! (LeftMid == NULL || "" .equals (LeftMid))) {Base32For9.Add (LeftMid); } String Leftdown = getGeoHashBase32 (LeftLat, Downlng); if (! (Leftdown == null || "" .equals (izquierda))) {base32FOR9.Add (Leftdown); } // Las 3 cadenas de arriba a abajo en el medio midup = getGeoHashBase32 (ubicación.getLat (), uplng); if (! (midUp == null || "" .equals (midUp))) {base32for9.Add (midUp); } String midmid = getGeoHashBase32 (ubicación.getLat (), ubicación.getLng ()); if (! (midmid == null || "" .equals (midmid))) {base32for9.add (midmid); } String Minddown = getGeoHashBase32 (ubicación.getLat (), downlng); if (! (mediado == null || "" .equals (mediado en la mitad)) {base32for9.Add (mediano down); } // 3 cadenas de arriba a abajo en el lado derecho derecho = getGeoHashBase32 (rightlat, uplng); if (! (rightUp == null || "" .equals (rightUp))) {base32for9.Add (rightUp); } String RightMid = getGeoHashBase32 (rightlat, ubicación.getlng ()); if (! (rightMid == null || "" .equals (rightmid))) {base32for9.add (rightmid); } String Rightdown = getGeoHashBase32 (rightlat, downlng); if (! (right down == null || "" .equals (right down)) {base32for9.Add (right down); } Base de retorno32for9; } / ** * @param longitud * @return * @author: lulei * @Description: Establezca la latitud y la longitud en la longitud de Geohash * / public boolean sethashLength (int longitud) {if (longitud <1) {return false; } hashlength = longitud; latlength = (longitud * 5) / 2; if (longitud % 2 == 0) {lnglength = latlength; } else {lnglength = latlength + 1; } setMinlatlng (); devolver verdadero; } / ** * @return * @author: lulei * @description: obtenga la cadena base32 de latitud y longitud * / public string getGeoHashBase32 () {return getGeoHashBase32 (ubicación.getLat (), ubicación.getlng ()); } / ** * @param lat * @param lng * @return * @author: lulei * @description: obtenga la cadena base32 de latitud y longitud * / cadena privada getGeoHashBase32 (doble lat, doble lng) {boolean [] bools = getGeobinary (lat, lng); if (bools == null) {return null; } StringBuffer sb = new StringBuffer (); para (int i = 0; i <bools.length; i = i + 5) {boolean [] base32 = nuevo booleano [5]; para (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: convierte binario de cinco bits a base32 * / private char getbase32char (boolean [] base32) {if (base32 == null || base32.length! = 5) {return '; } int num = 0; para (boolean bool: base32) {num << = 1; if (bool) {num += 1; }} devuelve chars [num % chars longitud]; } / ** * @param i * @return * @author: lulei * @Description: Convertir números en cadena binaria * / private String getBase32BinaryString (int i) {if (i <0 || i> 31) {return null; } String str = Integer.TobinaryString (i + 32); devolver str.substring (1); } / ** * @param geohash * @return * @author: lulei * @Description: convertir geohash a cadena binaria * / cadena privada 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: devuelve las coordenadas correspondientes a geohash * / public ubicación getLocation (string geohash) {string geohashBinarystr = getGeohashBinary (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)); }} doble latvalue = getGeoHashmid (lat.ToString (), ubicaciónBean.Minlat, ubicaciónBean.maxlat); Double lngValue = getGeoHashmid (lng.ToString (), ubicaciónbean.minlng, ubicaciónbean.maxlng); UbicationBean ubicación = nueva ubicaciónBean (latvalue, lngValue); Ubication.SetGeohash (Geohash); Ubicación de regreso; } /** * @param binaryStr * @param min * @param max * @return * @Author:lulei * @Description: Return the intermediate value corresponding to the binary*/ 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: obtenga la cadena binaria geo boolean [] lngarray = gethasharray (lng, ubicaciónbean.minlng, ubicaciónbean.maxlng, lnglength); Regreso de fusión (Latray, Lngarray); } / ** * @param latArray * @param lngarray * @return * @author: lulei * @Description: fusionar latitud y longitud binary * / private boolean [] merge (boolean [] latArray, boolean [] lnGarray) {si (Lattary == null | } boolean [] resultado = new Boolean [lnGarray.length + latArray.length]; Arrays.fill (resultado, falso); para (int i = 0; i <lngarray.length; i ++) {resultado [2 * i] = lnGarray [i]; } para (int i = 0; i <LatRAray.length; i ++) {resultado [2 * i+1] = LatRAY [i]; } resultado de retorno; } / ** * @param value * @param min * @param max * @return * @author: lulei * @Description: Convertir números en geohash binary string * / private boolean [] gethasharray (valor doble, doble min, doble max, int long) {if (valor <min || valor> max) {return null; } if (longitud <1) {return null; } boolean [] resultado = new Boolean [longitud]; for (int i = 0; i <longitud; i ++) {double mid = (min+max) / 2.0; if (valor> mid) {resultado [i] = true; min = medio; } else {resultado [i] = false; max = Mid; }} Resultado de retorno; } public static void main (String [] args) {// TODO Método generado por auto Geohash g = nuevo Geohash (40.221227, 116.24875); Cadena geohash = g.getGeoHashBase32 (); System.out.println (Geohash); UbicationBean Bean = G.GetLocation (Geohash); System.out.println (jsonutil.parsejson (bean)); System.out.println (nuevo Geohash (bean.getlat (), bean.getlng ()). GetGeoHashBase32 ()); System.out.println (DistanceUtL.GetDistance (bean.getlat (), bean.getlng (), bean.getlat (), bean.getlat () - g.minlat, bean.getlng () - g.minlng)); }}Lo anterior es el contenido detallado de este artículo, espero que sea útil para el aprendizaje de todos.