MongoDB和PostGIS的Geohash是怎么计算的

MongoDB和PostGIS的Geohash是怎么计算的,第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));

}

}

10个经典的公开数据集+免费下载链接

TYYQ

来自专栏公开数据集

1、帕尔默企鹅数据集

背景描述

由Kristen Gorman博士和南极洲LTER的帕尔默科考站共同创建,包含344只企鹅的数据。

数据说明

species: 三个企鹅种类:阿德利 巴布亚 帽带

culmen_length_mm: 鸟的嘴峰长度

culmen_depth_mm: 鸟的嘴峰深度

flipper_length_mm: 脚掌长度

body_mass_g: 体重

island: 岛屿的名字

sex: 企鹅的性别

下载链接:帕尔默企鹅数据集

2、MNIST数据集

经典的手写数字数据集,用于图像分类和识别练习。

21 中文数字MNIST

背景描述

由100名中国人亲自用黑笔手写的15个数字

数据说明

15000张 300x300分辨率 64x64大小的

下载链接:中文数字MNIST

22 Fashion MNIST

背景描述

用于代替原始的MNIST数据

数据说明

包含 60,000 个样本的训练集和一个 10,000 个服装图像的测试集,所有图像都经过尺寸归一化和居中,图像的大小也固定为 28×28

下载链接:Fashion MNIST

3、共享单车

21 国内共享单车数据集

背景描述

共享单车数据集

数据说明

训练集(traincsv)和测试集 共近500万条出行记录:

orderid 订单号 userid 用户ID bikeid 车辆ID biketype 车辆类型 starttime 骑行起始日期时间 geohashed_start_loc 骑行起始区块位置 geohashed_end_loc 骑行目的地区块位置

注意:地理位置通过Geohash加密,可以通过开源的方法获得经纬度数据(testcsv)

下载链接:国内共享单车数据集

22 共享单车需求

背景描述

华盛顿特区“首都自行车共享计划”,根据自行车共享和租赁系统获取的数据

数据说明

骑行信息:时间、出发地点、到达地点、经过时间、租借总长;

天气信息:当天温度(摄氏度)、风速、湿度;

时间信息:季节、工作日、周末、假期;

下载链接:共享单车需求

4、猫狗

包含2千张(猫与狗各1千张),用于机器学习

下载链接:猫狗训练集共2000张

5、威斯康星州乳腺癌(诊断)数据集

背景描述

数据通过处理乳房肿块的细针穿刺(FNA)的数字化图像提取出来

数据说明

由 569 个样本组成,包括 357 个良性样本和 212 个恶性样本。这个数据集中有三类特征,其中实值特征最有趣。它们是从数字化图像中计算出来的,包含有关区域、细胞半径、纹理等信息

下载链接:威斯康星州乳腺癌(诊断)数据集

6、葡萄酒数据集

61 红葡萄酒

背景描述

数据取自葡萄牙一种红酒品类:Vinho Verde

数据说明

包含11种特征与最终质量评分

下载链接:红酒质量数据

62 白葡萄酒

背景描述

来自葡萄牙Vinho Verde产地的白葡萄酒

数据说明

包含葡萄酒的氯化物、柠檬酸、硫酸盐、酒精度、残留糖份等其他属性数据

下载链接:白葡萄酒质量

7、Twitter推文的情绪分析

背景描述

情绪分析用于监控和了解客户反馈

数据说明

包含了使用 Twitter API 提取的 1,600,000 条推文

下载链接:Twitter推文的情绪分析数据集

三种方式进行定位,获取用户位置,分别是基于基站定位, 网络定位,GPS定位。

1基站定位(passive):这是基于网络基站进行定位的,定位的精确度在几十米到几千米不等,在城市中基站覆盖率比较高,推荐使用基站定位,如果是在郊区,基站相距较远,基站的覆盖没有城里好,定位的误差比较大。如果在郊区不推荐使用基站定位。

2网络定位:wifi定位,网络定位

3GPS定位:与卫星进行通信。手机中嵌入了GPS模块(精简版的A-GPS),通过A-GPS搜索卫星, 获取经纬度。使用GPS的弊端是:必须站在空旷的地方,头顶对着天空,如果云层厚了,也会受到一定的影响。精确度:10-50米

扩展知识:

使用Android是定位必备的权限:

< uses-permission android:name= " androidpermissionACCESS_FINE_LOCATION " />      //精确定位

<uses-permission android:name= "androidpermissionACCESS_MOCK_LOCATION" />      //模拟器

<uses-permission android:name= "androidpermissionACCESS_COARSE_LOCATION" />   //粗糙定位

 

//获取定位管理对象

LocationManager  lm=(LocationManager)getSystemService(LOCATION_SERVICE);

String[] names=lmgetAllProviders();//获取所有的位置提供者,一般三种

Criteria  criteria=new Criteria();//查询条件,如果设置了海拔,则定位方式只能是GPS;

criteriasetCostAllowed(true);//是否产生开销,比如流量费

String provider=lmgetBaseProvider(criteria,true)//获取最好的位置提供者,第二个参数为true,表示只获取那些被打开的位置提供者

lmrequestLocationUpdates(provier,0,0,new LocationListener(){});//获取位置。第二个参数表示每隔多少时间返回一次数据,第三个参数表示被定位的物体移动每次多少米返回一次数据。

private class MyLocationListener implements LocationListener {

            @Override

            public void onStatusChanged(String provider, int status, Bundle extras) {

           }

            @Override

            public void onProviderEnabled(String provider) {

           }

            @Override

         

            @Override

            public void onLocationChanged(Location location) {

                 System outprintln( "服务中位置监听发送了变化了" );

                  float accuracy = locationgetAccuracy(); // 精确度

                  double altitude = locationgetAltitude(); // 海拔

                  double latitude = locationgetLatitude(); // 纬度

                  double longitude = locationgetLongitude(); // 经度

                 String locationInfo = "jingdu:" + longitude + ",weidu:" + latitude + ",haiba:" + altitude + ",jingquedu:" + accuracy;

                 Editor edit = spedit();

                 editputString( "location", locationInfo);

                 editcommit();

           }

     }   public void onProviderDisabled(String provider) {

           }

以上就是关于MongoDB和PostGIS的Geohash是怎么计算的全部的内容,包括:MongoDB和PostGIS的Geohash是怎么计算的、威斯康星乳腺癌数据集下载哪一个、android怎么获取用户所在地 csdn等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: http://outofmemory.cn/web/9433260.html

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

发表评论

登录后才能评论

评论列表(0条)

保存