返回介绍

2.1 地理数据

发布于 2024-10-03 10:53:59 字数 9861 浏览 0 评论 0 收藏 0

狭义的地理编码是指将地址或地名描述转换为地球表面上相应位置的功能,比如北京这个地名,它被地理编码后的经纬度坐标为(东经 116°20′、北纬 39°56′),其逆向地理编码是将坐标(东经 116°20′、北纬 39°56′)转化为北京这个地名。广义的地理编码应包含二进制、文本、矢量、图像等 多种形式表示的地物实体到位置坐标的转换。

地理编码不仅有字符集编码的技术特征,更有位置编码的特征。

GNSS 全球导航卫星系统

GNSS 的全称是:Global Navigation Satellite System。它是所有在轨工作的卫星导航定位系统的总称包括 GPS、俄罗斯的 GLONASS、欧盟的 Galileo 和中国的 COMPASS(北斗)。

地理可视化技术核心要素:

  1. 地理单元选择
  2. 坐标系选择
  3. BBox/Zoom level
  4. 图层管理
  5. 元素管理

mapviewleafletR notebook 是地图交互式分析最好用的三个工具。

在一个 R notebook chunk 中将 sf 对象通过 mapview 直接可视化,再通过 leaflet 进行图层叠加与拓展。

地理单元

通过空间划分,建立数据库索引可以实现高效的实时查询服务,比如周边车辆位置查询,周边餐厅位置查询等。

传统的空间划分方法主要分为两类:

  • 动态单元:比如 R-tree 。动态单元通常应用于对精度要求苛刻的场景,比如共享单车的违停区域判罚。
  • 静态单元:比如 S2, H3, Geohash 。Geohash 简单来说是将二维的经纬度转换成字符串的四叉树线性索引,适用于点数据,查询时间复杂度为 O(log(N))。

表格 动态单元和静态单元比较

对比维度动态单元 / R-tree静态单元 / Geohash
实现难度
邻近搜索
水平扩张
索引精度

表格 常用地理单元方法比较

方法特点厂家
H3美观、等面积、等形状、NormlizedUber
S2层次丰富、精度高Google
geohash成熟实现、各端 SDK 齐全-
R-tree  

其中,H3 最适用于机器学习场景,避免了地理单元因为面积、形状不一致带来的统计指标的偏差。geohash 在北京和深圳的面积误差就非常严重。

Uber H3

官网 uber/h3: Hexagonal hierarchical geospatial indexing system (github.com)

H3 是由 Uber 开源的一个六边形分层索引网格系统。H3 的前身其实是 DDGS(Discrete global grid systems) 中的 ISEA3H,其原理是把无限的不规则但体积相等的六棱柱从二十面体中心延伸,这样任何半径的球体都会穿过棱镜形成相等的面积 cell,基于该标准使得每一个地理单元的面积大小就可以保证几乎相同。

然而原生的 ISEA3H 方案在任意级别中都存在 12 个五边形,H3 的主要改进是通过坐标系的调整将其中的五边形都转移到水域上,这样就不影响大多数业务的开展。

H3 是一种基于网格的空间索引,但跟普通的矩形网格索引不同的是,他的每一个网格都是正六边形。为啥要选正六边形呢,因为在基于网格的空间索引中, 使用的多边形的边数越多,则一个网格越近似圆形,做缓冲区查询、kNN 查询什么的也就越方便。而做网格索引又要求空间能够被网格铺满,不能有缝隙。

Google S2

S2 其实是来自几何数学中的一个数学符号 S²,它表示的是单位球。S2 这个库其实是被设计用来解决球面上各种几何问题的。

Geohash

GeoHash 是一种地址编码,它能把二维的经纬度编码成一维的字符串。

GeoHash 是由 Gustavo Niemeyer 提出的,目的原本是为地球上的每一个点(根据经纬度)确定一条短的 URL 作为唯一标识。只是后来被广泛的应用到空间检索方面。 GeoHash 所做的事就是把一个坐标点映射到一个字符串上,每一个字符串代表的就是一个以经纬度划分的矩形区域。Geohash 是一种分级的数据结构, 把空间划分为网格。Geohash 属于空间填充曲线中的 Z 阶曲线( Z-order curve )的实际应用。

优点

首先,GeoHash 用一个字符串表示经度和纬度两个坐标。某些情况下无法在两列上同时应用索引 (例如 MySQL 4 之前的版本,Google App Engine 的数据层等),利用 geohash,只需在一列上应用索引即可。

其次,GeoHash 表示的并不是一个点,而是一个矩形区域。比如编码 wx4g0ec19,它表示的是一个矩形区域。 使用者可以发布地址编码,既能表明自己位于北海公园附近,又不至于暴露自己的精确坐标,有助于隐私保护。

第三,编码的前缀可以表示更大的区域。例如 wx4g0ec1,它的前缀 wx4g0e 表示包含编码 wx4g0ec1 在内的更大范围。 这个特性可以用于附近地点搜索。首先根据用户当前坐标计算 geohash(例如 wx4g0ec1)然后取其前缀进行查询 (SELECT * FROM place WHERE geohash LIKE 'wx4g0e%'),即可查询附近的所有地点。Geohash 比直接用经纬度的高效很多。

存在问题

GeoHash 的原理就是按照区域,把经纬度进行编码,按照不同的网格精度,变成不同位数的编码,在同一区域中的编码相同。

  • 问题 1:不同精度下网格的形状不一(长方形和矩形)且精度的变化幅度时小时大

  • 问题 2:在不同纬度的地区会出现地理单元单位面积差异较大的情况:在国际化业务中会表现特别明显,比如北京和新加坡的 geohash 对应面积有将近 30% 的差异。这导致业务指标和模型输入的特征存在一定的分布倾斜和偏差。

  • 问题 3:存在 8 邻域到中心网格的距离不相等的问题

R-tree

R-tree 简单来说是将空间划分为若干个不规则的边界框矩形的 b + 树索引,适用于面、线数据,查询时间复杂度为 O(n)。

空间编码语言

空间数据编码语言有 WKT、GML、GeoJSON 等,用于空间信息数据的存储、表达与交换等。

国际组织有 开放式地理信息系统协会 OGC (Open GIS Consortium)、ISO 等。 OGC 由许多私人公司、政府机构、学术团体咨询机构组成的一个国际性会员组织,致力于地理空间数据与地理处理标准的开发,其首要任务是建立一个开放式的地 理数据互操作规范。

表格 常见空间编码语言列表

编码格式英文全名制定组织或维护者简介
WKTWell-known textOGC空间数据 ASCII 文本表示语言,用于表示矢量几何对象、空间参照系统及空间参照系统之间的转换。
WKBWell-known binaryOGC空间数据的 binary 二进制表示语言,解决了 WKT 表达方式冗余的问题,便于传输和在数据库中存储相同的信息。
GMLGeographic Markup LanguageOGCXML(标准通用标记语言的子集)格式,用来表达地理信息要素。它提供一个表达地理信息要素的语言模型,同时可以用来在 Internet 上进行数据交换,由 xml 扩展而来。
GeoJSON  GeoJSON 对象可以表示几何、特征或者特征集合。
TopoJSON D3 作者 Mike BostockGeoJSON 按拓扑学编码后的扩展形式。TopoJSON 中的每一个几何体都是通过将共享边(被称为 arcs)整合后组成的。TopoJSON 拓扑表示共享一个称为弧的位置序列的一个或多个几何。因此,其文件比 GeoJSON 小。
KMLKeyhole Markup LanguageGoogle 旗下 Keyhole 公司 --> OGC一种基于 XML 的标记语言,利用 XML 语法格式描述地理空间数据(如点、线、面、多边形和模型等),适合网络环境下的地理信息协作与共享。2008 年 4 月,KML 的最新版本 2.2 被 OGC 宣布为开放地理信息编码标准,并改由 OGC 维护和发展。

GeoJSON

GeoJSON 是一种对各种地理数据结构进行编码的格式,基于 Javascript 对象表示法(JavaScript Object Notation, 简称 JSON) 的地理空间信息数据交换格式。GeoJSON 对象可以表示几何、特征或者特征集合。GeoJSON 支持下面几何类型:Point(点)、 LineString(线)、Polygon(面)、多点、多线、多面和几何集合。

GeoJSON 里的特征包含一个几何对象和其他属性,特征集合表示一系列特征。一个完整的 GeoJSON 数据结构总是一个(JSON 术语里的)对象。

  • GeoJSON 对象可能有任何数目成员(名/值对)。
  • GeoJSON 对象必须有一个名字为"type"的成员。这个成员的值是由 GeoJSON 对象的类型所确定的字符串。不同的 type 会有不同的 coordinates 值。
  • type 成员的值必须是下面之一:"Point", "MultiPoint", "LineString", "MultiLineString", "Polygon", "MultiPolygon", "GeometryCollection", "Feature", 或者 "FeatureCollection"。
  • GeoJSON 对象可能有一个可选的"crs"成员,它的值必须是一个坐标参考系统的对象。
  • GeoJSON 对象可能有一个"bbox"成员,它的值必须是边界框数组。

中国国家地图 geojson 文件示例:

{
    "type": "FeatureCollection",
    "crs": {
        "type": "name",
        "properties": {
            "name": "urn:ogc:def:crs:OGC:1.3:CRS84"
        }
    },
    "features": [
        {
            "type": "Feature",
            "properties": {
                "ISO": "CN-65",
                "NAME_1": "新疆"    # 修改此处
            },
            "geometry": {
                "type": "Polygon",
                "coordinates": [[
                    [77.88313195800004,35.431068420000048],...]
                ]]
             }
        }
    ]
}

坐标系

坐标术语

SRS:spatial reference system 空间参考系统

CRS:coordinate reference system 坐标参考系统

GCS(Geographic Coordinate Systems):地理坐标系统

GEOCCS:地心坐标系统

GEOGCS:地理坐标系统

PROJCS:投影坐标系统

表格 各种坐标系比较

地标系名简介备注
WGS-84World Geodetic System,地心坐标系,GPS 原始坐标体系。坐标原点为地球质心,其地心空间直角坐标系的 Z 轴指向国际时间局(BIH)1984.0 定义的协议地极(CTP)方向,X 轴指向 BIH1984.0 的协议子午面和 CTP 赤道的交点,Y 轴与 Z 轴、X 轴垂直构成右手坐标系,称为 1984 年世界大地坐标系。这是一个国际协议地球参考系统 (ITRS),是目前国际上统一采用的大地坐标系。GPS 广播星历是以 WGS-84 坐标系为根据的。
WGS84 Web 墨卡托2005 年谷歌在谷歌地图中首次使用的。属于投影坐标系。如今主流的 Web 地图几乎都是使用的 Web 墨卡托,如国外的 Google Maps,OpenStreetMap,Bing Map,ArcGIS 和 Heremaps 等,国内的百度地图、高德地图、腾讯地图和天地图等也是基于 Web 墨卡托。
GCJ-02GCJ-国测局,国测局坐标,火星坐标系。国测局 02 年发布的坐标体系,它是一种对经纬度数据的加密算法,即加入随机的偏差。加密后的坐标也常被大家称为“火星坐标系统”。
CGCS2000China Geodetic Coordinate System,中国大地坐标系2000 国家大地坐标系是全球地心坐标系在我国的具体体现,其原点为包括海洋和大气的整个地球的质量中心。天地图使用了 CGCS2000。
BD-09百度坐标系百度中国地图所采用的坐标系,由 GCJ-02 进行进一步的偏移算法得到。

备注:1. 中国使用过的坐标系有:北京 54 坐标系,西安 80 坐标系。如今 CGCS2000 已成为新的国家标准。

  1. 互联网地图在国内必须至少使用 GCJ-02 进行首次加密,不允许直接使用 WGS-84 坐标下的地理数据,同时任何坐标系均不可转换为 WGS-84 坐标。国内几个地图服务商的坐标系基本上延用 GCJ-02 或基于 GCJ-02 进行进一步的偏移算法得到。GCJ-02 偏移的如百度、搜狗和图吧, GCJ-02 直接使用的如高德。

表格 各地图服务商比较

地国坐标系中国/外国引入方式
高德地图国内 GCJ02目前只支持国内除了本身的 freamework 包之外还需引入多个系统类库。
百度国内 BMK09LL 和 BMK09MC,国外 WGS84全球。国内外看到的数据一致。同上
苹果国内 GCJ02,国外 WGS84全球。国外没限制,国内不可看国外数据。只需引入 2 个系统类库,CoreLocation 和 Mapkit
谷歌WGS84全球。但国内目前无法使用 SDK,只能使用 WEB 
MapboxWGS84全球。但国内访问略慢。只需引入一个 Mapbox.framework 类库即可。

备注:

坐标系转换示例(R 语言实现,以北京亮马桥地铁站位置为例)

# 经纬度转化:国测局坐标系(GCJ-02)、地球坐标 (WGS84) 和 百度坐标 (BD-09)
geogcj = data.frame(lat=39.949958,lng=116.46343)
geowgs = geoChina::gcj2wgs(39.949958, 116.46343)
geobd = geoChina::gcj2bd(39.949958, 116.46343)

leaflet.mapbox::leafletMapbox(access_token=MAPBOX_TOKEN) %>%
 addCircleMarkers(lat = geogcj$lat,lng = geogcj$lng,color = "red") %>%
 addCircleMarkers(lat = geowgs$lat,lng = geowgs$lng,color = "green") %>%
 addCircleMarkers(lat = geobd$lat,lng = geobd$lng,color = "blue") %>%
 # leafletCN::amap()
 leaflet.mapbox::addMapboxTileLayer(mapbox.classicStyleIds$dark)

REmap::remapB(markPointData = data.frame(a=c("gcj","wgs","bd"),
color=c("red","green","blue")),color = "Blue",geoData = geogcj %>%
rbind(geowgs) %>%
rbind(geobd) %>%
select(lon = lng,lat= lat) %>%
cbind(city=c("gcj","wgs","bd")))

国家及城市代码

ISO3316 为标准国家及城市代码,如 ISO-3166-2:CN 为中国省份代码,(e.g. CN-91 -> CN-HK ) 已经支持用 2 个字母替代 2 个数字,但仍兼容数字。

国家代码(Country codes, cc) 支持以下四种类型,

  • ccn: 国家代码数值
  • cca2: 国家代码 2 个字母
  • cca3: 国家代码 3 个字母
  • name: 使用英文简称,如 cn 是中国。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文