我的数据看起来像这样:
{
"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
结果总是空的。我想知道是否有人可以让我知道可能有什么问题?
答案 0 :(得分:1)
我怀疑你只是调整了逻辑和纬度。因为如果我将文档更改为:
"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中,使用[经度,纬度]指定点,使其与我们对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