この記事では、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 location; /** * 1 2500km; 2 630km; 3 78km; 4 30km * 5 2.4km; 6 610M; 7 76m; 8 19m */ private int hashlength = 8; //緯度と経度はgeohash lengthに変換されますprivate int latlength = 20; //緯度と経度はバイナリ長に変換されますプライベートint lnglength = 20; //緯度と経度は、バイナリ長プライベートダブルミンラットに変換されます。 //各緯度のプライベートダブルミンのユニットサイズ。 //各緯度のユニットサイズプライベートスタティック最終char [] chars = {'0'、 '1'、 '2'、 '3'、 '4'、 '5'、 '6'、 '7'、 '9'、 'b'、 'c' '' '' '' '' 'd 's'、 't'、 'u'、 'v'、 'w'、 'x'、 'y'、 'z'}; private static hashmap <文字、integer> charsmap; static {charsmap = new hashmap <Character、integer>(); for(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:緯度と経度の最小単位を設定* / 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:9つの座標ポイントと周囲のポイントを見つけます * / public list <string> getGeoHashBase32for9(){double leftlat = location.getlat() - minlat; double rightlat = location.getlat() + minlat; double uplng = location.getlng() - minlng; Double downlng = location.getlng() + minlng; List <String> base32for9 = new ArrayList <String>(); //左側の3つの文字列左に左に左に= 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(leftdown); } //上から上への3つの文字列中央の途中で= 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文字右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(右lat、downlng); if(!(rightdown == null || "" .equals(rightdown))){base32for9.add(rightdown); } base32for9を返します。 } / ** * @param length * @return * @author:lulei * @description:緯度と経度をgeohash lengthに設定 * / public boolean sethashlength(int length){if(length <1){return false; } hashlength = length; latlength =(length * 5) / 2; if(length%2 == 0){lnglength = latlength; } else {lnglength = latlength + 1; } setMinlatlng(); trueを返します。 } / ** * @return * @author:lulei * @description:latitude and ratitudeのbase32文字列を取得 * / public string getgeohashbase32(){return getgeohashbase32(location.getlat()、location.getlng()); } / ** * @param lat * @param lng * @return * @author:lulei * @description:latitude and ratitude and経度のbase32文字列を取得 * / private string getgeohashbase32(double lat、double lng){boolean [] bools = getgeobinary(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 = getBase32Char(base32); if( '' == cha){return null; } sb.append(cha); } return sb.toString(); } / ** * @param base32 * @return * @author:lulei * @description:5ビットのバイナリをbase32 * / private char getBase32Char(base32){if(base32 == null || base32.length!= 5){return ''; {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); locationbean location = new locationbean(latvalue、lngvalue); location.setgeohash(geohash);戻り場所。 } / ** * @param binarystr * @param min * @param max * @return * @author:lulei * @description:バイナリに対応する中間値を返します * / private double getgeohashmid(string binarystr、double min、double max){if(binarystr == null || binarystr.lengtr.lent.lent.lent() } 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:@description:geo binary string of coordinates * / private boolean [] getGeobinary(double lat、double lng){boolean [] latarray = gethasharray(lat、location.minlat、location.minlat、location.minlat、minlat、minlat、minlat、minlat、minlat、minlat、minlat、minlat、minlat、 boolean [] lngarray = gethasharray(lng、locationbean.minlng、locationbean.maxlng、lnglength); Return Merge(LatArray、lngarray); } / ** * @param latarray * @param lngarray * @return * @author:lulei * @description:マージ緯度と経度バイナリ * / private boolean [] merge(boolean [] latarray、boolean [] lngarray){if(latarray = null | lngarray == null) } boolean [] result = new boolean [lngarray.length + latarray.length]; arrays.fill(result、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 binary string * / private boolean [] gethasharray [] gethasharray [] gethasharray [] gethasharray(] gethasharray [] gethasharray [] gethasharray [] gethasharray(double min、double max、int length){if(value <min || value> max)null; } if(length <1){return null; } boolean [] result = new boolean [length]; for(int i = 0; i <length; i ++){double mid =(min+max) / 2.0; if(value> mid){result [i] = true; min = mid; } else {result [i] = false; max = mid; }} return result; } public static void main(string [] args){// todo auto-fenated method 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(distanceutil.getDistance(bean.getlat()、bean.getlng()、bean.getlat()、bean.getlat() - g.minlat、bean.getlng()-g.minlng)); }}上記はこの記事の詳細な内容です。すべての人の学習に役立つことを願っています。