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 इंस्टेंस कैसे चलाया जाता है। फिर, मैं डेटाबेस पर कुछ सैंपल क्वेरीज़ चलाऊंगा, ताकि आपको यह महसूस हो सके कि यह कैसे काम करता है। और सबसे अच्छी बात? आप हमारे साथ चल सकते हैं और जैसे-जैसे हम आगे बढ़ेंगे, अपनी खुद की खोज कर सकते हैं!

पोस्टजीआईएस क्या है?

भले ही आपने कुछ समय के लिए Postgres का उपयोग किया हो, लेकिन आप PostGIS से परिचित नहीं हो सकते हैं। GIS का मतलब भौगोलिक सूचना प्रणाली है। इस क्षेत्र में कई समाधान हैं। लेकिन PostGIS को जो चीज़ अच्छी बनाती है वह यह है कि यह लोकप्रिय PostgreSQL डेटाबेस पर आधारित है। Postgres से अपेक्षित सभी प्रदर्शन के अलावा, हमें भू-स्थानिक डेटा संग्रहीत करने के लिए एक पूर्ण-विशेषताओं वाला टूल मिलता है।


पोस्टजीआईएस न केवल इस प्रकार के डेटा के लिए एक अच्छा भंडारण समाधान प्रदान करता है, बल्कि इसे कई अनुप्रयोगों के साथ सहजता से एकीकृत किया जा सकता है जो इस डेटा का उपयोग कर सकते हैं (जैसे आर्कजीआईएस और टेबल्यू)।


TL; DR—यदि आपको स्थान डेटा को प्रोसेस, स्टोर या क्वेरी करने की आवश्यकता है, तो PostGIS ऐसा करने के लिए एक बढ़िया विकल्प है। सौभाग्य से, यह Heroku ऐप में ऐडऑन जोड़ने जितना ही सरल है, ताकि एक नया Postgres इंस्टेंस चालू और चालू हो सके। तो, चलिए अब ऐसा करते हैं।

हम पोस्टजीआईएस का उपयोग कैसे कर सकते हैं?

आरंभ करने के लिए, आपको किसी भी आकार के ऐप की आवश्यकता होगी। फिर, आप अपने ऐप में 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.5 एमबी की ज़िप फ़ाइल है। निकाले गए संग्रह के data सबफ़ोल्डर में, nyc_data.backup नामक 9.5 एमबी की फ़ाइल है।


यह फाइल न्यूयॉर्क शहर की 2000 की जनगणना के सभी जनगणना आंकड़ों के साथ-साथ शहर की सभी सड़कों, मोहल्लों और मेट्रो स्टेशनों की जानकारी से युक्त है।


हम heroku pg:backups:restore कमांड का उपयोग करके सीधे अपने Heroku Postgres इंस्टेंस में डेटा बैकअप को पुनर्स्थापित कर सकते हैं। यह अविश्वसनीय रूप से सुविधाजनक है। हालाँकि, निम्नलिखित सावधानियों को ध्यान में रखें:


  • जिस बैकअप फ़ाइल से आप रिस्टोर कर सकते हैं, उसे आपकी स्थानीय मशीन से अपलोड नहीं किया जा सकता। यह ऑनलाइन उपलब्ध होना चाहिए। सौभाग्य से, मुझे एक GitHub रेपो मिला जो nyc_data.backup उपलब्ध कराता है।


  • डेटाबेस रिस्टोर करने की शुरुआत आपके Heroku Postgres इंस्टेंस को पूरी तरह से रीसेट करके होती है, जिसमें postgis एक्सटेंशन की आपकी इंस्टॉलेशन भी शामिल है। इसलिए, भले ही हमने ऊपर दिखाया है कि एक्सटेंशन को मैन्युअल रूप से कैसे इंस्टॉल किया जाए, लेकिन जब हम अपने डेटाबेस को रिस्टोर करेंगे तो हमें डेटा लोड करने से पहले एक्सटेंशन को प्री-इंस्टॉल करने के लिए एक फ्लैग जोड़ना होगा।


डेटाबेस बैकअप को पुनर्स्थापित करने के लिए हम इस कमांड का उपयोग करेंगे:

 $ 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 कैसे काम करता है।

ठीक वैसे ही काम करें जैसे आप 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 में) के आधार पर, हम उस पड़ोस ( nyc_neighborhoods में) के लिए क्वेरी करते हैं जिसके लिए ST_Contains सत्य है। हमारी क्वेरी इस तरह दिखती है:

 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 परिचय पुस्तक का केवल आधा भाग ही पढ़ा है। इतना ही नहीं, मैं 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 ऐप बनाने के लिए तैयार हैं? आज ही वह दिन है!