Suporte CRS
A partir da versão 0.15.0, a pygeoapi suporta totalmente OGC API - Features - Part 2: Coordinate Reference Systems by Reference.
Isto permite a importação e exportação de quaisquer dados de acordo com projeções dedicadas.
Uma "projeção" é especificada com um identificador de Sistema de Referência de Coordenadas (CRS). Estes estão em formatos URI
como http://www.opengis.net/def/crs/OGC/1.3/CRS84
(basicamente WGS84 em ordem de eixo longitude, latitude)
ou o formato "OpenGIS" como http://www.opengis.net/def/crs/EPSG/0/4258
. Note que o formato "EPSG:" como EPSG:4326
está fora do âmbito da norma OGC.
Em particular, o suporte CRS permite o seguinte:
- especificar o CRS no qual os dados são armazenados, na pygeoapi a opção de configuração
storageCRS
- especificar a lista de CRSs nos quais os dados de Funcionalidades podem ser recuperados, na pygeoapi a opção de configuração
crs
- publicar estes CRSs nos metadados da coleção
- o parâmetro de consulta
crs=
para uma coleção ou item de coleção - o parâmetro de consulta
bbox-crs=
para indicar que o parâmetrobbox=
está codificado nesse CRS - o cabeçalho de resposta HTTP
Content-Crs
denota o CRS da(s) Funcionalidade(s) nos dados devolvidos
Então, embora o GeoJSON exija WGS84 em ordem longitude, latitude, o cliente e servidor podem ainda assim concordar com outros CRSs.
Por baixo, a pygeoapi usa o bem conhecido wrapper Python pyproj para a biblioteca PROJ.
Leia mais na documentação da pygeoapi no Capítulo CRS.
Exercício
Adicionar suporte CRS às coleções pygeoapi para o tipo provider
feature
é tão simples como
por exemplo estender a configuração do Exercício 2 com este fragmento:
crs:
- http://www.opengis.net/def/crs/OGC/1.3/CRS84
- http://www.opengis.net/def/crs/EPSG/0/4258
- http://www.opengis.net/def/crs/EPSG/0/3857
- http://www.opengis.net/def/crs/EPSG/0/4326
storage_crs: http://www.opengis.net/def/crs/OGC/1.3/CRS84
Ordem
A ordem dos eixos (são coordenadas em ordem longitude, latitude ou latitude, longitude?) nas projeções é frequentemente uma fonte de confusão.
No entanto, o formato URI é bastante claro sobre isto, pelo menos mais do que o formato EPSG:
.
Então http://www.opengis.net/def/crs/OGC/1.3/CRS84 é ordem longitude, latitude, enquanto
http://www.opengis.net/def/crs/EPSG/0/4326 é ordem latitude, longitude.
Na configuração abaixo, indicamos basicamente que os dados são armazenados em WGS84 (ordem de eixo longitude, latitude) e podem ser recuperados
em CRSs como http://www.opengis.net/def/crs/EPSG/0/4258
(ETRS89 ordem de eixo latitude, longitude) etc.
Adicionar CRS a uma configuração pygeoapi
Abra o ficheiro de configuração da pygeoapi num editor de texto.
Encontre a linha # START - EXERCISE 2 - firenze-terrain
Atualize a secção do conjunto de dados com suporte CRS substituindo-a pelo fragmento abaixo:
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 |
|
Agora vamos inspecionar os metadados da coleção e recuperar Funcionalidades em vários CRSs. Podemos até fazer isto na interface Swagger, mas usar o navegador é bastante rápido e claro.
Metadados
Metadados da Coleção
Abra o URL: http://localhost:5000/collections/firenze-terrains-vec Os seus CRSs configurados são exibidos na parte inferior da página: "Reference Systems" e "Storage CRS".
Veja estes em formato JSON, também na parte inferior: http://localhost:5000/collections/firenze-terrains-vec?f=json
.
.
"crs":[
"http://www.opengis.net/def/crs/OGC/1.3/CRS84",
"http://www.opengis.net/def/crs/EPSG/0/4258",
"http://www.opengis.net/def/crs/EPSG/0/3857",
"http://www.opengis.net/def/crs/EPSG/0/4326"
],
"storageCRS":"http://www.opengis.net/def/crs/OGC/1.3/CRS84"
}
Reprojetar Funcionalidades
Usar o parâmetro de consulta CRS
Este é ETRS89, semelhante a WGS84, mas para o Continente Europeu (Datum) e em ordem lat,lon. Este é por exemplo usado no INSPIRE.
Veja estes em formato JSON, também na parte inferior:
"type":"FeatureCollection",
"features":[
{
"type":"Feature",
"geometry":{
"type":"MultiPolygon",
"coordinates":[
[
[
[
43.77805936835436,
11.23486287997071
],
[
43.77809089595012,
11.2348943159564
],
[
43.77810038978989,
11.23491359066035
],
[
43.77705757917591,
11.2368990806804
],
.
.
"crs":[
"http://www.opengis.net/def/crs/OGC/1.3/CRS84",
"http://www.opengis.net/def/crs/EPSG/0/4258",
"http://www.opengis.net/def/crs/EPSG/0/3857",
"http://www.opengis.net/def/crs/EPSG/0/4326"
],
"storageCRS":"http://www.opengis.net/def/crs/OGC/1.3/CRS84"
}
Se abrir a consola de desenvolvimento do navegador, pode observar o cabeçalho de resposta HTTP:
Content-Crs: <http://www.opengis.net/def/crs/EPSG/0/4258>
(O URI CRS está sempre entre <
>
)