Böyle bir durum var:
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ı?
Böyle bir durum var:
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:
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)
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ç
Çö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.