コード例 #1
0
    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
コード例 #2
0
    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