paint-brush
위치, 위치, 위치! PostGIS와 Heroku Postgres~에 의해@josephcaudle
681 판독값
681 판독값

위치, 위치, 위치! PostGIS와 Heroku Postgres

~에 의해 Joseph Caudle9m2024/04/16
Read on Terminal Reader

너무 오래; 읽다

최근에 저는 Heroku에 PostGIS에 대한 지원도 포함되어 있다는 것을 알게 되었습니다. 저는 개인적으로 PostGIS를 사용해 본 적이 없습니다. 저는 이 제품에 대한 여러 독점 경쟁업체를 알고 있으므로 지금이 오픈 소스 옵션을 시험해 볼 수 있는 좋은 기회라고 생각했습니다.
featured image - 위치, 위치, 위치! PostGIS와 Heroku Postgres
Joseph Caudle HackerNoon profile picture

지리공간 데이터 쿼리를 지원하도록 Postgres 확장

AWS에서 컴퓨팅 인스턴스를 가동하기 위해 구성과 서비스를 조작하느라 너무 많은 시간을 허비했습니다. 때로는 애플리케이션과 아이디어를 테스트하기 위해 바로 사용할 수 있는 프로덕션 환경이 필요할 때가 있습니다. Heroku를 사용하면 CLI에서 몇 가지 간단한 명령만으로 이를 얻을 수 있습니다.


최근에 나는 Heroku에PostGIS에 대한 지원 도 포함되어 있다는 것을 알게 되었습니다. 저는 개인적으로 PostGIS를 사용해 본 적이 없습니다. 저는 이 제품에 대한 여러 독점 경쟁업체를 알고 있으므로 지금이 오픈 소스 옵션을 시험해 볼 수 있는 좋은 기회라고 생각했습니다.


이 기사에서는 Heroku에서 실행되는 PostGIS 지원 Postgres 인스턴스를 얻는 방법을 보여 드리겠습니다. 그런 다음 데이터베이스에서 몇 가지 샘플 쿼리를 실행하여 작동 방식에 대한 느낌을 드리겠습니다. 그리고 가장 좋은 점은? 우리가 진행하는 동안 여러분도 따라하면서 직접 탐색해 볼 수 있습니다!

PostGIS란 무엇입니까?

Postgres를 한동안 사용해 보셨다고 해도 PostGIS가 익숙하지 않을 수도 있습니다. GIS는 지리정보시스템(Geographic Information System) 을 의미합니다. 공간에는 많은 솔루션이 있습니다. 하지만 PostGIS를 훌륭하게 만드는 점은 이것이 많은 사랑을 받는 PostgreSQL 데이터베이스를 기반으로 한다는 것입니다. Postgres에서 기대할 수 있는 모든 성능 외에도 지리 공간 데이터 저장을 위한 모든 기능을 갖춘 도구가 제공됩니다.


PostGIS는 이러한 유형의 데이터에 적합한 저장소 솔루션을 제공할 뿐만 아니라 이 데이터를 사용할 수 있는 여러 응용 프로그램(예: ArcGIS 및 Tableau)과 원활하게 통합될 수 있습니다.


TL; DR - 위치 데이터를 처리, 저장 또는 쿼리해야 하는 경우 PostGIS는 이를 위한 훌륭한 옵션입니다. 다행히 새로운 Postgres 인스턴스를 시작하고 실행하려면 Heroku 앱에 애드온을 추가하는 것만큼 간단합니다. 이제 그렇게 해보겠습니다.

PostGIS를 어떻게 사용할 수 있나요?

시작하려면 모든 크기의 앱이 필요합니다. 그런 다음 Heroku Postgres 인스턴스를 앱에 추가합니다.

Heroku 앱 만들기

데모에서는 빈 앱을 만들겠습니다.

Heroku Postgres 애드온 연결

앱이 생성되면 Heroku Postgres 추가 기능을 생성할 수 있습니다. 내 샘플 데이터 세트가 미니 계획 인스턴스에 비해 너무 크기 때문에 대신 기본 계획을 사용해야 합니다. 명령줄에서 이 작업을 수행할 수 있습니다.

 $ 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

Postgres 데이터베이스를 생성한 후에는PostGIS를 설정하는 데 몇 가지 단계만 더 하면 됩니다.

PostGIS 확장 생성

Heroku Postgres에는 설치할 수 있는 확장 기능이 많이 있습니다. 이를 나열하려면 인스턴스에 다음을 요청하면 됩니다.

 $ 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


사용 가능한 확장 목록에 postgis 표시됩니다. 거기에서 확장을 만들 수 있습니다.

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


확장 프로그램이 설치되어 있는지 확인하고 버전을 확인할 수 있습니다.

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


괜찮은! PostGIS 3.4를 사용하여 실행 중인 것 같습니다.

초기 데이터세트 로드

이제 PostGIS 확장이 활성화되었으므로 가지고 놀 수 있는 데이터세트를 로드해야 합니다. 저는 PostGIS 소개 책 에서 제공하는 데이터세트를 사용하고 있습니다. 다운로드한 데이터 번들은 21.5MB의 zip 파일입니다. 추출된 아카이브의 data 하위 폴더에는 nyc_data.backup 이라는 9.5MB 파일이 있습니다.


이 파일에는 2000년 뉴욕 인구 조사의 모든 인구 조사 데이터와 함께 도시의 모든 거리, 동네, 지하철역이 포함되어 있습니다.


heroku heroku pg:backups:restore 명령을 사용하여 Heroku Postgres 인스턴스에 직접 데이터 백업을 복원할 수 있습니다. 이것은 매우 편리합니다. 그러나 다음 사항에 유의하세요.


  • 복원할 수 있는 백업 파일은 로컬 컴퓨터에서 업로드할 수 없습니다. 온라인으로 이용 가능해야 합니다. 다행히 nyc_data.backup 사용할 수 있게 해주는 GitHub 저장소 를 찾았습니다.


  • 데이터베이스 복원 수행은 postgis 확장 설치를 포함하여 Heroku Postgres 인스턴스를 완전히 재설정하는 것부터 시작됩니다. 따라서 위에서 확장 프로그램을 수동으로 설치하는 방법을 보여주었지만 데이터를 로드하기 전에 확장 프로그램을 사전 설치하려면 데이터베이스를 복원할 때 플래그를 추가해야 합니다.


데이터베이스 백업을 복원하는 데 사용할 명령은 다음과 같습니다.

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

백업 파일은 공개적으로 액세스 가능한 URL을 통해 지정됩니다. 언제든지 PostGIS 튜토리얼에서 데이터세트를 다운로드하고, nyc_data.backup 파일을 추출한 후, 원하는 위치에 온라인으로 게시할 수 있습니다.


-e postgis 플래그는 백업의 스키마와 데이터를 로드하기 전에 postgis 확장을 설치하도록 지정합니다.


그거였다! 몇 가지 간단한 명령으로는 나쁘지 않습니다. 우리는 데이터베이스와 데이터를 가지고 있습니다.

왜 헤로쿠인가?

로컬 컴퓨터에서 Postgres를 설정하는 방법을 이미 알고 있다면 내가 왜 Heroku를 선택했는지 궁금할 것입니다. 나에게 가장 큰 이유는 단순성이다. 내가 계획한 분석을 위해 충분히 큰 Heroku Postgres 계획을 선택하고 PostGIS 확장을 설치하는 것 외에 시작하고 실행하기 위해 해야 할 일은 아무것도 없습니다.


또한 내가 수행하는 모든 분석에 공동작업하는 것도 쉽습니다. 다른 사람들에게 공동 작업자로서 내 데이터베이스에 대한 액세스 권한을 부여할 수도 있고, 데이터베이스 위에 애플리케이션을 신속하게 구축하고 Postgres 클라이언트가 아닌 일반 웹 인터페이스를 통해 액세스를 공유할 수도 있습니다.


마지막으로, 프로젝트 작업을 마치고 더 이상 필요하지 않을 때 Heroku에서 앱을 삭제하면 모두 사라집니다. 내 컴퓨터에는 걱정할 데이터 파일이 없습니다. 로컬에 추가 소프트웨어가 설치되지 않았습니다. 나는 새로운 기술을 빠르게 살펴보고 작업이 끝나면 다음 단계로 넘어갈 수 있습니다.

PostGIS 작업

이제 PostGIS가 어떻게 작동하는지 살펴보겠습니다.

Postgres에서와 마찬가지로 작업

가장 먼저 기억해야 할 점은 PostGIS가 Postgres 내의 확장 이라는 것입니다. 즉, 표준 Postgres 쿼리도 수행할 수 있습니다.


뉴욕에서 B로 시작하는 거리가 몇 개인지 알고 싶다고 가정해 보겠습니다. 간단한 SQL 쿼리를 통해 다음과 같이 알 수 있습니다.

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


각 자치구의 동네 수는 어떻습니까? 다시 한 번 간단한 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)

지금까지 우리는 표준 PostgreSQL을 수행했습니다. 이제 PostGIS 기능을 사용하는 방법을 살펴보겠습니다.

지리 공간적 기하학 작업의 예

데이터 세트에는 뉴욕의 모든 거리가 포함되어 있으므로 다음 쿼리를 사용하여 도시에 거리가 몇 킬로미터인지 물어볼 수 있습니다.

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


또한 맨해튼 전체의 면적과 같은 면적을 계산할 수도 있습니다.

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

이러한 계산은 이러한 종류의 집계된 데이터와 관련된 열이 아닌 지리공간 데이터에서 수행됩니다. 뿐만 아니라 이러한 쿼리는 매우 빠르게 실행됩니다.


제가 정말 놀랐던 마지막 쿼리 중 하나는 공간 조인을 사용하는 것과 관련이 있습니다. 표준 데이터베이스 조인과 마찬가지로 공간 조인은 여러 테이블을 통합할 수 있지만 공간 관계를 기반으로 합니다. 예를 들어, 공간 데이터를 이용하면 특정 지하철역이 어느 동네에 있는지 쿼리할 수 있습니다. 이를 위해 PostGIS의 ST_Contains 사용하여 해당 지역의 기하학이 지하철역의 기하학을 완전히 포함하는지 확인할 수 있습니다.


지하철 이름( nyc_subway_stations )을 기반으로 ST_Contains true인 동네( nyc_neighborhoods )를 쿼리합니다. 우리의 쿼리는 다음과 같습니다:

 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는 도형을 사용하여 훨씬 더 고급 위치 쿼리 기능을 제공하지만 이는 여기의 간단한 데모 범위를 벗어납니다.

결론

이전에 PostGIS를 사용해 본 적이 없었기 때문에 PostGIS의 기능에 정말 감동받았습니다. 공식 PostGIS 소개 책을 절반쯤 읽었기 때문에 이 데이터베이스로 할 수 있는 일이 훨씬 더 많습니다. 뿐만 아니라 Heroku가 지원하는 다양한 언어를 사용하여 PostGIS 위에 애플리케이션을 구축하고 배포할 수 있습니다.


특히 PostGIS 위에 Rails 앱을 구축하는 사용 사례를 찾고 싶을 수도 있다고 생각합니다. 시작하는 방법에 대한 문서를 이미 찾았습니다.


하지만 지금은 이 인스턴스가 더 이상 필요하지 않으므로 정리하고 앱을 삭제하겠습니다. CLI에서 수행해야 할 작업은 다음과 같습니다.

 $ 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

잠깐, 그게 다야? 응, 그게 다야. 단 한번의 명령과 확인으로 모든 것이 무너지고, 더 이상 걱정할 필요가 없습니다.

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

이제 내 앱을 삭제했으므로 여러분에게는 놀라운 기회가 있습니다. 고유한 앱 이름 postgis-demo Heroku에서 해당 앱을 가져오려는 첫 번째 독자에게 제공됩니다! 차세대 PostGIS 앱을 구축할 준비가 되셨나요? 오늘이 그날이다!