Uso de funções de dados GeoJSON
A especificação GeoJson define a estrutura e o conteúdo de objetos JSON que supostamente representam formas geográficas na terra (chamadas geometrias). De acordo com a especificação GeoJson, para que um objeto JSON seja um objeto de geometria, ele deve ter dois campos chamados tipo e coordenadas, em que o valor do campo de tipo especifica o tipo de geometria e o valor das coordenadas deve ser um array cujos elementos definem a forma geométrica.
Todos os tipos de geometrias são especificados em termos de um conjunto de posições. No entanto, para cordas de linha e polígonos, a forma geométrica real é formada pelas linhas que conectam suas posições. A especificação GeoJson define uma linha entre dois pontos como a linha reta que conecta os pontos no sistema de coordenadas cartesianas (plano) cujos eixos horizontais e verticais são a longitude e a latitude, respectivamente.
Existem várias funções incorporadas que interpretam objetos JSON como geometrias e permitem pesquisar as linhas que contêm geometrias que satisfazem determinadas condições.
CREATE TABLE IF NOT EXISTS PointsOfInterest (
id INTEGER, poi JSON,
PRIMARY KEY(id));
Consulte Criando uma Tabela Singleton: Modo de Entrada DDL Avançada para obter as etapas de criação de uma tabela com uma instrução DDL.
Para carregar dados na tabela criada na console do OCI, clique no nome da tabela. Os detalhes da tabela são exibidos. Clique em Carregar Dados. Clique em selecionar arquivo para upload e forneça o arquivo JSON a ser submetido a upload. Você pode fazer download do arquivo DDL e JSON para os dados GeoJSON aqui.
Tópicos Relacionados
geo_inside
boolean geo_inside(any*, any*)
- O primeiro parâmetro
any*
pode ser qualquer objeto geométrico. - O segundo parâmetro
any*
precisa ser um polígono.
A função determina se a geometria apontada pelo primeiro parâmetro está completamente contida dentro do polígono apontado pelo segundo parâmetro.
Se qualquer um dos dois parâmetros não retornar um único objeto de geometria válido e se puder ser detectado em tempo de compilação, a função gerará um erro.
- Retorna falso se qualquer parâmetro retornar 0 ou mais de 1 item.
- Retorna NULL se qualquer parâmetro retornar NULL.
- Retorna falso se qualquer parâmetro (no runtime) retornar um item que não é um objeto de geometria válido.
- Retorna falso se o segundo parâmetro retornar um objeto de geometria que não seja um polígono.
- Se ambos os parâmetros retornarem um único objeto de geometria cada um e a segunda geometria for um polígono.
- Ele retorna verdadeiro se a primeira geometria estiver completamente contida dentro do segundo polígono, ou seja, todos os seus pontos pertencem ao interior do polígono.
- Caso contrário, ela retornará falso.
Observação:
O interior de um polígono é todos os pontos na área do polígono, exceto os pontos no anel linear que definem o limite do polígono.SELECT t.poi.name AS park_name,
t.poi.address.street AS park_location
FROM PointsOfInterest t
WHERE t.poi.kind = "nature park"
AND geo_inside(t.poi.location,
{ "type" : "polygon",
"coordinates": [[
[-120.1135253906249, 36.99816565700228],
[-119.0972900390625, 37.391981943533544],
[-119.2840576171875, 37.97451499202459],
[-120.2069091796874, 38.035112420612975],
[-122.3822021484375, 37.74031329210266],
[-122.2283935546875, 37.15156050223665],
[-121.5362548828124, 36.85325222344018],
[-120.1135253906249, 36.99816565700228]
]]
});
- Você consulta a tabela
PointsOfInterest
para filtrar as linhas de nature park. - Você especifica um polígono como o segundo parâmetro para a função
geo_inside
. - As coordenadas do polígono que você especificar correspondem às coordenadas da porção norte do estado da Califórnia nos EUA.
- A função
geo_inside
só retorna linhas quando a localização do parque natural está completamente contida dentro dos pontos de localização especificados.
{"park_name":"portola redwoods state park",
"park_location":"15000 Skyline Blvd"}
geo_intersect
boolean geo_intersect(any*, any*)
O primeiro e o segundo parâmetros any*
podem ser qualquer objeto geométrico.
A função determina se duas geometrias que são especificadas como parâmetros têm pontos em comum. Se qualquer um dos dois parâmetros não retornar um único objeto de geometria válido e se puder ser detectado em tempo de compilação, a função gerará um erro.
- Retorna falso se qualquer parâmetro retornar 0 ou mais de 1 item.
- Retorna NULL se qualquer parâmetro retornar NULL.
- Retorna falso se qualquer parâmetro (no runtime) retornar um item que não é um objeto de geometria válido.
Se ambos os parâmetros retornarem um único objeto de geometria cada, a função retornará verdadeiro se as 2 geometrias tiverem pontos em comum; caso contrário, falso.
Exemplo: A Texas está considerando regular o acesso ao abastecimento de água subterrânea. Um aquífero é uma camada subterrânea de rocha permeável portadora de água, fraturas de rocha ou materiais não consolidados. O governo quer impor novas regulamentações para locais que estão muito próximos de um aquífero.
SELECT t.poi.county AS County_needs_regulation,
t.poi.contact AS Contact_phone
FROM PointsOfInterest t WHERE
geo_intersect(
t.poi.location,
{
"type" : "polygon",
"coordinates": [
[
[-97.668457031249, 29.34387539941801],
[-95.207519531258, 29.19053283229458],
[-92.900390625653, 30.37287518811801],
[-94.636230468752, 32.21280106801518],
[-97.778320312522, 32.45415593941475],
[-99.799804687541, 31.18460913574325],
[-97.668457031249, 29.34387539941801]
]
]
}
);
- A consulta acima extrai os locais que se cruzam com a localização do aquífero. Ou seja, se as coordenadas de localização tiverem pontos em comum com a localização do aquífero.
- Você usa
geo_intersect
para ver se as coordenadas do local têm pontos comuns com as coordenadas do aquífero especificadas.
{"County_needs_regulation":"Tarrant","Contact_phone":"469 745 5687"}
{"County_needs_regulation":"Kinga","Contact_phone":"469 384 7612"}
geo_distance
double geo_distance(any*, any*)
O primeiro e o segundo parâmetros any*
podem ser qualquer objeto geométrico.
A função retorna a distância geodésica entre as duas geometrias de entrada. A distância retornada é o mínimo entre as distâncias de qualquer par de pontos onde o primeiro ponto pertence à primeira geometria e o segundo ponto à segunda geometria. Entre dois desses pontos, sua distância é o comprimento da linha geodésica que conecta os pontos.
Visão geral da linha geodésica
Uma linha geodésica entre 2 pontos é a linha mais curta que pode ser traçada entre os 2 pontos na superfície elipsoidal da terra. Para uma definição simplificada, mas mais ilustrativa, assuma por um momento que a superfície da Terra é uma esfera. Então, a linha geodésica entre dois pontos na terra é o arco menor entre os dois pontos no grande círculo correspondente aos pontos, ou seja, o círculo que é formado pela interseção da esfera e o plano definido pelo centro da terra e os dois pontos.
A figura a seguir mostra a diferença entre as linhas geodésicas e retas entre Los Angeles e Londres.
Se qualquer um dos dois parâmetros não retornar um único objeto de geometria válido e se puder ser detectado em tempo de compilação, a função gerará um erro.
- Retorna -1 se algum parâmetro retornar zero ou mais de 1 item.
- Retorna NULL se qualquer parâmetro retornar NULL.
- Retorna -1 se qualquer um dos parâmetros não for um objeto de geometria.
Observação:
Os resultados são classificados em ordem crescente por distância (exibindo a distância mais curta primeiro).SELECT
t.poi.name AS restaurant_name,
t.poi.address.street AS street_name,
geo_distance(
t.poi.location,
{
"type" : "point",
"coordinates": [-121.94034576416016,37.2812239247177]
}
) AS distance_in_meters
FROM PointsOfInterest t
WHERE t.poi.kind = "restaurant" ;
- Você consulta a tabela
PointsOfInterest
para filtrar as linhas do restaurante. - Você fornece o ponto de localização correto e determina a distância usando a função
geo_distance
.
{"restaurant_name":"Coach Sports Bar & Grill","street_name":"80 Edward St","distance_in_meters":799.2645323337218}
{"restaurant_name":"Ricos Taco","street_name":"80 East Boulevard St","distance_in_meters":976.5361117138553}
{"restaurant_name":"Effie's Restaurant and Bar","street_name":"80 Woodeard St","distance_in_meters":2891.0508307646282}
A distância entre a localização atual e o restaurante mais próximo é de 799 metros.
geo_within_distance
boolean geo_within_distance(any*, any*,double)
O primeiro e o segundo parâmetros any*
podem ser qualquer objeto geométrico.
A função determina se a primeira geometria está a uma distância de N metros da segunda geometria.
Se qualquer um dos dois parâmetros não retornar um único objeto de geometria válido e se puder ser detectado em tempo de compilação, a função gerará um erro.
- Retorna falso se qualquer parâmetro retornar 0 ou mais de 1 item.
- Retorna NULL se qualquer um dos dois primeiros parâmetros retornar NULL.
- Retorna falso se qualquer um dos dois primeiros parâmetros retornar um item que não é um objeto de geometria válido.
Finalmente, se ambos os parâmetros retornarem um único objeto de geometria cada, ele retornará verdadeiro se a primeira geometria estiver a uma distância de N metros da segunda geometria, onde N é o número retornado pelo terceiro parâmetro; caso contrário, falso. A distância entre 2 geometrias é definida como o mínimo entre as distâncias de qualquer par de pontos onde o primeiro ponto pertence à primeira geometria e o segundo ponto à segunda geometria. Se N for um número negativo, ele será definido como 0.
SELECT t.poi.address.street AS city_hall_address,
geo_distance(
t.poi.location,
{
"type" : "point",
"coordinates" : [-120.653828125,38.85682013474361]
}
) AS distance_in_meters
FROM PointsOfInterest t
WHERE t.poi.kind = "city hall" AND
geo_within_distance(
t.poi.location,
{
"type" : "point",
"coordinates" : [-120.653828125,38.85682013474361]
},
5000
);
- Você consulta a tabela
PointsOfInterest
para filtrar as linhas do city hall. - Você usa a função
geo_within_distance
para filtrar a prefeitura dentro de 5 km (5000m) do local fornecido. - Você também extrai a distância real entre sua localização e a prefeitura usando a função
geo_distance
.
{"city_hall_address":"70 North 1st street","distance_in_meters":1736.0144040331768}
A prefeitura fica a 1736 m (1,73 km) da localização atual.
geo_near
boolean geo_near(any*, any*, double)
O primeiro e o segundo parâmetros any*
podem ser qualquer objeto geométrico.
A função determina se a primeira geometria está a uma distância de N metros da segunda geometria.
Se qualquer um dos dois parâmetros não retornar um único objeto de geometria válido e se puder ser detectado em tempo de compilação, a função gerará um erro.
- Retorna falso se qualquer parâmetro retornar 0 ou mais de 1 item.
- Retorna NULL se qualquer um dos dois primeiros parâmetros retornar NULL.
- Retorna falso se qualquer um dos dois primeiros parâmetros retornar um item que não é um objeto de geometria válido.
Observação:
geo_near é convertido internamente em geo_within_distance mais uma ordem (implícita) pela distância entre as duas geometrias. No entanto, se a consulta já tiver uma ordem (explícita), nenhuma ordem por distância será executada. A função geo_near só pode aparecer na cláusula WHERE, em que deve ser um predicado de nível superior, ou seja, não aninhado em um operador OR ou NOT.SELECT
t.poi.name AS hospital_name,
t.poi.address.street AS hospital_address
FROM PointsOfInterest t
WHERE t.poi.kind = "hospital"
AND
geo_near(
t.poi.location,
{"type" : "point",
"coordinates" : [-122.03493933105469,37.32949164059004]
},
3000
);
- Você consulta a tabela
PointsOfInterest
para filtrar as linhas do hospital. - Use a função
geo_near
para filtrar hospitais em 3000m do local fornecido.
{"hospital_name":"St. Marthas hospital","hospital_address":"18000 West Blvd"}
{"hospital_name":"Memorial hospital","hospital_address":"10500 South St"}
SELECT
t.poi.address.street AS gas_station_address,
geo_distance(
t.poi.location,
{
"type" : "point",
"coordinates" : [-121.90768646240233,37.292081740702365]
}
) AS distance_in_meters
FROM PointsOfInterest t
WHERE t.poi.kind = "gas station" AND
geo_near(
t.poi.location,
{
"type" : "point",
"coordinates" : [-121.90768646240233,37.292081740702365]
},
1600
);
- Você consulta a tabela
PointsOfInterest
para filtrar as linhas do gas station. - Você usa a função
geo_near
para filtrar postos de gasolina dentro de uma milha (1600m) do local fornecido. - Você também extrai a distância real entre sua localização e o posto de gasolina usando a função
geo_distance
.
{"gas_station_address":"33 North Avenue","distance_in_meters":886.7004173859665}
A distância real para o posto de gasolina mais próximo dentro da próxima milha é 886m.
geo_is_geometry
boolean geo_is_geometry(any*)
O parâmetro any*
pode ser qualquer objeto geométrico.
- Retorna falso se o parâmetro retornar zero ou mais de 1 item.
- Retorna NULL se o parâmetro retornar NULL.
- Retorna verdadeiro se a entrada for um único objeto de geometria válido. Caso contrário, false.
SELECT geo_is_geometry(t.poi.location) AS city_hall
FROM PointsOfInterest t
WHERE t.poi.kind = "city hall"
Explicação: Você usa a função geo_is_geometry para determinar se um determinado local é um objeto geométrico válido ou não.
{ "city_hall" : true}