PyQGIS'te dik çizgiler çizmek?


33

Böyle bir durum var:

görüntü tanımını buraya girin

Yapmam gereken, her noktayı en fazla olan her çizgiye bağlamak, diyelim ki 200 m uzaklıkta. Başka bir deyişle, her noktadan tampondaki her satıra dik bir çizgi çizmem gerekiyor.

Bunu PyQGIS'te yapmanın bir yolu var mı?

Yanıtlar:


40

Analitik bir geometri problemidir ve çözüm 1998 yılında Paul Bourke tarafından verilmiştir ( En Küçük Mesafe ve Bir Çizgi ). Bir noktadan bir çizgiye veya çizgi parçasına en kısa mesafe bu noktadan çizgi parçasına diktir. Algoritmasının çeşitli versiyonları Python dahil bir noktadan bir çizgi segmentine olan bir mesafeden Ölçüm mesafesindeki gibi Python dahil olmak üzere çeşitli dillerde önerilmiştir . ama diğerleri var ( bir nokta katmanı ile Shapely ile bir çizgi katmanı arasındaki En yakın komşu gibi )

# basic example with PyQGIS
# the end points of the line
line_start = QgsPoint(50,50)
line_end = QgsPoint(100,150)
# the line
line = QgsGeometry.fromPolyline([line_start,line_end])
# the point
point = QgsPoint(30,120)

pt hattı

def intersect_point_to_line(point, line_start, line_end):
     ''' Calc minimum distance from a point and a line segment and intersection'''
      # sqrDist of the line (PyQGIS function = magnitude (length) of a line **2)
      magnitude2 = line_start.sqrDist(line_end) 
      # minimum distance
      u = ((point.x() - line_start.x()) * (line_end.x() - line_start.x()) + (point.y() - line_start.y()) * (line_end.y() - line_start.y()))/(magnitude2)
      # intersection point on the line
      ix = line_start.x() + u * (line_end.x() - line_start.x())
      iy = line_start.y() + u * (line_end.y() - line_start.y())
      return QgsPoint(ix,iy)

line = QgsGeometry.fromPolyline([point,intersect_point_to_line(point, line_start, line_end)])

ve sonuç

sonuç

Çözümü probleminize adapte etmek kolaydır, sadece tüm çizgi segmentlerinde döngü uygulayın, segmentlerin bitiş noktalarını ayıklayın ve işlevi uygulayın.

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.