O serviço de pesquisa do Couchbase está introduzindo recursos de consulta e indexação geoespacial de maior dimensão com a versão 7.1.2 do Couchbase Server.
Até esse novo recurso, o serviço Search estava limitado à indexação de campos de geoponto/localização unidimensionais. As consultas eram limitadas a consultas de delimitação como point-distance, bounded-rectangle e bounded-polygon em relação ao campo de geoponto indexado. Mas sabemos que os geopontos sozinhos não são eficazes para representar os vários detalhes espaciais de formas ou estruturas da vida real.
O suporte a essas estruturas espaciais de dimensões mais altas permite que os usuários aproximem uma grande variedade de formas da vida real, como limites de regiões postais ou jurisdicionais, rotas de veículos de entrega ou de uma companhia aérea ou os limites de vários corpos d'água, como rios, lagos, riachos etc.
O serviço de pesquisa agora oferecerá suporte ao GeoJSON formatos de dados espaciais em geodésicas esféricas nesta versão. Isso permite que os usuários abordem casos de uso, como encontrar todos os documentos com qualquer forma GeoJSON:
-
- contêm a forma da consulta
- residem no formato da consulta
- interseção com a forma de consulta
As formas GeoJSON compatíveis são:
Além das formas acima, o Search também suporta algumas formas personalizadas adicionais para facilitar as aproximações espaciais para os usuários. As formas adicionais suportadas são:
-
- Círculo
- Envelope
Os novos tipos de GeoJSON
Vamos dar uma olhada rápida em todos esses vários tipos de formas.
Todas as geometrias simples no GeoJSON consistem em um tipo e uma coleção de coordenadas.
Ponto
O seguinte especifica um GeoJSON Ponto em um documento:
1 2 3 4 |
{ "tipo": "Ponto", "coordenadas": [75.05687713623047,22.53539059204079] } |
Um ponto é uma coordenada geográfica única, como a localização de um edifício ou a posição atual fornecida por qualquer API de geolocalização.
Observação : O padrão suporta apenas uma única maneira de especificar as coordenadas, como um formato de matriz de longitude seguida de latitude, ou seja: [lng, lat].
Cadeia de linhas
O seguinte especifica um GeoJSON Cadeia de linhas em um documento:
1 2 3 4 5 6 7 |
{ "tipo": "LineString", "coordenadas": [ [ 77.01416015625, 23.0797317624497], [ 78.134765625, 20.385825381874263] ] } |
Uma linestring é definida por uma matriz de duas ou mais posições. Ao especificar apenas dois pontos, a linha de referência representará uma linha reta. A especificação de mais de dois pontos cria um caminho arbitrário.
Polígono
O seguinte especifica um GeoJSON Polígono em um documento:
1 2 3 4 5 6 7 8 9 |
{ "tipo": "Polígono", "coordenadas": [ [ [ 85.605, 57.207], [ 86.396, 55.998], [ 87.033, 56.716], [ 85.605, 57.207] ] ] } |
Um polígono é definido por uma lista de uma lista de pontos. O primeiro e o último pontos em cada lista (externa) devem ser os mesmos (ou seja, o polígono deve ser fechado). E as coordenadas externas devem estar em Sentido anti-horárior (CCW) em um polígono.
Também há suporte para polígonos com furos. Os furos devem seguir No sentido horário Pedido para os vértices do limite.
Para polígonos com um único anel, o anel não pode se autointersectar.
OBSERVAÇÃO: A ordem CCW dos vértices é estritamente obrigatória para os geoshapes na versão 7.1.2 do Couchbase Server e qualquer violação desse requisito resultaria em resultados de pesquisa inesperados.
MultiPoint
O seguinte especifica um GeoJSON Multiponto em um documento:
1 2 3 4 5 6 7 8 9 |
{ "tipo": "MultiPoint", "coordenadas": [ [ -115.8343505859375, 38.45789034424927], [ -115.81237792968749, 38.19502155795575], [ -120.80017089843749, 36.54053616262899], [ -120.67932128906249, 36.33725319397006] ] } |
MultiLineString
O seguinte especifica um GeoJSON MultiLineString em um documento:
1 2 3 4 5 6 7 8 |
{ "tipo": "MultiLineString", "coordenadas": [ [ [ -118.31726074, 35.250105158],[ -117.509765624, 35.3756141] ], [ [ -118.6962890, 34.624167789],[ -118.317260742, 35.03899204] ], [ [ -117.9492187, 35.146862906], [ -117.6745605, 34.41144164] ] ] } |
Multipolígono
O seguinte especifica um GeoJSON Multipolígono em um documento:
1 2 3 4 5 6 7 8 9 10 |
{ "tipo": "MultiPolygon", "coordenadas": [ [ [ [ -73.958, 40.8003 ], [ -73.9498, 40.7968 ], [ -73.9737, 40.7648 ], [ -73.9814, 40.7681 ], [ -73.958, 40.8003 ] ] ], [ [ [ -73.958, 40.8003 ], [ -73.9498, 40.7968 ], [ -73.9737, 40.7648 ], [ -73.958, 40.8003 ] ] ] ] } |
GeometryCollection (Coleção de geometria)
O seguinte especifica um GeoJSON GeometryCollection (Coleção de geometria) em um documento:
Uma GeometryCollection tem um membro com o nome "geometries". O valor de "geometries" é uma matriz. Cada elemento dessa matriz é um objeto GeoJSON Geometry. É possível que essa matriz esteja vazia.
Diferentemente dos outros tipos de geometria descritos acima, uma GeometryCollection pode ser uma composição heterogênea de objetos Geometry menores. Por exemplo, um objeto Geometry com a forma de um "i" romano minúsculo pode ser composto de um ponto e uma LineString.
As GeometryCollections aninhadas são inválidas.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
{ "tipo": "GeometryCollection" (Coleção de geometria), "geometries" (geometrias): [ { "tipo": "MultiPoint", "coordenadas": [ [ -73.9580, 40.8003 ], [ -73.9498, 40.7968 ], [ -73.9737, 40.7648 ], [ -73.9814, 40.7681 ] ] }, { "tipo": "MultiLineString", "coordenadas": [ [ [ -73.96943, 40.78519 ], [ -73.96082, 40.78095 ] ], [ [ -73.96415, 40.79229 ], [ -73.95544, 40.78854 ] ], [ [ -73.97162, 40.78205 ], [ -73.96374, 40.77715 ] ], [ [ -73.97880, 40.77247 ], [ -73.97036, 40.76811 ] ] ] }, { "tipo" : "Polígono", "coordenadas" : [ [ [ 0 , 0 ] , [ 3 , 6 ] , [ 6 , 1 ] , [ 0 , 0 ] ], [ [ 2 , 2 ] , [ 3 , 3 ] , [ 4 , 2 ] , [ 2 , 2 ] ] ] } ] } |
Círculo
Se os usuários desejarem cobrir uma região circular sobre a superfície da Terra, poderão usar essa forma.
Um exemplo de forma circular é o seguinte.
1 2 3 4 5 |
{ "tipo": "círculo", "coordenadas": [75.05687713623047,22.53539059204079], "radius": "1000m" } |
O círculo é especificado sobre as coordenadas do ponto central junto com o raio.
Exemplos de formatos compatíveis com o radius são:
"5in" , "5inch" , "7yd" , "7yards", "9ft" , "9feet", "11km", "11kilometers", "3nm" "3nauticalmiles", "13mm" , "13millimeters", "15cm", "15centimeters", "17mi", "17miles", "19m" ou "19meters".
Se a unidade não puder ser determinada, a string inteira será analisada e a unidade de medidores é assumido.
Envelope
Tipo de envelope, que consiste em coordenadas para os pontos superior esquerdo e inferior direito da forma para representar um retângulo delimitador no formato [[minLon, maxLat], [maxLon, minLat]].
1 2 3 4 5 6 7 |
{ "tipo": "envelope", "coordenadas": [ [72.83, 18.979], [78.508,17.4555] ] } |
Indexação dos campos espaciais - novo geoforma tipo de campo
A pesquisa introduziu um tipo de campo chamado geoforma para representar as formas espaciais mencionadas anteriormente.
Se você tiver um campo chamado "geometry" (geometria) no documento que contenha as informações de forma geográfica aderentes ao formato geoJSON, primeiro poderá incluir o campo geoespacial nos mapeamentos de tipo na definição do índice, como abaixo.
Por fim, clique no botão Criar índice e você estará pronto para consultar seus dados geoespaciais.
Observação: O geoforma é capaz de indexar qualquer um dos tipos espaciais mencionados anteriormente, incluindo Point, LineString, Polygon, MultiPoint, MultiLineString, MultiPolygon, GeometryCollection, Circle e Envelope.
Consulta aos campos espaciais - nova consulta GeoShape
A pesquisa suporta principalmente três tipos de recursos de consulta espacial nesses tipos heterogêneos de formas geográficas indexadas.
Estrutura da consulta:
1 2 3 4 5 6 7 8 9 10 11 12 |
{ "query" (consulta): { "campo": " <> ", "geometria": { "forma": { "tipo": " <> ", "coordenadas": [[[ ]]] }, "relação": " <> " } } } |
Detalhes:
-
- shapeDesc - Pode ser qualquer um dos 9 tipos, como Point, LineString, Polygon, MultiPoint, MultiLineString, MultiPolygon, GeometryCollection, Circle e Envelope.
- relação - Pode ser qualquer um dos três tipos, como intersects, contains e within.
Relacionamento | Resultado |
INTERSECÇÕES | Retornar todos os documentos cujo espacial cruza a geometria da consulta. |
CONTÉM | Retornar todos os documentos cujo espacial contém a geometria da consulta |
DENTRO | Retornar todos os documentos cujo espacial está dentro da geometria da consulta. |
Vamos explorar alguns exemplos de consultas.
Um ponto contém consulta retorna todos os documentos correspondentes com formas que contêm o ponto fornecido na consulta:
1 2 3 4 5 6 7 8 9 10 11 12 |
{ "query" (consulta): { "campo": "<>", "geometria": { "forma": { "tipo": "ponto", "coordenadas": [75.05687713623047, 22.53539059204079] }, "relação": "contém" } } } |
lineString interseções consulta retorna todos os documentos correspondentes com formas que se cruzam com a linestring na consulta:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
{ "query" (consulta): { "campo": "<>", "geometria": { "forma": { "tipo": "linestring", "coordenadas": [ [77.01416015625, 23.079731762449878], [78.134765625, 20.385825381874263] ] }, "relação": "intersects" (interseções) } } } |
Polígono com consulta retorna todos os documentos correspondentes com formas que residem completamente dentro da área do polígono na consulta:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
{ "query" (consulta): { "campo": "<>", "geometria": { "forma": { "tipo": "polygon" (polígono), "coordenadas": [ [ [77.59012699127197, 12.959853852513307], [77.59836673736572, 12.959853852513307], [77.59836673736572, 12.965541604118611], [77.59012699127197, 12.965541604118611], [77.59012699127197, 12.959853852513307] ] ] }, "relação": "dentro" } } } |
Dicas adicionais
O serviço de pesquisa usa geodésicas ou geometria esférica para dar suporte aos recursos espaciais avançados. Isso significa que a curvatura da superfície da Terra é levada em conta durante a execução dos filtros espaciais. Tenha isso em mente ao observar quaisquer diferenças no alinhamento dos limites de uma determinada forma.
Esses recursos estão disponíveis para ajudá-lo a entender e validar as geometrias em seus dados de teste:
-
- Referência para o mapeador esférico - gcmap
- Referência para verificar as formas geojson - geojson.io
- Referência para validar a ordem dos vértices ou a exatidão do GeoJSON - geojsonlint