2015-10-06 45 views
1

我有一個地圖上有很多標記。我有兩個不相交的多邊形(Box)。我想獲得由這些多邊形覆蓋的所有標記。如何在MultiPolygon或多個多邊形上進行空間查找「包含」?

qb_1 = Polygon.from_bbox((-35.19153, -5.84512, -35.24054, -5.78552)) 
qb_2 = Polygon.from_bbox((64.16016, 50.26125, 61.80359, 52.04911)) 
q_box = MultiPolygon(qb_1, qb_2) 

test1 = Marker.objects.filter(point__contained=qb_1) 
test2 = Marker.objects.filter(point__contained=qb_2) 

test = Marker.objects.filter(point__contained=q_box) 

print "Count of Polygon 1 = %s" % test1.count() 
print "Count of Polygon 2 = %s" % test2.count() 
print "Count of MultiPolygon = %s" % test.count() 

但結果是:

Count of Polygon 1 = 4 
Count of Polygon 2 = 12 
Count of MultiPolygon = 237 

爲什麼多邊形1 + 2多邊形不等於的MultiPolygon?

回答

2

祕密就在我已經強調(從geoqueryset documentation

包含

可用性的話:PostGIS的,MySQL和SpatiaLite

測試,如果幾何領域的邊框是完全由查找幾何的邊界框包含

您創建的兩個多邊形碰巧有小區域,而您創建的多邊形也有一個小區域,但關於它的邊界框不能這麼說。

qb_1.envelope.area # 0.0029209960000001417 
qb_2.envelope.area # 4.213217240200014 
qbox.envelope.area # 5754.726987961 

因爲你會看到最後一個比較巨大,它比兩個多邊形採取自己的更多點。因此,整體大於其部分的總和。

你應該能夠得到由兩個多邊形所覆蓋的實際要點如下:

從django.db.models導入Q Marker.objects.filter(Q(point__contained = qb_1)| Q(point__contained = qb_1))

但也許contains_properly是你真正想要的?但是這僅在postgresql中可用,所以包含是一個很好的替代品。

包含

可用性:PostGIS的,Oracle,MySQL等,SpatiaLite

如果

測試幾何領域裏的空間包含查閱幾何。

然後將查詢變得

Marker.objects.filter(Q(point__contains=qb_1) | Q(point__contains=qb_1)) 
+0

現在我明白了!謝謝!但是我怎樣才能得到一個具有Polygon 1和Polygon 2覆蓋點的查詢集呢? – Anton

+1

更新回答這個 – e4c5

+0

嗯,它真的有用!我認爲|它是OR並且我得到qb_1或qb_2,但它工作正確,因爲我需要。謝謝! – Anton