RTree ile uzamsal dizinlerin kullanımını anlamakta zorlanıyorum.
Örnek: 300 arabelleğe alınmış noktam var ve her tamponun kesişim alanını çokgen şekil dosyasıyla bilmem gerekiyor. Çokgen şekil dosyasının> 20.000 çokgen vardır. Süreci hızlandırmak için mekansal indeksler kullanmam önerildi.
SO ... Çokgen şekil dosyam için uzamsal bir dizin oluşturursam, dosyaya bir şekilde "eklenir" mi yoksa dizin tek başına mı kalır? Yani, oluşturduktan sonra çokgen dosyasında kesişim fonksiyonumu çalıştırabilir ve daha hızlı sonuçlar alabilir miyim? Kavşak mekansal endeksler olduğunu "görecek" ve ne yapacağını bilecek mi? Veya, dizin üzerinde çalıştırmak ve daha sonra bu sonuçları FIDs veya benzeri bazı orijinal poligon dosyama ilişkilendirmek gerekir?
RTree belgeleri bana çok yardımcı olmuyor (muhtemelen sadece programlamayı öğreniyorum). Manuel olarak oluşturulan noktalarda okuyarak ve ardından pencerede bulunan kimlikleri döndüren diğer elle oluşturulan noktalara göre sorgulayarak nasıl dizin oluşturulacağını gösterirler. Mantıklı. Ancak, bunun dizinin geleceği orijinal dosyayla nasıl ilişkili olacağını açıklamazlar.
Böyle bir şeye gitmesi gerektiğini düşünüyorum:
- Her çokgen özelliğinin bbox'larını çokgen şekil dosyamdan al ve bunları uzamsal bir dizine yerleştirerek şekil dosyasındaki kimlikleriyle aynı bir kimlik verir.
- Kesişen kimlikleri almak için bu dizini sorgulayın.
- Daha sonra kesişimimi yalnızca orijinal şekil dosyamdaki dizinimi sorgulayarak tanımlanan özellikler üzerinde yeniden çalıştırın (bu son kısmı nasıl yapacağımı bilmiyorum).
Doğru fikrim var mı? Bir şey mi kaçırıyorum?
Şu anda sadece bir nokta özelliği içeren bir nokta şekil dosyası ve> 20.000 çokgen özellikleri içeren bir çokgen şekil dosyası üzerinde çalışmak için bu kodu almaya çalışıyorum.
Fiona'yı kullanarak şekil dosyalarını içe aktarıyorum, RTree kullanarak mekansal dizini ekliyorum ve Shapely kullanarak kesişim yapmaya çalışıyorum.
Test kodum şöyle:
#point shapefile representing location of desired focal statistic
traps = fiona.open('single_pt_speed_test.shp', 'r')
#polygon shapefile representing land cover of interest
gl = MultiPolygon([shape(pol['geometry']) for pol in fiona.open('class3_aa.shp', 'r')])
#search area
areaKM2 = 20
#create empty spatial index
idx = index.Index()
#set initial search radius for buffer
areaM2 = areaKM2 * 1000000
r = (math.sqrt(areaM2/math.pi))
#create spatial index from gl
for i, shape in enumerate(gl):
idx.insert(i, shape.bounds)
#query index for ids that intersect with buffer (will eventually have multiple points)
for point in traps:
pt_buffer = shape(point['geometry']).buffer(r)
intersect_ids = pt_buffer.intersection(idx)
Ama TypeError almaya devam ediyorum: 'Polygon' nesnesi çağrılabilir değil
TypeError: 'Polygon' object is not callable
shape
for i, shape in enumerate(gl):