В этой статье представлен подробный код Java для преобразования Geohash в соответствующие координаты широты и долготы. Это совместно с вами для вашей ссылки. Конкретный контент заключается в следующем
пакет com.lulei.geo; импортировать java.util.arraylist; импортировать java.util.arrays; импортировать java.util.hashmap; импортировать java.util.list; Импорт com.lulei.geo.bean.locationbean; импорт com.lulei.util.jsonutil; открытый класс Geohash {частное местоположение местоположение; /** * 1 2500 км; 2 630 км; 3 78 км; 4 30 км * 5 2,4 км; 6 610 м; 7 76 м; 8 19m */ private int hashlength = 8; // широта и долгота преобразуются в длину Geohash Private int latlength = 20; // широта и долгота преобразуются в двоичную длину // широта и долгота преобразуются в двоичную длину частную двойную двойную минлат; // размер единицы каждого частного двойного двойного манипуляции; //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'}; Частный статический Hashmap <персонаж, целое число> charsmap; static {charsmap = new Hashmap <символ, Integer> (); for (int i = 0; i <chars.length; i ++) {charsmap.put (chars [i], i); }} public geohash (double lat, двойной lng) {location = new locationbean (lat, lng); setminlatlng (); } public int gethashlength () {return hashlength; } / *** @author: lulei* @description: установить минимальную единицу широты и долготы* / private void setminlatlng () {minlat = locationbean.maxlat - locationbean.minlat; for (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: Найдите девять точек координат и окружающих точек * / public <string> getgeohashbase32for9 () {Double Leathlat = location.getLat () - minlat; double rightlat = location.getlat () + minlat; Double uplng = location.getlng () - minlng; double downlng = location.getlng () + minlng; Список <string> base32for9 = new ArrayList <string> (); // три строки слева от сверху вниз Leftup = getGeOhashbase32 (Leathlat, Uplng); if (! (Leftup == null || ". } String leftmid = getGeOhashbase32 (левш, location.getlng ()); if (! (LeftMid == null || "" .equals (левый))) {base32for9.add (левый); } String deflown = getGeOhashbase32 (левша, Downlng); if (! (Унижение == null || ". } // 3 строки сверху донизу в среднем среднем = getGeOhashbase32 (location.getlat (), uplng); if (! (midup == null || ". } String mid Mid = getGeOhashbase32 (location.getLat (), location.getlng ()); if (! (Mid Mid == null || "" .equals (Mid Mid))) {base32for9.add (Mid Mid); } String middown = getGeOhashbase32 (location.getLat (), downlng); if (! (middown == null || "" .equals (middown))) {base32for9.add (middown); } // 3 строки сверху вниз с правой стороны вправо = getGeOhashbase32 (rightlat, uplng); if (! (Rightup == null || "" .equals (raightUp))) {base32for9.add (rugeUp); } String rightmid = getGeOhashbase32 (rightlat, location.getlng ()); if (! (rightmid == null || ". } String rightdown = getGeOhashbase32 (rightlat, downlng); if (! (rightdown == null || ". } return base32for9; } / ** * @param length * @return * @author: lulei * @description: установить широту и долготу на длину Geohash * / public boolean sethashlength (int length) {if (длина <1) {return false; } hashlength = длина; latlength = (длина * 5) / 2; if (длина % 2 == 0) {lnglength = latlength; } else {lnglength = latlength + 1; } setMinlatlng (); вернуть истину; } / ** * @return * @author: lulei * @description: получить строку базы32 широты и долготы * / public String getgeohashbase32 () {return getgeohashbase32 (location.getlat (), location.getlng ()); } / ** * @param lat * @param lng * @return * @author: lulei * @description: получить строку базы32 широты и долготы * / private string getgeohashbase32 (double lat, двойной lng) {boolean [] bools = getgeobasian (lat, 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]; for (int j = 0; j <5; j ++) {base32 [j] = bools [i+j]; } char cha = getBase32Chr (base32); if ('' == cha) {return null; } sb.append (cha); } вернуть sb.toString (); } / ** * @param base32 * @return * @author: lulei * @description: преобразовать пятибитный двоичный в Base32 * / private char getbase32ch (boolean [] base32) {if (base32 == null || base32.length! = 5) {return ''; } int num = 0; for (boolean bool: base32) {num << = 1; if (bool) {num += 1; }} return chars [num % chars.length]; } / ** * @param i * @return * @author: lulei * @description: конвертировать номера в двоичную строку * / private string getBase32binaryString (int i) {if (i <0 || i> 31) {return null; } String str = integer.tobinaryString (i + 32); вернуть str.substring (1); } / ** * @param geohash * @return * @author: lulei * @description: преобразовать Geohash в двоичную строку * / private string 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: вернуть координаты, соответствующие 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); Расположение местоположения = новое местоположение (Latvalue, Lngvalue); location.setgeohash (Geohash); место возвращения; } / ** * @param binarystr * @param min * @param max * @return * @author: lulei * @description: вернуть промежуточное значение, соответствующее двоичному * / private double getgeohashmid (string binarystr, двойной мин, двойной максимум) {if (binarystr == null || binarystr.length () <1) {min +; } 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: получить геоирную строку координат * / private boolean [] getgeobinary (double lat, двойной lng) {boolean [] latarray = gethasharray (latebean.minlat, location.max. Boolean [] lngarray = gethasharray (lng, locationbean.minlng, locationbean.maxlng, lnglength); возврат слияния (Latarray, Lngarray); } / ** * @param latarray * @param lngarray * @return * @author: lulei * @description: Merge Latitude and Longitude Binary * / Private Boolean [] Merge (Boolean [] latarray, boolean [] lngarray) {if (latarray = null || lngarray == null) {null) } boolean [] result = new Boolean [lngarray.length + latarray.length]; Arrays.fill (результат, false); for (int i = 0; i <lngarray.length; i ++) {result [2 * i] = lngarray [i]; } for (int i = 0; i <latarray.length; i ++) {result [2 * i+1] = latarray [i]; } return Result; } / ** * @param value * @param min * @param max * @return * @author: lulei * @description: преобразовать числа в бинарную строку Geohash * / private boolean [] gethasharray (двойное значение, двойное мин, двойное максимум, int length) {if (value <min || value> max) {return null; } if (длина <1) {return null; } boolean [] result = new Boolean [длина]; for (int i = 0; i <length; i ++) {double mid = (min+max) / 2,0; if (value> mid) {result [i] = true; мин = средняя; } else {result [i] = false; max = mid; }} return result; } public static void main (string [] args) {// todo Автопогенерированный метод 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 ()). Getgeohashbase32 ()); System.out.println (Divandutil.getDistance (bean.getlat (), bean.getlng (), bean.getlat (), bean.getlat () - g.minlat, bean.getlng () - g.minlng)); }}Приведенное выше подробное содержание этой статьи, я надеюсь, что это будет полезно для каждого обучения.