düzgün kullanarak: Çokgenler ve Çokgenler arasında çeviri


12

[EDIT: Bunun çözümü, şekil dosyalarını okumak için OGR'yi kullanmaktı. Geographika örneğine bakın.]

ESRI şekil dosyasında, Çokgenler ve Çokgenler arasında bir ayrım yoktur. Ayrıca, iç delikler ile dış halkalar arasında belirli bir ayrım yoktur (belirli bir çokgenin "elle tutulması" yanında).

Bir şekil dosyasını okuduktan sonra, halkaları tanımlayan bir koordinat dizileri listem var, ancak daha yoğun bir işlem olmadan, bu halkalardan hangilerinin dış halkalar, iç delikler veya ek çokgenler olduğunu ayırt edemiyorum.

O için görünür düzgün çokgen ve MultiPolygon kurucular s', dış ve iç halkaları arasında net bir ayrım olmalıdır, peki nasıl açıkça belirlenmiş iç ve dış halkalar ile ayrılmış çokgen sıralı bir dizi halkaların bir belirsiz listeden hareket etmeliyiz ?

Özetlemek gerekirse: Çokgen halkaların bir listesi varsa, ancak hangi halkaların iç kısımdaki delikler olduğunu veya ayrı çokgenler olduğunu bilmiyorsam, bunları en iyi nasıl belirlenmiş iç delikli ayrı poligonlara ayırmalıyım?

Ben piton uygulayabilirsiniz basit bir algoritmik çözüm arıyorum, bir dakika veya daha az bir sürede yüzlerce çokgen işlemek için kullanılabilir, ve ben çok sayıda kavşak gerçekleştirmek için yapıyorum.


Bu soruda, Shapefile'ı okumak için ne kullandığınıza dair önemli bilgiler eksik.
inc42

@ inc42 Dosyayı doğrudan okumak için python kullanıyordum.
BenjaminGolder

Ah, o zaman Shapely biti yanıltıcı. Asıl sorun Shapefile formatında halka "tür" belirleme bulmak oldu. :)
inc42

Yanıtlar:


10

Ayrı ayrı çokgenleri nasıl alacağınıza dair cevabın yanı sıra, delikleri oluşturmak için tüm çokgenler üzerinde bir kavşak çalıştırabilirsiniz. Veri kümenizde şansınız olmasa da çakışan çokgenler varsa.

Mevcut şekil dosyası okuyucularında neyin yanlış olduğunu tekrar açıklayın?

Özellik kimlikleri ve M değerlerini şekil dosyasından dışa aktarmak ve daha sonra mevcut bir şekil dosyası okuyucusunu kullandıktan sonra bunları çokgenlerle birleştirmek daha kolay olmaz mıydı?

Çoklu eşlemeler için, bir "yama kimliğine" çokgen kimlikleri atama ve daha sonra bu niteliği tekrar özelliklere ekleme tekniğini kullanabilirsiniz.

Edit: OGR kullanmak istemediğiniz söylenirken, sadece fikrinizi değiştirmek durumunda ..

import ogr
# Get the driver
driver = ogr.GetDriverByName('ESRI Shapefile')
# Open a shapefile
shapefileName = "D:/temp/myshapefile.shp"
dataset = driver.Open(shapefileName, 0)

layer = dataset.GetLayer()
for index in xrange(layer.GetFeatureCount()):
    feature = layer.GetFeature(index)
    geometry = feature.GetGeometryRef()
    #geometry for polygon as WKT, inner rings, outer rings etc. 
    print geometry

Geometri aşağıdaki gibi çıktılanmalıdır:

POLYGON ((79285 57742,78741 54273...),(76087 55694,78511 55088,..))

İlk braket dış halkanın kollarını içerir, daha sonra iç halkaların kollarını tutar. Z değerleriniz varsa, puanlar 79285 57742 10 biçiminde olmalıdır (son koordinat bir yüksekliktir).

Aksi takdirde, her bir çokgeni birbirleriyle değerlendirmek ve işlemeyi hızlandırmak için önceden bir uzamsal dizin uygulamak için Shapely Contains and Within işlevlerini kullanabilirsiniz - http://pypi.python.org/pypi/Rtree/ .


teşekkürler, aradığım şey bu değil, ama soruma yapabileceğim daha fazla açıklama gördüm. Sorularınızı cevaplamak için: 1, çünkü onları ilk etapta tonlarca kavşak yapmak için sıralıyorum. 2, hiçbir şey, ben sadece hafif ve python kolayca kullanabileceğiniz birine ihtiyacım var, ve ogr öğrenmedim. 3, hayır, bu durumda daha kolay olmazdı.
BenjaminGolder

1
Vaov! Teşekkürler geographika! Şimdi% 90'ın ogr'un buradaki çözüm olduğuna ikna oldum. Ogr ile ilgili bazı kurulum sorunlarıyla karşılaştım, ancak üzerinde çalışmaya değer gibi görünüyorlar. Peki ogr halkaları wkt çıktısında düzenler? ve 3d şekil dosyaları ile iyi mi (çok fazla 3d kullanıyorum)?
BenjaminGolder

Sorularıma cevaplar evet ve evet gibi görünüyor. Ve beni rtree ile tanıştırdığın için teşekkürler. Kurulumu bu kez doğru şekilde yapılandırabildiğim sürece OGR sorunumu tamamen çözüyor gibi görünüyor.
BenjaminGolder

OGR'nin yeniden yüklenmesi - Windows için ikili dosyalara ve eşleşen Python bağlarına ihtiyacınız olacağını unutmayın.
geographika

9

İlk olarak, şekil dosyasını açmak için ogr kullanın:

from osgeo import ogr
source = ogr.Open("mpolys.shp")
layers =  source.GetLayerByName("mpoly")
len(layers)
1

şekil dosyası geometrilerini düzgün geometrilere dönüştürür

from shapely.wkb import loads
element=layers[0] #(because lenght of layer =1, else you need "for element in layers: ...")
geom = loads(element.GetGeometryRef().ExportToWkb())
geom.geom_type
'MultiPolygon'
print geom
MULTIPOLYGON ((..... # the geometry in shapely wkt format

Çokgendeki çokgenler için:

poly=[]
for pol in geom:
    poly.append(pol)
poly[0]
<shapely.geometry.polygon.Polygon object at 0x00B82CB0>
poly[0].geom_type
'Polygon'
print(poly[1])
POLYGON ((.... # the geometry in shapely wkt format

Ve şimdi, tüm fonksiyonları düzgün ( düzgün ) kullanabilirsiniz


1

Çokgenlerin aslında şekil dosyalarında nasıl saklandığına çok aşina değilim, ama - ve eğer sadece başlangıç ​​koordinatı tekrarlanırsa çokgen halka kapalı bir döngü olmamalı mı? Dolayısıyla, sonraki her bir koordinatı başlangıç ​​koordinatı ile karşılaştırırsanız, çokgenin kapalı olduğu ilk noktayı bulacaksınız. Bu, çokgenin son koordinatıysa, basit bir çokgendir, değilse, bir çokgendir ve diğer döngülerin işlenmesini gerektirir.

Bu, kaçınmak istediğiniz 'daha yoğun işleme' olabilir, ancak gerçekten sadece onları okumak zorunda olduğunuzda ücretsiz olarak gelen koordinatlar aracılığıyla bir yinelemedir.


Özür dilerim - sorum biraz yanıltıcıydı ve bunu düzenledim. Çokgen halkalarım var ve birden fazla çokgen halkasının bir listesine sahip olduğumu biliyorum, ancak noktaların saat yönünde veya saat yönünün tersine sıralamanın dışında, iç veya dış halka olup olmadığını bilmiyorum. Eğer iç halkalarsa, konumlarını ölçmek dışında hangi dış halkaya ait olduklarından emin olamıyorum.
BenjaminGolder

Anlıyorum. Ayrıca ogr için yol bulduğunu görmek için mutluyum. ;)
işgal edildi muhtemelen

-2

@ İnc42 ile belirtildiği gibi , ESRI Şekil Dosyasının 8. sayfasında Teknik Açıklama: Bir ESRI Teknik Dokümanı - Temmuz 1998 ( PDF'de sayfa 12/34) , daha sonra ne olabileceğiniz çokgen kayıt içerikleri hakkında bir tartışma vardır:

Bir çokgen birden fazla dış halka içerebilir. Bir halkanın köşe işaretleri veya yönü, halkanın hangi tarafının çokgenin içi olduğunu gösterir.


s.10'da "Bir çokgen birden fazla dış halka içerebilir. Bir halka için köşeler veya yön sırası, halkanın hangi tarafının çokgenin içi olduğunu gösterir."
inc42

@ inc42, sayfa numarasının 8 (veya 34'ün 12'si) olması gerektiğini düşünmeme rağmen uygun şekilde güncellendi.
PolyGeo
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.