PyQGISで垂直線を描く?


33

私はこのような状況があります:

ここに画像の説明を入力してください

私がする必要があるのは、各ポイントを、そのポイントからせいぜい200 mの距離にあるすべてのラインに接続することです。つまり、各ポイントからバッファー内のすべてのラインに垂直な線を引く必要があります。

PyQGISでこれを行う方法はありますか?

回答:


40

これは解析ジオメトリの問題であり、解決策は1998年にポール・バークによって与えられました(ポイントとライン間の最小距離)。点から線または線分までの最短距離は、この点から線分までの垂線です。彼のアルゴリズムのいくつかのバージョンは、Pythonでのポイントからラインセグメントまでの距離の測定などのPythonを含むさまざまな言語で提案されています。しかし、他にも多くの点があります( ポイントレイヤーと Shapelyのラインレイヤーの間の最近傍など)

# 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ライン

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)])

結果は

結果

問題にソリューションを適応させるのは簡単です。すべての線セグメントをループして、セグメントのエンドポイントを抽出し、関数を適用するだけです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.