文档数据库位置查询
Document DB Location Query
我的数据看起来像这样:
{
"id": "a06b42cf-d130-459a-8c89-dab77966747c",
"propertyBag": {
"Fixed": {
"address": {
"locationName": "",
"addressLine1": "1 Microsoft Way",
"addressLine2": null,
"city": "Redmond",
"postalCode": "98052",
"subDivision": null,
"state": "WA",
"country": "USA",
"location": {
"type": "Point",
"coordinates": [
47.640049,
-122.129797
]
}
},
}
}
}
现在当我尝试查询这样的东西时
SELECT * FROM V v
WHERE ST_DISTANCE(v.propertyBag.Fixed.address.location, {
"type": "Point",
"coordinates": [47.36, -122.19]
}) < 100 * 1000
结果总是空的。我想知道是否有人可以告诉我可能有什么问题?
我怀疑你只是调换了经度和纬度。因为如果我将文档更改为:
"location": {
"type": "Point",
"coordinates": [-122.129797, 47.640049]
}
我 运行 这个查询:
SELECT
ST_DISTANCE(v.propertyBag.Fixed.address.location, {
"type": "Point",
"coordinates": [-122.19, 47.36]
})
FROM v
我得到了一个结果,但是如果我运行按照你显示的方式,我没有得到任何结果。
在 GeoJSON 中,点是用 [longitude, latitude] 指定的,以使其符合我们通常期望的 x 是东西方向,y 是南北方向。不幸的是,这与显示 GEO 坐标的传统方式相反。
-122 不是有效的纬度值。纬度的范围是 -90 到 +90。经度指定为 -180 到 +180。
如果您的数据库已经填充并且您不想迁移它,那么您可以在查询期间使用用户定义的函数 (UDF) 来修复它,但我强烈建议通过这种方法进行迁移,因为地理空间索引将无法像您现在那样工作,因此您的查询会慢得多。
同样,除非 GEO 索引不重要,否则我不推荐这样做,但这里有一个 swapXY
UDF 可以进行交换:
function(point) {
return {
type: "Point",
coordinates: [point.coordinates[1], point.coordinates[0]]
};
}
您在这样的查询中使用它:
SELECT * FROM v
WHERE
ST_DISTANCE(
udf.swapXY(v.propertyBag.Fixed.address.location),
udf.swapXY({
"type": "Point",
"coordinates": [47.36, -122.19]
})
) < 100 * 1000
我的数据看起来像这样:
{
"id": "a06b42cf-d130-459a-8c89-dab77966747c",
"propertyBag": {
"Fixed": {
"address": {
"locationName": "",
"addressLine1": "1 Microsoft Way",
"addressLine2": null,
"city": "Redmond",
"postalCode": "98052",
"subDivision": null,
"state": "WA",
"country": "USA",
"location": {
"type": "Point",
"coordinates": [
47.640049,
-122.129797
]
}
},
}
}
}
现在当我尝试查询这样的东西时
SELECT * FROM V v
WHERE ST_DISTANCE(v.propertyBag.Fixed.address.location, {
"type": "Point",
"coordinates": [47.36, -122.19]
}) < 100 * 1000
结果总是空的。我想知道是否有人可以告诉我可能有什么问题?
我怀疑你只是调换了经度和纬度。因为如果我将文档更改为:
"location": {
"type": "Point",
"coordinates": [-122.129797, 47.640049]
}
我 运行 这个查询:
SELECT
ST_DISTANCE(v.propertyBag.Fixed.address.location, {
"type": "Point",
"coordinates": [-122.19, 47.36]
})
FROM v
我得到了一个结果,但是如果我运行按照你显示的方式,我没有得到任何结果。
在 GeoJSON 中,点是用 [longitude, latitude] 指定的,以使其符合我们通常期望的 x 是东西方向,y 是南北方向。不幸的是,这与显示 GEO 坐标的传统方式相反。
-122 不是有效的纬度值。纬度的范围是 -90 到 +90。经度指定为 -180 到 +180。
如果您的数据库已经填充并且您不想迁移它,那么您可以在查询期间使用用户定义的函数 (UDF) 来修复它,但我强烈建议通过这种方法进行迁移,因为地理空间索引将无法像您现在那样工作,因此您的查询会慢得多。
同样,除非 GEO 索引不重要,否则我不推荐这样做,但这里有一个 swapXY
UDF 可以进行交换:
function(point) {
return {
type: "Point",
coordinates: [point.coordinates[1], point.coordinates[0]]
};
}
您在这样的查询中使用它:
SELECT * FROM v
WHERE
ST_DISTANCE(
udf.swapXY(v.propertyBag.Fixed.address.location),
udf.swapXY({
"type": "Point",
"coordinates": [47.36, -122.19]
})
) < 100 * 1000