2010-08-23 15 views
6

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

मैं Google geocoding (WGS84, या SRID 4326) से प्राप्त एक ज्यामिति बिंदु अक्षांश और अक्षांश में बचत कर रहा हूं। मेरी समस्या यह है कि मेरे आवेदन में दूरी संचालन बहुत आम हैं। मुझे अक्सर एक ऐतिहासिक स्थल से नजदीकी जगहों की आवश्यकता होती है। ज्यामिति गणित बहुत जटिल हैं, इसलिए यदि मेरे पास एक स्थानिक इंडेक्स है, तो शायद भविष्य में यह बहुत लंबा लगेगा कि पास के क्षेत्र में 1000 से अधिक धब्बे हैं।

तो क्या इस ज्यामिति प्रकार को दूरी संचालन को तेज करने के लिए प्रोजेक्ट करने का कोई तरीका है? क्या किसी को Django लाइब्रेरी पता है जो Google मानचित्र को इनमें से कुछ बिंदुओं को प्रस्तुत कर सकता है?

GeoDjango पर स्थानिक प्रश्नों को गति देने के तरीके पर कोई सलाह?

+1

बस स्पष्ट करने के लिए, क्या आप वास्तव में पोस्टजीआईएस के साथ प्रदर्शन समस्याओं का सामना कर रहे हैं? यदि आप बस क्या हो सकता है इसके बारे में चिंतित हैं, समयपूर्व अनुकूलन का विरोध करें! लोगों के पास लाखों रिकॉर्ड के साथ तालिकाओं का उपयोग करके आपके जैसे प्रश्नों के साथ अच्छे परिणाम हैं। दूरी प्रश्नों पर अधिक: http://www.bostongis.com/?content_name = postgis_tut02 # 21 – tcarobruce

+0

अच्छा, मुझे यकीन नहीं है कि मैं इस समयपूर्व अनुकूलन को कॉल करूंगा (हालांकि मेरे पास अभी तक प्रदर्शन समस्याएं नहीं हैं)। मुझे बस यह जानने की जरूरत है कि जब आवश्यक हो तो जियोजंजो चुनौती तक पहुंच जाएगा। मुझे पोस्टजीआईएस पता है और कैसे && और ओवरलैप बॉक्स का उपयोग करके दूरी क्वेरी में सुधार करने के लिए, लेकिन उदाहरण के लिए GeoDjango इसका उपयोग करता है? दूसरी तरफ, मैं सटीकता के साथ वास्तव में पसंद नहीं कर रहा हूं, इसलिए मुझे ज्यामिति का उपयोग नहीं करना चाहिए, क्योंकि यह कीमत पर आता है। – maraujop

उत्तर

0

आम तौर पर, जियोडजैंगो जहां उचित हो, ज्यामिति कॉलम पर स्थानिक इंडेक्स बनायेगा और उपयोग करेगा।

मुख्य रूप से अंक के बीच दूरी के साथ व्यवहार करने वाले अनुप्रयोग के लिए, Geography type (पोस्टजीआईएस 1.5 में पेश किया गया, और जियोडजैगो द्वारा समर्थित) एक अच्छा फिट हो सकता है। GeoDjango का कहना है कि यह "WGS84 दूरी प्रश्नों पर बेहतर प्रदर्शन" [link] देता है।

+1

यह सच है, जैसा कि आप http://docs.djangoproject.com/en/1.2/ref/contrib/gis/model-api/#spatial-index GeometryField.spatial_index -> सही पर डिफ़ॉल्ट में पढ़ सकते हैं। दिए गए ज्यामिति क्षेत्र के लिए एक स्थानिक सूचकांक बनाता है। Django पिछले स्थिर संस्करण 1.2.1 के बाद भूगोल प्रकार का समर्थन करता है, इसलिए यह बहुत नया है। दस्तावेज़ों में आप यह भी पढ़ सकते हैं: क्योंकि भूगोल गणना में अधिक गणित शामिल है: http://docs.djangoproject.com/en/dev/ref/contrib/gis/model-api/#selecting-an-srid तो मैं क्या पूछ रहा हूं भूगोल वास्तव में एक अच्छा फिट है? क्या यह ठीक से स्केल करेगा? – maraujop

3

यदि आप अपने कार्यक्षेत्र को मानचित्र प्रक्षेपण में फिट कर सकते हैं, तो यह हमेशा तेज रहेगा, क्योंकि दूरी गणना जैसी चीजों के लिए कम गणित कॉल आवश्यक हैं। हालांकि, यदि आपके पास वास्तव में वैश्विक डेटा है, तो इसे चूसो: भूगोल का उपयोग करें। यदि आपके पास केवल महाद्वीपीय यूएसए डेटा है, तो EPSG जैसे कुछ का उपयोग करें: 2163 http://spatialreference.org/ref/epsg/2163/

आपके कार्यक्षेत्र को और अधिक बाधित कर दिया गया है, मानचित्र प्रक्षेपण में आपको और सटीक परिणाम मिल सकते हैं। संयुक्त राज्य अमेरिका में क्षेत्रीय क्षेत्रों के लिए अत्यधिक बाध्य, सटीक अनुमानों के लिए राज्य विमान अनुमान देखें। या बड़े उप-राष्ट्रीय क्षेत्रों के लिए यूटीएम अनुमान।

+0

मुझे लगता है कि प्रोजेक्टिंग तेज है, लेकिन मैं स्पैनिश जिओडाटा का प्रबंधन कर रहा हूं और यह सुनिश्चित नहीं करता कि GeoDjango में इसे कैसे बदलना, स्टोर करना और संसाधित करना है। साथ ही, सुनिश्चित नहीं है कि Google द्वारा दिए गए अंक SRID 4326 या EPSG 900913 – maraujop

+1

में हैं, Google API ईपीएसजी में निर्देशांक देता है और उपभोग करता है: 4326। स्पेन में एक अनुमानित प्रणाली के लिए, ईपीएसजी: 25831 आज़माएं। –

2

मैं इस विषय पर शोध कर रहा हूं। जहां तक ​​मैंने पाया है, समन्वय करता है कि आप भूगर्भीय पुस्तकालय से प्राप्त हैं, एसआरआईडी 4326 प्रारूप में हैं, इसलिए आप उन्हें बिना किसी समस्या के ज्यामिति फ़ील्ड प्रकार में स्टोर कर सकते हैं। यह एक GeoDjango ज्यामिति का उपयोग कर मॉडल का एक उदाहरण होगा:

class Landmark(models.Model): 
    point = models.PointField(spatial_index = True, 
          srid = 4326, 
          geography = True) 

    objects = models.GeoManager() 

वैसे,, PointField को देशांतर/अक्षांश पारित करने के लिए ठीक उसी क्रम में बहुत सावधान रहना होगा। भूगर्भ अक्षांश/देशांतर निर्देशांक देता है, इसलिए आपको उन्हें उलट करने की आवश्यकता होगी।

एक समन्वय प्रणाली में दूसरे बिंदुओं को बदलने के लिए हम GeoDjango के साथ जीईओएस का उपयोग कर सकते हैं। उदाहरण में मैं मशहूर गूगल प्रक्षेपण 900913 का समर्थन करता करने के लिए 4326 में एक बिंदु बदल सकते हैं:

from django.contrib.gis.geos import Point 
punto = Point(40,-3) 
punto.set_srid(900913) 
punto.transform(4326) 
punto.wkt 
Out[5]: 'POINT (0.0003593261136478 -0.0000269494585230)' 

इस तरह हम प्रक्षेपण प्रणाली है, जो बेहतर प्रदर्शन गणित होगा में निर्देशांक स्टोर कर सकते हैं। व्यवस्थापक साइट इंटरफ़ेस में Google मानचित्र में अंक दिखाने के लिए। हम this great article का उपयोग कर सकते हैं।

मैंने भूगोल प्रकारों के साथ आगे बढ़ने का फैसला किया है, और यदि मैं प्रदर्शन में सुधार करने की आवश्यकता है, तो मैं उन्हें भविष्य में परिवर्तित कर दूंगा।

संबंधित मुद्दे