文档数据库位置查询

时间:2016-02-07 03:44:13

标签: geospatial azure-cosmosdb

我的数据看起来像这样:

    {
  "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

结果总是空的。我想知道是否有人可以让我知道可能有什么问题?

1 个答案:

答案 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