Signed-off-by: lixiangrong <lixiangrong@pxene.com>
This commit is contained in:
		| @@ -1,116 +0,0 @@ | ||||
| package osc.git.eh3.utils; | ||||
|  | ||||
| import java.util.BitSet; | ||||
| import java.util.HashMap; | ||||
|  | ||||
| public class GeoHash2 { | ||||
|  | ||||
| 	private static int numbits = 6 * 5; | ||||
| 	final static char[] digits = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'j', 'k', 'm', 'n', | ||||
| 			'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' }; | ||||
|  | ||||
| 	final static HashMap<Character, Integer> lookup = new HashMap<Character, Integer>(); | ||||
|  | ||||
| 	static { | ||||
| 		int i = 0; | ||||
| 		for (char c : digits) | ||||
| 			lookup.put(c, i++); | ||||
| 	} | ||||
|  | ||||
| 	public static void main(String[] args) throws Exception { | ||||
|  | ||||
| 		double lon1 = 109.014520; | ||||
| 		double lat1 = 34.236080; | ||||
| 		System.out.println(new GeoHash2().encode(lat1, lon1)); | ||||
|  | ||||
| 	} | ||||
|  | ||||
| 	public double[] decode(String geohash) { | ||||
| 		StringBuilder buffer = new StringBuilder(); | ||||
| 		for (char c : geohash.toCharArray()) { | ||||
|  | ||||
| 			int i = lookup.get(c) + 32; | ||||
| 			buffer.append(Integer.toString(i, 2).substring(1)); | ||||
| 		} | ||||
|  | ||||
| 		BitSet lonset = new BitSet(); | ||||
| 		BitSet latset = new BitSet(); | ||||
|  | ||||
| 		// even bits | ||||
| 		int j = 0; | ||||
| 		for (int i = 0; i < numbits * 2; i += 2) { | ||||
| 			boolean isSet = false; | ||||
| 			if (i < buffer.length()) | ||||
| 				isSet = buffer.charAt(i) == '1'; | ||||
| 			lonset.set(j++, isSet); | ||||
| 		} | ||||
|  | ||||
| 		// odd bits | ||||
| 		j = 0; | ||||
| 		for (int i = 1; i < numbits * 2; i += 2) { | ||||
| 			boolean isSet = false; | ||||
| 			if (i < buffer.length()) | ||||
| 				isSet = buffer.charAt(i) == '1'; | ||||
| 			latset.set(j++, isSet); | ||||
| 		} | ||||
|  | ||||
| 		double lon = decode(lonset, -180, 180); | ||||
| 		double lat = decode(latset, -90, 90); | ||||
|  | ||||
| 		return new double[] { lat, lon }; | ||||
| 	} | ||||
|  | ||||
| 	private double decode(BitSet bs, double floor, double ceiling) { | ||||
| 		double mid = 0; | ||||
| 		for (int i = 0; i < bs.length(); i++) { | ||||
| 			mid = (floor + ceiling) / 2; | ||||
| 			if (bs.get(i)) | ||||
| 				floor = mid; | ||||
| 			else | ||||
| 				ceiling = mid; | ||||
| 		} | ||||
| 		return mid; | ||||
| 	} | ||||
|  | ||||
| 	public String encode(double lat, double lon) { | ||||
| 		BitSet latbits = getBits(lat, -90, 90); | ||||
| 		BitSet lonbits = getBits(lon, -180, 180); | ||||
| 		StringBuilder buffer = new StringBuilder(); | ||||
| 		for (int i = 0; i < numbits; i++) { | ||||
| 			buffer.append((lonbits.get(i)) ? '1' : '0'); | ||||
| 			buffer.append((latbits.get(i)) ? '1' : '0'); | ||||
| 		} | ||||
| 		return base32(Long.parseLong(buffer.toString(), 2)); | ||||
| 	} | ||||
|  | ||||
| 	private BitSet getBits(double lat, double floor, double ceiling) { | ||||
| 		BitSet buffer = new BitSet(numbits); | ||||
| 		for (int i = 0; i < numbits; i++) { | ||||
| 			double mid = (floor + ceiling) / 2; | ||||
| 			if (lat >= mid) { | ||||
| 				buffer.set(i); | ||||
| 				floor = mid; | ||||
| 			} else { | ||||
| 				ceiling = mid; | ||||
| 			} | ||||
| 		} | ||||
| 		return buffer; | ||||
| 	} | ||||
|  | ||||
| 	public static String base32(long i) { | ||||
| 		char[] buf = new char[65]; | ||||
| 		int charPos = 64; | ||||
| 		boolean negative = (i < 0); | ||||
| 		if (!negative) | ||||
| 			i = -i; | ||||
| 		while (i <= -32) { | ||||
| 			buf[charPos--] = digits[(int) (-(i % 32))]; | ||||
| 			i /= 32; | ||||
| 		} | ||||
| 		buf[charPos] = digits[(int) (-i)]; | ||||
|  | ||||
| 		if (negative) | ||||
| 			buf[--charPos] = '-'; | ||||
| 		return new String(buf, charPos, (65 - charPos)); | ||||
| 	} | ||||
| } | ||||
		Reference in New Issue
	
	Block a user