从现有曲线创建新曲线 - Shapely
Create a new curve from existing curve - Shapely
我写了一个 Python 脚本来解析 GPX 文件中的坐标。坐标存储为元组列表:(float lat, float long)
。我使用 Shapely 的 LineString
函数为每个 GPX 文件创建了一条曲线。
在解析了几个GPX文件后,我有一些相交的曲线,我想根据这些相交的曲线计算一些信息。为简单起见,假设我有 3 行(称它们为 line1, line2, line3
)。在此特定场景中,line1
与 line2
和 line3
相交,但 line2
和 line3
不相交。或者更直观:
|
|
--*--- Line 2 ------
|
|
|
Line 1
|
|
|
--*--- Line 3 ------
|
|
我想做的是从这些现有曲线创建一条新曲线。这条曲线的起点和终点将是交点(在视觉表示中用 *
表示),曲线的中间点将是落在这些交点之间的 line1
的点.
我可以使用 Shapely 的 intersection()
方法获取交点,但我不知道如何获取落在这些交点之间的 line1
的点。
我考虑过确定 line1
是否运行 east/west 或 north/south。根据该结果,我可以将交叉点的纬度或经度与直线中的每个点(在本例中为 line1
)进行比较,一旦我找到一个位于交叉点的纬度或经度内的点,然后我可以用以交点为界的那些坐标开始新的一行。
但是,这似乎是一项疯狂的工作。我觉得必须有一个更简单的解决方案。特别是因为我对 Shapely 有非常基本的了解。任何帮助将不胜感激。
以下算法用于在给定两个中间点(称为 startPoint 和 endPoint)的情况下将 lineString 分成 3 段
代码看起来像 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)
我写了一个 Python 脚本来解析 GPX 文件中的坐标。坐标存储为元组列表:(float lat, float long)
。我使用 Shapely 的 LineString
函数为每个 GPX 文件创建了一条曲线。
在解析了几个GPX文件后,我有一些相交的曲线,我想根据这些相交的曲线计算一些信息。为简单起见,假设我有 3 行(称它们为 line1, line2, line3
)。在此特定场景中,line1
与 line2
和 line3
相交,但 line2
和 line3
不相交。或者更直观:
|
|
--*--- Line 2 ------
|
|
|
Line 1
|
|
|
--*--- Line 3 ------
|
|
我想做的是从这些现有曲线创建一条新曲线。这条曲线的起点和终点将是交点(在视觉表示中用 *
表示),曲线的中间点将是落在这些交点之间的 line1
的点.
我可以使用 Shapely 的 intersection()
方法获取交点,但我不知道如何获取落在这些交点之间的 line1
的点。
我考虑过确定 line1
是否运行 east/west 或 north/south。根据该结果,我可以将交叉点的纬度或经度与直线中的每个点(在本例中为 line1
)进行比较,一旦我找到一个位于交叉点的纬度或经度内的点,然后我可以用以交点为界的那些坐标开始新的一行。
但是,这似乎是一项疯狂的工作。我觉得必须有一个更简单的解决方案。特别是因为我对 Shapely 有非常基本的了解。任何帮助将不胜感激。
以下算法用于在给定两个中间点(称为 startPoint 和 endPoint)的情况下将 lineString 分成 3 段 代码看起来像 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)