def GetClosestPointTo(self, point, bExtend): # polyline = self.getQgsPolyline() # vtx, at, before, after, distance = polyline.closestVertex(point) # vtxBefore = polyline.vertexAt(before) # vtxAfter = polyline.vertexAt(after) # distBefore = QgsGeometry.fromPolyline([vtxBefore, vtx]).distance(QgsGeometry.fromPoint(point)) # distAfter = QgsGeometry.fromPolyline([vtx, vtxAfter]).distance(QgsGeometry.fromPoint(point)) # if distBefore < distance: # closestPoint = MathHelper.getProjectionPoint(vtxBefore, vtx, point) # elif distAfter < distance: # closestPoint = MathHelper.getProjectionPoint(vtx, vtxAfter, point) # else: # closestPoint = vtx pointList = self.getQgsPointList() minDistance = 9.0E+9 index = 0 for linePoint in pointList: distance = MathHelper.calcDistance(linePoint, point) if minDistance > distance: minDistance = distance index = pointList.index(linePoint) pointAt = pointList[index] if index != 0 and index != len(pointList) - 1: pointBefore = pointList[index - 1] pointAfter = pointList[index + 1] projPointB = MathHelper.getProjectionPoint(pointBefore, pointAt, point) if projPointB != None: lenBeforeSegment = MathHelper.calcDistance(pointBefore, pointAt) lenBeforeProj = MathHelper.calcDistance(pointBefore, projPointB) if lenBeforeProj < lenBeforeSegment: return projPointB projPointA = MathHelper.getProjectionPoint(pointAt, pointAfter, point) if projPointA != None: lenAfterSegment = MathHelper.calcDistance(pointAt, pointAfter) lenAfterProj = MathHelper.calcDistance(pointAt, projPointA) if lenAfterProj < lenAfterSegment: return projPointA elif index == 0: pointAfter = pointList[index + 1] projPointA = MathHelper.getProjectionPoint(pointAt, pointAfter, point) if projPointA != None: lenAfterSegment = MathHelper.calcDistance(pointAt, pointAfter) lenAfterProj = MathHelper.calcDistance(pointAt, projPointA) if lenAfterProj < lenAfterSegment: return projPointA elif index == len(pointList) - 1: pointBefore = pointList[index - 1] projPointB = MathHelper.getProjectionPoint(pointBefore, pointAt, point) if projPointB != None: lenBeforeSegment = MathHelper.calcDistance(pointBefore, pointAt) lenBeforeProj = MathHelper.calcDistance(pointBefore, projPointB) if lenBeforeProj < lenBeforeSegment: return projPointB return pointAt
def getClosestPointTo(self, point, bExtend): if not bExtend: closestPoint = self[0].Position for polylineAreaPoint in self: if MathHelper.calcDistance(point, polylineAreaPoint.Position) < MathHelper.calcDistance(closestPoint, point): closestPoint = polylineAreaPoint.Position return closestPoint pointList = self.getQgsPointList() minDistance = 9.0E+9 index = 0 for linePoint in pointList: distance = MathHelper.calcDistance(linePoint, point) if minDistance > distance: minDistance = distance index = pointList.index(linePoint) pointAt = pointList[index] if index != 0 and index != len(pointList) - 1: pointBefore = pointList[index - 1] pointAfter = pointList[index + 1] projPointB = MathHelper.getProjectionPoint(pointBefore, pointAt, point) if projPointB != None: lenBeforeSegment = MathHelper.calcDistance(pointBefore, pointAt) lenBeforeProj = MathHelper.calcDistance(pointBefore, projPointB) if lenBeforeProj < lenBeforeSegment: return projPointB projPointA = MathHelper.getProjectionPoint(pointAt, pointAfter, point) if projPointA != None: lenAfterSegment = MathHelper.calcDistance(pointAt, pointAfter) lenAfterProj = MathHelper.calcDistance(pointAt, projPointA) if lenAfterProj < lenAfterSegment: return projPointA elif index == 0: pointAfter = pointList[index + 1] projPointA = MathHelper.getProjectionPoint(pointAt, pointAfter, point) if projPointA != None: lenAfterSegment = MathHelper.calcDistance(pointAt, pointAfter) lenAfterProj = MathHelper.calcDistance(pointAt, projPointA) if lenAfterProj < lenAfterSegment: return projPointA elif index == len(pointList) - 1: pointBefore = pointList[index - 1] projPointB = MathHelper.getProjectionPoint(pointBefore, pointAt, point) if projPointB != None: lenBeforeSegment = MathHelper.calcDistance(pointBefore, pointAt) lenBeforeProj = MathHelper.calcDistance(pointBefore, projPointB) if lenBeforeProj < lenBeforeSegment: return projPointB return pointAt