DocumentDB SQL - Função Espacial
O DocumentDB também oferece suporte às funções integradas do Open Geospatial Consortium (OGC) para consultas geoespaciais. A seguir está uma lista de funções espaciais integradas com suporte.
S.No. | Descrição da função |
---|---|
1 | ST_DISTANCE (point_expr, point_expr) Retorna a distância entre as duas expressões de ponto GeoJSON. |
2 | ST_WITHIN (point_expr, polygon_expr) Retorna uma expressão booleana indicando se o ponto GeoJSON especificado no primeiro argumento está dentro do polígono GeoJSON no segundo argumento. |
3 | ST_ISVALID Retorna um valor booleano que indica se o ponto GeoJSON ou expressão poligonal especificada é válida. |
4 | ST_ISVALIDDETAILED Retorna um valor JSON contendo um valor booleano se o ponto GeoJSON ou expressão poligonal especificada for válido e, se inválido, adicionalmente o motivo como um valor de string. |
Neste exemplo, usaremos os seguintes dois documentos de universidades que contêm a localização na forma de coordenadas.
A seguir está o Case University document.
{
"id": "case-university",
"name": "CASE: Center For Advanced Studies In Engineering",
"city": "Islamabad",
"location": {
"type": "Point",
"coordinates": [
33.7194136,
-73.0964862
]
}
}
A seguir está o Nust University document.
{
"id": "nust",
"name": "National University of Sciences and Technology",
"city": "Islamabad",
"location": {
"type": "Point",
"coordinates": [
33.6455715,
72.9903447
]
}
}
Vamos dar uma olhada em outro exemplo de ST_DISTANCE.
A seguir está a consulta que retorna o id e o nome dos documentos das universidades que estão a 30 km do local especificado.
SELECT u.id, u.name
FROM Universities u
WHERE ST_DISTANCE(u.location, {'type': 'Point', 'coordinates':[33.7, -73.0]}) < 30000
Quando a consulta acima é executada, ela produz a seguinte saída.
[
{
"id": "case-university",
"name": "CASE: Center For Advanced Studies In Engineering"
}
]
Vamos dar uma olhada em outro exemplo.
A seguir está a consulta que contém ST_ISVALID e ST_ISVALIDDETAILED.
SELECT
ST_ISVALID({ "type": "Point", "coordinates": [32.9, -132.8] }) AS Point1,
ST_ISVALIDDETAILED({ "type": "Point", "coordinates": [31.9, -132.8] }) AS Point2
Quando a consulta acima é executada, ela produz a seguinte saída.
[
{
"Point1": false,
"Point2": {
"valid": false,
"reason": "Latitude values must be between -90 and 90 degrees."
}
}
]
A saída acima mostra que ST_ISVALIDDETAILED também retorna a razão pela qual este ponto é inválido, mas ST_ISVALID retorna apenas o valor booleano.