स्थानिक रूप से सबसे तेज़ तरीका एक पॉलीगॉन शेपफाइल के साथ एक बिंदु सीएसवी में शामिल होता है


19

मेरे पास 1 बिलियन पॉइंट वाली CSV फ़ाइल और लगभग 5,000 बहुभुजों वाली एक आकृति है। अंक और बहुभुज में स्थानिक रूप से जुड़ने का सबसे तेज़ तरीका क्या होगा? प्रत्येक बिंदु के लिए, मुझे युक्त बहुभुज आईडी प्राप्त करने की आवश्यकता है। (बहुभुज ओवरलैप नहीं होते हैं।)

आमतौर पर, मैं दोनों डेटा सेट को PostGIS में लोड करूंगा। क्या काम करने का एक तेज़ तरीका है?

मैं एक ओपन-सोर्स समाधान की तलाश में हूं।

जवाबों:


16

यदि "सबसे तेज़" में आपके समय की राशि शामिल है जो खर्च की जाती है, तो समाधान इस बात पर निर्भर करेगा कि आप किस सॉफ्टवेयर के साथ सहज हैं और शीघ्रता से उपयोग कर सकते हैं। निम्नलिखित टिप्पणी सबसे तेजी से संभव कंप्यूटिंग समय को प्राप्त करने के लिए विचारों पर केंद्रित है ।

यदि आप एक डिब्बाबंद कार्यक्रम का उपयोग करते हैं, तो लगभग निश्चित रूप से आप जो सबसे अच्छा कर सकते हैं वह पॉलीगॉन को एक बिंदु-इन-बहुभुज डेटा संरचना, जैसे कि केडी ट्री या क्वाडट्री स्थापित करने के लिए पूर्व-प्रक्रिया है, जिसका प्रदर्शन आम तौर पर ओ (लॉग (वी) होगा ) * ((N + V)) जहां V बहुभुजों में कुल संख्याओं की संख्या है और N बिंदुओं की संख्या है, क्योंकि डेटा संरचना को बनाने में कम से कम O (लॉग (V) * V) प्रयास लगेगा और फिर होगा प्रति बिंदु लागत O (लॉग (V)) पर प्रत्येक बिंदु के लिए जांच की जानी चाहिए।

आप पहले से पॉलीगनों को ग्रिड करके, बिना किसी ओवरलैप की धारणा का फायदा उठाते हुए काफी बेहतर कर सकते हैं। प्रत्येक ग्रिड सेल या तो पूरी तरह से एक बहुभुज इंटीरियर ("सार्वभौमिक बहुभुज" के इंटीरियर सहित) है, जिस स्थिति में बहुभुज की आईडी के साथ सेल को लेबल करते हैं, या फिर इसमें एक या एक से अधिक बहुभुज किनारों होते हैं। सभी किनारों को रेखापुंज करते समय संदर्भित ग्रिड कोशिकाओं की संख्या के बराबर इस रेखांकन की लागत, O (V / c) है जहां c एक कोशिका का आकार है, लेकिन बड़े-O संकेतन में निहित स्थिरांक छोटा है।

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

इस ग्रिड के साथ, प्रत्येक बिंदु (केवल कुछ घड़ियों की आवश्यकता वाले एक O (1) ऑपरेशन वाले सेल की गणना करके बिंदुओं को पूर्व-स्क्रीन करें)। जब तक अंक बहुभुज सीमाओं के आसपास नहीं होते हैं, यह आमतौर पर अस्पष्ट परिणामों के साथ केवल ओ (सी) अंक के बारे में छोड़ देगा। ग्रिड के निर्माण और प्री-स्क्रीनिंग की कुल लागत इसलिए O (V / c + 1 / c ^ 2) + O (N) है। आपको O (लॉग (V) * N * c) की कीमत पर शेष अंक (जो कि बहुभुज की सीमाओं के करीब हैं) को संसाधित करने के लिए कुछ अन्य विधि (जैसे कि अब तक सुझाई गई) का उपयोग करना होगा। ।

जैसा कि c छोटा हो जाता है, कम और कम अंक एक ही ग्रिड सेल में होगा जिसमें किनारे होंगे और इसलिए कम और कम को बाद के O (लॉग (V)) प्रसंस्करण की आवश्यकता होगी। इसके विरुद्ध कार्य करने के लिए O (1 / c ^ 2) ग्रिड कोशिकाओं को संग्रहीत करने और O (V / c + 1 / c ^ 2) समय बिताने के लिए बहुभुज को व्यवस्थित करने की आवश्यकता होती है। इसलिए एक इष्टतम ग्रिड आकार होगा सी। यह का उपयोग करना, कुल कम्प्यूटेशनल लागत हे (लॉग (वी) * एन) है, लेकिन अंतर्निहित निरंतर आम तौर पर है जिस तरह से , डिब्बाबंद प्रक्रियाओं का उपयोग पूर्व स्क्रीनिंग के हे (एन) की गति के कारण से छोटा है।

20 साल पहले मैंने इस दृष्टिकोण का परीक्षण किया (पूरे इंग्लैंड और अपतटीय में समान रूप से स्थान बिंदुओं का उपयोग करके और उस समय के वीडियो बफ़र्स द्वारा पेश किए गए लगभग 400K कोशिकाओं के अपेक्षाकृत कच्चे ग्रिड का दोहन) और सर्वोत्तम प्रकाशित एल्गोरिथम की तुलना में परिमाण गति के दो आदेश प्राप्त किए। पाते हैं। यहां तक ​​कि जब बहुभुज छोटे और सरल होते हैं (जैसे त्रिकोण), तो आपको वास्तव में परिमाण गति के एक आदेश का आश्वासन दिया जाता है।

मेरे अनुभव में अभिकलन इतना तेज था कि पूरा संचालन डेटा I / O गति द्वारा सीमित था, सीपीयू द्वारा नहीं। यह अनुमान लगाते हुए कि मैं / ओ अड़चन हो सकता है, आप डेटा पढ़ने के समय को कम से कम करने के लिए संभव के रूप में एक प्रारूप को संपीड़ित करके बिंदुओं को संग्रहीत करके बहुत तेज़ परिणाम प्राप्त करेंगे। यह भी कुछ सोचें कि परिणाम कैसे संग्रहीत किए जाने चाहिए, ताकि आप डिस्क लेखन को सीमित कर सकें।


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

5

अपने हिस्से के लिए, मैं शायद CSV डेटा को एक shp फ़ाइल में लोड करूँगा और फिर शेपफाइल और सुडौल रूप से युक्त बहुभुज आईडी प्राप्त करने और फ़ील्ड मान को अपडेट करने के लिए एक अजगर स्क्रिप्ट लिखूंगा ।

मुझे नहीं पता कि क्या जियोटॉल्स और JTS शेपफाइल / शेप्लीली से तेज है ... क्या इसके पास परीक्षण करने का समय नहीं है!

संपादित करें : वैसे, आकार आकार प्रारूप के लिए सीएसवी रूपांतरण शायद आवश्यक नहीं है, क्योंकि मूल्यों को आसानी से आपके बहुभुज आकार के स्थान से स्थानिक वस्तुओं के साथ परीक्षण करने के लिए स्वरूपित किया जा सकता है।


4
मैं सीधे सीएसवी रीडर का उपयोग करके डेटा लोड करूंगा और एक आरटीआरआई स्थानिक सूचकांक को पॉप्युलेट करूंगा । Rtree और Shapely के संयोजन में एक प्रभावशाली प्रदर्शन है (PostGIS की तुलना में बेहतर; मैं JTS की तुलना नहीं कर सकता क्योंकि मुझे जावा नहीं पता है)।
माइक टी।

2
अच्छा विचार है बशर्ते आपको एक बार में सभी 1b अंक को स्टोर करने की आवश्यकता नहीं है। न्यूनतम 16 बाइट प्रति बिंदु (X / Y) पर, आप 16GB मूल्य के डेटा को देख रहे हैं। यदि Rtree स्थानीय भंडारण पर सूचकांक का निर्माण करेगा, तो यह निश्चित रूप से प्रदर्शन में सुधार करेगा। एक एकल आकार के लिए 1 बी अंक आयात करना भी काम नहीं करेगा। OGR चश्मा स्टेट शेपफाइल्स 8GB (4GB अनुशंसित) तक सीमित हैं। एक एकल बिंदु आकार 20 बाइट्स का उपयोग करता है।
सास इवेटिक जूल

4

मैंने बहुभुजों को एक रेखापुंज में परिवर्तित कर दिया और इसे बिंदु स्थिति पर नमूना दिया। चूंकि मेरे बहुभुज ओवरलैप नहीं थे और उच्च सटीकता आवश्यक नहीं थी (बहुभुज भूमि-उपयोग कक्षाओं का प्रतिनिधित्व करते थे और उनकी सीमाओं को वैसे भी अनिश्चित माना जाता था) यह सबसे समय-कुशल समाधान था जिसके साथ मैं आ सकता था।


3

मैं जल्दी से के आधार पर एक छोटा सा जावा कार्यक्रम लिखते थे शेपफ़ाइल पाठक की geotools और ऑपरेशन में शामिल की जेटीएस । मुझे नहीं पता कि यह कितनी तेजी से हो सकता है ...


1
यदि आपके पास PostGIS में डेटा है तो जियोटूल जीस्ट इंडेक्स आदि का उपयोग कर सकते हैं
इयान टर्टन

3

स्थानिक उपयोग करें

GUI डाउनलोड करें। आप वर्चुअल टेबल के रूप में शेपफाइल और सीएसवी दोनों को खोल सकते हैं। इसका मतलब है कि आप वास्तव में उन्हें डेटाबेस में आयात नहीं करते हैं, लेकिन वे तालिकाओं के रूप में दिखाई देते हैं और आप किसी भी तरह से उन्हें शामिल कर सकते हैं और उन्हें क्वेरी कर सकते हैं।


3

O / CGR / Python (पायथन 3 की सबसे धीमी गति से होनी चाहिए) का उपयोग करते हुए आप इसे OGR का उपयोग करके जल्दी से कर सकते हैं। सभी बहुभुजों के माध्यम से लूप करें और बिंदुओं पर एक फ़िल्टर सेट करें, फ़िल्टर किए गए बिंदुओं के माध्यम से लूप करें और आपको पता चल जाएगा कि आपके द्वारा लूप किए जाने वाले प्रत्येक बिंदु वर्तमान बहुभुज के हैं। यहाँ OGR का उपयोग करके अजगर में नमूना कोड है जो बहुभुज और फिल्टर बिंदुओं के अनुसार लूप करेगा। C / C ++ कोड इस के समान होगा, और मुझे लगता है कि आपको एक महत्वपूर्ण गति वृद्धि मिलेगी बनाम अजगर। CSV को अपडेट करने के लिए आपको कोड की कुछ पंक्तियाँ डालनी होंगी जैसे आप साथ चलते हैं:

from osgeo import ogr
from osgeo.gdalconst import *

inPolyDS = ogr.Open("winnipeg.shp", GA_ReadOnly)
inPolyLayer = inPolyDS.GetLayer(0)
inPointDS = ogr.Open("busstops.vrt", GA_ReadOnly)   
inPointLayer = inPointDS.GetLayerByName("busstops")

inPolyFeat = inPolyLayer.GetNextFeature()
while inPolyFeat is not None:
  inPtFeat = inPointLayer.GetNextFeature()
  while inPtFeat is not None:
    ptGeom = inPtFeat.GetGeometryRef()
    # Do work here...

    inPtFeat = inPointLayer.GetNextFeature()

  inPolyFeat = inPolyLayer.GetNextFeature()

वीआरटी फ़ाइल (busstops.vrt):

<OGRVRTDataSource>
  <OGRVRTLayer name="busstops">
    <SrcDataSource>busstops.csv</SrcDataSource>
    <GeometryType>wkbPoint</GeometryType>
    <LayerSRS>WGS84</LayerSRS>
    <GeometryField encoding="PointFromColumns" x="X" y="Y" reportSrcColumn="FALSE" />
  </OGRVRTLayer>
</OGRVRTDataSource>

CSV फ़ाइल (busstops.csv):

FID,X,Y,stop_name
1,-97.1394781371062,49.8712241633646,Southbound Osborne at Mulvey

CSVT फ़ाइल (busstops.csvt, OGR को स्तंभ प्रकारों की पहचान करने की आवश्यकता है, अन्यथा यह स्थानिक फ़िल्टर नहीं करेगा:

Integer,Real,Real,String

2
1 bn अंक 5000 बार (प्रत्येक बहुभुज के लिए) के माध्यम से वह लूप नहीं करता है?
UnderDark

एक स्थानिक सूचकांक एक पूर्ण होना चाहिए । मैंने पहले Rtree का उल्लेख किया , और मैं इसे फिर से उल्लेख करूँगा!
माइक टी।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.