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.