In diesem Artikel wird der detaillierte Code von Java eingeführt, um Geohash in entsprechende Breiten- und Längengradkoordinaten umzuwandeln. Es wird Ihnen als Referenz mit Ihnen geteilt. Der spezifische Inhalt ist wie folgt
Paket com.lulei.geo; Import Java.util.ArrayList; Import Java.util.Arrays; import Java.util.hashMap; importieren java.util.list; import com.lulei.geo.bean.locationBean; import com.lulei.util.jsonutil; öffentliche Klasse Geohash {privater Ort für Standortbeams; /** * 1 2500 km; 2 630 km; 3 78 km; 4 30 km * 5 2,4 km; 6 610 m; 7 76m; 8 19m */ private int haslength = 8; // Breitengrad und Länge werden in die Geohash -Länge private int latlenlänge = 20 umgewandelt; // Breitengrad und Länge werden in eine binäre Länge privat intlength = 20 umgewandelt; // Breitengrad und Länge werden in eine binäre Länge privates Double Minlat umgewandelt; // Einheitsgröße jeder Breite private Doppel -Minlng; //Unit size of each latitude private static 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', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'}; Private statische Hashmap <Charakter, Integer> charsmap; static {charSmap = new HashMap <Zeichen, Integer> (); für (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: Stellen Sie die minimale Einheit von Breiten- und Längengrads ein* / private void setminlatlng () {minlat = locationBean.maxlat - locationBean.minlat; für (int i = 0; i <latlength; i ++) {minlat /= 2.0; } minlng = locationBean.maxlng - locationBean.minlng; für (int i = 0; i <lnGlength; i ++) {minlng /= 2.0; }} / ** * @return * @Author: lulei * @Description: Finden Sie die neun Koordinatenpunkte und umliegenden Punkte * / publiclist <string> getgeoHashBase32For9 () {double links = lactlat.getlat () - minlat; double rightlat = location.getLat () + minlat; double uplng = location.getLng () - minlng; double downlng = location.getLng () + minlng; List <String> Base32FOR9 = New ArrayList <String> (); // die drei Zeichenfolgen links von oben nach unten links = Getgeohashbase32 (links, uplng); if (! (rutsUp == null || "" .Equals (links)) {Base32For9.Add (links); } String linkMid = getGeOhashBase32 (links, location.getLng ()); if (! (linkMid == null || "" .Equals (linkMid)) {Base32For9.Add (linkMid); } String linksdown = getgeoHashBase32 (links, Downlng); if (! (linksdown == null || "" .Equals (links)) {Base32For9.Add (links); } // Die 3 Zeichenfolgen von oben nach unten in der Mitte Midup = GetGeOhashBase32 (location.getLat (), uplng); if (! (MidUp == null || "" .Equals (Midup)) {Base32For9.Add (MidUp); } String midmid = getgeohashbase32 (location.getLat (), location.getLng ()); if (! (Midmid == null || "" .Equals (MidMid)) {Base32For9.Add (MidMid); } String Middown = getGeOHashBase32 (location.getLat (), Downlng); if (! (Middown == null || "" .Equals (Middown)) {Base32For9.Add (Middown); } // 3 Zeichenfolgen von oben nach unten auf der rechten Seite rechtzeitig if (! (rightup == null || "" .Equals (rightup)) {Base32For9.Add (rightup); } String rightmid = getGeOhashBase32 (rechter, location.getLng ()); if (! (rightmid == null || "" .Equals (rightmid)) {Base32For9.Add (rightMid); } String rechts = getGeOhashBase32 (rechter, downlng); if (! (rechtsdown == null || "" .Equals (rechts)) {Base32For9.Add (rechts); } return base32For9; } / ** * @param Länge * @return * @Author: lulei * @Description: Setzen Sie den Breitengrad und Längengrad auf GeoHash Länge * / public boolean sethashlength (int länge) {if (Länge <1) {return false; } Hashlength = Länge; latlenlänge = (Länge * 5) / 2; if (Länge % 2 == 0) {lnGlength = latlength; } else {lnGlength = latlength + 1; } setminlatlng (); zurückkehren; } / ** * @return * @Author: lulei * @Description: Holen Sie sich die Base32 -String von Breiten- und Längengrad * / public String getGeHashBase32 () {return getgeoHashBase32 (location.getLat (), location.getLng ()); } / ** * @param lat * @param lng * @return * @author: lulei * @Description: Holen Sie sich die Base32 -String von Breitengrad und Länge * / private String getGeOhashBase32 (double lat, double lng) {boolean [] bools = getgeObinary (lat, lngen); if (bools == null) {return null; } StringBuffer sb = new StringBuffer (); für (int i = 0; i <bools.length; i = i + 5) {boolean [] Base32 = neuer boolean [5]; für (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: Fünf-Bit-Binärdehnung in Base32 * / private char getBase32CHAR (boolean [] Base32) {if (Base32 == null || Base32.Length! = 5) {return ''; } int num = 0; für (boolean bool: base32) {num << = 1; if (bool) {num += 1; }} return chars [num % chars.length]; } / ** * @param i * @return * @Author: lulei * @Description: Zahlen in Binary String * / private String 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: GeoHash in binäre String konvertieren } StringBuffer sb = new StringBuffer (); für (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: Geben Sie die Koordinaten zurück, die Geohash * / public locationSe -GetLocation (String Geohash) {String GeoHashBinarystr = getgeoHashBinaryString (GeoHash); if (GeohashBinarystr == null) {return null; } StringBuffer lat = new StringBuffer (); StringBuffer lng = new StringBuffer (); für (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); Standortstandort = neuer Standortbean (Latvalue, lngValue); location.setGeohash (Geohash); Rückkehrort; } / ** * @param binarystr * @param min * @param max * @return * @Author: lulei * @Description: RECHTEN SIE DEN VERMETIATIONSWERTEN, der dem binären Binary * / privat doppelt gotgeohashmid (String binarystr, doppelter min, doppelt max) {if (Binary == NULL || || || || || || || || || || || || || || || || || || || || || || || || || || || ||) zurückgegeben wird, (). } 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: Holen Sie sich die geo -binäre String von Koordinaten. boolean [] lngarray = gethasharray (lng, locationBean.minlng, location.maxlng, lnglength); Return Merge (Latarray, Lngarray); } / ** * @param latarray * @param lngarray * @return * @Author: lulei * @Description: Merge Latitude and Longitude Binary * / privat boolean [] merge (boolean [] latarray, boolean [] lngarray) {if (latarray == null || } boolean [] result = new boolean [lngarray.length + latarray.length]; Arrays.fill (Ergebnis, falsch); für (int i = 0; i <lngarray.length; i ++) {result [2 * i] = lngArray [i]; } für (int i = 0; i <latarray.length; i ++) {result [2 * i+1] = latarray [i]; } Rückgabeergebnis; } / ** * @param value * @param min * @param max * @return * @Author: lulei * @Description: Umwandeln Sie Zahlen in GeoHash -Binärstritten * / private boolean [] Gethasharray (Doppelwert, Double min, Double Max, intlänge) {if (value <max | } if (Länge <1) {return null; } boolean [] result = new Boolean [Länge]; für (int i = 0; i <länge; i ++) {double Mid = (min+max) / 2.0; if (value> mid) {result [i] = true; min = mid; } else {result [i] = false; max = mid; }} Rückgabeergebnis; } public static void main (String [] args) {// Todo automatisch generierte Methode Stub 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 ()). GetGgeohashbase32 ()); System.out.println (distanceutil.getDistance (bean.getlat (), bean.getlng (), bean.getlat (), bean.getlat () - g. minlat, bean.getlng () - g.Minlng)); }}Das obige ist der detaillierte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein.