「javageohash」javageohash定位

博主:adminadmin 2022-12-01 22:21:05 59

本篇文章给大家谈谈javageohash,以及javageohash定位对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

MongoDB和PostGIS的Geohash是怎么计算的

Geohash的最简单的解释就是:将一个经纬度信息,转换成一个可以排序,可以比较的字符串编码

import java.io.File;

import java.io.FileInputStream;

import java.util.BitSet;

import java.util.HashMap;

public class Geohash {

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 HashMapCharacter, Integer lookup = new HashMapCharacter, Integer();

static {

int i = 0;

for (char c : digits)

lookup.put(c, i++);

}

public static void main(String[] args) throws Exception{

System.out.println(new Geohash().encode(45, 125));

}

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; ibs.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));

}

}

import java.io.File;

import java.io.FileInputStream;

import java.util.BitSet;

import java.util.HashMap;

public class Geohash {

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 HashMapCharacter, Integer lookup = new HashMapCharacter, Integer();

static {

int i = 0;

for (char c : digits)

lookup.put(c, i++);

}

public static void main(String[] args) throws Exception{

System.out.println(new Geohash().encode(45, 125));

}

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; ibs.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));

}

}

在java中,geohash怎么计算周围8点的字符串?如何获得周围8点的经纬度坐标?

Geohash的最简单的解释就是:将一个经纬度信息,转换成一个可以排序,可以比较的字符串编码

import java.io.File;

import java.io.FileInputStream;

import java.util.BitSet;

import java.util.HashMap;

public class Geohash {

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 HashMapCharacter, Integer lookup = new HashMapCharacter, Integer();

static {

int i = 0;

for (char c : digits)

lookup.put(c, i++);

}

public static void main(String[] args) throws Exception{

System.out.println(new Geohash().encode(45, 125));

}

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; ibs.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));

}

}

import java.io.File;

import java.io.FileInputStream;

import java.util.BitSet;

import java.util.HashMap;

public class Geohash {

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 HashMapCharacter, Integer lookup = new HashMapCharacter, Integer();

static {

int i = 0;

for (char c : digits)

lookup.put(c, i++);

}

public static void main(String[] args) throws Exception{

System.out.println(new Geohash().encode(45, 125));

}

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; ibs.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));

}

}

如何找到周围8个区域的GeoHash编码

Geohash的最简单的解释就是:将一个经纬度信息,转换成一个可以排序,可以比较的字符串编码 import java.io.File; import java.io.FileInputStream; import java.util.BitSet; import java.util.HashMap;

javageohash的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于javageohash定位、javageohash的信息别忘了在本站进行查找喔。

The End

发布于:2022-12-01,除非注明,否则均为首码项目网原创文章,转载请注明出处。