文档数据库位置查询

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