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 服务。