अक्षांश और देशांतर के लिए कौन सा डेटा प्रकार?


154

मैं PostgreSQL और PostGIS के लिए नौसिखिया हूं। मैं PostgreSQL 9.1.1 डेटाबेस तालिका में अक्षांश और देशांतर मान संग्रहीत करना चाहता हूं। मैं दो अंकों के बीच की दूरी की गणना करूंगा, इस स्थान मानों का उपयोग करके निकटतम बिंदुओं को खोजूंगा।

अक्षांश और देशांतर के लिए मुझे किस डेटा प्रकार का उपयोग करना चाहिए?


4
यदि आप दो अंक (2D लाट / लून मैप) कर रहे हैं तो मैं जियोमेट्री डेटा प्रकार का उपयोग करूंगा। यदि आपको अपनी दूरी के बछड़ों में पृथ्वी की ऊंचाई या वक्रता लाने की आवश्यकता है, तो भूगोल वह स्थान है जहाँ आप जाना चाहते हैं।
बारहवीं

4
क्या नीचे दिए गए किसी भी उत्तर ने आपके प्रश्न का समाधान किया है? यदि हां, तो मैं आपको उत्तर देने के लिए एक का चयन करने के लिए प्रोत्साहित करता हूं :)
Volte

जवाबों:


140

आप डेटा प्रकार का उपयोग कर सकते हैं point- (x,y)जो आपके लेट / लॉन्ग हो सकते हैं। 16 बाइट्स पर कब्जा: float8आंतरिक रूप से 2 नंबर।

या इसे दो प्रकार के कॉलम float(= float8या double precision) बनाते हैं । 8 बाइट्स प्रत्येक।
या real(= float4) यदि अतिरिक्त परिशुद्धता की आवश्यकता नहीं है। 4 बाइट्स प्रत्येक।
या यहां तक ​​कि numericअगर आप पूर्ण परिशुद्धता की जरूरत है। 4 अंकों के प्रत्येक समूह के लिए 2 बाइट्स, प्लस 3 - 8 बाइट्स ओवरहेड।

संख्यात्मक प्रकार और ज्यामितीय प्रकारों के बारे में ठीक मैनुअल पढ़ें ।


geometryऔर geographyडेटा प्रकार अतिरिक्त मॉड्यूल द्वारा प्रदान की जाती हैं PostGIS और कब्जा एक अपने कॉलम खोजें। प्रत्येक एक बिंदु के लिए 32 बाइट्स रखता है। वहाँ एक SRID की तरह कुछ अतिरिक्त उपरि है। इस प्रकार के स्टोर (लम्बे / लम्बे), नहीं (lat / long)।

यहां PostGIS मैनुअल पढ़ना शुरू करें


5
मैं floatडेटाटाइप का उपयोग करने की अनुशंसा नहीं करूंगा । यह निर्देशांक के साथ गणना को बहुत जटिल बनाता है। आपको geographyइस तरह की गणनाओं के लिए PostGIS और डेटाटाइप का उपयोग करना चाहिए ।
m13r

8
यह वास्तव में एक अच्छा मैनुअल है ना? प्रलेखन में एक चमकदार उदाहरण।
ओटोकैन

1
क्या मूल लॉन्ग लाट के लिए पार्स जियोग की कोशिश करने पर लॉन्ग, लाट और जियॉग को स्टोर करना तेज होगा?
डैन

1
@ दान: निर्भर करता है। कृपया विवरण के साथ एक नया प्रश्न पूछें । आप संदर्भ के लिए इसे हमेशा लिंक कर सकते हैं। टिप्पणियाँ नए प्रश्नों के लिए जगह नहीं हैं।
इरविन ब्रान्डेसटेटर

40

PostGIS में, अक्षांश और देशांतर वाले बिंदुओं के लिए भूगोल डेटाटाइप है।

स्तंभ जोड़ने के लिए:

alter table your_table add column geog geography;

डेटा डालने के लिए:

insert into your_table (geog) values ('SRID=4326;POINT(longitude latitude)');

4326 स्थानिक संदर्भ आईडी है जो कहती है कि यह डिग्री देशांतर और अक्षांश में डेटा है, जैसे कि जीपीएस में। इसके बारे में और अधिक: http://epsg.io/4326

आदेश देशांतर, अक्षांश है - इसलिए यदि आप इसे मानचित्र के रूप में साजिश करते हैं, तो यह (x, y) है।

निकटतम बिंदु खोजने के लिए आपको स्थानिक सूचकांक बनाने की आवश्यकता है:

create index on your_table using gist (geog);

और फिर अनुरोध करें, कहें, दिए गए बिंदु के 5 निकटतम:

select * 
from your_table 
order by geog <-> 'SRID=4326;POINT(lon lat)' 
limit 5;

1
सरलीकरण एसआरआईडी 4326 उस क्रम में अक्षांश देशांतर चाहता है। लेकिन SRG 4326 की PostGIS की व्याख्या उस क्रम में देशांतर अक्षांश चाहती है। PostGIS उपयोग के लिए उदाहरण सही है। postgis.net/2013/08/18/tip_lon_lat
hahmed

26

मैं PostGis की पुरजोर वकालत करता हूं । यह उस प्रकार के डेटाटाइप के लिए विशिष्ट है और इसमें जीआईएस संचालन के बीच बिंदुओं के बीच की दूरी की गणना करने के लिए बॉक्स के तरीके हैं, जो आपको भविष्य में उपयोगी मिल सकते हैं


5

यदि आपको सभी कार्यक्षमता की आवश्यकता नहीं है PostGIS ऑफ़र, Postgres (आजकल) Earthdistance नामक एक विस्तार मॉड्यूल प्रदान करता है । यह दूरी की गणना के लिए आपकी सटीकता की जरूरतों के आधार पर बिंदु या घन डेटा प्रकार का उपयोग करता है ।

अब आप किसी स्थान के एक निश्चित दूरी के भीतर बिंदुओं के लिए Earth_box फ़ंक्शन टू-फॉर उदाहरण का उपयोग कर सकते हैं ।


2

PostGIS में ज्योमेट्री को ज्योग्राफी (राउंड अर्थ मॉडल) से अधिक पसंद किया जाता है क्योंकि गणनाएं अधिक सरल होती हैं इसलिए तेज होती हैं। इसमें MANY अधिक उपलब्ध कार्य हैं लेकिन बहुत लंबी दूरी पर कम सटीक है।

अपने CSV को DECIMAL(10,6)स्तंभों के लिए लंबे अक्षांश के खेतों में आयात करें । 6 अंक 10 सेमी परिशुद्धता है, अधिकांश उपयोग के मामलों के लिए बहुत होना चाहिए।

फिर अपना आयातित डेटा डालें

SELECT 
    --ST_SetSRID(ST_Point(long, lat),4326) geom -- the wrong way because SRID not set in geometry_columns table
    ST_Point(long, lat)::geometry(Geometry, 4326) geom
INTO target_table
FROM source_table;

सत्यापित करें कि SRID शून्य नहीं है!

SELECT * FROM public.geometry_columns WHERE f_table_name = 'target_table';

WKT व्यूअर का उपयोग करके अपने लंबे लट पैरामीटर के क्रम को मान्य करें और ST_AsEWKT(target_table.geom)

फिर इसे सर्वश्रेष्ठ प्रदर्शन के लिए अनुक्रमित करें

CREATE INDEX idx_target_table_geom_gist
    ON target_table USING gist(geom);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.