Çizgiler ve çokgenler JSON belgelerinde nasıl saklanır?


24

Artan NoSQL hareketine bakmak ve MongoDB gibi veritabanlarının GIS için esnek veri depolama alanında yeni bir bakış açısı sunduğunu düşünerek . 2d endekslerinden ve uzamsal işlevlerden yararlanmak için JSON belgelerinde satırları ve çokgenleri saklamanın en iyi yolu nedir ?


6
MongoDB şu anda noktalardan başka bir şey için endekslemeyi desteklememektedir ve mekansal işlevleri sınırlar içinde bulmakla sınırlıdır.
scw

Yanıtlar:


16

GeoJSON burada SPEC'ler .

İşte bir çizgi ve çokgen örneği:

{ "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

Unutulmaması gereken bir şey, MongoDB'nin mekansal veri türleri için desteğinin, herhangi bir ciddi mekansal arama için korkunç derecede kötü olduğu ve bu, en son kontrol ettiğimde NoSQL'e dahil olduğu için geçerli. GeoCouch'ı biraz daha az sevdim, ama yine de devam etmenin bir yolu var.

GeoJSON fantastik bir formattır ancak Mongo'daki sınırlı (SADECE NOKTALI) mekansal endekslerden yararlanmak için, Mongol'daki spatial indekslenmiş bir koleksiyona ihtiyacınız olacak. başka bir koleksiyonda yaşayan mekansal kayıt, daha sonra birinden kayıt kimlikleri almak için bir sınırlayıcı kutu sorgusu kullanın ve diğerinden seçim yaparak etkin bir şekilde birleşim öykünmesini öykünür.

Hırsızlığa uğrayabilir ve sınırlayıcı kutunun köşelerini kayıtlarınız için puan olarak kullanabilirsiniz, ancak daha sonra sınırlayıcı kutu aramaları başarısız olabilir ve hepsinde bazı oldukça verimsiz tasarım desenlerini zorlar ve geliştiriciye her türlü sorumluluğu uygunsuz bir şekilde zorlar.

Referans olarak, bu yıl Esri Geliştirici Zirvesi'nde sunulan bu koda atıfta bulunmak isteyebilirsiniz .

Çeşitli NoSQL veritabanlarındaki mekansal destekle hiç mutlu değildim. Yalnızca aptal nokta bulutu araması için yeterince ileri gidiyorlar; bu, bunu kullanan uygulamaların çoğunun yalnızca bir yerde bir tarayıcıdaki bir Google haritasına raptiyeler bıraktığını düşünmenin mantıklı olduğunu gösteriyor. PostGIS, öngörülebilir gelecek için mekansal bilgileri yönetmek için hala en iyi açık kaynaklı işgücü olacak.


9

Bu sadece doğru değil,

"Mongo’daki uzamsal endekslerden yararlanmak için, poligonun her bir noktası için bir kayıttan başka hiçbir şey tutan mekansal olarak indekslenmiş bir koleksiyona ihtiyacınız olacak, başka bir koleksiyonda yaşayan mekansal kaydınızın kayıt kimliği için ek bir değere sahip olacaksınız. bir [koleksiyon] 'dan kayıt kimliklerini almak için sınırlayıcı kutu sorgusu ve diğer bir [koleksiyon]' dan [kayıt verisi] 'ni seçmek, etkin bir şekilde birleştirmek öykünmek. "

Tek bir Mongo koleksiyonunda saklanan USGS nokta verisine sahibim.

> 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" }

Kaydı kutu sorguları yapabiliyorum, bu veriler üzerinde kaydın tamamını döndüren (başka bir koleksiyona gerek kalmadan) gayet iyi.

Sorgu:

> 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);

Tepki:

{ "_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 ayrıca en yakın komşu aramaların yanı sıra çokgen aramalarını da yapma yeteneği sağlar. Bu iyi mongodb.org de belgelenmiştir


Özür dilerim ama kafam karıştı, MongoDB çizgi ve poligon özellikli koleksiyonlar üzerinde mekansal bir dizin oluşturabilir mi veya oluşturamaz mı?
Derek Swingley

2
Şu anda çizgi ve çokgen özellikleri üzerinde uzamsal bir dizin oluşturamaz. Bununla birlikte, eğer poligon geometrisini sorgunun bir parçası olarak verirseniz, içinde bir nokta bulunan poligon içinde bir nokta araması yapabilir. mongodb.org/display/DOCS/…
lagerratrobe

1
Tamam, öyleyse: "GeoJSON harika bir format ama Mongo'daki sınırlı (SADECE NOKTA) mekansal endekslerinden yararlanmak" aslında doğrudur çünkü Mongo sadece mekansal olarak puan verebilmektedir.
Derek Swingley

Size, bu cümlenin bir kısmının doğru olduğunu, "sınırlı (SADECE NOKTADA) mekansal dizinler" olduğunu veriyorum. Yani 71 kelimeden 5'i veya% 7'si. Bu onun% 93'ünü yanlış bırakıyor. İfademin arkasında duruyorum.
lagerratrobe

1
Netleştirmek için cevabınızı düzenleyebilir misiniz? Olduğu gibi, kafa karıştırıcı ve yanıltıcı. İfadenin diğer kısmı ile ilgili olarak, bu temelde sadece nokta dışı veriler için mekansal bir endeks uygulanması için bir öneri değil midir? İdeal veya optimal olmayabilir, ancak sadece bir öneri. Bu ifadenin çoğunluğunun neden yanlış olduğunu düşündüğünüzün detaylandırılması da yardımcı olacaktır.
Derek Swingley
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.