çokgenlere sentroid atama ve taşıma


9

QGIS 1.8 Lisboa kullanıyorum. Bir çokgen şekil dosyasındaki sentroidleri hesapladıktan sonra, bazıları çokgen anahatlarının dışındaysa, geldikleri çokgenin üzerine taşımak istiyorum. Poligonun kimlik kodu olarak kullanılacak koordinatları çıkarmak için bunları kullanmam gerektiğinden ölçüt tek anlamlı olmalıdır. Bu nedenle, prosedür aynı poligon için her çalıştığında aynı nokta konumunu vermelidir (her çalıştırıldığında yeni bir sonuç veren "rastgele noktalar" işleviyle verilen gibi rastgele bir konum değil).


1
İki soru gibi geliyor. Doğru anlarsam, (a) bir çokgenin içine rastgele noktalar eklemek ve (b) onlara veya çokgene buna dayalı benzersiz bir kimlik vermek istersiniz. (A) için akla gelen en basit şey, QGIS'teki mevcut rastgele nokta yeteneklerini kullanmak ve daha sonra bu nokta bulutunu çokgeninizle kesmektir.
lynxlynxlynx

"rastgele noktalar" işlevini aynı çokgenler ile farklı zamanlarda kullanmak farklı sonuçlara yol açar (yani, her çokgenden türetilen noktaların konumu, işlevin her yeni kullanımında farklıdır) ve bana verecek bir yöntem oluşturmak istiyorum çokgenler için kimlik kodu olarak kullanmak istediğim koordinatları çıkarabildiğim her poligon için her zaman aynı nokta.
1313

fTools 'gerçek sentroid' aracını geometri araçları altında kullanın - docs.qgis.org/html/en/docs/user_manual/plugins/…
Mapperz

sadece sentroidi veriyor, ama bu da kaçınmam gereken poligonun dışında olabilir. Minimum mesafe gibi bir işlev kullanarak, türettikleri çokgen üzerinde hareket etmeliyim (ancak mesafeyle ilgilenmiyorum, taşınmasını istiyorum). Başka bir blogda birisi PostGIS'ten ST_PointOnSurface kullanmamı söyledi (ama QGIS kullanıyorum).
13:15

Yanıtlar:


7

representative_point()Çokgenin içinde kalması garanti edilen bir işlev sağlayan Shapely python kitaplığını kullanabilirsiniz .

İşte QGIS Python konsolunda çalıştırılabilen bir Python betiği. Özniteliğini oluşturmak istediğiniz çokgen katmanı seçilmelidir. İşlev, güncellemek istediğiniz özniteliğin adını alır. Öznitelik katmanınızda zaten var olmalı, dize türü olmalı ve yeterince uzun olmalıdır (30 karakter).

İşte algoritmanın bulduğu noktalara bir örnek:

import shapely.wkb

def setIDPoint(attributename):
 layer = qgis.utils.iface.activeLayer()
 provider = layer.dataProvider()
 fields = provider.fields()
 provider.select(provider.attributeIndexes() )
 attributeID = provider.fieldNameIndex(attributename)
 feature = QgsFeature()
 layer.startEditing()
 while provider.nextFeature(feature):
  wkb = feature.geometry().asWkb()
  polygon = shapely.wkb.loads(wkb)
  reprPoint = ','.join([str(polygon.representative_point().x), str(polygon.representative_point().y)] )
  feature.changeAttribute(attributeID, reprPoint)
  layer.updateFeature(feature)
 layer.commitChanges()

Test etmeye çalışıyorum, tam olarak aradığım şey gibi görünüyor. Onu çalıştırır çalıştırmaz size bildireceğim!
1313

Bu konuda alamadım bir şey "dize türü olmalı ve yeterince uzun (30 karakter)" ile ne demek istiyorsun. Bu kütüphane doğrudan çokgen shpfiles üzerinde mi çalışıyor? Öyleyse, Att Sekmesinde en az 30 karakter içeren yeni bir dize türü alanı oluşturmam gerekiyor mu ve bu güncellenecek olan mı?
1313

@ user9518: Evet, tabloda tabloda özniteliği kendiniz oluşturmak zorunda olduğunuz anda işlevin yazılma şekli ve daha sonra yalnızca alanın adını işleve iletmeniz gerekir. Komut dosyası, gerekli olan alanın kendisi de gerekli alanı oluşturmak için kolayca uyarlanabilir.
Jake

Sadece bir şeyi özlüyorum. Görünüşe göre şimdi "def" yazarak bir işlevi (veya bir sınıfı) tanımlıyorum, ama sonra senaryoyu yazmayı bitirdiğimde hiçbir şey olmuyor. Sonunda tablomda sonucu nasıl alabilirim?
13:15

1
Mükemmel çalıştı !!! Koordinatların katmanın koordinat sistemine göre yazıldığını ve puan almak istersem bu koordinatlarla bir shp oluşturmam gerektiğini düşünüyorum, değil mi? Eğer burada olsaydın sana en az 3 bira öneririm! Çabalarınız için çok teşekkür ederim !!!
1313

5

Ftools centroid aracı, içbükey ise centroidi çokgenin dışına yerleştirebilir.

ST_PointOnSurfacekesinlikle istediğini yapacak. Şekil dosyanızı PostGIS'e almak için SPIT kullanarak yüklediyseniz, QGIS içinden komutu kullanabilir ve ardından sorguyu çalıştırmak için PgQuery eklentisini kullanabilirsiniz.

Alternatif olarak, PostGIS kurulumu bir kerelik kullanım için biraz fazla ise, QGIS içinden Spatialite kullanabilirsiniz . Daha sonra verilerinizi SpatiaLite'a almak ve sorguyu çalıştırmak için QSpatiaLite eklentisini kullanabilirsiniz (SpatialLite onurları ST_PointOnSurface).


2

doğru anladığımda şunu kullanın: Vektör-> Araştırma Araçları_> Rastgele Noktalar. Şimdi "Tabakalı Örnekleme Tasarımı (Bireysel çokgenler)" altında girdi alanından değer seçin ve her bir çokgen için türetilmesi gereken noktaların sayısal değerini veren onaylama alanını kullanın.


"uygun alan" ile ne demek istiyorsun? Centroid'i kullanmayı ve daha sonra (örneğin) o noktanın en yakın çokgene olan minimum mesafesini hesaplayarak, dış çizginin dışına uzanırsa atıfta bulunduğu çokgenin en yakın kısmına bağlamayı düşünüyordum. Daha sonra amaç, poligonun benzersiz spesifik tanımlama kodu olarak kullanmak için bu nokta koordinatlarını çıkarmaktır.
1313

Temelde yapmaya çalıştığım şey her bir sentroidi göreceli çokgene atamak ve onu çokgenin içinde uzanacak şekilde hareket ettirmektir (ya da en azından sınırına dokunmak).
13:15

@ user9518: Üzgünüm, sorunuzu yanlış anladım. Her poli içinde belirli sayıda rastgele nokta istediğinizi düşündüm, örneğin 2 puan fpr poli 1, poli2 içinde 10 puan vb. Bu nedenle "uygun alan" terimi. tabii ki her poli için sadece bir puan oluşturmak üzere "bu sayıda nokta kullan" için 1'i seçebilirsiniz. bu nokta poliın içindedir veya en azından sınırına değmektedir. ancak bu nokta hala rastgele başına bulunur, bu yüzden prosedürü tekrar yaptığınızda diğer puanları alırsınız :-(
Kurt

1

realcentroids eklentisi, Eklentiler aracılığıyla yüklenebilir> Eklentileri Yönet ve Yükle QGIS 2.2'de içbükeyse her poligonun içine zorlanan centroid benzeri noktalar üretmek için çalıştı (nokta kenara çok yakın olacak). Kurt tarafından önerilen Rastgele noktalar aracını denedim ve çokgen başına 1 puan belirtmeme rağmen bunun yerine iki tane üretiyor. Ek bir dezavantaj, çoğu durumda, noktaların rastgele olduğu için sentroidi temsil etmemesidir.

http://www.agt.bme.hu/gis/qgis/realcentroid/

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.