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

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

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窗体坐标获取等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9613475.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-30
下一篇2023-04-30

发表评论

登录后才能评论

评论列表(0条)

    保存