Azure Cosmos DB for NoSQL 中的地理空间和 GeoJSON 位置数据

适用范围: NoSQL

Azure Cosmos DB for NoSQL 具有内置的地理空间功能,用于表示地图上的几何形状或实际位置/多边形。

地理空间数据通常涉及邻近查询。 例如,使用针对多个地理空间数据对象的邻近查询来回答“查找当前位置附近的所有零售店位置”问题。

常见的地理空间用例包括但不限于:

  • 地理位置分析,用于推动特定基于位置的市场营销计划。
  • 基于位置的个性化,适用于零售和医疗保健等行业,以改善用户体验。
  • 物流增强,适用于运输等优化至关重要的行业。
  • 风险分析,适用于保险和金融等行业,以补充其他元数据。
  • 态势感知*,用于发出基于临近位置的警报和通知。

空间数据简介

空间数据用于描述空间中对象的位置和形状。 在大部分应用程序中,这些点和形状会对应于地球上的对象和地理空间数据。 空间数据可以用来表示人、名胜古迹、城市边界或湖泊所处的位置。

Azure Cosmos DB for NoSQL 支持两种空间数据类型:几何数据类型和 地理 数据类型。

  • Geometry 类型表示欧几里得(平面)坐标系中的数据。 此类型适用于常见的几何任务,如测量直线、多边形相交和测量点间距离。
  • Geography 类型表示圆形地球坐标系中的数据。 此类型适用于常见的地理任务,例如确定某个位置是否在特定边界内,以及测量位置之间的距离。

支持的数据类型

Azure Cosmos DB for NoSQL 支持对使用 GeoJSON 规范表示的地理空间点数据进行索引编制和查询。 GeoJSON 数据结构永远是有效的 JSON 对象,因此可以通过 Azure Cosmos DB 来存储和查询,无需任何专用的工具或库。

Azure Cosmos DB 支持以下空间数据类型:

  • Point
  • LineString
  • 多边形
  • MultiPolygon

Point(点)

代表空间中的单一位置。 在地理空间数据中,某个点所代表的确切位置可能是杂货店、电话亭、汽车或城市的街道地址。 点使用其坐标对(度,以 GeoJSON 格式(和 Azure Cosmos DB for NOSQL)表示。

请考虑此示例 GeoJSON 点。 经度为 -122.12826822304672 ,纬度为 47.63980239335718

{
  "type": "Point",
  "coordinates": [
    -122.12826822304672,
    47.63980239335718
  ]
}

提示

对于 geography 数据类型,GeoJSON 规范先指定经度,再指定纬度。 与其他地图应用程序一样,经度和纬度为角度,并以度为单位表示。 经度值从本初子午线测量,并介于 -180 度和 180.0 之间;纬度值从赤道测量,并介于 -90.0 度和 90.0 度之间。

对于几何 数据类型,GeoJSON 规范首先指定水平轴,然后指定垂直轴。

空间数据类型可以嵌入到项中,如本包含 GeoJSON 数据的设施项示例所示。

{
  "name": "Headquarters",
  "location": {
    "type": "Point",
    "coordinates": [
      -122.12826822304672,
      47.63980239335718
    ]
  },
  "category": "business-offices"
}

Azure Cosmos DB for NoSQL 会将坐标解释为按照 WGS-84 参考系统表示。 有关详细信息,请参阅坐标参考系统

LineString

LineString 表示空间中一连串的点(两个或更多个)以及连接这些点的线段。 在地理空间数据中,LineString 通常用来表示高速公路或河流。

在此示例中,线条字符串用于表示在两个点之间绘制的线条。

{
  "type": "LineString",
  "coordinates": [
    [ 31.8, -5 ],
    [ 31.8, -4.7 ]
  ]
}

Polygon(多边形)

多边形 是形成闭合的 LineString 的相连接的点的边界。 多边形通常用来表示自然构成物(例如湖泊),或表示政治管辖权(例如省/市/自治区)。

多边形内的点必须以逆时针顺序指定。 以顺时针顺序指定的多边形表示其中的区域倒转。

在此示例中,会通过连接多个点创建多边形。

{
    "type":"Polygon",
    "coordinates":[ [
        [ 31.8, -5 ],
        [ 32, -5 ],
        [ 32, -4.7 ],
        [ 31.8, -4.7 ],
        [ 31.8, -5 ]
    ] ]
}

提示

GeoJSON 规范需要此数据才能形成有效的多边形;若要创建一个闭合的形状,最后一个坐标对应该与第一个坐标对相同。

MultiPolygon

MultiPolygon 是包含零个或多个多边形的数组。 各个 MultiPolygon 的边不能重叠,也不能具有任何公共区域。 它们的一个或多个点可以接触。

以下为 MultiPolygon 的示例。

{
    "type":"MultiPolygon",
    "coordinates":[[[
            [52.0, 12.0],
            [53.0, 12.0],
            [53.0, 13.0],
            [52.0, 13.0],
            [52.0, 12.0]
        ]],
        [[
            [50.0, 0.0],
            [51.0, 0.0],
            [51.0, 5.0],
            [50.0, 5.0],
            [50.0, 0.0]
        ]]]
}

坐标参考系统

由于地球的形状不规则,地理空间数据的坐标可以用许多坐标参考系统 (CRS) 来表示。 每个 CRS 都有自己的参照系和度量单位。 例如,“英国国家网格”对英国而言是非常精确的参考系统,但对其他地区则不是。

现今最常使用的 CRS 是世界测地系统 WGS-84。 GPS 设备和许多地图服务(包括谷歌地图和必应地图 API)均使用 WGS-84。 Azure Cosmos DB for NoSQL 仅支持对使用 WGS-84 CRS 的地理空间数据进行索引编制和查询。

创建包含空间数据的项目

创建包含 GeoJSON 值的项时,系统会自动使用空间索引为它们编制索引。 此默认索引根据容器的索引策略进行。 如果未指定,默认索引策略将准确地为 GeoJSON 数据编制索引。 如果以动态类型化语言(如 Python 或 Node.js)使用 SDK,则必须创建有效的 GeoJSON。

var userProfileitem = {
    "id": "aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb",
    "location":{
        "type":"Point",
        "coordinates":[ -122.12, 47.66 ]
    }
};

client.createitem(`dbs/${databaseName}/colls/${collectionName}`, userProfileitem, (err, created) => {
    // additional code within the callback
});

如果没有经纬度信息,但有物理地址或位置名称,请使用联机服务来查找实际坐标。 必应地图等服务可帮助从已知位置名称中查找实际地理数据。 有关必应地图地理编码的详细信息,请参阅 必应地图 REST 服务