Artikel ini memperkenalkan kode terperinci Java untuk mengubah GeoHash menjadi koordinat lintang dan bujur yang sesuai. Ini dibagikan kepada Anda untuk referensi Anda. Konten spesifiknya adalah sebagai berikut
paket com.lulei.geo; impor java.util.arraylist; impor java.util.arrays; impor java.util.hashmap; impor java.util.list; impor com.lulei.geo.bean.locationbean; impor com.lulei.util.jsonutil; Kelas Publik GeoHash {Lokasi PrivateBean Private; /** * 1 2500km; 2 630 km; 3 78km; 4 30 km * 5 2.4 km; 6 610m; 7 76m; 8 19m */ private int hashlength = 8; // Latitude dan bujur dikonversi menjadi panjang geohash pribadi int latlength = 20; // Latitude dan bujur dikonversi menjadi panjang biner private int lnglength = 20; // Latitude dan bujur dikonversi menjadi minlat ganda privat panjang biner; // Ukuran satuan dari setiap lintang swasta ganda minlng; // Ukuran satuan dari setiap lintang privat statis final char [] chars = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'B', 'C', 'D', 'E', 'f', 'G', 'H', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', " 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'}; hashmap statis pribadi <karakter, integer> charsmap; static {charsmap = hashmap baru <karakter, integer> (); untuk (int i = 0; i <chars.length; i ++) {charsmap.put (chars [i], i); }} public geohash (lat ganda, lng ganda) {location = new locationbean (lat, lng); setminlatlng (); } public int getHashLength () {return hashlength; } / *** @Author: lulei* @description: Setel unit minimum lintang dan bujur* / private void setminlatlng () {minlat = locationbean.maxlat - locationbean.minlat; untuk (int i = 0; i <latlength; i ++) {minlat /= 2.0; } minlng = locationbean.maxlng - locationbean.minlng; untuk (int i = 0; i <lnglength; i ++) {minlng /= 2.0; }} / ** * @return * @author: lulei * @description: Temukan sembilan titik koordinat dan titik sekitarnya * / Daftar publik <string> getGeoHashBase32for9 () {ganda leftlat = location.getlat () - minlat; double rightlat = location.getlat () + minlat; double uplng = location.getlng () - minlng; double downlng = location.getlng () + minlng; Daftar <String> base32for9 = ArrayList baru <string> (); // Tiga string di sebelah kiri dari atas ke kiri bawah = getGeohashbase32 (leftlat, uPlng); if (! (leftup == null || "" .Equals (leftup))) {base32for9.add (leftup); } String leftmid = getGeoHashBase32 (leftlat, location.getlng ()); if (! (leftmid == null || "" .Equals (leftmid))) {base32for9.add (leftmid); } String leftdown = getGeohashBase32 (leftlat, downlng); if (! (LeftDown == null || "" .Equals (leftdown))) {base32for9.add (kiri); } // 3 string dari atas ke bawah di midup tengah = 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 string dari atas ke bawah di sisi kanan RightUp = getGeohashBase32 (rightlat, uPlng); if (! (rightup == null || "" .Equals (rightUp))) {base32for9.add (rightUp); } String rightMid = getGeoHashBase32 (rightlat, location.getlng ()); if (! (rightMid == null || "" .Equals (rightMid))) {base32for9.add (rightMid); } String rightDown = getGeoHashBase32 (rightlat, downlng); if (! (rightDown == null || "" .Equals (rightDown))) {base32for9.add (rightDown); } return base32for9; } / ** * @param panjang * @return * @author: lulei * @description: atur lintang dan bujur ke geohash panjang * / public boolean setHashlength (int int) {if (panjang <1) {return false; } hashlength = panjang; latlength = (panjang * 5) / 2; if (panjang % 2 == 0) {lnglength = latlength; } else {lnglength = latlength + 1; } setminlatlng (); Kembali Benar; } / ** * @return * @author: lulei * @description: Dapatkan string base32 dari lintang dan bujur * / string publik getGeohashBase32 () {return getGeoHashBase32 (location.getlat (), location.getlng ()); } / ** * @param lat * @param lng * @return * @author: lulei * @description: Dapatkan string base32 latitude dan bujur * / string privat getGeohashbase32 (lat ganda, lng ganda) {boolean [] bools = getGeobinary (lat, lng); if (bools == null) {return null; } StringBuffer SB = StringBuffer baru (); untuk (int i = 0; i <bools.length; i = i + 5) {boolean [] base32 = boolean baru [5]; untuk (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: Konversi biner lima-bit ke base32 * / private char getBase32char (boolean [] base32) {if (base32 == null || base32.length! = 5) {return ''; } int num = 0; untuk (boolean bool: base32) {num << = 1; if (bool) {num += 1; }} return chars [num % chars.length]; } / ** * @param i * @return * @author: lulei * @description: Konversi nomor ke string biner * / string privat 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: Konversi geohash ke string biner * / string privat getGeohashBinaryString (string geohash) {if (geohash == null || ". } StringBuffer SB = StringBuffer baru (); untuk (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: kembalikan koordinat yang sesuai dengan geohash * / lokasi umum getlocation (string geohash) {string geohashbinerstr = getgeohashbinerstring (geohash); if (geohashbinarystr == null) {return null; } StringBuffer lat = stringBuffer baru (); StringBuffer lng = stringBuffer baru (); untuk (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); Lokasi Lokasi = Lokasi Baru (LatValue, LngValue); location.setgeohash (Geohash); lokasi pengembalian; } / ** * @param BinerStr * @param min * @param max * @return * @author: lulei * @description: return nilai menengah yang sesuai dengan biner * / private getgeohashmid (string binerstr, double min, double max) {if (binerystr == null | | binerstr.linystry () () {if (BinerSstr == null || Binarystr.linenge. } if (binerstr.charat (0) == '1') {return getGeohashMid (BinerStr.substring (1), (min + max) / 2.0, max); } else {return getGeohashMid (BinerStr.substring (1), min, (min + max) / 2.0); }} / ** * @param lat * @param lng * @return * @author: lulei * @description: Dapatkan geo biner string koordinat * / private boolean [] getgeobinary (lat ganda, lng double) {boolean [] lataray = gethasharray (latlata. boolean [] lngarray = gethasharray (lng, locationbean.minlng, locationbean.maxlng, lnglength); return gabungan (latasray, lngarray); } / ** * @param latarray * @param lngarray * @return * @author: lulei * @description: gabungkan latitude dan longitude biner * / private boolean [] gabungan (boolean [] lataray, boolean [] lngarray) {if (latasray == null || } boolean [] hasil = boolean baru [lngarray.length + latasray.length]; Arrays.fill (hasil, salah); untuk (int i = 0; i <lngarray.length; i ++) {hasil [2 * i] = lngarray [i]; } untuk (int i = 0; i <latarray.length; i ++) {result [2 * i+1] = latarray [i]; } hasil pengembalian; } / ** * @param nilai * @param min * @param max * @return * @author: lulei * @description: Konversi angka menjadi geohash biner string * / private boolean [] gethasharray (nilai ganda, min double, double max, int length) {if (value <min || value> max) {return null; } if (panjang <1) {return null; } boolean [] hasil = boolean baru [panjang]; untuk (int i = 0; i <panjang; i ++) {double mid = (min+max) / 2.0; if (value> mid) {result [i] = true; min = mid; } else {hasil [i] = false; max = mid; }} hasil pengembalian; } public static void main (string [] args) {// TODO Metode yang dihasilkan otomatis Stub geohash g = baru 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 (geohash baru (bean.getlat (), bean.getlng ()). GetGeohashbase32 ()); System.out.println (Distarutil.getDistance (bean.getlat (), bean.getlng (), bean.getlat (), bean.getlat () - g.minlat, bean.getlng () - g.minlng)); }}Di atas adalah konten terperinci dari artikel ini, saya harap ini akan membantu untuk pembelajaran semua orang.