paint-brush
Konum, Konum, Konum! PostGIS ve Heroku Postgresile@josephcaudle
681 okumalar
681 okumalar

Konum, Konum, Konum! PostGIS ve Heroku Postgres

ile Joseph Caudle9m2024/04/16
Read on Terminal Reader

Çok uzun; Okumak

Son zamanlarda Heroku'nun PostGIS desteğini de içerdiğini öğrendim. Kişisel olarak PostGIS'i daha önce hiç kullanmadım. Ürünün birkaç tescilli rakibini biliyorum, bu yüzden açık kaynak seçeneğini denemek için harika bir zaman olacağını düşündüm.
featured image - Konum, Konum, Konum! PostGIS ve Heroku Postgres
Joseph Caudle HackerNoon profile picture

Postgres'i Jeo-uzaysal Veri Sorgularını Destekleyecek Şekilde Genişletme

AWS'de bir işlem örneğini başlatmak için yapılandırmalar ve hizmetlerle uğraşarak çok fazla zaman kaybettim. Bazen uygulamaları ve fikirleri test etmek için üretime hazır bir ortama ihtiyacım oluyor. Heroku ile bunu CLI'deki birkaç basit komutla elde edebiliyorum.


Son zamanlarda Heroku'nunPostGIS desteğini de içerdiğini öğrendim. Kişisel olarak PostGIS'i daha önce hiç kullanmadım. Ürünün birkaç tescilli rakibini biliyorum, bu yüzden açık kaynak seçeneğini denemek için harika bir zaman olacağını düşündüm.


Bu makalede, Heroku üzerinde çalışan PostGIS özellikli bir Postgres örneğinin nasıl alınacağını göstereceğim. Daha sonra, nasıl çalıştığına dair size bir fikir vermek için veritabanında bazı örnek sorgular çalıştıracağım. Ve en iyi kısmı? Biz giderken takip edebilir ve kendi keşfinizi yapabilirsiniz!

PostGIS Nedir?

Postgres'i bir süredir kullanmış olsanız bile PostGIS'e aşina olmayabilirsiniz. CBS, Coğrafi Bilgi Sistemi anlamına gelir. Uzayda birçok çözüm var. Ancak PostGIS'i güzel yapan şey onun çok sevilen PostgreSQL veritabanını temel almasıdır. Postgres'ten bekleyebileceğiniz tüm performansa ek olarak, coğrafi verileri depolamak için tam özellikli bir araca da sahip oluyoruz.


PostGIS yalnızca bu tür veriler için iyi bir depolama çözümü sağlamakla kalmaz, aynı zamanda bu verileri tüketebilecek çeşitli uygulamalarla (ArcGIS ve Tableau gibi) sorunsuz bir şekilde entegre edilebilir.


TL; DR—Konum verilerini işlemeniz, depolamanız veya sorgulamanız gerekiyorsa PostGIS bunu yapmak için mükemmel bir seçenektir. Neyse ki, yeni bir Postgres örneğini çalışır duruma getirmek için Heroku uygulamasına bir eklenti eklemek kadar basit. Öyleyse şimdi bunu yapalım.

PostGIS'i Nasıl Kullanabiliriz?

Başlamak için her boyutta bir uygulamaya ihtiyacınız olacak. Ardından uygulamanıza Heroku Postgres'in bir örneğini eklersiniz.

Bir Heroku Uygulaması Oluşturun

Demom için boş bir uygulama oluşturacağım.

Bir Heroku Postgres eklentisi ekleyin

Uygulama oluşturulduktan sonra Heroku Postgres eklentisini oluşturabilirim. Örnek veri kümem Mini plan örneği için çok büyük olduğundan bunun yerine Temel planı kullanmam gerekiyor. Bunu komut satırından yapabilirim:

 $ 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 veritabanımı oluşturduktan sonraPostGIS'i kurmak için yalnızca birkaç adımım kaldı.

PostGIS Uzantısını Oluşturun

Heroku Postgres'te kurabileceğimiz birçok olası uzantı var. Bunları listelemek için örneğimize şunu sorabiliriz:

 $ 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


Kullanılabilir uzantılar listesinde postgis görüyoruz. Buradan uzantıyı oluşturabiliriz.

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


Uzantının yüklü olduğunu doğrulayabilir ve sürümü kontrol edebiliriz:

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


Peki! Görünüşe göre PostGIS 3.4'ü kullanmaya başladık.

İlk Veri Kümesini Yükle

Artık PostGIS uzantısını etkinleştirdiğime göre, üzerinde oynamak için bir veri kümesi yüklemem gerekiyor. PostGIS'e Giriş kitabı tarafından sağlanan veri kümesini kullanıyorum. İndirilen veri paketi 21,5 MB boyutunda bir zip dosyasıdır. Çıkarılan arşivin data alt klasöründe nyc_data.backup adında 9,5 MB boyutunda bir dosya bulunmaktadır.


Bu, New York City'nin 2000 nüfus sayımına ait tüm nüfus sayımı verilerinin yanı sıra şehirdeki tüm sokaklar, mahalleler ve metro istasyonlarını içeren bir dosyadır.


heroku heroku pg:backups:restore komutunu kullanarak veri yedeklemesini doğrudan Heroku Postgres örneğimize geri yükleyebiliriz. Bu inanılmaz derecede kullanışlı. Ancak aşağıdaki uyarıları aklınızda bulundurun:


  • Geri yükleyebileceğiniz yedekleme dosyası yerel makinenizden yüklenemez. Çevrimiçi olarak mevcut olmalıdır. Neyse ki nyc_data.backup kullanılabilir hale getiren bir GitHub deposu buldum.


  • Veritabanı geri yükleme işlemi, postgis uzantısının kurulumu da dahil olmak üzere Heroku Postgres örneğinizin tamamen sıfırlanmasıyla başlar. Dolayısıyla, yukarıda uzantının manuel olarak nasıl kurulacağını göstermiş olsak da, verileri yüklemeden önce uzantıyı önceden yüklemek için veritabanımızı geri yüklediğimizde bir bayrak eklememiz gerekecek.


Veritabanı yedeklemesini geri yüklemek için kullanacağımız komut:

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

Yedekleme dosyamız herkesin erişebileceği bir URL aracılığıyla belirtilir. Veri kümesini istediğiniz zaman PostGIS eğitiminden indirebilir, nyc_data.backup dosyasını çıkarabilir ve çevrimiçi olarak kendi seçtiğiniz bir konuma gönderebilirsiniz.


-e postgis bayrağı, yedeğin şemasını ve verilerini yüklemeden önce postgis uzantısını yüklemek istediğimizi belirtir.


İşte bu! Birkaç basit komut için fena değil. Veritabanımız ve verilerimiz var.

Neden Heroku?

Yerel bir makinede Postgres'i nasıl kuracağınızı zaten biliyorsanız, neden Heroku'yu tercih ettiğimi merak ediyor olabilirsiniz. Benim için en büyük sebep basitlik. Yapmayı planladığım analiz için yeterince büyük bir Heroku Postgres planı seçmenin ve PostGIS uzantısını kurmanın yanı sıra, çalışmaya başlamak için yapmam gereken başka hiçbir şey yok.


Ayrıca yaptığım herhangi bir analiz üzerinde işbirliği yapmak kolaydır. Başkalarının veritabanıma ortak çalışan olarak erişmesine izin verebilirim veya veritabanının üzerinde hızlı bir şekilde bir uygulama oluşturabilir ve Postgres istemcisi yerine normal bir web arayüzü aracılığıyla erişimi paylaşabilirim.


Sonunda, bir proje üzerinde çalışmayı bitirdiğimde ve artık ona ihtiyacım kalmadığında, Heroku'daki uygulamayı silebiliyorum ve hepsi kayboluyor. Bilgisayarımda endişelenecek veri dosyası yok. Yerel olarak yüklenmiş ekstra bir yazılım yok. Yeni bir teknolojiye hızlı bir gezinin tadını çıkarabiliyorum ve işim bittiğinde devam edebiliyorum.

PostGIS'le Çalışmak

Şimdi PostGIS'in nasıl çalıştığına bir göz atalım.

Postgres'te Çalıştığınız Gibi Çalışın

Hatırlanması gereken ilk şey PostGIS'in Postgres'in bir uzantısı olduğudur. Bu, herhangi bir standart Postgres sorgusunu da gerçekleştirebileceğiniz anlamına gelir.


Diyelim ki New York'ta kaç sokağın B ile başladığını öğrenmek istedim. Basit bir SQL sorgusu bana şunu söyleyecektir:

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


Her ilçedeki mahalle sayısı nasıl? Yine basit bir SQL sorgusu:

 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)

Şu ana kadar standart PostgreSQL'i yaptık. Şimdi PostGIS özelliklerinin nasıl kullanılacağına bir göz atalım.

Jeo-uzaysal Geometrilerle Çalışma Örnekleri

Veri setimiz New York sokaklarının tamamını içerdiğinden bu sorguyla şehirde kaç kilometre sokak olduğunu sorabiliriz:

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


Ayrıca Manhattan'ın tamamının yüzölçümü gibi alanları da hesaplayabiliriz:

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

Bu hesaplamaların bu tür toplu verilerle ilgili sütunlardan değil, coğrafi verilerden geldiğini unutmayın. Sadece bu değil, aynı zamanda bu sorgular son derece hızlı bir şekilde yürütülüyor.


Gerçekten hayran kaldığım son bir sorgu, uzamsal birleştirmelerin kullanımını içeriyor. Standart veritabanı birleştirmelerine çok benzer şekilde, uzamsal birleştirmeler birden fazla tabloyu birleştirebilir, ancak bu, uzamsal ilişkiler temelinde mümkündür. Örneğin mekansal verileri kullanarak belirli bir metro istasyonunun hangi mahallede olduğunu sorgulayabiliyoruz. Bunu yapmak için PostGIS'ten ST_Contains kullanarak mahallenin geometrisinin tamamen metro istasyonu geometrisini içerip içermediğini tespit edebiliriz.


Metro ismine göre ( nyc_subway_stations içinde), ST_Contains doğru olduğu mahalleyi ( nyc_neighborhoods içinde) sorgularız. Sorgumuz şuna benzer:

 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, geometrilerle daha da gelişmiş konum sorgulama işlevselliği sağlar, ancak bu, buradaki basit demomuzun kapsamı dışındadır.

Çözüm

PostGIS'i daha önce hiç kullanmadığım için yapabileceklerinden gerçekten etkilendim. Resmi PostGIS'e Giriş kitabının henüz yarısına geldiğim için bu veritabanıyla yapabileceğim daha birçok şey var. Sadece bu da değil, Heroku tarafından desteklenen herhangi bir sayıda dili kullanarak PostGIS üzerinde uygulamalar oluşturup dağıtabilirim.


Özellikle PostGIS'in üzerinde bir Rails uygulaması oluşturmak için bir kullanım örneği bulmak isteyebileceğimi düşünüyorum. Nasıl başlayabileceğime dair bazı belgeler buldum.


Ancak şimdilik bu örneğe artık ihtiyacım yok, bu yüzden onu temizleyip uygulamamı sileceğim. CLI'den yapmam gereken şey şu:

 $ 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

Bekle, hepsi bu mu? Evet, hepsi bu. Tek bir komut ve onayla her şey yerle bir oluyor ve artık bu konuda endişelenmeme gerek yok.

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

Artık uygulamamı sildiğime göre inanılmaz bir fırsatınız var: Benzersiz uygulama adı postgis-demo onu Heroku'da edinmek isteyen ilk okuyucu için mevcut! Bir sonraki harika PostGIS uygulamanızı oluşturmaya hazır mısınız? Bugün o gün!