geohash vs PostGIS-阿里云开发者社区

开发者社区> 德哥> 正文

geohash vs PostGIS

简介:
+关注继续查看

标签

PostgreSQL , PostGIS , GEOHASH , 经纬度 , geometry , geography


背景

业界有几种地理位置的表示方法。

通常我们使用经纬度表示地球上的位置,PostgreSQL的PostGIS可以很好的描述这种类型,包括海拔在内。使用最为广泛,精度、功能最高的应该是PostGIS。

但是并不是所有的数据库都有这样的技术(或者实现难度的问题导致了很多数据库在初期会选择较为简单的geohash)。

什么是geohash呢?

geohash 原理

通常我们使用经纬度表示地球上的位置,PostgreSQL的PostGIS可以很好的描述这种类型,包括海拔在内。

但是并不是所有的数据库都有这样的技术(或者实现难度的问题导致了很多数据库在初期会选择较为简单的geohash)。

什么是geohash呢?

实际上geohash是一套网格化的编码方式,经过编码,可以将经纬度对应的点,表示为一个网格,网格的大小,取决于geohash的精度。

通常,geohash使用32个字符进行编码。业界也有使用geo base 36的编码,即36个字符来表示的。

编码后,离得越近的点,编码值也是越近的。prefix永远会包含更长的编码字符表示的范围。(例如wb12x是5位的,包含了wb12x..........的网格,即wb12x是个大格子,wb12x....是更小的格子。),但是请注意,边界问题,例如-180和180实际上是一个地方。但是它们的geohash编码却完全不一样。这也是geohash的问题之一。

如何将geohash编码转换为经纬度?

首先有一个base32的映射表(以32个字符进行编码为例)

pic

例如一个hash=ezs42的geohash值,通过这个表,可以翻译成 13, 31, 24, 4, 2。

将以上每个数字,使用5位BIT表示,进而翻译成 01101 11111 11000 00100 00010 。

接下来是关键不走,以上BIT串,位置从0开始,偶数的BIT位连起来作为 longitude code (0111110000000), 奇数比特位连起来作为 latitude code (101111001001).

得到了经纬度BIT串后,该怎么办呢?

经度范围-180 ~ 180

纬度范围-90 ~ 90

每次将范围对半拆开,例如-180, 0, 180。当bit=0时,表示点落在左边的范围,当bit=1时,表示点落在右边的范围。然后再将下一个范围对半拆开,例如-180, -90, 0。继续根据BIT选择范围,循环往复。

得到一个范围,取范围的中值,作为对应的经度或者纬度。

pic

上图就是101111001001的计算过程,右,左,右,右,右,右,左,左,右,左,左,右。

value指范围的中间值,ERR指误差。

当geohash的字符串长度越长时,误差越小,我们来看看误差表如下。

pic

geohash缺陷

由于编码,地球非正球体,等问题。导致了geohash 存在几个比较致命的缺陷。

1. 网格化算法带来的精度问题

2. 地球是不规则椭圆,geohash的偏差会随着纬度的变大骤变,越接南北极地,距离计算越不准确。

  • At the Equator (0 Degrees) the length of a degree of longitude is 111.320 km, while a degree of latitude measures 110.574 km, an error of 0.67%.

  • At 30 Degrees (Mid Latitudes) the error is 110.852/96.486 = 14.89%

  • At 60 Degrees (High Arctic) the error is 111.412/55.800 = 99.67%, reaching infinity at the poles.

3. 经度边界(-180,180)数据的处理,边界的哈希值完全不同,但是他们却相邻,不利于相邻计算。

PostGIS geometry, geography, raster, ...

PostgreSQL PostGIS 发展了几十年,有非常深厚的理论背景,广泛应用于军工、科研、商业场景。

PostGIS adds extra types (geometry, geography, raster and others) to the PostgreSQL database.

It also adds functions, operators, and index enhancements that apply to these spatial types.

These additonal functions, operators, index bindings and types augment the power of the core PostgreSQL DBMS, making it a fast, feature-plenty, and robust spatial database management system.

Feature List

The PostGIS 2+ series provides:

  • Processing and analytic functions for both vector and raster data for splicing, dicing, morphing, reclassifying, and collecting/unioning with the power of SQL

  • raster map algebra for fine-grained raster processing

  • Spatial reprojection SQL callable functions for both vector and raster data

  • Support for importing / exporting ESRI shapefile vector data via both commandline and GUI packaged tools and support for more formats via other 3rd-party Open Source tools

  • Packaged command-line for importing raster data from many standard formats: GeoTiff, NetCDF, PNG, JPG to name a few

  • Rendering and importing vector data support functions for standard textual formats such as KML,GML, GeoJSON,GeoHash and WKT using SQL

  • Rendering raster data in various standard formats GeoTIFF, PNG, JPG, NetCDF, to name a few using SQL

  • Seamless raster/vector SQL callable functions for extrusion of pixel values by geometric region, running stats by region, clipping rasters by a geometry, and vectorizing rasters

  • 3D object support, spatial index, and functions

  • Network Topology support

  • Packaged Tiger Loader / Geocoder/ Reverse Geocoder / utilizing US Census Tiger data

geohash vs PostGIS

参考自

http://www.cnblogs.com/LBSer/p/3629149.html

一个玩具级场景(PostGIS说:我可不是玩具^_^....)的对比

功能 Mysql spatial extension PostGIS
空间索引 仅MyISAM支持R树索引,InnoDB不支持 GIST树索引(R树的变种)
支持的空间类型 仅二维数据 二维、三维以及曲线
空间操作函数 有限的空间函数 基本实现OGC标准定义的空间操作函数
空间投影 不支持 支持多种常用投影坐标系
事务支持 不支持 PostGIS提供了一系列的长事务支持,可以有效支持复杂的空间分析功能
加载速度 MySQL > PostGIS (事务) (作者可能没有进行优化,性能不会更差)。 -
空间索引的创建速度 MySQL < PostGIS (diff split algo)。 -
查询效率 MySQL PostGIS(不同性质查询结果不一样,各有千秋) -
GIS系统使用 使用较少 使用较多,例如openstreetmap的数据库后台就是Postgresql+Postgis

例:想查找蓝色多边形内的点,mysql空间扩展仅能查出在最小外包矩形(红色框)内的点,而postgis能查出任意多边形内的点。

pic

例:想查找两点间距离。MySQL Spatial仅能计算欧式空间距离,而PostGIS能计算不同投影坐标系下的真实空间距离

PostGIS不仅支持geometry,geography也支持geohash

PostGIS虽然不推荐使用geohash,但是它内置了转换函数,可以将geometry转换为geohash

Name

ST_GeoHash — Return a GeoHash representation of the geometry.  

Synopsis

text ST_GeoHash(geometry geom, integer maxchars=full_precision_of_point);  

Description

Return a GeoHash representation (http://en.wikipedia.org/wiki/Geohash) of the geometry. A GeoHash encodes a point into a text form that is sortable and searchable based on prefixing. A shorter GeoHash is a less precise representation of a point. It can also be thought of as a box, that contains the actual point.

If no maxchars is specified ST_GeoHash returns a GeoHash based on full precision of the input geometry type. Points return a GeoHash with 20 characters of precision (about enough to hold the full double precision of the input). Other types return a GeoHash with a variable amount of precision, based on the size of the feature. Larger features are represented with less precision, smaller features with more precision. The idea is that the box implied by the GeoHash will always contain the input feature.

If maxchars is specified ST_GeoHash returns a GeoHash with at most that many characters so a possibly lower precision representation of the input geometry. For non-points, the starting point of the calculation is the center of the bounding box of the geometry.

Availability: 1.4.0

[Note]

ST_GeoHash will not work with geometries that are not in geographic (lon/lat) coordinates.

This method supports Circular Strings and Curves

Examples

SELECT ST_GeoHash(ST_SetSRID(ST_MakePoint(-126,48),4326));  
  
	 st_geohash  
----------------------  
 c0w3hf1s70w3hf1s70w3  
  
SELECT ST_GeoHash(ST_SetSRID(ST_MakePoint(-126,48),4326),5);  
  
 st_geohash  
------------  
 c0w3h  

参考

https://en.wikipedia.org/wiki/Geohash

http://postgis.net/docs/ST_GeoHash.html

http://www.cnblogs.com/LBSer/p/3629149.html

http://planet.postgis.net/

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
怎么设置阿里云服务器安全组?阿里云安全组规则详细解说
阿里云服务器安全组设置规则分享,阿里云服务器安全组如何放行端口设置教程
6380 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
3970 0
使用OpenApi弹性释放和设置云服务器ECS释放
云服务器ECS的一个重要特性就是按需创建资源。您可以在业务高峰期按需弹性的自定义规则进行资源创建,在完成业务计算的时候释放资源。本篇将提供几个Tips帮助您更加容易和自动化的完成云服务器的释放和弹性设置。
7615 0
阿里云服务器安全组设置内网互通的方法
虽然0.0.0.0/0使用非常方便,但是发现很多同学使用它来做内网互通,这是有安全风险的,实例有可能会在经典网络被内网IP访问到。下面介绍一下四种安全的内网互联设置方法。 购买前请先:领取阿里云幸运券,有很多优惠,可到下文中领取。
9325 0
windows server 2008阿里云ECS服务器安全设置
最近我们Sinesafe安全公司在为客户使用阿里云ecs服务器做安全的过程中,发现服务器基础安全性都没有做。为了为站长们提供更加有效的安全基础解决方案,我们Sinesafe将对阿里云服务器win2008 系统进行基础安全部署实战过程! 比较重要的几部分 1.
4994 0
腾讯云服务器 设置ngxin + fastdfs +tomcat 开机自启动
在tomcat中新建一个可以启动的 .sh 脚本文件 /usr/local/tomcat7/bin/ export JAVA_HOME=/usr/local/java/jdk7 export PATH=$JAVA_HOME/bin/:$PATH export CLASSPATH=.
2031 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,云吞铺子总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系统盘、创建快照、配置安全组等操作如何登录ECS云服务器控制台? 1、先登录到阿里云ECS服务器控制台 2、点击顶部的“控制台” 3、通过左侧栏,切换到“云服务器ECS”即可,如下图所示 通过ECS控制台的远程连接来登录到云服务器 阿里云ECS云服务器自带远程连接功能,使用该功能可以登录到云服务器,简单且方便,如下图:点击“远程连接”,第一次连接会自动生成6位数字密码,输入密码即可登录到云服务器上。
16300 0
+关注
德哥
公益是一辈子的事, I&#39;m digoal, just do it.
2153
文章
245
问答
来源圈子
更多
阿里云数据库:帮用户承担一切数据库风险,给您何止是安心!支持关系型数据库:MySQL、SQL Server、PostgreSQL、PPAS(完美兼容Oracle)、自研PB级数据存储的分布式数据库Petadata、自研金融级云数据库OceanBase支持NoSQL数据库:MongoDB、Redis、Memcache更有褚霸、丁奇、德哥、彭立勋、玄惭、叶翔等顶尖数据库专家服务。
+ 订阅
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载