我的数据如下所示:
{
"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结果总是空的。我想知道有人能不能让我知道可能出了什么问题?
发布于 2016-02-07 13:20:40
我怀疑你刚刚把逻辑和纬度转换了。因为如果我将文档更改为:
"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 * 1000https://stackoverflow.com/questions/35249478
复制相似问题