获取折线的所有点


11

我在python中有一些折线要素对象。现在,我想获得折线的所有要点。

例如,如果折线具有起点[0,0]end point [5,5]。结果:[1,1];[2,2];[3,3];[4,4];[5,5]

我想找到那条线上的所有整数点,包括终点。对于直线来说,这很简单,但是如果折线具有Beizer曲线,圆弧,椭圆弧几何类型,那我该怎么办?

编辑:

我只能使用在所有许可级别的ArcGIS中都可用的那些工具。例如,ArcGIS Basic。


2
通常,您通常不会获得很好的“整数”积分。它在您的示例中有效,但在现实生活中并不常见。通常,您只获得顶点的位置,因此在您的情况下,您将获得[0,0]和[5,5]。可以“假定”“中间”点。不确定如何在python中执行此操作,但是有几种工具可让您从一行创建顶点的点文件。
达伦·科普

Answers:


18

我知道这很旧,但我一直在寻找相同的东西,因为FeatureVerticesToPoints工具没有ArcInfo 。在使用了上面的搜索游标解决方案之后,我继续简化了代码,发现在数据访问模块中使用NumPy数组可以生成一个简单且非常快速的脚本。我将其用作脚本工具。

注:关键是explode_to_points在参数arcpy.da.FeatureClassToNumPyArray

这是指向ArcGIS Repository位置的链接:点的要素类

# Feature Class to Points
# 
# Paul Smith (2012) paul@neoncs.com.au

# Imports
import arcpy
import numpy

#Inputs from user parameters
InFc  = arcpy.GetParameterAsText(0) # input feature class
OutFc = arcpy.GetParameterAsText(1) # output feature class

# Spatial reference of input feature class
SR = arcpy.Describe(InFc).spatialReference

# Create NumPy array from input feature class
array = arcpy.da.FeatureClassToNumPyArray(InFc,["SHAPE@XY"], spatial_reference=SR, explode_to_points=True)

# Check array and Exit if no features found
if array.size == 0:
    arcpy.AddError(InFc + " has no features.")

# Create a new points feature class
else:
    arcpy.da.NumPyArrayToFeatureClass(array, OutFc, ['SHAPE@XY'], SR)

欢迎来到GIS.se Paul :) +1取得了圆满的成果,并且比一般的初创公司更好,而且可以启动代码。谢谢!一些编辑提示:选择文本,内联或块,然后ctrl-k应用代码格式(与b旧和i斜体相同)。按照惯例,我们倾向于避免诸如“ hi”,“ thanks”,“ cheers”之类的闲话。这些被暗示为始终存在,并有助于强化这个地方与通常的论坛和电子邮件不同的想法。欢迎上车。
马特·威尔基

您需要在代码数组的这一行上为where_clause放置一个占位符= arcpy.da.FeatureClassToNumPyArray(InFc,[“ SHAPE @ XY”],“”,spacespace_reference = SR,explode_to_points = True)
特里斯坦

4

据我了解,您需要增加折线要素的顶点数量。并将所有“ Beizer曲线,圆弧,椭圆弧”线段转换为多个线段。

对于ArcGIS中的此任务,您可以使用ArcToolbox中的“ 密化(编辑)”工具。

然后,您可以将折线的顶点转换为点要素,如建议的Darren Cope和Artwork21所示。

如果您更喜欢在ArcMap中执行此操作,请查看沿线帮助主题创建新点


3

以下应在折线和多边形上起作用:

import arcpy

infc = r"D:\Projects\GDBs\slowbutter.gdb\fc"

desc = arcpy.Describe(infc)
shapefieldname = desc.ShapeFieldName

rows = arcpy.SearchCursor(infc)
for row in rows:
    # Create the geometry object
    feat = row.getValue(shapefieldname)
    print "Feature %i: " % row.getValue(desc.OIDFieldName)
    partnum = 0
    # Step through each part of the feature
    for part in feat:
        print "Part %i: " % partnum
        part_list = []
        for pnt in feat.getPart(partnum):
            if pnt:
                # Add to list
                part_list.append([pnt.X, pnt.Y])
            else:
                # If pnt is None, this represents an interior ring
                print "Interior Ring:"
        partnum += 1  
        print part_list

对于一些英国道路数据,我知道了。组成折线的每个顶点的X,Y对的嵌套列表:

Feature 7: 
Part 0: 
[[-0.48053999999996222, 51.482510000000048], [-0.48032999999992398, 
51.482609000000082], [-0.48026999999996178, 51.48273800000004], 
[-0.48043999999993048, 51.482891000000052], [-0.48065999999994347, 51.482948000000079],
[-0.48123999999995704, 51.483009000000038]]

我已经在ESRI页面上看到了这一点。但是,如果仔细看一下它们的描述,此代码将仅返回端点,而不返回端点之间的端点
用户

2
@crucifiedsoul-是的,这是该ESRI样本的一种变体,但是它给出了所有点的X,Y对,而不仅仅是终点。那就是你想要的,对吗?
乍得·库珀

我不明白 唯一的改变就是您要替换print pnt.X, pnt.Ypart_list.append([pnt.X, pnt.Y])。您将在循环结束时进行打印。您的代码如何获得一条线的所有点,而ESRIs代码却没有?
用户

describe方法对我不起作用。我只需要指定形状字段-arcpy.da.SearchCursor(fc,[“ SHAPE @”])
jbalk

1

如Darren Cope所建议,可以使用“ 要素顶点到点” 工具将图层转换为点顶点。

这是snippt的python代码:

# import system modules 
import arcpy
from arcpy import env

# Set environment settings
env.workspace = "C:/data"

# Set local variables
inFeatures = "majorrds.shp"
outFeatureClass = "c:/output/output.gdb/majorrds_midpt"

# Execute FeatureVerticesToPoints
arcpy.FeatureVerticesToPoints_management(inFeatures, outFeatureClass, "MID")
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.