J'ai perdu trop de temps à manipuler les configurations et les services juste pour lancer une instance de calcul dans AWS. Parfois, j’ai juste besoin d’un environnement prêt pour la production avec lequel tester des applications et des idées. Avec Heroku, je peux l'obtenir avec seulement quelques commandes simples sur la CLI.
Récemment, j'ai appris que Heroku inclut égalementla prise en charge de PostGIS . Personnellement, je n'ai jamais utilisé PostGIS auparavant. Je connais plusieurs concurrents propriétaires du produit, j'ai donc pensé que ce serait le moment idéal pour essayer l'option open source.
Dans cet article, je vais vous montrer comment faire fonctionner une instance Postgres compatible PostGIS sur Heroku. Ensuite, je vais exécuter quelques exemples de requêtes sur la base de données, juste pour vous donner une idée de son fonctionnement. Et le meilleur ? Vous pouvez suivre et faire votre propre exploration au fur et à mesure !
Même si vous utilisez Postgres depuis un certain temps, vous n'êtes peut-être pas familier avec PostGIS. Le SIG signifie Système d'Information Géographique . Il existe de nombreuses solutions dans l'espace. Mais ce qui rend PostGIS intéressant, c'est qu'il est basé sur la base de données PostgreSQL très appréciée. En plus de toutes les performances que vous attendez de Postgres, nous disposons d'un outil complet pour stocker des données géospatiales.
Non seulement PostGIS fournit une bonne solution de stockage pour ce type de données, mais il peut également être intégré de manière transparente à plusieurs applications pouvant consommer ces données (telles que ArcGIS et Tableau).
TL ; DR : Si vous devez traiter, stocker ou interroger des données de localisation, PostGIS est une excellente option pour ce faire. Heureusement, c'est aussi simple que d'ajouter un module complémentaire à une application Heroku pour qu'une nouvelle instance Postgres soit opérationnelle. Alors faisons-le maintenant.
Pour commencer, vous aurez besoin d’une application de n’importe quelle taille. Ensuite, vous ajoutez une instance de Heroku Postgres à votre application.
Pour ma démo, je vais créer une application vide.
Une fois l'application créée, je peux créer le module complémentaire Heroku Postgres. Étant donné que mon exemple d’ensemble de données est trop volumineux pour une instance du plan Mini , je dois plutôt utiliser le plan Basic. Je peux le faire depuis la ligne de commande :
$ 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
Une fois que j'ai créé ma base de données Postgres, il ne me reste plus que quelques étapespour configurer PostGIS .
Heroku Postgres propose de nombreuses extensions possibles que nous pourrions installer. Pour les lister, nous pouvons demander à notre instance :
$ 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
Nous voyons postgis
dans la liste des extensions disponibles. À partir de là, nous pouvons créer l'extension.
postgis-demo::DATABASE=> CREATE EXTENSION postgis; CREATE EXTENSION
Nous pouvons confirmer que l'extension est installée et vérifier la version :
postgis-demo::DATABASE=> SELECT postgis_version(); -[ RECORD 1 ]---+-------------------------------------- postgis_version | 3.4 USE_GEOS=1 USE_PROJ=1 USE_STATS=1
Bien! Il semble que nous soyons opérationnels avec PostGIS 3.4.
Maintenant que l'extension PostGIS est activée, je dois charger un ensemble de données avec lequel jouer. J'utilise l'ensemble de données fourni par le livre Introduction to PostGIS . Le paquet de données téléchargé est un fichier zip de 21,5 Mo. Dans le sous-dossier data
de l'archive extraite, il y a un fichier de 9,5 Mo appelé nyc_data.backup
.
Il s'agit d'un fichier contenant toutes les données du recensement de 2000 de la ville de New York, ainsi que toutes les rues, quartiers et stations de métro de la ville.
Nous pouvons restaurer la sauvegarde des données directement sur notre instance Heroku Postgres en utilisant la commande heroku pg:backups:restore
. C'est incroyablement pratique. Gardez toutefois à l’esprit les mises en garde suivantes :
nyc_data.backup
disponible.
postgis
. Ainsi, même si nous avons montré ci-dessus comment installer l'extension manuellement, nous devrons ajouter un indicateur lorsque nous restaurerons notre base de données pour préinstaller l'extension avant de charger les données.
Voici la commande que nous utiliserions pour restaurer la sauvegarde de la base de données :
$ heroku pg:backups:restore \ https://github.com/Giorgi/PostgresSamples/raw/main/nyc_data.backup \ -e postgis \ -a postgis-demo
Notre fichier de sauvegarde est spécifié via une URL accessible au public. Vous pouvez toujours télécharger l'ensemble de données à partir du didacticiel PostGIS, extraire le fichier nyc_data.backup
et le publier en ligne à l'emplacement de votre choix.
L'indicateur -e postgis
spécifie que nous souhaitons installer l'extension postgis
avant de charger le schéma et les données de la sauvegarde.
C'était ça! Pas mal pour quelques commandes simples. Nous avons notre base de données et nos données.
Si vous savez déjà comment configurer Postgres sur une machine locale, vous vous demandez peut-être pourquoi j'ai choisi Heroku. Pour moi, la principale raison est la simplicité. En plus de choisir un plan Heroku Postgres suffisamment volumineux pour l'analyse que je prévois de faire et d'installer l'extension PostGIS, je n'ai rien d'autre à faire pour être opérationnel.
De plus, il est facile de collaborer à toute analyse que je fais. Je peux accorder à d'autres personnes l'accès à ma base de données en tant que collaborateurs, ou je peux rapidement créer une application sur la base de données et partager l'accès via une interface Web normale, plutôt que le client Postgres.
Enfin, lorsque j'ai fini de travailler sur un projet et que je n'en ai plus besoin, je peux simplement supprimer l'application sur Heroku et tout est parti. Aucun fichier de données sur mon ordinateur à craindre. Aucun logiciel supplémentaire installé localement. Je peux profiter d'une excursion rapide dans une nouvelle technologie, puis passer à autre chose lorsque j'ai terminé.
Voyons maintenant comment fonctionne PostGIS.
La première chose à retenir est que PostGIS est une extension de Postgres. Cela signifie que vous pouvez également effectuer n’importe quelle requête Postgres standard.
Disons que je voulais savoir combien de rues à New York commencent par B. Une simple requête SQL me dira :
postgis-demo::DATABASE=> SELECT count(*) postgis-demo::DATABASE-> FROM nyc_streets postgis-demo::DATABASE-> WHERE name LIKE 'B%'; count 1282 (1 row)
Qu’en est-il du nombre de quartiers dans chaque arrondissement ? Encore une fois, une simple requête 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)
Jusqu'à présent, nous avons simplement utilisé PostgreSQL standard. Voyons maintenant comment utiliser les fonctionnalités de PostGIS.
Étant donné que notre ensemble de données inclut toutes les rues de New York, nous pouvons demander combien de kilomètres de rues il y a dans la ville avec cette requête :
postgis-demo::DATABASE=> SELECT Sum(ST_Length(geom)) / 1000 as street_length FROM nyc_streets; street_length -------------------- 10418.904717199996 (1 row)
Nous pouvons également calculer des superficies, telles que la superficie de l’ensemble de Manhattan :
postgis-demo::DATABASE=> SELECT Sum(ST_Area(geom)) / 4047 as acreage FROM nyc_neighborhoods WHERE boroname = 'Manhattan'; acreage ------------------- 13965.32012239119 (1 row)
Notez que ces calculs proviennent des données géospatiales et non de colonnes liées à des données agrégées de ce type. Non seulement cela, mais ces requêtes s’exécutent extrêmement rapidement.
Une dernière requête qui m'étonne vraiment implique l'utilisation de jointures spatiales . Tout comme les jointures de bases de données standard, les jointures spatiales peuvent unir plusieurs tables, mais sur la base de relations spatiales. Par exemple, nous pouvons demander dans quel quartier se trouve une station de métro spécifique, en utilisant les données spatiales. Pour ce faire, nous pouvons utiliser ST_Contains
de PostGIS pour déterminer si la géométrie du quartier contient complètement la géométrie de la station de métro.
En fonction du nom du métro (dans nyc_subway_stations
), nous recherchons le quartier (dans nyc_neighborhoods
) pour lequel ST_Contains
est vrai. Notre requête ressemble à ceci :
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 fournit une fonctionnalité de requête de localisation encore plus avancée avec des géométries , mais cela sort du cadre de notre simple démo ici.
N'ayant jamais utilisé PostGIS auparavant, je suis vraiment impressionné par ce qu'il peut faire. Je pourrais également faire beaucoup plus avec cette base de données, puisque je n'ai parcouru que la moitié du livre officiel Introduction à PostGIS . De plus, je peux créer et déployer des applications sur PostGIS en utilisant n'importe quel nombre de langues prises en charge par Heroku.
En particulier, je pense que je souhaiterais peut-être trouver un cas d'utilisation pour créer une application Rails sur PostGIS. J'ai déjà trouvé de la documentation sur la façon de commencer.
Mais pour l'instant, je n'ai plus besoin de cette instance, je vais donc la nettoyer et supprimer mon application. Depuis la CLI, voici ce que je dois faire :
$ 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
Attends, c'est tout ? Ouais, c'est tout. Avec une seule commande et confirmation, tout est démoli et je n'ai plus à m'en soucier.
$ heroku apps You have no apps. $ heroku addons No add-ons.
Maintenant que j'ai supprimé mon application, vous avez une opportunité incroyable : le nom unique de l'application postgis-demo
est disponible pour le premier lecteur qui souhaite l'acquérir sur Heroku ! Êtes-vous prêt à créer votre prochaine grande application PostGIS ? C'est aujourd'hui le jour!