Gostaria de obter um recurso geojson com propriedades do PostGIS. Encontrei um exemplo para ter uma coleção de recursos, mas não posso fazê-lo funcionar apenas para um recurso.
SELECT row_to_json(fc)
FROM ( SELECT 'FeatureCollection' As type, array_to_json(array_agg(f)) As features
FROM (SELECT 'Feature' As type
, ST_AsGeoJSON(lg.geog)::json As geometry
, row_to_json(lp) As properties
FROM locations As lg
INNER JOIN (SELECT loc_id, loc_name FROM locations) As lp
ON lg.loc_id = lp.loc_id ) As f ) As fc;
até agora, tentei modificar a consulta de coleção de recursos do exemplo. mas a saída não é válida.
postgis
postgresql
geojson
sql
Abaixo do radar
fonte
fonte
Respostas:
Isso pode ser feito de maneira um pouco mais simples
json_build_object
no PostgreSQL 9.4+, que permite criar um JSON fornecendo argumentos alternativos de chave / valor. Por exemplo:As coisas ficam ainda melhores no PostgreSQL 9.5+, onde alguns novos operadores são adicionados ao
jsonb
tipo de dados ( docs ). Isso facilita a configuração de um objeto "propriedades" que contém tudo, exceto o ID e a geometria .Deseja fazer uma FeatureCollection? Basta encerrar tudo com
jsonb_agg
:fonte
regexp_replace(current_setting('server_version'),'(\d)\.(\d)\.(\d)','\1.\3.\2')
...json_build_object
tem dois pontos em vez de vírgulas.ST_AsGeoJSON
função do PostGIS deve ser modificada para corrigir a orientação por conta própria.Esta resposta pode ser usada na versão PostgreSQL anterior à 9.4. Use a resposta do dbaston para o PostgreSQL 9.4+
A consulta é a seguinte: (onde
'GEOM'
está o campo de geometria,id
o campo a ser incluído nas propriedades json,shapefile_feature
o nome da tabela e489445
o ID do recurso desejado)saída:
fonte
dict
, não JSON. São coisas muito diferentes. JSON é uma sequência. Sempre. É um formato de texto, da mesma forma que XML é apenas um formato de texto. Adict
é um objeto na memória.Apenas uma ligeira correção na resposta do dbaston (gostaria de comentar, mas não tenho pontos). Você precisa converter a saída de ST_AsGeoJSON como json (the
::json
thingie):Caso contrário, o membro da geometria será uma sequência. GeoJSON inválido
fonte
A resposta do @ dbaston foi modificada ultimamente por @ John Powell, também conhecido como Barça, e produz geojsons inválidos para mim. Conforme modificada, a agregação nos recursos retorna cada recurso aninhado dentro de um objeto json, que é inválido.
Não tenho reputação de comentar diretamente a resposta, mas o jsonb_agg final deve estar na coluna "feature" e não na subconsulta "features". A agregação no nome da coluna (ou "features.feature", se você achar melhor) coloca todos os elementos diretamente na matriz "features" após a agregação, que é o caminho certo a seguir.
Portanto, o seguinte, que é bastante semelhante à resposta do @ dbaston, como era até algumas semanas atrás (mais a correção de @ Jonh Powell para nomear subconsultas) funciona:
fonte