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!
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.
Başlamak için her boyutta bir uygulamaya ihtiyacınız olacak. Ardından uygulamanıza Heroku Postgres'in bir örneğini eklersiniz.
Demom için boş bir uygulama oluşturacağım.
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ı.
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.
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:
nyc_data.backup
kullanılabilir hale getiren bir GitHub deposu buldum.
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.
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.
Şimdi PostGIS'in nasıl çalıştığına bir göz atalım.
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.
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.
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!