QGIS kullanarak hat boyunca belirtilen mesafede noktalar oluşturma?


20

QGIS çizgisi boyunca, ancak belirli bir mesafede puan oluşturma kullanmak istiyorum. SEXTANTE Toolbox'ta iki GRASS aracı buldum :

  • v.to.points
  • v.segment

Harita birimlerindeki noktalar arasındaki maksimum mesafeyi 100'e ayarlayarak v.to.points'i denedim ve anladım :

çizgi boyunca puan

detaylı inceleme

İkinci fotoğraf, yukarıdakinden yakından baktı. Sonuç istediğim şeydi, ama daha az puan almak istiyorum, ama maksimum mesafeyi 1000 veya 1000000 olarak ayarlasam bile sonuç aynıydı.

V.segment kullanmaya çalıştım , ancak segment kuralları içeren bir dosyam yoktu.

Underdark bana bazı tavsiyeler verdi ve bir aralık verilen Densify geometrilerini denedim . Önce bana girdiğim gibi bir çoklu çizgi şekli dosyası verdi ve sonra bu noktaları elde etmek için özü düğümleri kullandım . Ama sonuç, mesafe aralığını ne ayarlasam da , v.to.points kullandığımla aynıydı .

Çizgi boyunca ve belirtilen mesafede nasıl nokta oluşturabilirim?


4
Şuna bir göz atın, bize bildirin nathanw.net/2012/08/05/…
Willy

Bana bu yararlı tavsiyeyi verdiğiniz için teşekkürler! Senaryonuzu kullanmak istersem python kurmam gerekiyor mu? ya da QGIS 2.0'ın yeni sürümünde zaten bu fonksiyon var mı?
Heinz

5
Bunun için QGIS 2.0'da QChainage adı verilen bir eklenti var. Eklentiyi getirin ve yükleyin.
Willy

QGIS 2.2.0+ sürümünde "Sextante" araç kutusuna "İşleme" adı verildiğini ve bir aralıkta verilen Densify geometrilerinin "ProcessingToolbox / QGISGeoalgorithms / VectorGeometryTools menüsünün altında olduğunu unutmayın. o daha yakın olan seçilmiş aralığı.
Dave X

Bu benim için çalıştı: plugins.qgis.org/plugins/LocatePoints
Tactopoda

Yanıtlar:


20

Python konsolunda:

1) crea_mem_layer.py'de bir bellek katman sınıfı (tam sınıf (öznitelikler olmadan) oluşturun )

class Create_vlayer(object):
    '''creation of a virtual layer''' 
     def __init__(self,nom,type):
         self.type=type
         self.name = nom
         self.layer =  QgsVectorLayer(self.type, self.name , "memory")
         self.pr =self.layer.dataProvider() 
     def create_point(self,geometry):
         # add point to the layer
         self.seg = QgsFeature()
         self.seg.setGeometry(QgsGeometry.fromPoint(geometry))
         self.pr.addFeatures([self.seg])
         self.layer.updateExtents()
     @property
     def display_layer(self):
         #end of layer and display layer 
         QgsMapLayerRegistry.instance().addMapLayers([self.couche])

2) vektör cebir fonksiyonları ( algèbre_vect_PyQGIS.py'den )

import math 
def mag(point):
    # magnitude of a vector
    return math.sqrt(point.x()**2 + point.y()**2)
def diff(point2, point1):
    # substraction betwen two vector
    return QgsPoint(point2.x()-point1.x(), point2.y() - point1.y())
def length(point1,point2):
    # with PyQGIS: sqrDist
    return math.sqrt(point1.sqrDist(point2))

3) yön kosinüsleri

def dircos(point):
    cosa = point.x() / mag(point)
    cosb = point.y()/ mag(point)
    return cosa,cosb

4) çizgi veya çizgi parçalarını işlemek

def pairs(list):
    # list pairs iteration 
    for i in range(1, len(list)):
    yield list[i-1], list[i]

layer = qgis.utils.iface.activeLayer()
# interval between points
interval = 5 m
# create virtual layer
gen_pt  = Create_vlayer("mid5", "Point")

for elem in layer():
    line = elem.geometry()
    for seg_start, seg_end in pairs(line.asPolyline()):
       line_start = QgsPoint(seg_start)
       line_end = QgsPoint(seg_end)
       # mid point = vector coordinates [x2-x1,y2-y1]
       pointm =diff(line_end, line_start)
       # direction cosines of the segment
       cosa,cosb = dircos(pointm)
       # length of the segment
       lg = length(line_end, line_start)
       # generate and add points to the virtual layer 
       for i in range(interval,lg,interval):
           gen_pt.create_point(QgsPoint(line_start.x()  + (i * cosa), line_start.y() + (i*cosb)))

# display layer
gen_pt.display_layer

Sonuçlar

çoklu çizgi, Shapely veya PyQGIS2 ile eşit nokta, yön kosinüslü

Çoklu çizgidüzgünvector_algebra

Sonra sadece aralığı ayarlayın


Kavşağa baktığımızda, önceden var olan düğüm noktalarını hat üzerinde tutuyor gibi görünüyor, bu yüzden onları zaten hattaki köşelerden daha düşük bir çözünürlüğe inceltemiyor. OP'deki gibi karmaşık, kıvrımlı çizgilerle, bu prosedürlerin pek bir etkisi olmayabilir.
Dave X

betiği mükemmel şekilde uyarlayabilirsiniz.
gen

17

Şimdi tam olarak ne istediğinizi yapan QChainage adlı bir eklenti var. Bir aralık mesafesi belirtirsiniz ve eklenti, çizginiz boyunca belirtilen aralıkta noktalar oluşturur.


* Bunun hat düğümlerinizi yakalamayacağını unutmayın, bu yüzden onlara ihtiyacınız varsa geometri aracını da kullanmanız gerekir - düğümleri çıkarın ve zincirleme noktalarınıza ekleyin.
Jason

1
GIS SE'ye Hoşgeldiniz! Buraya Yorum olarak eklediğiniz bilgilerin, altındaki Düzenle düğmesini kullanarak gerçek Yanıtınıza daha iyi dahil edileceğini düşünüyorum. Bunu bir Kopyala / Yapıştır ile yapabilir ve yorumunuzu, yanındaki küçük çarpı işaretini tıklayarak silebilirsiniz.
PolyGeo

11

Belli bir mesafeyi kabul etmek için Sextante Densify geometrileri aracını değiştiren bir senaryo yazdım. Buna aralık verilen Densify geometrileri denir .

Yoğunlaştır'ı çalıştırdıktan sonra, Düğümleri çıkar aracını kullanarak noktaları ayıklayabilirsiniz .

Sen mal alabilirsiniz Github ve yükleyin talimatları benim Hangi bloga .

resim açıklamasını buraya girin


Görünüşe göre bu araç artık Sextante yüklemesi olmadan QGIS'de kullanılabilir (QGIS 2.18.7). Menülerde görmedim, ancak İşleme Araç Kutusu'nda arama yaparken bir QGIS geoalgoritması olarak buldum.
Nate Wanner

0

Python betikleriyle atlamak istemiyorsanız, "Profilden satır" eklentisini yükleyip kullanabilirsiniz ve raster değeri sütununu yok sayabilir / silebilirsiniz. Zincirleme, örnekleme aralığını ayarladığınız her şey olacaktır.


QGIS 2.2.0'da "Profil aracı", "qProf" ve "VoGIS-ProfilTool" ifadelerini görüyorum, ancak "Profilden satır" aracı görmüyorum.
Dave X

0

Bunun kararlı sürümde olup olmadığından emin değilim, ancak Geoalgorithims-> Vector altındaki 1.9 alpha üzerindeki sextante araç kutusunda "Satırları Noktalara Dönüştür" seçeneği. Bir tedavi çalışır, ancak çizgi boyunca mesafe için bir alan eklediyse harika olun.

İlginç olsa da benim vektör katmanından NAME alanını ekledi.

Nathan Woodrow'un Python Script'ini çalıştırmayı denedim ama python ile berbatım. Ve genel olarak kod ile görünüyor.


0

Bu sorunla mücadele etmek için uzun zaman harcadım, ancak sonunda QChainage kullanarak aradığım şeyi az çok aldım. Paylaşmak istediğim şey başkalarına yardımcı olabilecek bir şey. SAGA coğrafi işlem çözme aracını hatta kullanırken, QChainage yanlış sonuçlar verir. Farklı bir eritme aracının kullanılması, düzgün çalışmasına neden olur.

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.