从现有曲线创建一条新曲线 - Shapely

时间:2015-04-21 07:36:57

标签: python intersection curve shapely

我编写了一个Python脚本,用于解析GPX文件中的坐标。坐标存储为元组列表:(float lat, float long)。我使用Shapely的LineString函数创建了一条曲线,我可以为每个GPX文件使用。

在解析了几个GPX文件之后,我有了一些交叉曲线,我想根据这些交叉曲线计算一些信息。为了简单起见,想象一下我有3行(称之为line1, line2, line3)。在此特定情况下,line1line2line3相交,但line2line3不相交。或者更直观:

  |
  |
--*--- Line 2 ------
  |
  |
  |
Line 1
  |
  |
  |
--*--- Line 3 ------
  |
  |

我要做的是从这些现有曲线创建一条新曲线。该曲线的起点和终点将是交叉点(在视觉表示中由*表示),并且曲线的中点将是落在这些交叉点之间的line1

使用Shapely intersection()方法获取相交点没有问题,但我不知道如何抓住落在这些相交点之间的line1点。

我考虑过确定line1是向东/向西还是在北/南。基于该结果,我可以将相交点的纬度或经度与线中的每个点(在这种情况下为line1)进行比较,并且一旦我发现了一个在交叉点的纬度或经度内的点,那么我可以用那些由交叉点限定的坐标开始一条新线。

然而,这似乎是一项疯狂的工作。我觉得必须有一个更简单的解决方案。特别是因为我对Shapely有非常基本的了解。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

以下算法用于在给定两个中间点(称为startPoint和endPoint)的3个段中拆分lineString 代码看起来像python,但必须更多地作为伪代码处理,因为我无法测试。

linestring是要拆分的行

## first  find in which pair the startPoint and endPoint exist
for i,e in enumerate(linestring,1):
    if linestring[i-1,i].contains(startPoint):
        startIdx = i-1
    if linestring[i-1,i].contains(endPoint):
        endIdx = i

# build three list
# startLine from the beginning of line until start point 
# middleLine from startPoint until endPoint
# endLine from endPoint until the last point
# transform every list to a LineString 

# start the list with coords from Line starting with beginning until startPoint
startLine = linestring.coords[:startIdx]
# append startPoint coords
startLine.append( startPoint.coords)
# transform from list to LineString
startLine = LineSting(startLine)

middleLine =  list(startPoint.coords).extend(linestring.coords[startIdx+1:endIdx-1]).extend(endPoint.coord)
# transform from list to LineString
middleLine = LineSting(middleLine)

# start list with end point coords
endLine = endPoint.coords 
# extend the list with coords from Line starting with endPoint until end
endLine.extend( linestring.coords[endIdx:])  
# transform from list to LineString
endLine = LineSting(endLine)