2016-02-07 2 views
0

Мои данные выглядит примерно так:Документ DB Расположение 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 

Результаты всегда пусты. Мне было интересно, может ли кто-нибудь угодить, дайте мне знать, что, возможно, неправильно?

ответ

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 -spacial indexes не будут работать так, как вы сейчас, и ваши запросы будут намного медленнее в результате.

Опять же, я не рекомендую это, если индекс 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