paint-brush
Localização, localização, localização! PostGIS e Heroku Postgrespor@josephcaudle
681 leituras
681 leituras

Localização, localização, localização! PostGIS e Heroku Postgres

por Joseph Caudle9m2024/04/16
Read on Terminal Reader

Muito longo; Para ler

Recentemente, descobri que o Heroku também inclui suporte para PostGIS. Pessoalmente, nunca usei PostGIS antes. Conheço vários concorrentes proprietários do produto, então achei que seria um ótimo momento para experimentar a opção de código aberto.
featured image - Localização, localização, localização! PostGIS e Heroku Postgres
Joseph Caudle HackerNoon profile picture

Estendendo o Postgres para oferecer suporte a consultas de dados geoespaciais

Perdi muito tempo mexendo em configurações e serviços apenas para ativar uma instância de computação na AWS. Às vezes, só preciso de um ambiente pronto para produção para testar aplicativos e ideias. Com o Heroku, posso conseguir isso com apenas alguns comandos simples na CLI.


Recentemente, descobri que o Heroku também incluisuporte para PostGIS . Pessoalmente, nunca usei PostGIS antes. Conheço vários concorrentes proprietários do produto, então achei que seria um ótimo momento para experimentar a opção de código aberto.


Neste artigo, mostrarei como obter uma instância do Postgres habilitada para PostGIS em execução no Heroku. Em seguida, executarei alguns exemplos de consultas no banco de dados, apenas para dar uma ideia de como ele funciona. E a melhor parte? Você pode acompanhar e fazer sua própria exploração à medida que avançamos!

O que é PostGIS?

Mesmo que você já use o Postgres há algum tempo, talvez não esteja familiarizado com o PostGIS. O GIS significa Sistema de Informação Geográfica . Existem muitas soluções no espaço. Mas o que torna o PostGIS legal é que ele é baseado no popular banco de dados PostgreSQL. Além de todo o desempenho que você espera do Postgres, temos uma ferramenta completa para armazenar dados geoespaciais.


O PostGIS não apenas fornece uma boa solução de armazenamento para esse tipo de dados, mas também pode ser perfeitamente integrado a diversos aplicativos que podem consumir esses dados (como ArcGIS e Tableau).


TL; DR — Se você precisa processar, armazenar ou consultar dados de localização, o PostGIS é uma ótima opção para fazer isso. Felizmente, é tão simples quanto adicionar um complemento a um aplicativo Heroku para colocar uma nova instância do Postgres em funcionamento. Então, vamos fazer isso agora.

Como podemos usar o PostGIS?

Para começar, você precisará de um aplicativo de qualquer tamanho. Em seguida, você adiciona uma instância do Heroku Postgres ao seu aplicativo.

Crie um aplicativo Heroku

Para minha demonstração, vou criar um aplicativo vazio.

Anexe um complemento Heroku Postgres

Depois que o aplicativo for criado, posso criar o complemento Heroku Postgres. Como meu conjunto de dados de amostra é muito grande para uma instância do plano Mini , preciso usar o plano Básico. Eu posso fazer isso na linha de comando:

 $ heroku login $ heroku addons:create heroku-postgresql:basic -a postgis-demo Creating heroku-postgresql:basic on ⬢ postgis-demo... ~$0.013/hour (max $9/month) Database has been created and is available ! This database is empty. If upgrading, you can transfer ! data from another database with pg:copy Created postgresql-fitted-78461 as DATABASE_URL

Depois de criar meu banco de dados Postgres, só tenho mais algumas etapaspara configurar o PostGIS .

Crie a extensão PostGIS

Heroku Postgres tem muitas extensões possíveis que podemos instalar. Para listá-los, podemos perguntar à nossa instância:

 $ heroku pg:psql -a postgis-demo --> Connecting to postgresql-fitted-78461 … postgis-demo::DATABASE=> \x on; Expanded display is on. postgis-demo::DATABASE=> show extwlist.extensions; … address_standardizer,address_standardizer_data_us,amcheck,autoinc,bloom,btree_gin,btree_gist,citext,cube,dict_int,earthdistance,fuzzystrmatch,hstore,insert_username,intarray,isn,lo,ltree,moddatetime,pg_partman,pg_stat_statements,pg_trgm,pgcrypto,pgrowlocks,postgis,postgis_raster,postgis_topology,refint,seg,sslinfo,tablefunc,tcn,tsm_system_rows,tsm_system_time,unaccent,uuid-ossp


Vemos postgis na lista de extensões disponíveis. A partir daí, podemos criar a extensão.

 postgis-demo::DATABASE=> CREATE EXTENSION postgis; CREATE EXTENSION


Podemos confirmar que a extensão está instalada e verificar a versão:

 postgis-demo::DATABASE=> SELECT postgis_version(); -[ RECORD 1 ]---+-------------------------------------- postgis_version | 3.4 USE_GEOS=1 USE_PROJ=1 USE_STATS=1


Tudo bem! Parece que estamos funcionando com o PostGIS 3.4.

Carregar conjunto de dados inicial

Agora que habilitei a extensão PostGIS, preciso carregar um conjunto de dados para brincar. Estou usando o conjunto de dados fornecido pelo livro Introdução ao PostGIS . O pacote de dados baixado é um arquivo zip de 21,5 MB. Na subpasta data do arquivo extraído, há um arquivo de 9,5 MB chamado nyc_data.backup .


Este é um arquivo com todos os dados do censo de 2000 da cidade de Nova York, junto com todas as ruas, bairros e estações de metrô da cidade.


Podemos restaurar o backup de dados diretamente para nossa instância Heroku Postgres usando o comando heroku pg:backups:restore . Isso é incrivelmente conveniente. No entanto, tenha em mente as seguintes advertências:


  • O arquivo de backup do qual você pode restaurar não pode ser carregado da sua máquina local. Deve estar disponível online. Felizmente, encontrei um repositório GitHub que disponibiliza nyc_data.backup .


  • A execução da restauração do banco de dados começa com a redefinição completa da instância do Heroku Postgres, incluindo a instalação da extensão postgis . Portanto, embora tenhamos mostrado acima como instalar a extensão manualmente, precisaremos adicionar um sinalizador quando restaurarmos nosso banco de dados para pré-instalar a extensão antes de carregar os dados.


Aqui está o comando que usaríamos para restaurar o backup do banco de dados:

 $ heroku pg:backups:restore \ https://github.com/Giorgi/PostgresSamples/raw/main/nyc_data.backup \ -e postgis \ -a postgis-demo

Nosso arquivo de backup é especificado por meio de uma URL acessível publicamente. Você sempre pode baixar o conjunto de dados do tutorial PostGIS, extrair o arquivo nyc_data.backup e publicá-lo online em um local de sua escolha.


O sinalizador -e postgis especifica que queremos instalar a extensão postgis antes de carregar o esquema e os dados do backup.


Foi isso! Nada mal para alguns comandos simples. Temos nosso banco de dados e dados.

Por que Heroku?

Se você já sabe como configurar o Postgres em uma máquina local, deve estar se perguntando por que optei pelo Heroku. Para mim, o maior motivo é a simplicidade. Além de escolher um plano Heroku Postgres grande o suficiente para a análise que pretendo fazer e instalar a extensão PostGIS, não há mais nada que preciso fazer para começar a trabalhar.


Além disso, colaborar em qualquer análise que eu faça é fácil. Posso conceder a outras pessoas acesso ao meu banco de dados como colaboradores ou posso construir rapidamente um aplicativo sobre o banco de dados e compartilhar o acesso por meio de uma interface web normal, em vez do cliente Postgres.


Finalmente, quando termino de trabalhar em um projeto e não preciso mais dele, posso simplesmente excluir o aplicativo no Heroku e tudo desaparece. Não há arquivos de dados no meu computador para me preocupar. Nenhum software extra instalado localmente. Posso desfrutar de uma rápida excursão por uma nova tecnologia e seguir em frente quando terminar.

Trabalhando com PostGIS

Agora, vamos dar uma olhada em como funciona o PostGIS.

Trabalhe exatamente como faria com o Postgres

A primeira coisa a lembrar é que PostGIS é uma extensão do Postgres. Isso significa que você também pode realizar qualquer consulta padrão do Postgres.


Digamos que eu queira descobrir quantas ruas em Nova York começam com B. Uma simples consulta SQL me dirá:

 postgis-demo::DATABASE=> SELECT count(*) postgis-demo::DATABASE-> FROM nyc_streets postgis-demo::DATABASE-> WHERE name LIKE 'B%'; count 1282 (1 row)


E quanto ao número de bairros em cada bairro? Novamente, uma consulta SQL simples:

 postgis-demo::DATABASE=> SELECT boroname, count(*) postgis-demo::DATABASE-> FROM nyc_neighborhoods postgis-demo::DATABASE-> GROUP BY boroname; boroname | count ---------------+------- Queens | 30 Brooklyn | 23 Staten Island | 24 The Bronx | 24 Manhattan | 28 (5 rows)

Até agora, acabamos de fazer o PostgreSQL padrão. Agora, vamos dar uma olhada em como usar os recursos do PostGIS.

Exemplos de trabalho com geometrias geoespaciais

Como nosso conjunto de dados inclui todas as ruas de Nova York, podemos perguntar quantos quilômetros de ruas existem na cidade com esta consulta:

 postgis-demo::DATABASE=> SELECT Sum(ST_Length(geom)) / 1000 as street_length FROM nyc_streets; street_length -------------------- 10418.904717199996 (1 row)


Também podemos calcular áreas, como a área plantada de toda Manhattan:

 postgis-demo::DATABASE=> SELECT Sum(ST_Area(geom)) / 4047 as acreage FROM nyc_neighborhoods WHERE boroname = 'Manhattan'; acreage ------------------- 13965.32012239119 (1 row)

Observe que esses cálculos vêm de dados geoespaciais e não de colunas relacionadas a dados agregados desse tipo. Não só isso, mas essas consultas são executadas com extrema rapidez.


Uma questão final que me surpreendeu envolve o uso de junções espaciais . Assim como as junções de banco de dados padrão, as junções espaciais podem unir várias tabelas, mas com base em relacionamentos espaciais. Por exemplo, podemos consultar em qual bairro está localizada uma estação de metrô específica, usando os dados espaciais. Para fazer isso, podemos usar ST_Contains do PostGIS para determinar se a geometria da vizinhança contém completamente a geometria da estação de metrô.


Com base no nome do metrô (em nyc_subway_stations ), consultamos o bairro (em nyc_neighborhoods ) para o qual ST_Contains é verdadeiro. Nossa consulta fica assim:

 postgis-demo::DATABASE=> SELECT subways.name AS subway_name, neighborhoods.name AS neighborhood_name, neighborhoods.boroname AS borough FROM nyc_neighborhoods AS neighborhoods JOIN nyc_subway_stations AS subways ON ST_Contains(neighborhoods.geom, subways.geom) WHERE subways.name = 'Broad St'; subway_name | neighborhood_name | borough -------------+--------------------+----------- Broad St | Financial District | Manhattan (1 row)

PostGIS fornece funcionalidade de consulta de localização ainda mais avançada com geometrias , mas isso está fora do escopo de nossa demonstração simples aqui.

Conclusão

Nunca tendo usado o PostGIS antes, estou realmente impressionado com o que ele pode fazer. Há muito mais que eu poderia fazer com esse banco de dados também, já que só cheguei na metade do livro oficial de Introdução ao PostGIS . Além disso, posso construir e implantar aplicativos em PostGIS usando qualquer número de linguagens suportadas pelo Heroku.


Em particular, estou pensando em encontrar um caso de uso para construir um aplicativo Rails sobre PostGIS. Já encontrei alguma documentação sobre como posso começar.


Mas, por enquanto, não preciso mais dessa instância, então vou limpá-la e excluir meu aplicativo. Na CLI, é isso que preciso fazer:

 $ heroku apps:destroy postgis-demo ▸ WARNING: This will delete ⬢ postgis-demo including all add-ons. ▸ To proceed, type postgis-demo or re-run this command with --confirm postgis-demo > postgis-demo Destroying ⬢ postgis-demo (including all add-ons)... done

Espere, isso é tudo? Sim, isso é tudo. Com um único comando e confirmação, tudo é destruído e não preciso mais me preocupar com isso.

 $ heroku apps You have no apps. $ heroku addons No add-ons.

Agora que excluí meu aplicativo, você tem uma oportunidade incrível: o nome exclusivo do aplicativo postgis-demo está disponível para o primeiro leitor que quiser acessá-lo no Heroku! Você está pronto para construir seu próximo ótimo aplicativo PostGIS? Hoje é o dia!