百度
360搜索
搜狗搜索

geohash,地图地址解析算法原理详细介绍

本文目录一览: Geohash原理

????????GeoHash本质上是空间索引的一种方式,其基本原理是将地球理解为一个二维平面,将平面递归分解成更小的子块,每个子块在一定经纬度范围内拥有相同的编码。以GeoHash方式建立空间索引,可以提高对空间poi数据进行经纬度检索的效率。

????????GeoHash将二维的经纬度转换成字符串,比如下图展示了北京9个区域的GeoHash字符串,分别是WX4ER,WX4G2、WX4G3等等,每一个字符串代表了某一矩形区域。也就是说,这个矩形区域内所有的点(经纬度坐标)都共享相同的GeoHash字符串,这样既可以保护隐私(只表示大概区域位置而不是具体的点),又比较容易做缓存。

????????Geohash编码中,字符串相似的表示距离相近(特殊情况后文阐述),这样可以利用字符串的前缀匹配来查询附近的POI信息。如下两个图所示,一个在城区,一个在郊区,城区的GeoHash字符串之间比较相似,郊区的字符串之间也比较相似,而城区和郊区的GeoHash字符串相似程度要低些。此外,不同的编码长度,表示不同的范围区间,字符串越长,表示的范围越精确。

????????以经纬度值:(116.389550, 39.928167)进行算法说明,对纬度39.928167进行逼近编码 (地球纬度区间是[-90,90]

????a. 区间[-90,90]进行二分为[-90,0),[0,90],称为左右区间,可以确定39.928167属于右区间[0,90],给标记为1

????b. 接着将区间[0,90]进行二分为 [0,45),[45,90],可以确定39.928167属于左区间 [0,45),给标记为0

????c. 递归上述过程39.928167总是属于某个区间[a,b]。随着每次迭代区间[a,b]总在缩小,并越来越逼近39.928167

? ? d. 如果给定的纬度x(39.928167)属于左区间,则记录0,如果属于右区间则记录1,序列的长度跟给定的区间划分次数有关,如下图

????????e. 同理,地球经度区间是[-180,180],可以对经度116.389550进行编码。通过上述计算, 纬度产生的编码为1 1 0 1 0 0 1 0 1 1 0 0 0 1 0,经度产生的编码为1 0 1 1 1 0 0 0 1 1 0 0 0 ?1 1

????????f. 合并:偶数位放经度,奇数位放纬度,把2串编码组合生成新串如下图

????????g. 首先将11100 11101 00100 01111 0000 ?01101转成十进制,对应着28、29、4、15,0,13 十进制对应的base32编码就是wx4g0e,如下图.

? ? ? ? ?h. 同理,将编码转换成经纬度的解码算法与之相反

????????Geohash其实就是将整个地图或者某个分割所得的区域进行一次划分,由于采用的是base32编码方式,即Geohash中的每一个字母或者数字(如wx4g0e中的w)都是由5bits组成(2^5 = 32,base32),这5bits可以有32中不同的组合(0~31),这样我们可以将整个地图区域分为32个区域,通过00000 ~ 11111来标识这32个区域。第一次对地图划分后的情况如下图所示(每个区域中的编号对应于该区域所对应的编码)。

????????Geohash的0、1串序列是经度0、1序列和纬度0、1序列中的数字交替进行排列的,偶数位对应的序列为经度序列,奇数位对应的序列为纬度序列,在进行第一次划分时,Geohash0、1序列中的前5个bits(11100),那么这5bits中有3bits是表示经度,2bits表示纬度,所以第一次划分时,是将经度划分成8个区段(2^3 = 8),将纬度划分为4个区段(2^2 = 4),这样就形成了32个区域。如下图

????????同理,可以按照第一次划分所采用的方式对第一次划分所得的32个区域各自再次划分。

????????上文讲了GeoHash的计算步骤,仅仅说明是什么而没有说明为什么?为什么分别给经度和维度编码?为什么需要将经纬度两串编码交叉组合成一串编码?本节试图回答这一问题。

????????如图所示,我们将二进制编码的结果填写到空间中,当将空间划分为四块时候,编码的顺序分别是左下角00,左上角01,右下脚10,右上角11,也就是类似于Z的曲线,当我们递归的将各个块分解成更小的子块时,编码的顺序是自相似的(分形),每一个子快也形成Z曲线,这种类型的曲线被称为Peano空间填充曲线。

????????这种类型的空间填充曲线的优点是将二维空间转换成一维曲线(事实上是分形维),对大部分而言,编码相似的距离也相近,但Peano空间填充曲线最大的缺点就是突变性,有些编码相邻但距离却相差很远,比如0111与1000,编码是相邻的,但距离相差很大。

????????除Peano空间填充曲线外,还有很多空间填充曲线,如图所示,其中效果公认较好是Hilbert空间填充曲线,相较于Peano曲线而言,Hilbert曲线没有较大的突变。但是由于Peano曲线实现更加简单,在使用的时候配合一定的解决手段,可以很好的满足大部分需求,因此TD内部Geohash算法采用的是Peano空间填充曲线。

? ? a.?由于GeoHash是将区域划分为一个个规则矩形,并对每个矩形进行编码,这样在查询附近POI信息时会导致以下问题,比如红色的点是我们的位置,绿色的两个点分别是附近的两个餐馆,但是在查询的时候会发现距离较远餐馆的GeoHash编码与我们一样(因为在同一个GeoHash区域块上),而较近餐馆的GeoHash编码与我们不一致。这个问题往往产生在边界处。

????????解决的思路很简单,我们查询时,除了使用定位点的GeoHash编码进行匹配外,还使用周围8个区域的GeoHash编码,这样可以避免这个问题。

????b.?我们已经知道现有的GeoHash算法使用的是Peano空间填充曲线,这种曲线会产生突变,造成了编码虽然相似但距离可能相差很大的问题,因此在查询附近餐馆时候,首先筛选GeoHash编码相似的POI点,然后进行实际距离计算。

? ? c.?GeoHash Base32编码长度与精度。可以看出,当geohash base32编码长度为8时,精度在19米左右,而当编码长度为9时,精度在2米左右,编码长度需要根据数据情况进行选择。

????????理解了geohash算法的基本原理之后,本节将介绍一个实际应用中常见的场景:计算围栏范围内所有的Geohash编码。该场景封装为函数可以表示如下:输入组成围栏的点经纬度坐标集合和指定的geohash长度,输出一组geohash编码。

????????public static Set getHashByFence(List points, int length)

????????具体算法步骤如下:

1. 输入围栏点坐标集合List points和指定的geohash长度length

2. 计算围栏的外包矩形的左上角和右下角坐标lat_min、lat_max、lng_min、lng_max

3. 根据lat_min、lat_max、lng_min、lng_max,计算外包矩形对角定点的距离d

4. 以外包矩形中心点为圆心,以d/2为半径做一个圆,计算圆覆盖范围内的geohash

????4.1 获取圆的外包矩形左上角和右下角定点坐标经纬度,存储到double[] locs

????4.2 根据geohash字符长度计算该长度geohash编码对应的经纬度间隔(latA,lngA)

????4.3 根据latA和lngA,计算出locs组成的矩形的左上角和右下角定点的经纬度,在geohash划分的网格的索引(也就是第几个),分别记为lat_min,lat_max,lng_min,lng_max

????4.4 计算lat_min,lat_max,lng_min,lng_max对应范围内左右geohash的二进制编码,然后将经纬度二进制编码uncode为geohash字符编码,保存为Set sets

5. 剔除sets中geohash编码对应矩形的中心点不在points围栏范围内的geohash,得到最终的geohash结果集

geohash6位7位区别

GeoHash值如果取6位,误差为61米左右,值取7位长度,误差大概在76米左右。经纬度对应距离的换算关系整理如下。1、纬度相同,经度不同在纬度相同的情况下:经度每隔0.00001度,距离相差约1米。每隔0.0001度,距离相差约10米。每隔0.001度,距离相差约100米。每隔0.01度,距离相差约1000米。每隔0.1度,距离相差约10000米。2、经度相同,纬度不同。纬度每隔0.00001度,距离相差约1.1米。每隔0.0001度,距离相差约11米。每隔0.001度,距离相差约111米。每隔0.01度,距离相差约1113米。每隔0.1度,距离相差约11132米。
Geohash是一种将经度和纬度编码为字符串的算法。Geohash的长度通常以数字表示,长度越长,编码的精度也就越高。
Geohash的6位和7位主要的区别在于编码的精度不同。相比于6位Geohash,7位Geohash在经度和纬度的精度上要高得多。具体来说,根据算法的规则,7位Geohash在经度和纬度上各增加了9倍的精度。这意味着,7位Geohash可以更准确地表示地点的位置信息,更细致地反映出位置的差异。
例如,在纬度每隔0.00001度的变化上,6位Geohash大约只能表示1米左右的距离变化,而7位Geohash则能更精确地表示这个变化,大约能达到0.1米左右的距离变化。
总的来说,7位Geohash相比6位Geohash具有更高的精度,可以更准确地表示地理位置信息。

皮亚诺曲线图片 geohash

皮亚诺曲线是一种数学图形,由意大利数学家皮亚诺在19世纪末首次提出。它是一种无限细节的自相似曲线,具有高度的几何美感和复杂性。
而geohash是一种用于地理位置编码的算法,它将地球表面划分成一个网格,每个格子都有一个唯一的编码。这种编码方式可以方便地用来在数据库中存储和检索地理位置信息。
在geohash算法中,每个格子的编码由一系列二进制位组成,每个二进制位可以表示格子在经度或纬度方向上的划分方向。这样,格子的编码就可以表示为一串二进制数字,非常紧凑和高效。
将皮亚诺曲线和geohash算法结合起来,就可以得到一种非常有趣和实用的技术。利用皮亚诺曲线的自相似性质,可以将地球表面划分成一系列相似的小区域,每个小区域用一个geohash编码来表示。这种编码方式非常紧凑和高效,可以用于搜索和定位地理位置信息。
同时,利用皮亚诺曲线的复杂性质,可以将geohash编码转换成一条连续的曲线,从而方便地进行可视化和分析。这种曲线被称为geohash曲线,它可以用来显示地球表面上的地理位置分布和密度,非常适用于地图数据可视化等应用。
总之,皮亚诺曲线和geohash算法的结合,为地理位置编码和可视化提供了一种新的方法和工具,具有广泛的应用前景。

在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 HashMap

lookup = new HashMap

();

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

}

阅读更多 >>>  php中数组和字符串的相互转换

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 HashMap

lookup = new HashMap

();

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

}

阅读更多 >>>  PHP 数组和字符串互相转换实现方法

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

}

}

在Spark SQL作业中使用地理空间函数

地理空间数据又称为几何数据,可用来表示物体的位置、形态、大小分布等各方面的信息,是对现实世界中存在的具有定位意义的事物和现象的定量描述。通常,地理空间数据以点、线、面、体的形式表示。通过对地理空间数据的查询,可以获得被查询对象的面积、长度、空间关系等。

Point(点),LineString(线),Polygon(面),MultiPoint(多点),MultiLineString(多线), MultiPolygon(多面)

地理空间查询用于统计某空间范围内兴趣点的个数,检查两个区域是否重叠、两个地点之间的距离等。

返回与Geohash字符串geohash(base-32编码)对应的边界框的Geometry,其精度
为prec位。 有关GeoHashes的更多信息,请参阅Geohash。

Format: ST_GeomFromGeoHash(geohash: string, precision: int)
查询命令:
select ST_AsText(ST_GeomFromGeoHash('ssf17',25))

从给定的已知文本标记语言的二进制表示(WKB)创建Geometry。

Format: ST_GeomFromWKT (Wkt:string)
select
ST_AsText((ST_GeomFromWKT(ST_AsEWKB(ST_GeomFromText('MULTIPOLYGON (((30 20,
45 40, 10 40, 30 20)), ((15 5, 40 10, 10 20, 5 10, 15 5)))')))))

根据给定的已知文本标记语言(WKT)创建Geometry。
ST_GeomFromText是ST_GeomFromWKT的别称

Format: ST_GeomFromWKT (Wkt:string)
select ST_AsText((ST_GeomFromText('POLYGON ((30 10, 40 40,
20 40, 10 20, 30 10))')))

返回具有给定坐标值的point。
Format: ST_Point (X:decimal, Y:decimal) Format: ST_Point (X:decimal, Y:decimal, Z:decimal)

如果a和b在2D中空间相交(即共享空间的任何部分),则返回true。 相当于NOT
st_disjoint(a,b)。
Format: ST_Intersects (A:geometry, B:geometry)

从MinX,MinY,MaxX,MaxY构建一个矩形。
Format: ST_PolygonFromEnvelope (MinX:decimal, MinY:decimal, MaxX:decimal, MaxY:decimal)

返回一个几何图形/地理位置,它表示与该几何图形/地理位置的距离小于或等于距离的所有点。
Format: ST_Buffer (A:geometry, buffer: Double)

经纬度需要转换成Decimal格式

图上需求是:根据中心点获取半径范围内的所有基站

图上需求是:根据矩形四个点获取矩形内的所有基站

图上需求是:根据自定义边框的多个点获取区域内的所有基站

ST_Centroid
SQL示例:

如何根据查询范围大小获取geohash层级

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

地图地址解析算法原理

GeoHash二进制编码。
地球纬度区间是[-90,90], 北海公园的纬度是39.928167,可以通过下面算法对纬度39.928167进行逼近编码:
区间[-90,90]进行二分[-90,0),[0,90],称为左右区间,可以确定39.928167属于右区间[0,90],给标记为1;接着将区间[0,90]进行二分为 [0,45),[45,90],递归上述过程39.928167总是属于某个区间[a,b]。

Arcgis—经纬度距离换算误差

1度是多少米?约等于 111KM

1米是多少度? 约等于 0.00001

30min= 0.5°,约等于55.5km

15min=0.25°,约等于27.75Km

一、经纬度距离换算

a)在纬度相等的情况下:

经度每隔0.00001度,距离相差约1米;

每隔0.0001度,距离相差约10米;

每隔0.001度,距离相差约100米;

每隔0.01度,距离相差约1000米;

每隔0.1度,距离相差约10000米。

b)在经度相等的情况下:

纬度每隔0.00001度,距离相差约1.1米;

每隔0.0001度,距离相差约11米;

每隔0.001度,距离相差约111米;

每隔0.01度,距离相差约1113米;

每隔0.1度,距离相差约11132米。

二、Geohash距离换算(使用base32编码)

如果geohash的位数是9位数的时候,大概为附近2米

下表摘自维基百科:http://en.wikipedia.org/wiki/Geohash

订餐geohash不能为空

是因为送餐地址没有定位,定位好了就不会出现这个了。
我也遇到这种情况,看不懂~
是因为你的位置定位失败,我刚才在饿了么点餐就出现了这样的情况,重新定位一下位置就好了。

MySQL的GIS、GEO入门笔记

探索和学习MySQL中GIS相关功能和特性
这里记录了学习和了解MySQL中GIS特性相关内容的过程。
MySQL官方论坛中GIS的举例
测试数据已经导入成功,下面开始对GIS相关函数和GEOHASH进行了解和体验;
mysql中geometry类型的简单使用 MySQL空间数据类型
经纬度信息存储在geometry格式的字段中,该字段必须非空。
MySQL8.0前按照longitude-latitude的顺序存储位置 MySQL8.0前按照longitude-latitude的顺序存储位置 MySQL8.0前按照longitude-latitude的顺序存储位置
插入数据时候可使用如下语句:
MySQL存储geometry信息的方式采用了25bytes,相比WKB的21bytes,多了4bytes的坐标系表示,组成部分如下:
WTF字符串格式说明 select ST_GeomFromText(WTF格式字符串); WKT(Well-known text)是一种文本标记语言,用于表示矢量几何对象、空间参照系统及空间参照系统之间的转换。通过WTF字符串生成geometry的方法:
点: POINT(x y) 线: LINESTRING(x1 y1, x2 y2, x3 y3...) 多边形: POLYGON((0 0, 10 0, 10 10,0 10,0 0),(5 5,7 5,7 7,5 7,5 5)) 多点集: MULTIPOINT(0 0, 20 20, 60 60) 或 MULTIPOINT((0 0),(5 5),(5 0)) 多线集: MULTILINESTRING((10 10, 20 20), (15 15, 30 15)) 多多边形集: MULTIPOLYGON(((0 0,10 0,10 10,0 10,0 0)),((5 5,7 5,7 7,5 7, 5 5))) 例如两点一线组成的几何集: GEOMETRYCOLLECTION(POINT(10 10), POINT(30 30), LINESTRING(15 15, 20 20))
A geometry is syntactically well-formed if it satisfies conditions such as those in this (nonexhaustive) list:
Collections are not empty (except GeometryCollection)
更多内容参见 ST_PointFromText('POINT(X Y)'); ST_LineStringFromText('LINESTRING(0 0,1 1,2 2)'); ST_PolygonFromText('POLYGON((0 0,10 0,10 10,0 10,0 0),(5 5,7 5,7 7,5 7,5 5))'); ST_GeomCollFromText();
更多内容参见
参见 Point(x,y) LineString((x1,y1),(x2,y2)...) Polygon(LineString(),LineString()....)
参见 ST_AsText() ST_AsBinary() ST_AsWKT()
参见 ST_Dimension(geom) :返回geom的维度(-1,0,1,2) ST_Envelope(geom) :返回geom的最小外接矩形(MBR) ST_GeometryType(geom) :返回geom的类型 ST_IsEmpty(geom) :该函数并不能真实的判空,当geom为任何有效的几何值时返回0,无效的几何值返回1; ST_IsSimple(geom) :当geom无任何异常几何点返回1(如自相交和自切线等),否则返回0 ST_SRID(geom) :返回geom的坐标系ID
参见 ST_X(Point) :获取Point的X值 ST_Y(Point) :获取Point的Y值
参见 ST_StartPoint(linestrng) : 线的起点 ST_EndPoint(linestring) :返回线的最后一个点 ST_IsClosed(linestring或multilinestring) :线是否闭合(若为线,则判断起点与终点是否一致;若为线组,则判断组内每个元素是否符合闭合线) ST_Length(linestring) :返回线的长度,若入参为线集,则返回集合内所有长度的和 ST_NumPoiints(linestring) :返回点的数量; ST_PointN(linestring,N) :返回第N个点(从1开始)
参见 具体不在一一列举,主要有计算多边形面积、中心点、最小外接圆,最大内接圆等函数,列举几个可能会用到的: ST_Area(Poly|mPoly) :返回双精度的面积或面积的和 'ST_Centroid(Poly|mPoly)':返回数学上的中心点 ST_ExteriorRing(Poly) :返回外接圆
参见 ST_Buffer说明 不再列举,主要有:ST_Buffer(不懂干啥用),ST_ConvexHull(geom)凸包,ST_Dfference(g1,g2)比较差异,ST_Intersecton(g1,g2)交叉点,ST_SymDifference(g1,g2)对称差分,ST_Union(g1,g2)连接、合并等。
检查geometry Objects之间的空间关系的方法。
参见 计算两个Object之间的空间关系的函数,有两个间距离、相交、不相交,包含、相等、相切、重叠、接触、在内等等空间关系。下面列举几个可能会常用的方法: ST_Contains(g1,g2) :g1是否完全包含g2 ST_Within(g1,g2) :g1是否包含于g2中 ST_Distance(g1,g2) :返回g1和g2之间的距离,已坐标单位计算的 ST_Equals(g1,g2) :返回g1和g2是否相等
参见 MBRContains(g1,g2) :g1的mbr是否包含g2的mbr MBRWithin(g1,g2) :g1的mbr是否在g2的mbr内 MBRCoveredBy(g1,g2) :g1的mbr是否被g2的mbr覆盖 MBRCovers(g1,g2) :g1的mbr是否覆盖g2的mbr MBRDisjoint(g1,g2) :g1的mbr,g2的mbr是否不相交 MBRIntersects(g1,g2) :g1mbr,g2mbr是否相交 MBREqual(g1,g2) :g1的mbr,g2的mbr的外接是否相等 MBREquals(g1,g2) :g1的mbr,g2的mbr的外接是否相等 MBROverlaps(g1,g2) :g1mbr、g2mbr 其他函数请参看原文
GeoHash介绍 GeoHash Wiki百科
MySQL中自带函数 st_geohash(longtude,latitude,max_length) 或 st_geohash(point, max_length) 即可生成某一点的geohash值。
返回一个geohash字符串中的latitude或longitude
返回一个geohash解析出的point数据
官方文档
通过geometry生成一个GeoJSON Object, select st_asgeojson(geometry,max_length,options);
通过GeoJSON生成GeoMetry对象。 ST_GeomFromGeoJSON(jsonstring, [options [, srid]]) 具体使用方法参见官方文档
官方文档 MySQL中提供的方便空间运算的函数们
select ST_Distance_Spher(geomPoint1,geomPoint2 [, radius]); 此方法用于计算两点或多个点之间的地球上的距离(是地球球面距离而不是直线距离),返回单位为米,
select ST_IsValid(ST_GeomFromText('LINESTRING(0 0,1 1)')) 判断入参是否是符合地理位置描述的格式。返回1(符合)或者0(不符);
例如: 返回0: select st_isvalid(st_geomfromtext('linestring(0 0, -0.00 0, 0.0 0)') 返回1: select st_isvalid(st_geomfromtext('linestring(0 0,1 1)')
select st_astext(st_makeenvelope(pt1, pt2)); 返回两点构成的包络。(此计算是基于笛卡尔坐标系而非球面)
例如: SELECT ST_AsText ( st_makeenvelope ( st_geomfromtext ( 'point(0 0)' ), st_geomfromtext ( 'point(1 1)' ) ) ); 返回结果: POLYGON((0 0,1 0,1 1,0 1,0 0))
效果说明 JS抽稀算法 select st_simplify(geometry, max_distance); 用道格拉斯-普克算法(抽稀函数)简化geometry,并返回与原格式相同格式的结果。
例如,以下点集拟合为直线,步长0.5: SELECT st_simplify ( st_geomfromtext ( 'LINESTRING(0 0,0 1,1 1,1 2,2 2,2 3,3 3)' ), 0.5 ) 返回结果: LINESTRING(0 0, 0 1, 1 1, 2 3, 3 3) 再如,步长1.0: SELECT st_simplify ( st_geomfromtext ( 'LINESTRING(0 0,0 1,1 1,1 2,2 2,2 3,3 3)' ), 1.0 ) 返回结果: LINESTRING(0 0, 3 3)
SELECT ST_Validate(geometry); 验证geometry是符合正确的地理位置信息格式。例如 Point(0 0) 是合格的; Linestring(0 0) 是非法的; Linestring(0 0, 1 1) 是合格的
了解了上述MySQL中关于集合对象的功能,下面来实践一下
由上面geohash长度-精度对应表可知,前6位表示±610米左右的误差,这里先查询前六位范围之后再用上述方法精确筛选一次即可:
可将上述查询方法封装为MySQL函数方便和简化程序调用.
该方法是运用了内置的几何关系运算函数 ST_Contains 和 ST_MakeEnvelop 来实现的,0.5对应大概500米左右的范围,具体如下;
链接: https://pan.baidu.com/s/1cW-kv6DIgtYMw5I3bNFzKA
提取码: jagn

阅读更多 >>>  format函数vb,vbformat函数怎么设置输出字符串的宽度

网站数据信息

"geohash,地图地址解析算法原理"浏览人数已经达到20次,如你需要查询该站的相关权重信息,可以点击进入"Chinaz数据" 查询。更多网站价值评估因素如:geohash,地图地址解析算法原理的访问速度、搜索引擎收录以及索引量、用户体验等。 要评估一个站的价值,最主要还是需要根据您自身的需求,如网站IP、PV、跳出率等!