JSON दस्तावेजों में लाइनों और बहुभुजों को कैसे स्टोर करें?


24

बढ़ती NoSQL आंदोलन को देखते हुए और माना जाता है कि MongoDB जैसे डेटाबेस जीआईएस के लिए लचीले डेटा भंडारण में एक नया दृष्टिकोण प्रदान करते हैं। 2d इंडेक्स और स्थानिक कार्यों का लाभ लेने के लिए JSON दस्तावेज़ों में लाइनों और बहुभुजों को स्टोर करने का सबसे अच्छा तरीका क्या है ?


6
MongoDB वर्तमान में अंकों के अलावा किसी अन्य चीज़ पर अनुक्रमण का समर्थन नहीं करता है, और इसके स्थानिक कार्य सीमा के भीतर खोजने तक सीमित हैं।
SCW

जवाबों:


16

GeoJSON यहाँ विनिर्देश हैं

यहाँ एक लाइन और बहुभुज का उदाहरण दिया गया है:

{ "type": "FeatureCollection",
  "features": [
    { "type": "Feature",
      "geometry": {"type": "Point", "coordinates": [102.0, 0.5]},
      "properties": {"prop0": "value0"}
      },
    { "type": "Feature",
      "geometry": {
        "type": "LineString",
        "coordinates": [
          [102.0, 0.0], [103.0, 1.0], [104.0, 0.0], [105.0, 1.0]
          ]
        },
      "properties": {
        "prop0": "value0",
        "prop1": 0.0
        }
      },
    { "type": "Feature",
       "geometry": {
         "type": "Polygon",
         "coordinates": [
           [ [100.0, 0.0], [101.0, 0.0], [101.0, 1.0],
             [100.0, 1.0], [100.0, 0.0] ]
           ]
       },
       "properties": {
         "prop0": "value0",
         "prop1": {"this": "that"}
         }
       }
     ]
   }

9

ध्यान देने वाली एक बात यह है कि स्थानिक डेटाटाइप्स के लिए MongoDB का समर्थन किसी भी गंभीर स्थानिक लुकअप के लिए बुरी तरह से खराब है, और यह पिछली बार जब मैंने जाँच की तो NoSQL के साथ बोर्ड पर लागू होता है। मैं जियोचैट को काफी कम पसंद करता हूं, लेकिन यह अभी भी एक रास्ता है।

GeoJSON एक शानदार प्रारूप है, लेकिन Mongo में सीमित (केवल-बिंदु) स्थानिक अनुक्रमियों का लाभ उठाने के लिए आपको एक स्थानिक रूप से अनुक्रमित संग्रह की आवश्यकता होगी, लेकिन बहुभुज के प्रत्येक बिंदुओं के रिकॉर्ड के लिए एक अतिरिक्त मान के साथ एक रिकॉर्ड अपने आईडी के लिए। एक और संग्रह में रहने वाले स्थानिक रिकॉर्ड, फिर एक से रिकॉर्ड आईडी प्राप्त करने के लिए एक बाउंडिंग बॉक्स क्वेरी का उपयोग करें और दूसरे में से चयन करें, प्रभावी रूप से एक सम्मिलित अनुकरण।

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

एक संदर्भ कार्यान्वयन के रूप में, आप इस कोड को संदर्भित करना चाह सकते हैं जो इस वर्ष एस्री डेवलपर शिखर सम्मेलन में प्रस्तुत किया गया था।

मैं विभिन्न NoSQL डेटाबेस पर स्थानिक समर्थन के साथ बिल्कुल भी खुश नहीं हूं। वे केवल डंबल पॉइंट क्लाउड लुकअप के लिए काफी दूर तक जाते हैं, जो समझ में आता है कि इसका उपयोग करने वाले अधिकांश ऐप कहीं न कहीं एक ब्राउज़र पर Google मानचित्र पर केवल पुशपिन छोड़ रहे हैं। पोस्टजीआईएस अभी भी सबसे बेहतर भविष्य के लिए स्थानिक जानकारी के प्रबंधन के लिए ओपन-सोर्स वर्कहॉर्स होने जा रहा है।


9

यह बिल्कुल सही नहीं है,

"मानगो में स्थानिक अनुक्रमित का लाभ उठाने के लिए, आपको एक स्थानिक रूप से अनुक्रमित संग्रह की आवश्यकता होगी, जिसमें बहुभुज के प्रत्येक अंक के लिए एक रिकॉर्ड होगा, एक अन्य संग्रह में रहने वाले आपके स्थानिक रिकॉर्ड के रिकॉर्ड आईडी के लिए एक अतिरिक्त मूल्य के साथ, फिर एक उपयोग करें एक [संग्रह] से रिकॉर्ड आईडी प्राप्त करने के लिए बॉक्स क्वेरी को बाध्य करना और दूसरे [संग्रह] से [रिकॉर्ड डेटा] का चयन करें, प्रभावी रूप से एक सम्मिलित होने के लिए। "

मेरे पास USGS बिंदु डेटा एक एकल Mongo संग्रह में संग्रहीत है, जो इस तरह दिखता है:

> db.names.find({FEATURE_NAME: 'Mount Saint Helens', STATE_ALPHA: 'WA'})       
{ "_id" : ObjectId("4e262106d7a99b7db41a4919"), 
"_ID" : 1525360, 
"FEATURE_NAME" : "Mount Saint Helens", 
"FEATURE_CLASS" : "Summit", 
"STATE_ALPHA" : "WA", 
"STATE_FIPS" : 53, 
"COUNTY_NAME" : "Skamania", 
"COUNTY_FIPS" : "059", 
"COORDS" : [ -122.1944, 46.1912 ], 
"ELEV_IN_FT" : "8356" }

मैं इस डेटा पर बाउंड बॉक्स क्वेरी करने में सक्षम हूं जो पूरे रिकॉर्ड (दूसरे संग्रह की आवश्यकता के बिना) को ठीक करता है।

प्रश्न:

> box = [[-126.562500,45.089036], [-123.750000,47.040182]]
[ [ -126.5625, 45.089036 ], [ -123.75, 47.040182 ] ]
> db.names.find({"COORDS" : {"$within" : {"$box" : box}}, FEATURE_CLASS: "Summit"}, {FEATURE_NAME: true, COUNTY_NAME: true, STATE_ALPHA: true, ELEV_IN_FEET: true}).limit(5);

उत्तर:

{ "_id" : ObjectId("4e2620f8d7a99b7db4146cec"), "FEATURE_NAME" : "Harlocker Hill", "STATE_ALPHA" : "OR", "COUNTY_NAME" : "Coos" }
{ "_id" : ObjectId("4e2620f8d7a99b7db414a349"), "FEATURE_NAME" : "Neskowin Crest", "STATE_ALPHA" : "OR", "COUNTY_NAME" : "Tillamook" }
{ "_id" : ObjectId("4e2620f8d7a99b7db414a105"), "FEATURE_NAME" : "Miles Mountain", "STATE_ALPHA" : "OR", "COUNTY_NAME" : "Tillamook" }
{ "_id" : ObjectId("4e2620f8d7a99b7db414934a"), "FEATURE_NAME" : "Mount Gauldy", "STATE_ALPHA" : "OR", "COUNTY_NAME" : "Tillamook" }
{ "_id" : ObjectId("4e2620f8d7a99b7db4149d06"), "FEATURE_NAME" : "Little Hebo", "STATE_ALPHA" : "OR", "COUNTY_NAME" : "Yamhill" }

Mongo निकटतम पड़ोसी खोजों को करने की क्षमता प्रदान करता है, साथ ही बहुभुज खोजों में भी इंगित करता है। यह mongodb.org पर अच्छी तरह से प्रलेखित है


माफी लेकिन मैं उलझन में हूँ, MongoDB लाइन और बहुभुज सुविधा संग्रह पर एक स्थानिक सूचकांक बना सकता है या नहीं?
डेरेक स्विंगले

2
यह इस समय लाइन और बहुभुज सुविधाओं पर एक स्थानिक सूचकांक नहीं बना सकता है। हालाँकि, इसमें पॉइंट्स के साथ टेबल पर पॉइंट-इन-पॉलीगॉन सर्च कर सकते हैं, यदि आप क्वेरी के हिस्से के रूप में पॉलीगॉन ज्यामिति प्रदान करते हैं। mongodb.org/display/DOCS/…
lagerratrobe

1
ठीक है, इसलिए कथन: "जियोसन एक शानदार प्रारूप है लेकिन मोंगो में सीमित (केवल-केवल) स्थानिक अनुक्रमित का लाभ उठाने के लिए" वास्तव में सच है क्योंकि मोंगो केवल स्थानिक सूचकांक अंक दे सकता है।
डेरेक स्विंगले

मैं आपको अनुदान देता हूं कि उस वाक्य का एक हिस्सा सटीक है, "सीमित (केवल-बिंदु) स्थानिक सूचकांक"। तो 71 में से 5 शब्द, या 7%। यह 93% गलत है। मैं अपने बयान के पीछे खड़ा हूं।
लैगैरेट्रोब

1
क्या आप अपना उत्तर स्पष्ट करने के लिए संपादित कर सकते हैं? जैसा कि, यह भ्रामक और भ्रामक है। बयान के अन्य भाग के बारे में, क्या यह मूल रूप से गैर-बिंदु डेटा के लिए एक स्थानिक सूचकांक को लागू करने का सुझाव नहीं है? यह आदर्श या इष्टतम नहीं हो सकता है, लेकिन यह सिर्फ एक सुझाव है। आपको लगता है कि उस कथन का अधिकांश हिस्सा गलत है, इस पर चर्चा करने से भी मदद मिलेगी।
डेरेक स्विंगले
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.