ServBay में PostGIS का उपयोग कैसे करें: PostgreSQL के लिए जियोस्पेशियल क्षमताएँ जोड़ें
PostGIS
एक शक्तिशाली PostgreSQL डेटाबेस एक्सटेंशन है, जो PostgreSQL को जियोस्पेशियल डेटा टाइप्स, फंक्शन और इंडेक्स का सपोर्ट प्रदान करता है। इसका मतलब है कि आप अपने डेटाबेस में पॉइंट, लाइन, पॉलीगॉन आदि जैसे जियोइन्फॉर्मेशन को स्टोर कर सकते हैं और जटिल स्पेशियल क्वेरी और एनालिसिस कर सकते हैं। मैप्स, लोकेशन सर्विसेज, या किसी भी लोकेशन-आधारित वेब एप्लिकेशन के लिए यह एक अनिवार्य टूल है।
ServBay, जो macOS के लिए डिज़ाइन किया गया एक स्थानीय वेब डेवलपमेंट एनवायरनमेंट है, पहले से ही PostgreSQL सॉफ़्टवेयर पैकेज के साथ आता है और इसमें डिफ़ॉल्ट रूप से PostGIS एक्सटेंशन भी शामिल है। इससे स्थानीय स्तर पर PostGIS का उपयोग करना काफ़ी आसान हो जाता है, और आपको कोई मैन्युअल कॉम्पायल या डिपेंडेंसी इंस्टॉल करने की आवश्यकता नहीं होती।
यह लेख ServBay एनवायरनमेंट में PostGIS को इनेबल और इस्तेमाल करने के स्टेप्स को विस्तार से बताता है, जिससे आप अपने प्रोजेक्ट में आसानी से जियोस्पेशियल फीचर्स जोड़ सकते हैं।
आवश्यकताएँ
PostGIS का उपयोग करने से पहले, कृपया सुनिश्चित करें कि आपने निम्नलिखित तैयारी कर रखी है:
- ServBay इंस्टॉल और रन करें: सुनिश्चित करें कि आपने macOS सिस्टम पर सफलतापूर्वक ServBay इंस्टॉल किया है।
- PostgreSQL सॉफ़्टवेयर पैकेज को इनेबल और स्टार्ट करें: ServBay कंट्रोल पैनल पर जाएँ, देखें कि PostgreSQL पैकेज इनेबल और रन कर रहा है या नहीं। अगर नहीं, तो कंट्रोल पैनल में PostgreSQL को ढूँढें, इनेबल करें और स्टार्ट करें।
- PostgreSQL डेटाबेस तक पहुँचें: कमांड लाइन टूल
psql
या ग्राफिकल क्लाइंट (जैसे TablePlus, pgAdmin) से ServBay के PostgreSQL डेटाबेस से कनेक्ट करना जानें। डिफ़ॉल्ट रूप से आपpsql -U postgres
से लोकल डेटाबेस से कनेक्ट कर सकते हैं।
PostGIS एक्सटेंशन को इंस्टॉल और इनेबल करें
ServBay में PostGIS एक्सटेंशन फ़ाइलें पहले से ही इंस्टॉल्ड हैं, आपको अलग से कुछ डाउनलोड करने की आवश्यकता नहीं है। बस उस डेटाबेस में यह एक्सटेंशन "इनेबल" करें, जिसमें आप PostGIS का उपयोग करना चाहते हैं।
इसे इनेबल करने के स्टेप्स:
लक्ष्य PostgreSQL डेटाबेस से कनेक्ट करें: टर्मिनल खोलें और
psql
कमांड का उपयोग करके अपने डेटाबेस से कनेक्ट करें।your_username
को अपने डेटाबेस यूज़रनेम से (जैसेpostgres
), औरyour_database
को उस डेटाबेस के नाम से बदलें जहाँ आप PostGIS इनेबल करना चाहते हैं।bashpsql -U your_username -d your_database
1अगर आप डिफ़ॉल्ट
postgres
यूज़र और डेटाबेस में इनेबल करना चाहते हैं, तो बस यह चलाएँ:bashpsql -U postgres
1डेटाबेस में PostGIS एक्सटेंशन क्रिएट करें: कनेक्शन के बाद,
psql
कमांड लाइन पर यह SQL चलाएँ:sqlCREATE EXTENSION postgis;
1यह कमांड आपके डेटाबेस में PostGIS से संबंधित सभी ज़रूरी ऑब्जेक्ट्स (जैसे नए डेटा टाइप्स, फंक्शंस, ऑपरेटर्स, आदि) बना देगी।
जाँचें कि PostGIS सफलतापूर्वक इंस्टॉल हुआ या नहीं:
psql
में\dx
टाइप करें, यह आपके डेटाबेस में इनेबल सभी एक्सटेंशन की लिस्ट दिखाएगा।sql\dx
1यदि PostGIS इनेबल हो गया है, तो लिस्ट में
postgis
के साथ उसका वर्जन दिखाई देगा।List of installed extensions Name | Version | Schema | Description -----------+---------+------------+-------------------------------------------------------------- plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language postgis | 3.3.2 | public | PostGIS geometry and geography spatial types and functions (2 rows)
1
2
3
4
5
6(नोट: PostGIS के वर्जन नंबर आपके ServBay वर्शन पर निर्भर करते हैं)
अब आपने अपने चुने गए PostgreSQL डेटाबेस में PostGIS एक्सटेंशन सफलतापूर्वक इनेबल कर लिया है, और इसके जियोस्पेशियल फीचर्स इस्तेमाल कर सकते हैं।
PostGIS डेटा कन्फ़िगर करें
PostGIS इनेबल करने के बाद, अब आप नए टेबल्स बना सकते हैं जिनमें जियोस्पेशियल डेटा होगा या मौजूदा टेबल्स में ऐसे कॉलम जोड़ सकते हैं। PostGIS में मुख्यतः दो स्पेशियल डेटा टाइप्स हैं: geometry
और geography
। geometry
का उपयोग प्लेन कोऑर्डिनेट सिस्टम के लिए होता है, जबकि geography
ग्लोब के लिए (जैसे पृथ्वी की सतह), आमतौर पर लॉन्गिट्यूड-लैटीट्यूड के लिए अधिक उपयुक्त है।
जियोस्पेशियल कॉलम वाले टेबल बनाना
यह उदाहरण एक locations
नाम के टेबल को बनाना दिखाता है, जिसमें पॉइंट लोकेशन स्टोर करने के लिए एक स्पेशियल कॉलम है।
टेबल बनाएं: डेटाबेस से जुड़े
psql
या किसी ग्राफिकल क्लाइंट में यह SQL कमांड चलाएँ:sqlCREATE TABLE locations ( id SERIAL PRIMARY KEY, name VARCHAR(100), geom GEOMETRY(Point, 4326) );
1
2
3
4
5GEOMETRY(Point, 4326)
:geom
कॉलम का डेटा टाइपGEOMETRY
है।Point
बताता है कि यह एक बिंदु (पॉइंट) है।4326
एक SRID (Spatial Reference Identifier) है, जो WGS84 कोऑर्डिनेट सिस्टम का प्रतिनिधित्व करता है। यह वही सिस्टम है जो GPS, OpenStreetMap, Google Maps आदि ऑनलाइन मैप्स में इस्तेमाल होता है।- आप अपनी जरूरत के हिसाब से अन्य जियोमेट्री टाइप्स (जैसे
LineString
,Polygon
,MultiPoint
वगैरह) और अलग SRID भी इस्तेमाल कर सकते हैं।
डेटा डालें: PostGIS के फंक्शन से टेबल में जियोमेट्री ऑब्जेक्ट जोड़ें।
ST_GeomFromText()
का उपयोग WKT (Well-Known Text) से जियोमेट्री बनाने के लिए होता है।sqlINSERT INTO locations (name, geom) VALUES ('ServBay Headquarters', ST_GeomFromText('POINT(116.4074 39.9042)', 4326)), -- बीजिंग का उदाहरण ('ServBay Shanghai Office', ST_GeomFromText('POINT(121.4737 31.2304)', 4326)); -- शंघाई का उदाहरण
1
2
3ध्यान दें:
POINT(लॉन्गिट्यूड लैटीट्यूड)
का क्रम WKT स्टैंडर्ड में यही है।
जियोस्पेशियल इंडेक्स बनाना
अगर टेबल में बहुत सारे जियोस्पेशियल डेटा हैं, तो स्पेशियल इंडेक्स बनाना क्वेरी की परफॉरमेंस के लिए अहम है, ख़ासकर रेंज, कंटेनमेंट या नज़दीकी क्वेरी के लिए। PostGIS में सबसे ज्यादा GiST (Generalized Search Tree) इंडेक्स का उपयोग होता है।
GiST इंडेक्स बनाएं: डेटाबेस में कनेक्ट कर यह SQL चलाएँ:
sqlCREATE INDEX idx_locations_geom ON locations USING GIST (geom);
1यह
locations
टेबल मेंgeom
कॉलम पर GiST इंडेक्स बना देगा। PostgreSQL क्वेरी ऑप्टिमाइज़र अपने आप इस इंडेक्स का उपयोग स्पेशियल क्वेरी में कर लेता है।
PostGIS के साथ जियोस्पेशियल क्वेरीज़
PostGIS सैकड़ों फंक्शन मुहैया कराता है जिनसे आप जियोस्पेशियल डेटा के अलग-अलग ऑपरेशंस कर सकते हैं। नीचे कुछ वेब ऐप डेवेलपमेंट के लिए सामान्य क्वेरी उदाहरण दिए गए हैं:
दो पॉइंट्स के बीच दूरी ज्ञात करें
दो जियो लोकेशनों के बीच सीधी दूरी:
sql
SELECT ST_Distance(
ST_GeomFromText('POINT(116.4074 39.9042)', 4326), -- पॉइंट A
ST_GeomFromText('POINT(121.4737 31.2304)', 4326) -- पॉइंट B
);
1
2
3
4
2
3
4
ST_Distance()
: दो जियोमेट्री ऑब्जेक्ट्स के बीच की दूरी निकालता है। अगर SRID 4326 के साथgeometry
टाइप है, तो यूनिट डिग्री में करीब-करीब मानी जाएगी। अधिक सटीक और मीटर में दूरी चाहिए तोgeography
टाइप याST_Distance(geography_a, geography_b, use_spheroid)
का इस्तेमाल करें।
कंटेनमेंट क्वेरी
जांचें कि कोई जियोमेट्री दूसरी को कवर करती है या नहीं, जैसे किसी पॉइंट का किसी इलाके (पॉलीगॉन) के भीतर होना:
sql
SELECT name FROM locations
WHERE ST_Contains(
ST_GeomFromText('POLYGON((116.0 39.0, 117.0 39.0, 117.0 40.0, 116.0 40.0, 116.0 39.0))', 4326), -- रेक्टैंगल एरिया उदाहरण
geom
);
1
2
3
4
5
2
3
4
5
ST_Contains(geometry A, geometry B)
: अगर जियोमेट्री A पूरी तरह से जियोमेट्री B को घेरती है तो true देगा।
निकटतम पड़ोसी खोजना
किसी पॉइंट के आसपास सबसे करीब लोकेशन ढूँढें। GiST इंडेक्स यहाँ तेजी से खोजने में मदद करता है।
sql
SELECT name, ST_Distance(geom, ST_GeomFromText('POINT(116.4074 39.9042)', 4326)) AS distance
FROM locations
ORDER BY geom <-> ST_GeomFromText('POINT(116.4074 39.9042)', 4326) -- <-> ऑपरेटर GiST इंडेक्स के साथ दूरी के आधार पर सॉर्ट करता है
LIMIT 5;
1
2
3
4
2
3
4
<->
ऑपरेटर PostGIS का खास "डिस्टेंस" ऑपरेटर है, GiST इंडेक्स के साथ बहुत तेज़ी से निकटतम ऑब्जेक्ट फँदता है।
PostGIS के साथ जियोस्पेशियल एनालिसिस
बेसिक क्वेरी के अलावा, PostGIS में पावरफुल विश्लेषण फंक्शन भी हैं, जैसे बफर बनाना, इंटरसेक्शन निकालना, यूनियन करना आदि।
बफर एनालिसिस
किसी जियोमेट्री ऑब्जेक्ट के आसपास किसी तय डायमीटर का बफर बनाएं (एक पॉलीगॉन एरिया):
sql
SELECT ST_Buffer(geom, 0.01) -- डिग्री यूनिट में बफर बनाना, 0.01 डिग्री लगभग 1.1 किमी के बराबर
FROM locations
WHERE name = 'ServBay Headquarters';
1
2
3
2
3
ST_Buffer(geometry, distance)
: दूरी के हिसाब से बफर बनाता है। जियोमेट्री टाइप पर, यूनिट उस कोऑर्डिनेट सिस्टम के बराबर होगी (ज्यादातर डिग्री)।
इंटरसेक्शन एनालिसिस
दो या अधिक जियोमेट्री के ओवरलैपिंग हिस्से का हिसाब लगाएँ:
sql
SELECT ST_Intersection(
ST_GeomFromText('POLYGON((116.0 39.0, 117.0 39.0, 117.0 40.0, 116.0 40.0, 116.0 39.0))', 4326),
geom
)
FROM locations
WHERE name = 'ServBay Headquarters';
1
2
3
4
5
6
2
3
4
5
6
ST_Intersection(geometry A, geometry B)
: A और B के साझा हिस्से के रूप में नई जियोमेट्री देता है।
यूनियन एनालिसिस
कई जियोमेट्रीज़ को एक ही जियोमेट्री में मिलाएँ (संभव है कि वह मल्टीपार्ट बन जाए):
sql
SELECT ST_Union(geom)
FROM locations;
1
2
2
ST_Union(geometry set)
: सभी दिए गए जियोमेट्रीज़ को मिला देता है।
जियोस्पेशियल डेटा का विज़ुअलाइज़ेशन
PostGIS डेटाबेस में स्टोर जियोस्पेशियल डेटा को विज़ुअलाइज़ करना वेब डेवेलपमेंट में आम जरूरत है। इसके लिए आप डेस्कटॉप GIS सॉफ्टवेयर या वेब लाइब्रेरीज़ का इस्तेमाल कर सकते हैं।
डेस्कटॉप GIS टूल (जैसे QGIS) का उपयोग
QGIS एक प्रसिद्ध फ्री और ओपन-सोर्स डेस्कटॉप GIS है, जिससे PostGIS डेटाबेस से सीधे जुड़कर डेटा देख सकते हैं।
ServBay के PostgreSQL डेटाबेस से कनेक्ट करें:
- QGIS खोलें।
- मेनू से
Layer
(लेयर) ->Add Layer
(लेयर जोड़ें) ->Add PostGIS Layers...
(PostGIS लेयर जोड़ें) चुनें। - खिड़की में,
New
(नया) पर क्लिक करें और कनेक्शन बनाएँ। - कनेक्शन डिटेल भरें:
- Name (नाम): कनेक्शन का नाम, जैसे
ServBay PostGIS
। - Host (होस्ट):
localhost
या127.0.0.1
- Port (पोर्ट): डिफ़ॉल्ट
5432
(ServBay में भी यही) - Database (डेटाबेस): वही डेटाबेस जिसमें PostGIS इनेबल है
- Username (यूज़रनेम): आपके डेटाबेस यूज़र, जैसे
postgres
- Password (पासवर्ड): डेटाबेस पासवर्ड
- Name (नाम): कनेक्शन का नाम, जैसे
Test Connection
(कनेक्शन जांचें) पर क्लिक और सुनिश्चित करें कि कनेक्ट हो रहा है।OK
से सेव करें, और फिर मुख्य विंडो मेंConnect
(कनेक्ट) पर क्लिक करें
जियोस्पेशियल डेटा लोड करें:
- कनेक्शन सफल होने के बाद, आपको सभी टेबल दिख जाएँगी।
- जिसमें जियोस्पेशियल कॉलम है (जैसे
locations
), उसे चुनें। - अपनी इच्छित टेबल सलेक्ट करें,
Add
(जोड़ें) पर क्लिक करें और फिरClose
(बंद करें)। अब आपके डेटा QGIS के मैप व्यू में आ जाएंगे।
वेब मैप लाइब्रेरी (जैसे Leaflet) का उपयोग
JavaScript लाइब्रेरी (Leaflet, OpenLayers, Mapbox GL JS) की मदद से, आप Back-end सर्विस के जरिए PostGIS से डेटा लाकर वेबपेज पर मैप में शो कर सकते हैं। नीचे एक साधारण Leaflet उदाहरण है जो HTML फाइल में बेसिक मैप दिखाता है। आपको अपनी Back-end सर्विस (जैसे PHP, Node.js, Python - ये सब ServBay में चलते हैं) से PostGIS का डेटा लेकर GeoJSON आदि फॉर्मेट में फ्रंटेंड को भेजना होगा।
इस HTML फाइल को ServBay की वेबसाइट रूट डिरेक्टरी (जैसे /Applications/ServBay/www/postgis-map/index.html
) में रखें, और फिर ServBay के जरिए उस साइट को खोलें (postgis-map.servbay.demo
के रूप में)।
html
<!DOCTYPE html>
<html>
<head>
<title>ServBay PostGIS Leaflet Example</title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="https://unpkg.com/leaflet/dist/leaflet.css" />
<script src="https://unpkg.com/leaflet/dist/leaflet.js"></script>
<style>
#map { height: 400px; width: 100%; } /* मैप कंटेनर का साइज़ सेट करें */
</style>
</head>
<body>
<h1>PostGIS डेटा विज़ुअलाइज़ेशन उदाहरण (Leaflet)</h1>
<div id="map"></div>
<script>
// मैप को इनिशियलाइज़ करें, केंद्र बिंदु और जूम लेवल सेट करें
// उदाहरण में केंद्र बीजिंग के आसपास रखा गया है
var map = L.map('map').setView([39.9042, 116.4074], 10);
// OpenStreetMap लेयर जोड़ें
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
attribution: '© OpenStreetMap contributors'
}).addTo(map);
// उदाहरण: मैन्युअल मार्कर जोड़ना (असल प्रोजेक्ट में PostGIS से डेटा आएगा)
// यह पॉइंट ऊपर डाले गए 'ServBay Headquarters' के लोकेशन का है
var marker = L.marker([39.9042, 116.4074]).addTo(map)
.bindPopup('<b>ServBay Headquarters</b><br>उदाहरण स्थान')
.openPopup();
// हकीकत में AJAX से Back-end से PostGIS डेटा (GeoJSON) आएगा
// फिर L.geoJSON() आदि से मैप में जोड़ा जाएगा
/*
fetch('/api/locations') // मान लीजिए Back-end /api/locations पर GeoJSON लौटाता है
.then(response => response.json())
.then(data => {
L.geoJSON(data).addTo(map);
});
*/
</script>
</body>
</html>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
यह उदाहरण केवल Leaflet का बेसिक उपयोग दिखाता है। असली डेटा को PostGIS से लाने के लिए आपको Back-end कोड लिखना होगा, डेटाबेस से डेटा पढ़ना, GeoJSON में बदलना और HTTP API के जरिए फ्रंटएंड भेजना होगा। ServBay बहु-भाषा Back-end को सपोर्ट करता है, जिससे यह काफ़ी आसान हो जाता है।
सामान्य प्रश्न (FAQ)
प्रश्न:
CREATE EXTENSION postgis;
चलाने पर एरर मिल रही है, क्या करें?- उत्तर: पहले यह जांचें कि आप PostgreSQL डेटाबेस से सही तरीके से जुड़े हैं, और आपके पास एक्सटेंशन क्रिएट करने की अनुमति है (
postgres
यूज़र के पास आमतौर पर होती है)। साथ ही यह देखें कि ServBay में PostgreSQL पैकेज चालू है। समस्या बनी रहे तो ServBay और PostgreSQL के लॉग्स चेक करें और अधिक जानकारी पाएं।
- उत्तर: पहले यह जांचें कि आप PostgreSQL डेटाबेस से सही तरीके से जुड़े हैं, और आपके पास एक्सटेंशन क्रिएट करने की अनुमति है (
प्रश्न: SRID 4326 क्या है? क्या मैं अन्य SRID का उपयोग कर सकता हूँ?
- उत्तर: SRID (Spatial Reference Identifier) एक संख्यात्मक कोड है जो किसी कोऑर्डिनेट रेफरेंस सिस्टम को दर्शाता है। 4326 WGS84 लैटीट्यूड-लॉन्गिट्यूड सिस्टम को दर्शाता है, जो सबसे ज्यादा वेब मैप्स में है। हाँ, आप अन्य SRID (जैसे वेब मर्केटर, SRID 3857) का भी उपयोग कर सकते हैं। उपयुक्त SRID का चयन आपके डेटा और जरूरत पर निर्भर करता है। सामान्यतः वेब मैप के लिए 4326 या 3857 सबसे अधिक काम आते हैं।
प्रश्न:
geometry
औरgeography
टाइप में क्या फर्क है?- उत्तर:
geometry
टाइप फ्लैट यानी कार्टेशियन (समतल) कोऑर्डिनेट सिस्टम के लिए है, दूरी और क्षेत्रफल की गणना यूक्लिडियन ज्योमेट्री पर होती है।geography
टाइप ग्लोब-आधारित यानी पृथ्वी की सतह (लैट-लॉन्ग) के लिए है, जिसमें पृथ्वी की वक्रता का ध्यान रखा जाता है, जिससे आंकड़े ज्यादा सटीक होते हैं - खासकर बड़े एरिया के लिए। छोटे इलाके या ज्यादा तेजी के लिएgeometry
अक्सर पर्याप्त होता है। पूरे विश्व के जियो डेटा या अत्यधिक शुद्धता के लिएgeography
सही रहता है।
- उत्तर:
सारांश
PostGIS, PostgreSQL को जबरदस्त जियोस्पेशियल डेटा प्रोसेसिंग ताकत देता है, जो लोकेशन-आधारित ऐप्स के लिए आधार बन जाता है। ServBay के द्वारा macOS लोकल एनवायरनमेंट में आप इसे बहुत ही आसानी से इनेबल और इस्तेमाल कर सकते हैं, और आपको लंबा-चौड़ा इंस्टॉल या सेटअप नहीं करना पड़ता।
इस लेख में आपने जाना कि ServBay में PostGIS एक्सटेंशन कैसे इनेबल करें, जियोस्पेशियल डेटा टेबल्स कैसे बनाएँ और मैनेज करें, सामान्य स्पेशियल क्वेरी और एनालिसिस कैसे करें, और शॉर्ट में डेटा विज़ुअलाइज़ेशन कैसे हो सकता है। इन बेसिक ढाँचों को समझकर आप PostGIS और ServBay का उपयोग कर फिचर-सम्पन्न जियोस्पेशियल वेब एप्लिकेशन बना सकते हैं। PostGIS के डोक्युमेंटेशन में और भी तमाम शानदार फंक्शन और फीचर्स आपको मिलेंगे, जरूर एक्स्प्लोर करें!