paint-brush
Emplacement, emplacement, emplacement ! PostGIS et Heroku Postgrespar@josephcaudle
681 lectures
681 lectures

Emplacement, emplacement, emplacement ! PostGIS et Heroku Postgres

par Joseph Caudle9m2024/04/16
Read on Terminal Reader

Trop long; Pour lire

Récemment, j'ai appris qu'Heroku inclut également la 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.
featured image - Emplacement, emplacement, emplacement ! PostGIS et Heroku Postgres
Joseph Caudle HackerNoon profile picture

Extension de Postgres pour prendre en charge les requêtes de données géospatiales

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 !

Qu'est-ce que PostGIS ?

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.

Comment pouvons-nous utiliser PostGIS ?

Pour commencer, vous aurez besoin d’une application de n’importe quelle taille. Ensuite, vous ajoutez une instance de Heroku Postgres à votre application.

Créer une application Heroku

Pour ma démo, je vais créer une application vide.

Joindre un module complémentaire Heroku Postgres

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 .

Créer l'extension 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.

Charger l'ensemble de données initial

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 :


  • Le fichier de sauvegarde à partir duquel vous pouvez restaurer ne peut pas être téléchargé depuis votre ordinateur local. Il doit être disponible en ligne. Heureusement, j'ai trouvé un dépôt GitHub qui rend nyc_data.backup disponible.


  • La restauration de la base de données commence par la réinitialisation complète de votre instance Heroku Postgres, y compris votre installation de l'extension 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.

Pourquoi Heroku ?

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é.

Travailler avec PostGIS

Voyons maintenant comment fonctionne PostGIS.

Travaillez comme vous le feriez avec Postgres

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.

Exemples de travail avec des géométries géospatiales

É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.

Conclusion

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!