He perdido demasiado tiempo jugueteando con configuraciones y servicios solo para poner en marcha una instancia informática en AWS. A veces, solo necesito un entorno listo para producción con el que jugar y probar aplicaciones e ideas. Con Heroku, puedo conseguirlo con sólo unos pocos comandos sencillos en la CLI.
Recientemente, me enteré de que Heroku también incluyesoporte para PostGIS . Personalmente, nunca antes había usado PostGIS. Conozco varios competidores propietarios del producto, así que pensé que sería un buen momento para probar la opción de código abierto.
En este artículo, le mostraré cómo ejecutar una instancia de Postgres habilitada para PostGIS en Heroku. Luego, ejecutaré algunas consultas de muestra en la base de datos, sólo para darle una idea de cómo funciona. ¿Y la mejor parte? ¡Puedes seguirnos y explorar por tu cuenta a medida que avanzamos!
Incluso si ha usado Postgres por un tiempo, es posible que no esté familiarizado con PostGIS. El SIG significa Sistema de Información Geográfica . Hay muchas soluciones en el espacio. Pero lo que hace que PostGIS sea agradable es que está basado en la muy querida base de datos PostgreSQL. Además de todo el rendimiento que esperarías de Postgres, obtenemos una herramienta con todas las funciones para almacenar datos geoespaciales.
PostGIS no solo proporciona una buena solución de almacenamiento para este tipo de datos, sino que también puede integrarse perfectamente con varias aplicaciones que pueden consumir estos datos (como ArcGIS y Tableau).
TL; DR: si necesita procesar, almacenar o consultar datos de ubicación, PostGIS es una excelente opción para hacerlo. Afortunadamente, es tan simple como agregar un complemento a una aplicación Heroku para poner en funcionamiento una nueva instancia de Postgres. Entonces, hagámoslo ahora.
Para comenzar, necesitarás una aplicación de cualquier tamaño. Luego, agrega una instancia de Heroku Postgres a su aplicación.
Para mi demostración, crearé una aplicación vacía.
Una vez creada la aplicación, puedo crear el complemento Heroku Postgres. Debido a que mi conjunto de datos de muestra es demasiado grande para una instancia del plan Mini , necesito usar el plan Básico en su lugar. Puedo hacer esto desde la línea 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
Una vez que he creado mi base de datos Postgres, solo me quedan unos pocos pasos máspara configurar PostGIS .
Heroku Postgres tiene muchas extensiones posibles que podríamos instalar. Para enumerarlos, podemos preguntarle a nuestra instancia:
$ 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
en la lista de extensiones disponibles. Desde allí, podemos crear la extensión.
postgis-demo::DATABASE=> CREATE EXTENSION postgis; CREATE EXTENSION
Podemos confirmar que la extensión está instalada y verificar la versión:
postgis-demo::DATABASE=> SELECT postgis_version(); -[ RECORD 1 ]---+-------------------------------------- postgis_version | 3.4 USE_GEOS=1 USE_PROJ=1 USE_STATS=1
¡Está bien! Parece que estamos funcionando con PostGIS 3.4.
Ahora que tengo la extensión PostGIS habilitada, necesito cargar un conjunto de datos para jugar. Estoy usando el conjunto de datos proporcionado por el libro Introducción a PostGIS . El paquete de datos descargado es un archivo zip de 21,5 MB. En la subcarpeta data
del archivo extraído, hay un archivo de 9,5 MB llamado nyc_data.backup
.
Este es un archivo con todos los datos censales del año 2000 de la ciudad de Nueva York, junto con todas las calles, barrios y estaciones de metro de la ciudad.
Podemos restaurar la copia de seguridad de los datos directamente en nuestra instancia de Heroku Postgres usando el comando heroku pg:backups:restore
. Esto es increíblemente conveniente. Sin embargo, tenga en cuenta las siguientes advertencias:
nyc_data.backup
esté disponible.
postgis
. Entonces, aunque mostramos arriba cómo instalar la extensión manualmente, necesitaremos agregar una marca cuando restauremos nuestra base de datos para preinstalar la extensión antes de cargar los datos.
Este es el comando que usaríamos para restaurar la copia de seguridad de la base de datos:
$ heroku pg:backups:restore \ https://github.com/Giorgi/PostgresSamples/raw/main/nyc_data.backup \ -e postgis \ -a postgis-demo
Nuestro archivo de copia de seguridad se especifica a través de una URL de acceso público. Siempre puede descargar el conjunto de datos del tutorial de PostGIS, extraer el archivo nyc_data.backup
y publicarlo en línea en la ubicación que elija.
El indicador -e postgis
especifica que queremos instalar la extensión postgis
antes de cargar el esquema y los datos de la copia de seguridad.
¡Eso fue todo! Nada mal para unos pocos comandos simples. Tenemos nuestra base de datos y datos.
Si ya sabes cómo configurar Postgres en una máquina local, quizás te preguntes por qué elegí Heroku. Para mí, la principal razón es la simplicidad. Además de elegir un plan Heroku Postgres lo suficientemente grande para el análisis que planeo hacer e instalar la extensión PostGIS, no hay nada más que deba hacer para comenzar a funcionar.
Además, colaborar en cualquier análisis que hago es fácil. Puedo otorgar acceso a mi base de datos a otras personas como colaboradores, o puedo crear rápidamente una aplicación sobre la base de datos y compartir el acceso a través de una interfaz web normal, en lugar del cliente Postgres.
Finalmente, cuando termino de trabajar en un proyecto y ya no lo necesito, puedo eliminar la aplicación en Heroku y todo desaparece. No tengo que preocuparme por archivos de datos en mi computadora. No hay software adicional instalado localmente. Puedo disfrutar de una rápida excursión a una nueva tecnología y luego seguir adelante cuando termine.
Ahora, echemos un vistazo a cómo funciona PostGIS.
Lo primero que debemos recordar es que PostGIS es una extensión dentro de Postgres. Eso significa que también puedes realizar cualquier consulta estándar de Postgres.
Digamos que quiero saber cuántas calles de Nueva York comienzan con B. Una simple 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)
¿Qué tal la cantidad de vecindarios en cada distrito? Nuevamente, una simple consulta SQL:
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)
Hasta ahora, acabamos de utilizar PostgreSQL estándar. Ahora, echemos un vistazo a cómo utilizar las funciones de PostGIS.
Debido a que nuestro conjunto de datos incluye todas las calles de Nueva York, podemos preguntar cuántos kilómetros de calles hay en la ciudad con esta consulta:
postgis-demo::DATABASE=> SELECT Sum(ST_Length(geom)) / 1000 as street_length FROM nyc_streets; street_length -------------------- 10418.904717199996 (1 row)
También podemos calcular áreas, como la superficie de todo Manhattan:
postgis-demo::DATABASE=> SELECT Sum(ST_Area(geom)) / 4047 as acreage FROM nyc_neighborhoods WHERE boroname = 'Manhattan'; acreage ------------------- 13965.32012239119 (1 row)
Tenga en cuenta que estos cálculos provienen de datos geoespaciales, no de columnas relacionadas con datos agregados de este tipo. No sólo eso, sino que estas consultas se ejecutan extremadamente rápido.
Una última consulta que realmente me sorprende tiene que ver con el uso de uniones espaciales . Al igual que las uniones de bases de datos estándar, las uniones espaciales pueden unir varias tablas, pero sobre la base de relaciones espaciales. Por ejemplo, podemos consultar en qué vecindario se encuentra una estación de metro específica, utilizando los datos espaciales. Para hacer esto, podemos usar ST_Contains
de PostGIS para determinar si la geometría del vecindario contiene completamente la geometría de la estación de metro.
Según el nombre del metro (en nyc_subway_stations
), consultamos el vecindario (en nyc_neighborhoods
) para el cual ST_Contains
es verdadero. Nuestra consulta se ve así:
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 proporciona una funcionalidad de consulta de ubicación aún más avanzada con geometrías , pero eso está fuera del alcance de nuestra sencilla demostración aquí.
Como nunca antes había usado PostGIS, estoy realmente impresionado por lo que puede hacer. También puedo hacer mucho más con esta base de datos, ya que solo llegué a la mitad del libro oficial de Introducción a PostGIS . No solo eso, puedo crear e implementar aplicaciones sobre PostGIS utilizando cualquier cantidad de idiomas admitidos por Heroku.
En particular, creo que tal vez quiera encontrar un caso de uso para crear una aplicación Rails sobre PostGIS. Ya encontré documentación sobre cómo puedo comenzar.
Pero por ahora ya no necesito esta instancia, así que la limpiaré y eliminaré mi aplicación. Desde la CLI, esto es lo que necesito hacer:
$ 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
Espera, ¿eso es todo? Sí, eso es todo. Con una sola orden y confirmación, todo se derriba y ya no necesito preocuparme por eso.
$ heroku apps You have no apps. $ heroku addons No add-ons.
Ahora que eliminé mi aplicación, tienes una oportunidad increíble: ¡el nombre exclusivo de la aplicación postgis-demo
está disponible para el primer lector que quiera obtenerla en Heroku! ¿Estás listo para crear tu próxima gran aplicación PostGIS? ¡Hoy es el día!