บทความนี้แนะนำรหัสรายละเอียดของ 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 2500km; 2 630km; 3 78km; 4 30km * 5 2.4km; 6 610M; 7 76m; 8 19M */ ส่วนตัว int hashlength = 8; // ละติจูดและลองจิจูดจะถูกแปลงเป็นความยาว geohash ความยาวส่วนตัว int latlength = 20; // ละติจูดและลองจิจูดจะถูกแปลงเป็นความยาวไบนารีส่วนตัว int lnglength = 20; // ละติจูดและลองจิจูดจะถูกแปลงเป็นความยาวไบนารีสองมินลาตส่วนตัว; // ขนาดหน่วยของแต่ละละติจูดส่วนตัวสอง minlng; // ขนาดหน่วยของละติจูดแต่ละตัวถ่านสุดท้ายของละติจูด [] chars = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'b', 'c', '' ',' ',' ',' 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'}; hashmap แบบคงที่ส่วนตัว <ตัวละคร, จำนวนเต็ม> Charsmap; คงที่ {charsmap = new hashmap <ตัวละคร, จำนวนเต็ม> (); สำหรับ (int i = 0; i <chars.length; i ++) {charsmap.put (chars [i], i); }} GeoHash สาธารณะ (Double Lat, Double LNG) {location = new LocationBean (lat, lng); setMinlatlng (); } public int gethashlength () {return hashlength; } / *** @author: lulei* @description: ตั้งค่าหน่วยขั้นต่ำของละติจูดและลองจิจูด* / โมฆะส่วนตัว setminlatlng () {minlat = locationbean.maxlat - locationbean.minlat; สำหรับ (int i = 0; i <latlength; i ++) {minlat /= 2.0; } minlng = locationbean.maxlng - locationbean.minlng; สำหรับ (int i = 0; i <lnglength; i ++) {minlng /= 2.0; }} / ** * @return * @author: lulei * @description: ค้นหาเก้าคะแนนพิกัดและคะแนนโดยรอบ * / รายการสาธารณะ <String> getGeoHashBase32For9 () {double leftlat = location.getLat () - minlat; double rightlat = location.getLat () + minlat; double uplng = location.getlng () - minlng; double downlng = location.getlng () + minlng; รายการ <String> base32For9 = arrayList ใหม่ <String> (); // สามสตริงที่ด้านซ้ายจากบนลงล่างซ้าย = getGeoHashBase32 (leftlat, Uplng); if (! (leftup == null || "" .equals (ซ้าย))) {base32for9.add (ซ้าย); } string leftmid = getGeoHashBase32 (ซ้าย, location.getLng ()); if (! (leftmid == null || "" .equals (liftmid))) {base32for9.add (ซ้าย); } string leftdown = getGeoHashBase32 (ซ้าย, downlng); if (! (leftdown == null || "" .equals (ซ้าย))) {base32for9.add (ซ้าย); } // 3 สตริงจากบนลงล่างใน midup กลาง = getGeoHashBase32 (location.getLat (), UPLNG); if (! (midup == null || "" .equals (midup))) {base32for9.add (midup); } สตริง midmid = getGeoHashBase32 (location.getLat (), location.getlng ()); if (! (midmid == null || "" .equals (midmid))) {base32for9.add (midmid); } สตริง middown = getGeoHashBase32 (location.getLat (), downlng); if (! (middown == null || "" .equals (middown))) {base32for9.add (middown); } // 3 สตริงจากบนลงล่างทางด้านขวาขวา = 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); } สตริงขวา = getGeoHashBase32 (Rightlat, downlng); if (! (ขวา == null || "" .Equals (ขวา))) {base32for9.add (ขวา); } return base32for9; } / ** * @param length * @return * @author: lulei * @description: ตั้งค่าละติจูดและลองจิจูดให้เป็นความยาว geohash * / public boolean sethashlength (ความยาว int) {ถ้า (ความยาว <1) {return false; } hashLength = ความยาว; Latlength = (ความยาว * 5) / 2; if (ความยาว % 2 == 0) {lnglength = latlength; } else {lnglength = latlength + 1; } setMinlatlng (); กลับมาจริง; } / ** * @return * @author: lulei * @description: รับ base32 สตริงของละติจูดและลองจิจูด * / สตริงสาธารณะ getgeOhashbase32 () {return getGeoHashBase32 (location.getLat (), location.getlng (); } / ** * @param lat * @param lng * @return * @author: lulei * @description: รับ base32 สตริงของละติจูดและลองจิจูด * / สตริงส่วนตัว getgeohashbase32 if (bools == null) {return null; } stringBuffer sb = new StringBuffer (); สำหรับ (int i = 0; i <bools.length; i = i + 5) {boolean [] base32 = บูลีนใหม่ [5]; สำหรับ (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: แปลงไบนารีห้าบิตเป็น base32 * / ถ่านส่วนตัว getbase32char (บูลีน [] base32) {ถ้า (base32 == null || base32.length! = 5) {return ''; } int num = 0; สำหรับ (บูลีนบูล: base32) {num << = 1; if (bool) {num += 1; }} return chars [num % chars.length]; } / ** * @param i * @return * @author: lulei * @description: แปลงหมายเลขเป็นสตริงไบนารี * / สตริงส่วนตัว getBase32BinaryString (int i) {ถ้า (i <0 || i> 31) {return null; } string str = integer.tobinaryString (i + 32); return str.substring (1); } / ** * @param geohash * @return * @author: lulei * @description: แปลง geohash เป็นสตริงไบนารี * / สตริงส่วนตัว getgeohashbinarystring (สตริง geohash) {ถ้า (geohash == null || " } stringBuffer sb = new StringBuffer (); สำหรับ (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); }}} ส่งคืน sb.toString (); } / ** * @param geohash * @return * @author: lulei * @description: กลับพิกัดที่สอดคล้องกับ geohash * / สถานที่สาธารณะ if (geohashbinarystr == null) {return null; } StringBuffer lat = new StringBuffer (); StringBuffer lng = new StringBuffer (); สำหรับ (int i = 0; i <geohashbinarystr.length (); i ++) {ถ้า (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: ส่งคืนค่าตัวกลางที่สอดคล้องกับไบนารี * / ส่วนตัว double getgeohashmid (binarystr, double min, double max) } if (binarystr.charat (0) == '1') {return getgeohashmid (binarystr.substring (1), (min + max) / 2.0, สูงสุด); } else {return getgeOhashmid (binarystr.substring (1), นาที, (ขั้นต่ำ + สูงสุด) / 2.0); }} / ** * @param lat * @param lng * @return * @author: lulei * @description: รับสตริงไบนารี geo ของพิกัด * / บูลีนส่วนตัว [] getGeobinary บูลีน [] lngarray = gethasharray (lng, locationbean.minlng, locationbean.maxlng, lnglength); Return Merge (Latarray, lngarray); } / ** * @param latarray * @param lngarray * @return * @author: lulei * @description: ผสานละติจูดและลองจิจูดไบนารี * / บูลีนส่วนตัว [] ผสาน (บูลีน [] Latarray, boolean [] lngarray) } บูลีน [] ผลลัพธ์ = บูลีนใหม่ [lngarray.length + latarray.length]; array.fill (ผลลัพธ์, เท็จ); สำหรับ (int i = 0; i <lngarray.length; i ++) {ผลลัพธ์ [2 * i] = lngarray [i]; } สำหรับ (int i = 0; i <latarray.length; i ++) {ผลลัพธ์ [2 * i+1] = latarray [i]; } ผลตอบแทนผลลัพธ์; } / ** * @param value * @param min * @param max * @return * @author: lulei * @description: แปลงหมายเลขเป็น geohash ไบนารีสตริง * / บูลีนส่วนตัว [] gethasharray } if (ความยาว <1) {return null; } บูลีน [] ผลลัพธ์ = บูลีนใหม่ [ความยาว]; สำหรับ (int i = 0; i <length; i ++) {double mid = (min+max) / 2.0; if (value> mid) {result [i] = true; ขั้นต่ำ = กลาง; } else {result [i] = false; สูงสุด = กลาง; }} ผลการส่งคืน; } โมฆะคงที่สาธารณะหลัก (สตริง [] args) {// วิธีการที่สร้างขึ้นอัตโนมัติ todo stub geohash g = ใหม่ geohash (40.221227, 116.24875); สตริง geohash = g.getgeohashbase32 (); System.out.println (Geohash); LocationBean Bean = G.GetLocation (GeoHash); System.out.println (jsonutil.parsejson (ถั่ว)); System.out.println (ใหม่ geohash (bean.getlat (), bean.getlng ()). getgeohashbase32 ()); System.out.println (ระยะทาง. getDistance (bean.getlat (), bean.getlng (), bean.getlat (), bean.getlat () - g.minlat, bean.getlng () - g.minlng)); }}ข้างต้นเป็นเนื้อหาโดยละเอียดของบทความนี้ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคน