使用ArcPy查找线的中点?


12

如何使用地理处理框架(例如在Python脚本中)计算折线的中点

polyline.centroid属性返回真正的重心,如果是内或功能; 否则,返回标签点。形心很少位于非直线上,这对我而言毫无用处。

要素顶点折点”工具具有中点选项,但这需要ArcInfo,而我目前没有。

一种选择是向多段线添加度量,并沿该线创建50%的路线事件。

另一个解决方法是在ArcMap中使用“计算几何”选项,但理想情况下,我需要在脚本中自动执行此过程。

有更好/更快的建议吗?

目前,我仅限于ArcGIS 10.0(无法访问ArcInfo级别的许可证)。


4
看到这个问题。最后,我在Shapely中使用了线性参考函数来确定中点。
Mike T

1
我认为@MikeToews有一个正确的想法,只是在ArcGIS中使用线性参照功能,而不是将其引入Shapely。看起来这是您想要的功能:生成 路由事件层-线性引用。您可能可以即时制作事件表。这适用于10.1,但应与10.0相同。
2012年

1
该博客似乎包含可以转换为Python / ArcPy的算法:rbrundritt.wordpress.com/2008/10/14/…–
PolyGeo

有人用JavaScript完成吗?我仅在Arcpy中成功地做到了。真诚的Ezequias
Ezequias

如果您有新问题,请单击“ 提问”按钮提问。如果它有助于提供上下文,请包括此问题的链接。- 来自评论
BERA

Answers:


23

折线类有一个在ArcGIS 10.1名为“positionAlongLine”新方法。这将返回一个PointGeometry对象,该对象在距直线起点的指定距离处恰好是一个点,或者是起点和终点之间距离的一小部分。要找到中点,您只需要做positionAlongLine(0.5,True)。要找到线的中点并将其坐标添加到属性表中,可以对以下语句执行字段计算器:

  • !Shape!.positionAlongLine(0.5,True).firstPoint.X
  • !Shape!.positionAlongLine(0.5,True).firstPoint.Y

请注意,您需要在字段计算器中使用Python解析器才能正常工作。

如果要在Python中访问此点对象,则只需执行以下操作:

Input_shp = "C:\Temp\Line.shp"
Cursor = arcpy.SearchCursor(Input_shp)
for Feature in Cursor:
    Midpoint = Feature.shape.positionAlongLine(0.50,True).firstPoint
    print Midpoint.X
    print Midpoint.Y

谢谢,这看起来很棒。我应该提到的是,我目前仅限于10.0,因此,上面的“路线”选项可能现在已经足够了
Stephen Lead

错误:该行包含错误的值。使用arcGIS10,并在Model Builder中检查了Python,我使用了相同的语句:!Shape!.positionAlongLine(0.5,True).firstPoint.X
juasmilla 2014年

1

使用ET Geo Wizards许可证,您可以尝试使用带有“中间点”和“删除重复的点”(可选)选项的“折线到点”功能:http : //www.ian-ko.com/ET_GeoWizards/UserGuide/convertPl2Pnt。 htm

您可以像这样实现ET Geo向导:

toolbox_ETgeowizards = arcpy.GetParameterAsText(0) # Location ET Toolbox (Type: Toolbox)
arcpy.ImportToolbox(toolbox_ETgeowizards)

...

arcpy.ET_GPPolylineToPoints(pInFeatureClass, sOutFileName, sExportOption, bRemoveDuplicates)

有关ET函数的输入变量,请参见:http : //www.ian-ko.com/ET_GeoWizards/UserGuide/Scripting/scripting_PolylineToPoint.htm

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.