تقدم هذه المقالة الكود التفصيلي لـ 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 {private locationbean موقع ؛ /** * 1 2500km ؛ 2 630km ؛ 3 78km ؛ 4 30km * 5 2.4km ؛ 6 610 م ؛ 7 76 م ؛ 8 19m */ private int henglength = 8 ؛ // يتم تحويل خطوط الطول والعرض إلى Geohash طول private intlength = 20 ؛ // يتم تحويل خطوط الطول والطول إلى طول ثنائي int lnglength = 20 ؛ // يتم تحويل خطوط الطول والطول إلى مينلات مزدوجة ذات طول ثنائي ؛ // حجم وحدة كل خطوط عرضية مزدوجة minlng ؛ . 's' ، 't' ، 'u' ، 'v' ، 'w' ، 'x' ، 'y' ، 'z'} ؛ hashmap الثابت الخاص <الحرف ، integer> charsmap ؛ ثابت {charsmap = new hashmap <الحرف ، integer> () ؛ لـ (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: قم بتعيين الحد الأدنى من Latitude and longitude* / private void 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 ؛ قائمة <Tring> base32for9 = new ArrayList <String> () ؛ . if (! (LAFTUP == NULL || "" .equals (Leftup))) {base32for9 } 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 } // السلاسل الثلاثة من الأعلى إلى الأسفل في منتصف منتصف = getGeoHashBase32 (location.getlat () ، uplng) ؛ if (! (midup == null || "" .equals (midup))) {base32for9 } 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 } // 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) ؛ } string levelddown = getGeoHashBase32 (rightlat ، downlng) ؛ if (! (levelddown == null || "" .equals (rightdown))) {base32for9 } return base32for9 ؛ } / ** * @param length * return * author: lulei * description: اضبط خط العرض والطول على طول geohash * / sethashlength public (طول int) {if (length <1) {return false ؛ } henglength = الطول ؛ latlength = (الطول * 5) / 2 ؛ if (length ٪ 2 == 0) {lnglength = latlength ؛ } آخر {lnglength = latlength + 1 ؛ } setMinLatlng () ؛ العودة صحيح. } / ** * return * author: lulei * description: احصل على سلسلة Base32 من خط العرض والطول * / السلسلة العامة getGeohashBase32 () {return getGeoHashBase32 (location.getlat () ، location.getlng ()) ؛ } / ** * param lat * param lng * return * @author: lulei * description: احصل على سلسلة من خطوط الطول والعرض * / سلسلة خاصة getGeoHashBase32 (double lat ، double lng) {boolean [] bools = getGeobinary (lng) ؛ if (bools == null) {return null ؛ } StringBuffer SB = new StringBuffer () ؛ لـ (int i = 0 ؛ i <bools.length ؛ i = i + 5) {boolean [] base32 = new boolean [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: تحويل binary بخمسة بت إلى base32 * / private char getBase32Char (boolean [] base32) {if (base32 == null || base32.length! = 5) {return '' ؛ } int num = 0 ؛ لـ (Boolean Bool: base32) {num << = 1 ؛ if (bool) {num += 1 ؛ }} chars الإرجاع [num ٪ chars.length] ؛ } / ** * param i * return * author: lulei * description: تحويل الأرقام إلى سلسلة ثنائية * / سلسلة خاصة getBase3BinaryString (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 إلى سلسلة ثنائية * / سلسلة خاصة getGeohashBinaryString (سلسلة geohash) {if (geohash == null || ".equals (geohash)) } 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) ؛ }}} 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 () ؛ لـ (int i = 0 ؛ i <geohashbinarystr.length () ؛ i ++) {if (i ٪ 2! = 0) {lat.append (geohashbinarystr.charat (i)) ؛ } آخر {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 * regurn * author: lulei * description: إرجاع القيمة الوسيطة المقابلة للثنائي * / private double getGeoHashMid (String binarystr ، double min ، double max) {if {albarystr == null || binarystr.lengrest () <1) } if (binarystr.charat (0) == '1') {return getGeoHashMid (binarystr.substring (1) ، (min + max) / 2.0 ، max) ؛ } آخر {return getGeoHashMid (binarystr.substring (1) ، min ، (min + max) / 2.0) ؛ }} / ** * param lat * param lng * return * author: lulei * description: احصل على السلسلة الثنائية الجغرافية من الإحداثيات * / private boolean [] getGeObinary (double lat ، double lng) {boolean [] latarray = gethasharray (latbean.minlat ، Boolean [] lngarray = gethasharray (lng ، locationbean.minlng ، locationbean.maxlng ، lnglength) ؛ Return Merge (Latarray ، Lngarray) ؛ } / ** * param latarray * param lngarray * regurn * author: lulei * description: دمج خط العرض والطول الثنائي * / boolean الخاص [] boolean [] latarray ، boolean [] lngarray) {if (latarray == null || } boolean [] result = new boolean [lngarray.length + latarray.length] ؛ المصفوفات. لـ (int i = 0 ؛ i <lngarray.length ؛ i ++) {result [2 * i] = lngarray [i] ؛ } لـ (int i = 0 ؛ i <latarray.length ؛ i ++) {result [2 * i+1] = latarray [i] ؛ } نتيجة الإرجاع ؛ } / ** * param value * param min * param max * return * author: lulei * description: تحويل الأرقام إلى سلسلة geohash الثنائية * / private boolean [] gethasharray (قيمة مزدوجة ، min double ، double max ، int) {if (value <min || value> max) {return null ؛ } if (length <1) {return null ؛ } boolean [] النتيجة = New Boolean [length] ؛ لـ (int i = 0 ؛ i <length ؛ i ++) {double mid = (min+max) / 2.0 ؛ if (value> mid) {result [i] = true ؛ دقيقة = منتصف ؛ } آخر {result [i] = false ؛ الحد الأقصى = منتصف ؛ }} نتيجة الإرجاع ؛ } main static void main (string [] args) {// todo method method method tuto geohash g = new geohash (40.221227 ، 116.24875) ؛ سلسلة geohash = g.getgeohashbase32 () ؛ system.out.println (geohash) ؛ LocationBean Bean = G.GetLocation (geohash) ؛ System.out.println (jsonutil.parsejson (Bean)) ؛ System.out.println (geohash new (bean.getlat () ، bean.getlng ()). getGeoHashBase32 ()) ؛ system.out.println (quateutil.getDistance (bean.getlat () ، bean.getlng () ، bean.getlat () ، bean.getlat () - g.minlat ، bean.getlng () - g.minlng)) ؛ }}ما سبق هو المحتوى التفصيلي لهذه المقالة ، وآمل أن يكون مفيدًا لتعلم الجميع.