ArcPy kullanarak ArcGIS Desktop'ta ArcSDE çokgenini noktadan mı seçiyorsunuz?


15

Bir şey eksik olduğumu düşünmeye devam ediyorum, ancak ArcGIS 10'da ArcPy aracılığıyla bir noktada (X, Y) bir konumdan özellikler (özellikle çokgenler) seçmek için bir araç yok gibi görünüyor. Böyle bir aracın parametreleri sadece bir katman adı ve bir XY konumu olacaktır.

Şu anda bu noktayı içeren bir nokta özellik sınıfı oluşturarak ve üzerinde bir SelectLayerByLocation gerçekleştirerek bu sorunu çözüyorum. Ancak, çokgen özellik sınıfı Oracle'da (ArcSDE 9.x aracılığıyla erişilir) ve 3,5 milyon çokgen içerdiğinde, bir veya iki (daha az kodla) olacağını düşündüğümde seçimi yapmak için geçen süre 5 dakikadan fazla olabilir. daha uygun. Özellik sınıfı bir uzamsal dizine sahiptir ve erişilen coğrafi alanı kısıtlamak için arcpy.env.extent (ki bu SelectLayerByLocation yok sayılıyor gibi) kullanmayı denedim ancak performans çok düşük.

ArcGIS Desktop 10 ve ArcPy kullanarak bunu yapmanın daha hızlı bir yolu var mı?


Şimdi forums.arcgis.com/threads/… adresinde buna bir çözüm var ve bu bilgiyi bugün daha sonra burada düzenleyeceğim - çok teşekkürler Jason
Scheirer

2
Bunun bir notu gibi, bir aracın onurlandırdığı ortamları aracın referans sayfasının alt kısmında bulabilirsiniz. SelectByLocation yalnızca Geçerli Çalışma Alanını ve Çıktı Koordinat Sistemini onurlandırır. help.arcgis.com/tr/arcgisdesktop/10.0/help/index.html#//…
blord-castillo

Yanıtlar:


9

Buna başka bir yaklaşım da Uzamsal Birleştirme aracını kullanmak olacaktır. Noktayı yukarıdaki gibi giriş özelliği katmanınız ve kimliğiniz olarak çokgen katmanı kullanın.
SelectLayerByLocation'ın aksine, SpatialJoin ortamın kapsamını onurlandırır.

targetlayer = layername
joinlayer=arcpy.PointGeometry(arcpy.Point(x, y))
fieldmappings = arcpy.FieldMappings()
fieldmappings.addTable(targetlayer)
arcpy.SpatialJoin_analysis(targetlayer, joinlayer, outputlayer, "JOIN_ONE_TO_MANY", "KEEP_COMMON", fieldmappings)

JOIN_ONE_TO_MANY karşı sezgisel görünebilir, ancak yalnızca bir birleştirme özelliğiniz olduğundan, bu seçeneğin ana işlevi toplama ve birleştirme kurallarını kapatmaktır. KEEP_COMMON, çıktınızın yalnızca noktanızla kesişen çokgenle sınırlı olmasını sağlar. Alan Haritaları çıktı niteliklerini yalnızca çokgen katmanının şekli ve nitelikleriyle sınırlar; varsayılan değer nokta katmanının niteliklerini de içerir.

Varsayılanların geri kalanı iyi çalışır, böylece kalan argümanları bırakabilirsiniz.


Denemediğim birkaç teknik içeren bu kod için çok teşekkürler. Daha önce SpatialJoin'i denedim (böylece coğrafi işlem ortamına saygı duyulabilirdim), ancak şu anda tekniğinizin bir testinin yanı sıra, 10-12 saniyeye kıyasla 4-5 dakika yanıt süreleriyle beni hala bıraktı Chris Snyder beni yönlendirdi.
PolyGeo

SpatialJoin ile Chris Snyder'ın tekniğini de denediniz mi? Arabellek tekniğinin bu kadar hızlı olmasının temel sebebinin çokgen sınıfının bir bellek kopyasını kullanmasıdır. Ben yere göre seçim düşünün mekansal katılmak daha hızlı olmalı, ama emin değilim.
blord-castillo

İn_memory bitini kullanmamak sona erdi. Zaten o kadar çok hızlanmıştı ki, onu yedekte tuttum. Ben önemli bir şey hızlı bir şekilde yerel bir dosya coğrafi veritabanına kopyalandı X, Y kontrol etmek için gerekli olan bir / birkaç çokgen (3.5 milyondan) almak için boyutunu ayarlamak olduğunu düşünüyorum. Bu kısmı SpatialJoin'den önce yapmak, aynı / benzer performans gelişimine yol açacağını düşünürüm.
PolyGeo

1

Bir şey fark ettim ...

Bir Geoprocessing Hizmeti uygulamak için bunu kullanıyorsanız, bunun yerine çokgen katmanınızla bir Özellik Hizmeti uygulayabilir ve özellik hizmetinde Sorgu işlemini kullanabilirsiniz.

Sen edebilirsiniz Özelliği Servisi Sorgu işlemi ile basit XY konumu kullanmak, hem de çıkış şekli de dahil olmak üzere niteliklerini kontrol eder.

Çokgen özellik sınıfını ne kadar açığa çıkarabileceğiniz konusunda kısıtlamalarınız olabilir, ancak zaten coğrafi işleme hizmeti için erişilebilir hale getiriyorsanız, bir Özellik Hizmeti de oluşturabilmeniz gerekir.


Bu, diğer gereksinimleri karşılamak için yararlı bir düşüncedir, ancak bu durumda, istemci uygulaması çok basittir ve kontrolüm dışındadır, bu yüzden sadece bir Geocesscessing Hizmeti verebiliyorum.
PolyGeo

Bir Geoprocessing Servisi dışında bir şey kullanma konusunda bir kısıtlama olabileceğini düşündüm :) İronik olarak, bir Özellik Hizmetinin uygulanması ve bakımı için çok daha basit bir yol olduğunu düşünüyorum. Bu aynı zamanda istediğiniz işlevin neden kullanılamadığını da açıklayabilir; zaten her uygulama düzeyinde yapabilirsiniz. Sonraki sürümde bir araç olarak uygulamak için ESRI'ya bir istek gönderdiğinizden emin olun.
blord-castillo

1

Bu cevap eski ArcGIS Tartışma Forumlarından geldi .

Bazı kısa kodlar için teşekkürler Jason Scheirer:

SelectLayerByLocation(in_layer=arcpy.PointGeometry(arcpy.Point(x, y)), select_features="mylayer") 

Ve özellikle performans ipucu için Chris Snyder'a:

Daha hızlı bir çözüm, noktanızı biraz tamponlamak ve daha sonra SDE verilerinizin bir bellek içi kopyasını (CopyFeatures aracı) oluşturmak ve daha küçük ve yerel bellek içi veri kümesinde bir SelectByLocation yapmak için tampon genişliğini analiz kapsamı olarak kullanmak olabilir. Bu şekilde, SelectByLocation aracını normalde yapmayacağı analiz kapsamı ortamını onurlandırıyorsunuz. BTW: Analiz kapsamıyla çakışan tüm özellikler CopyFeatures aracıyla kopyalanacaktır. Kesinlikle SelectByLocation aracı ve imleçler analiz kapsamı onur isterdim ...

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.