
Geohash的最简单的解释就是:将一个经纬度信息,转换成一个可以排序,可以比较的字符串编码
import javaioFile;
import javaioFileInputStream;
import javautilBitSet;
import javautilHashMap;
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 HashMap<Character, Integer> lookup = new HashMap<Character, Integer>();
static {
int i = 0;
for (char c : digits)
lookupput(c, i++);
}
public static void main(String[] args) throws Exception{
Systemoutprintln(new Geohash()encode(45, 125));
}
public double[] decode(String geohash) {
StringBuilder buffer = new StringBuilder();
for (char c : geohashtoCharArray()) {
int i = lookupget(c) + 32;
bufferappend( IntegertoString(i, 2)substring(1) );
}
BitSet lonset = new BitSet();
BitSet latset = new BitSet();
//even bits
int j =0;
for (int i=0; i< numbits2;i+=2) {
boolean isSet = false;
if ( i < bufferlength() )
isSet = buffercharAt(i) == '1';
lonsetset(j++, isSet);
}
//odd bits
j=0;
for (int i=1; i< numbits2;i+=2) {
boolean isSet = false;
if ( i < bufferlength() )
isSet = buffercharAt(i) == '1';
latsetset(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<bslength(); i++) {
mid = (floor + ceiling) / 2;
if (bsget(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++) {
bufferappend( (lonbitsget(i))'1':'0');
bufferappend( (latbitsget(i))'1':'0');
}
return base32(LongparseLong(buffertoString(), 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) {
bufferset(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 javaioFile;
import javaioFileInputStream;
import javautilBitSet;
import javautilHashMap;
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 HashMap<Character, Integer> lookup = new HashMap<Character, Integer>();
static {
int i = 0;
for (char c : digits)
lookupput(c, i++);
}
public static void main(String[] args) throws Exception{
Systemoutprintln(new Geohash()encode(45, 125));
}
public double[] decode(String geohash) {
StringBuilder buffer = new StringBuilder();
for (char c : geohashtoCharArray()) {
int i = lookupget(c) + 32;
bufferappend( IntegertoString(i, 2)substring(1) );
}
BitSet lonset = new BitSet();
BitSet latset = new BitSet();
//even bits
int j =0;
for (int i=0; i< numbits2;i+=2) {
boolean isSet = false;
if ( i < bufferlength() )
isSet = buffercharAt(i) == '1';
lonsetset(j++, isSet);
}
//odd bits
j=0;
for (int i=1; i< numbits2;i+=2) {
boolean isSet = false;
if ( i < bufferlength() )
isSet = buffercharAt(i) == '1';
latsetset(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<bslength(); i++) {
mid = (floor + ceiling) / 2;
if (bsget(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++) {
bufferappend( (lonbitsget(i))'1':'0');
bufferappend( (latbitsget(i))'1':'0');
}
return base32(LongparseLong(buffertoString(), 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) {
bufferset(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));
}
}
public static int[] getLoc() {
int[] A = new int[2];
int[] B = A;
float[] C = new float[2];
A[0] = 0;// 第一点x1
A[1] = 0;// 第一点y1
B[0] = 6;// 第二点x2
B[1] = 0;// 第二点y2
int lenAC = 5;// AC长
int lenBC = 5;// AB长
boolean found = false;
// x取值范围,减少运算时间
// 三角形两边之和大于第三边,所以x取值在x轴方向上和A的距离不大于lenAC,y类似
tag: for (int i = A[0] - lenAC; i < A[0] + lenAC; i++) {
for (int j = A[1] - lenAC; j < A[1] + lenAC; j++) {
C[0] = i;
C[1] = j;
// (x-x1)^2 + (y-y1)^2 = ca^2
found = Mathpow((C[0] - A[0]), 2) + Mathpow((C[1] - A[1]), 2) == Math
pow(lenAC, 2);
if (found) {
// (x-x2)^2 + (y-y2)^2 = cb^2
found = Mathpow((C[0] - B[0]), 2)
+ Mathpow((C[1] - B[1]), 2) == Mathpow(lenBC, 2);
if (found) {
break tag;// 找到了xy
}
}
}
}
Systemoutprintln("location is: X = " + C[0] + " Y = " + C[1]);
return new int[] { (int) C[0], (int) C[1] };
}
这不是普适的,因为我算了坐标为几千的,需要较长一段时间才能返回。
最重要还是先研究一下算法,尽量避免穷举这种方式。
而应该和手动解方程是一样的思路来设计,这样虽然算法实现可能更繁琐,但是应该是最科学的,普适的。
给你一个简单的例子吧,自己刚写的,看看是不是你想要的吧。
import javaawtevent;
import javaawt;
import javaxswingJFrame;
public class GetSize_Test extends JFrame implements ActionListener{
static GetSize_Test frame = null;
/
@param args
/
public GetSize_Test(){
addWindowListener(new WindowDestroyer());
thisgetContentPane();
setTitle("Welcome!");
setBounds(300,200,400,300);
setVisible(true);
}
private void getFrameSize(){
Rectangle test = framegetBounds();
Systemoutprintln("窗体的坐标:("+testx+","+testy+")");
Systemoutprintln("窗体的大小(高,宽):("+testheight+","+testwidth+")");
}
public class WindowDestroyer extends WindowAdapter {
public void windowClosing(WindowEvent e) {
Systemexit(0);
}
}
public void actionPerformed(ActionEvent e) {}
public static void main(String[] args) {
frame = new GetSize_Test();
framegetFrameSize();
}
}
既然获取了A的坐标那么直接BsetBounds(testx,testx,int i,int j);就行了啊。
以上就是关于在java中,geohash怎么计算周围8点的字符串如何获得周围8点的经纬度坐标全部的内容,包括:在java中,geohash怎么计算周围8点的字符串如何获得周围8点的经纬度坐标、java 已知两点坐标及另一点到这两点的距离,求该点的坐标、java窗体坐标获取等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)