कार्य मैत्रियोस्का सिद्धांत के अनुसार एक स्पष्ट पदानुक्रम में प्रशासनिक केंद्रों को व्यवस्थित करना था, उदाहरण के लिए, यूक्रेन - क्रीमिया - दक्षिण तट - याल्टा, और वर्तमान डेटाबेस में मौजूदा त्रुटियों को ठीक करने के लिए।
इस लेख में, मैं समझाऊंगा कि मैंने केएमएल बॉर्डर-फ्रेमिंग फाइलों और पोस्टग्रेज + पोस्टगिस के साथ इस समस्या को कैसे हल किया।
तथ्य यह है कि डेटाबेस जो हम
अपनी परियोजना के लिए उपयोग करते हैं, वह वाणिज्यिक (उपयोगकर्ता उत्पन्न, खुला स्रोत) नहीं है और इसमें त्रुटियां हैं। उदाहरण के लिए, सबसे आम मामला यह है कि कई शहरों को एक देश को सौंपा गया है, लेकिन इसके किसी भी क्षेत्र और क्षेत्र से संबंधित नहीं हैं, हम उन्हें
अनाथ शहर कहते हैं।
इसके अलावा, हमारा व्यवसाय पर्यटन है, इसलिए देशों का प्रशासनिक और राजनीतिक विखंडन हमेशा उपयुक्त नहीं होता है, कभी-कभी नहीं, नहीं, और आपको मैन्युअल रूप से पर्यटन क्षेत्रों को जोड़ना होगा। उदाहरण के लिए, "क्रीमिया के दक्षिणी तट" के रूप में ऐसा कोई प्रशासनिक क्षेत्र नहीं है, लेकिन एक ऐसा पर्यटन क्षेत्र है जहाँ पर्यटक चुनते हैं कि कहाँ जाना है - वे "दक्षिण तट में मकान" खोजते हैं, न कि "याल्टा, गैसप्रा, गुरूफ़ में घर और आमतौर पर कहीं-कहीं" "।
सवाल यह है कि माता-पिता (क्रीमिया) के ऐसे प्रशासनिक क्षेत्र को स्वचालित रूप से कैसे ढूंढा जाए और इसमें शामिल सभी बच्चों (यलता और सुदक जैसे शहर) से पूछें।
वैसे: हमारे देश में क्षेत्र, क्षेत्र शामिल हैं, क्षेत्रों के क्षेत्र हैं। जैसे कोशेव की मौत ...
इस समस्या को हल करने के लिए, क्षेत्रों की सीमाओं के साथ डेटा का उपयोग करने और माता-पिता और बच्चों की तुलना करने का निर्णय लिया गया।
डेटा तैयार करना
दुनिया के जिस हिस्से में आप रुचि रखते हैं, उसके क्षेत्रों की सीमाओं का एक डेटाबेस इंटरनेट पर पाया जा सकता है। मैंने Google धरती के लिए फ़ाइलों का उपयोग किया - या तो KML (निर्देशांक के साथ XML) या KMZ (ज़िप संग्रह में KML), वे सीधे Google धरती में देखने के लिए सुविधाजनक हैं।
केएमजेड स्वचालित रूप से केएमएल में नहीं बदल सकता है - शीर्ष नामों में यूनिकोड वर्ण टूट जाते हैं, इसलिए मैंने Google धरती में केएमजेड फाइलें खोली और इसे केएमएल के रूप में सहेजा। बेशक, "यह प्रतिभाशाली व्यक्ति की गणना करने के लिए एक गुलाम की तरह घंटों बिताने के लिए एक योग्य व्यक्ति है, जो निश्चित रूप से, किसी भी व्यक्ति को सौंपा जा सकता है, अगर कोई मशीन का उपयोग करने के लिए था", लेकिन अगर अधिक फाइलें थीं, तो वह निश्चित रूप से एक स्वचालन उपकरण की तलाश करेगा।
दूसरा तरीका, अगर आपको दक्षिण तट जैसे कस्टम क्षेत्रों की आवश्यकता है, तो Google धरती में हाथ से तैयार किया गया है और KML फ़ाइल में सहेजा गया है।
मेरे पास मौजूद डेटा फ़ाइलों में, प्रत्येक क्षेत्र के अलग-अलग क्षेत्र थे, लेकिन माता-पिता और बच्चों के बीच कोई संबंध नहीं थे। उदाहरण के लिए, एक अलग फ़ाइल "देश के सभी क्षेत्र", और अलग से - "देश के सभी क्षेत्र"। सिद्धांत रूप में, यह कार्य है जिसे हमें हल करने की आवश्यकता है, लेकिन इसके लिए अब हमारे पास सभी डेटा हैं।
हम मंच तैयार कर रहे हैं
सबसे पहले मैं MySQL का उपयोग करना चाहता था, क्योंकि उनके पास स्थानिक डेटा प्रकारों और उन पर संचालन के लिए समर्थन है, लेकिन फिर यह पता चला कि ये बहुत ही संचालन बहुत ही सरल रूप में लागू किए गए थे और वास्तविक कार्यों के लिए अनुपयुक्त थे। एक सरलीकृत दृश्य का अर्थ है कि MySQL केवल MBR के साथ काम करता है, आयत जो बहुभुज का वर्णन करता है। यह पता चला है कि क्रीमिया की खूबसूरत सीमाओं के बजाय, इसके चारों ओर एक कुंद आयत के साथ संचालन किया जाएगा, और वास्तविक क्षेत्र की गणना इस आयत के क्षेत्र से बदल दी जाएगी (जिसका उपयोग इस समस्या को हल करने के लिए किया जाएगा)। यह MySQL को इस कार्य के लिए अनुपयुक्त बनाता है।
भौगोलिक डेटा प्रकारों के साथ काम करने के लिए हम Postgres का उपयोग करते हैं और उस पर PostGis लाइब्रेरी स्थापित करते हैं।
डेटा डाउनलोड करें
मैंने कई तालिकाओं को तैयार किया -
country
,
region
,
area
,
subarea
। प्रत्यय "
_boundary
" के साथ तालिकाओं को भी उनमें से प्रत्येक के लिए बनाया गया था, क्योंकि एक ही क्षेत्र में एक से अधिक सीमाएं हो सकती हैं (उदाहरण के लिए, द्वीप)।
डेटा को 2 तरह से लोड किया जा सकता है:
- PostGis शस्त्रागार से अपरिचित होने के कारण, मैंने अपना KML हैंडलर लिखा - वास्तव में, निर्देशांक वाले XML नोड्स को पार्स किया गया और SQL बहुभुजों में बदल दिया गया,
- मैनुअल काम का विकल्प - Post_is में निर्मित ST_GeomFromKML फ़ंक्शन
स्वच्छ डेटा
परिणामी सीमाएं बहुत विस्तृत थीं, जिनमें बड़ी संख्या में अंक थे। इसका मतलब यह है कि प्रसंस्करण, साथ ही AJAX के माध्यम से ब्राउज़र में क्लाइंट को भेजने के लिए अधिक डेटा, यदि इन बहुभुजों को मानचित्र पर खींचने की आवश्यकता है। आगे देखते हुए, मैं कहूंगा कि इस तरह से डेटा का आकार 10 गुना कम हो गया था, और अजाक्स अनुरोध "उड़ान" करने लगे।
इसलिए, मैंने बहुभुज को सरल बनाने का निर्णय लिया, क्योंकि पोस्टगिस के पास एक फ़ंक्शन है
ST_Simplify
लिए - इसे बहुभुज और इनपुट को चौरसाई मूल्य देने की आवश्यकता है।
परीक्षण डेटा के साथ खेलने के बाद, मैंने 0.001 के बराबर चौरसाई पैरामीटर चुना।
अनुरोध इस प्रकार है:
UPDATE "subarea_boundary" SET "path" = ST_Simplify("path", 0.001);
"पहले" और "बाद" की तुलना खुद से करें:


हम एक माता-पिता का चयन करते हैं
पोलीगोन के बीच संबंधों को स्पष्ट करने के लिए पोस्टगिस के अलग-अलग कार्य हैं, लेकिन मैं इस निष्कर्ष पर पहुंचा हूं कि निम्नलिखित विचार का उपयोग करना सबसे अच्छा है: एक
क्षेत्र को एक बच्चा माना जाता है यदि बच्चा क्षेत्र आधे से अधिक मूल क्षेत्र है।एक सूत्र के रूप में, यह इस तरह दिखता है:
[चौराहा क्षेत्र] / [सहायक क्षेत्र]> 0.5PostGis सुविधाओं के संदर्भ में, यह इस तरह दिखता है:
ST_Area(ST_Intersection(region_path, area_path)) / ST_Area(area_path) > 0.5
अगला, मैंने दिए गए क्षेत्र के सही माता-पिता को खोजने के लिए कुछ समान संग्रहीत प्रक्रियाओं को लिखा।
यहाँ इस क्षेत्र के लिए मूल क्षेत्र खोजने का एक उदाहरण है:
CREATE OR REPLACE FUNCTION "SuggestRegion" ("area_path" geometry) RETURNS integer AS 'DECLARE admId integer := 0; BEGIN SELECT INTO admId "parent_id" FROM "region_boundary" WHERE ST_Area(ST_Intersection(region_path, area_path))/ST_Area(area_path) > 0.5 LIMIT 1; RETURN admId; END;' LANGUAGE "plpgsql" COST 100 VOLATILE RETURNS NULL ON NULL INPUT SECURITY INVOKER
उस क्षेत्र की ID प्राप्त करने के लिए जिसमें यह क्षेत्र है, आपको इस क्षेत्र के बहुभुज को इस फ़ंक्शन के माध्यम से चलाने की आवश्यकता है:
SELECT "SuggestRegion" ("path") AS parent_id FROM area_boundary WHERE area_id = XXX LIMIT 1;
यदि प्राप्त आईडी शून्य से अधिक है, तो आप प्राप्त क्षेत्र को इस क्षेत्र के मूल क्षेत्र के रूप में सहेज सकते हैं।
शहरों के लिए, यह और भी सरल है, क्योंकि शहर केवल केंद्र के समन्वय द्वारा निर्धारित किया जाता है - हम
ST_Within
की पूर्ण घटना की जाँच के कार्य का उपयोग करते हैं।
मुझे उम्मीद है कि यह लेख सर्वेक्षण के अन्य प्रेमियों के लिए उपयोगी होगा।