2017-01-17 29 views
8

ढूंढ रहा है मेरे पास एक मोंगोडीबी डेटाबेस है जिसमें fooCollection नामक संग्रह है। इस संग्रह में दस्तावेजों में एक बाध्यकारी बहुभुज के रास्ते में भू-स्थानिक डेटा शामिल है। मैं अपने ऐप में सी # मोंगोडीबी ड्राइवर का उपयोग कर रहा हूं। मैंने देखा कि यह कुछ स्थानिक प्रश्नों के साथ दस्तावेज़ नहीं ढूंढ रहा था हालांकि यह उनमें से अधिकांश के साथ काम करता है। मैंने एक अपमानजनक दस्तावेज़ को छोड़कर संग्रह खाली कर दिया और मैंने सीधे प्रश्नों को निष्पादित करके इसे खोजने का प्रयास किया।

मेरे दस्तावेज़ इस तरह दिखता है:

{ 
"_id" : UUID("12345678-62d9-4024-86dc-123456789012"), 
"polygon" : { 
    "type" : "Polygon", 
    "coordinates" : [ [ 
      [ 18.414846, -33.9699577 ], 
      [ 18.414846, -26.0991189 ], 
      [ 31.0330578, -26.0991189 ], 
      [ 31.0330578, -33.9699577 ], 
      [ 18.414846, -33.9699577 ] 
    ] ] 
}, 
"foo": "bar" 
} 

मैं भी उस संग्रह पर इस सूचकांक:

[ 
    1, 
    { 
     "polygon" : "2dsphere" 
    }, 
    "polygon_2dsphere", 
    "data.fooCollection", 
    3 
] 

निम्न क्वेरी सही ढंग से इस दस्तावेज़ रिटर्न:

db.getCollection('fooCollection').find({ 
    "polygon": { 
     $geoIntersects: { 
      $geometry: { 
       type: "LineString", 
       coordinates: [[24.7698287, -28.7353533],[28.0423, -26.19793]] 
}}}}) 

हालांकि, यह क्वेरी नहीं है:

db.getCollection('fooCollection').find({ 
    "polygon": { 
     $geoIntersects: { 
      $geometry: { 
       type: "LineString", 
       coordinates: [[27.7706902, -26.1091189],[28.0423, -26.19793]] 
}}}}) 

यदि आप उन तीन ज्यामितिओं को साजिश करते हैं, तो मैं वास्तव में नहीं देख सकता कि कोई काम क्यों करेगा लेकिन दूसरा नहीं।

  • दोनों लाइनों बहुभुज
  • के भीतर पूरी तरह झूठ काम कर लाइन बहुत लंबे समय तक
  • काम कर लाइन 0 डिग्री और 90 डिग्री के बीच का एक असर, 90 डिग्री और 180 डिग्री के बीच अन्य है।

क्या कोई इस व्यवहार को समझाने में सक्षम है?

संपादित करें: मैंने लाइनस्ट्रिंग का उपयोग करने के बजाय अलग-अलग बिंदुओं का भी परीक्षण किया है। हिट होने वाला एकमात्र ऐसा [24.7698287, -28.7353533] है। मैं क्या ज़रूरत है LineStrings - क्वेरी एक हिट भले ही बढ़त बहुभुज काटती है होना चाहिए और कोई अंक

के भीतर ही होनी आप GeoJSON here देख सकते हैं या आप तीन geometries खुद http://geojson.io/ में निम्न पंक्ति पेस्ट करके प्लॉट कर सकते हैं :

{"type":"GeometryCollection","geometries":[{"type":"Polygon","coordinates":[[[18.414846,-33.9699577],[18.414846,-26.0991189],[31.0330578,-26.0991189],[31.0330578,-33.9699577],[18.414846,-33.9699577]]]},{"type":"LineString","coordinates":[[27.7706902,-26.1091189],[28.0423,-26.19793]]},{"type":"LineString","coordinates":[[24.7698287,-28.7353533],[28.0423,-26.19793]]}]} 
+0

अरे इवान, मैंने बहुभुज निर्दिष्ट करके '$ geoIntersects' के साथ लगातार सफलता प्राप्त की है, मोंगो दस्तावेज़ भी लाइनस्ट्रिंग का उपयोग करके उदाहरणों से दूर शर्मिंदा हैं। जैसा कि आप सही ढंग से निरीक्षण करते हैं, क्वेरी को काम करना चाहिए, इसलिए यह अजीब बात है कि यह नहीं है। क्या आपने अन्य भू ऑपरेटरों को यह देखने के लिए प्रयास किया है कि आप उनके साथ एक ही परिणाम प्राप्त कर सकते हैं या नहीं? आखिरकार, क्या आप ऐसे मार्ग ढूंढ रहे हैं जो पूरी तरह से बाध्यकारी बॉक्स में आते हैं, या जो 'स्पर्श' या आंशिक रूप से बाध्यकारी बॉक्स के साथ छेड़छाड़ करते हैं? –

उत्तर

4

किसी को भी इस व्यवहार की व्याख्या करने में सक्षम है?

ऐसा इसलिए है क्योंकि पृथ्वी फ्लैट नहीं है, लेकिन काफी गोलाकार (घुमावदार) है। पृथ्वी की सतह को विरूपण के बिना विमान पर प्रदर्शित नहीं किया जा सकता है। तो इसका मतलब है कि हर नक्शा प्रक्षेपण पृथ्वी को किसी तरह से विकृत कर देगा। यह भी देखें Map Projections

MongoDB 2dsphere index, ऐसे प्रश्नों का समर्थन करता है जो पृथ्वी के समान क्षेत्र पर ज्यामिति की गणना करते हैं।

जब आप http://geojson.io पर समन्वय को मानचित्र करते हैं, तो यह पृथ्वी की गोलाकार प्रकृति का विवरण नहीं लेता है। छोटा लाइनस्ट्रिंग "वर्ग" पॉलीगॉन के भीतर दिखाया गया है।

geojson.io

आप https://geodndmap.mongodb.com कि तथ्य यह है कि वहाँ एक गोलाकार विरूपण है कि के कारण लेता है पर GeoJSON ज्यामितीय नक्शा, तो आप नीचे देख सकते हैं:

geodndmap.mongodb.com

कम LineString वास्तव में बाहर है "वर्ग" बहुभुज का। यह मोंगोडीबी 2dsphere इंडेक्स/क्वेरी पर किया जाता है।

विरूपण प्रभाव का प्रभाव लंबे/बड़े क्षेत्र के अनुमानों के साथ बढ़ता है।

उदाहरण:

{"type":"GeometryCollection","geometries":[ 
{"type":"Polygon","coordinates":[[[18.414846,-33.9699577],[18.414846,-26.0991189],[31.0330578,-26.0991189],[31.0330578,-33.9699577],[18.414846,-33.9699577]]]}, 
{"type":"LineString","coordinates":[[24.7698287,-28.7353533],[88.0423,-26.19793]]}]} 

geojson.io

geodndmap.mongodb.com

पुनश्च: और या तो एक फ़ाइल के रूप में या एक से पाठ के रूप में geodndmap.mongodb.com, खींचें का उपयोग नक्शे पर GeoJSON ड्रॉप करने के लिए, संपादन कार्यक्रम।

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