이 기사는 Geohash를 해당 위도 및 경도 좌표로 변환하기위한 상세한 Java 코드를 소개합니다. 참조를 위해 귀하와 공유됩니다. 특정 내용은 다음과 같습니다
패키지 com.lulei.geo; java.util.arraylist 가져 오기; import java.util.arrays; java.util.hashmap import; Java.util.list 가져 오기; com.lulei.geo.bean.locationbean import; import com.lulei.util.jsonutil; 공개 클래스 Geohash {Private LocationBean 위치; /** * 1 2500km; 2 630km; 3 78km; 4 30km * 5 2.4km; 6 610m; 7 76m; 8 19m */ 개인 int 해시 길이 = 8; // 위도와 경도는 Geohash 길이로 변환됩니다. Private int latlength = 20; // 위도와 경도는 이진 길이로 변환됩니다. 개인 int lnglength = 20; // 위도와 경도는 이진 길이 개인 이중 최소로 변환됩니다. // 각 위도의 단위 크기 개인 개인 이중 minlng; // 각 위도의 단위 크기 개인 static final char [] chars = { '0', '1', '2', '3', '4', '4', '5', '6', '7', '8', '9', 'B', 'c', 'd', ','f ','g ','h ','j ','k ',' ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', '', 'k' 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'}; 개인 정적 해시 맵 <문자, 정수> charsmap; static {charsmap = new Hashmap <문자, 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 해시 길이; } / *** @author : lulei* @description : 최소 위도 및 경도의 최소 단위를 설정* / 개인 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> (); // 왼쪽에서 상단에서 하단으로 왼쪽으로 세 문자열이 왼쪽으로 = GetGeoHashBase32 (LeftLat, Uplng); if (! (leftup == null || "".Equals (leftup))) {base32for9.Add (왼쪽); } string leftmid = getgeohashbase32 (leftlat, location.getlng ()); If (! } string leftdown = getgeohashbase32 (leftlat, downlng); if (! } // 중간 중간의 위에서 아래로 3 문자열 = GetGeoHashBase32 (location.getLat (), uplng); if (! } 문자열 midmid = getgeohashbase32 (location.getlat (), location.getlng ()); if (! } 문자열 middown = getGeoHashBase32 (location.getLat (), downlng); if (! } // 오른쪽의 위에서 아래로 3 문자열 오른쪽 오른쪽으로 = GetGeoHashBase32 (오른쪽, 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 (오른쪽))) {base32for9.Add (오른쪽 다운); } return base32for9; } / ** * @param length * @return * @author : lulei * @description : 위도와 경도를 Geohash 길이 * / public boolean sethashlength (int length) {if (length <1) {return false; } 해시 길이 = 길이; latlength = (길이 * 5) / 2; if (길이 % 2 == 0) {lnglength = latlength; } else {lnglength = latlength + 1; } setMinlatlng (); 진실을 반환하십시오. } / ** * @return * @author : lulei * @description : base32 위도 및 경도 문자열 * / public string getgeohashbase32 () {return getgeohashbase32 (location.getlat (), location.getlng ()); } / ** * @param lat * @param lng * @return * @author : lulei * @description : base32 위도 및 경도를 얻습니다 * / 개인 문자열 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 = 새로운 부울 [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 (boolean [] base32) {if (base32 == null || base32.length! = 5) {return ''; } int num = 0; for (부울 bool : base32) {num << = 1; if (bool) {num += 1; }} return chars [num % chars.length]; } / ** * @param i * @return * @author : lulei * @description : 숫자를 바이너리 문자열로 변환 * / 개인 문자열 getBase32BinaryString (int i) {if (i <0 || i> 31) {return null; } 문자열 str = integer.tobinaryString (i + 32); return str.substring (1); } / ** * @param geohash * @return * @author : lulei * @description : geohash를 이진 문자열로 변환 * / private String getgeohashbinarystring (string geohash) {if (geohash == null || ". } StringBuffer sb = new StringBuffer (); for (int i = 0; i <geohash.length (); i ++) {char c = geohash.charat (i); if (charsmap.containskey (c)) {문자열 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 : binary * / private double getgeohashmid (string binarystr, double min, double min, double min) {if (binarystr == null || binarystr.length () {return (retory) / 2; } 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 : get get get the geo biny string of coordinates * / private boolean [] getgeobinary (double lat, double lng) {boolean [] latarray = gethasharray (lat, locationbean.minlat, latebean.maxlat, latlat); 부울 [] lngarray = gethasharray (lng, locationbean.minlng, locationBean.maxlng, lnglength); 반환 병합 (Latarray, lngarray); } / ** * @param latarray * @param lngarray * @return * @author : lulei * @description : 합병 위도 및 경도 이진 * / private boolean [] merge (boolean [] latarray, boolean [] lngarray) {if (latarray == null || lngarrray == null); } 부울 [] 결과 = 새로운 부울 [lngarray.length + latarray.length]; 배열 .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]; } 반환 결과; } / ** * @param value * @param min * @param max * @return * @author : lulei * @description : 숫자를 geohash binary string * / private boolean [] gethasharray (double value, double min, double max, int length) {if (value <min || value> max) {return null; } if (길이 <1) {return null; } 부울 [] 결과 = 새로운 부울 [길이]; for (int i = 0; i <길이; i ++) {double mid = (min+max) / 2.0; if (value> mid) {결과 [i] = true; 최소 = 중간; } else {결과 [i] = false; MAX = MID; }} 반환 결과; } public static void main (String [] args) {// todo 자동 생성 메소드 스터브 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 (new Geohash (bean.getlat (), bean.getlng ()). getgeohashbase32 ()); System.out.println (distoneUtil.getDistance (bean.getlat (), bean.getlng (), bean.getlat (), bean.getlat () -g.minlat, bean.getlng () -g.minlng); }}위의 내용은이 기사의 자세한 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다.