我有一条折线的起点和终点。如何从给定距离指定的端点上获得该折线上的点。
如果该脚本应在ArcView上运行而无需导入任何模块,则如何使用arcpy来获得此信息(如此答案)。我正在尝试不对值进行硬编码。
相关问题:
object.interpolate(distance[, normalized=False])
。这是arcpy的方法吗?如果是的话,请您发布链接。我用谷歌搜索,但没有找到。
我有一条折线的起点和终点。如何从给定距离指定的端点上获得该折线上的点。
如果该脚本应在ArcView上运行而无需导入任何模块,则如何使用arcpy来获得此信息(如此答案)。我正在尝试不对值进行硬编码。
相关问题:
object.interpolate(distance[, normalized=False])
。这是arcpy的方法吗?如果是的话,请您发布链接。我用谷歌搜索,但没有找到。
Answers:
根据您的需求(如@LouisH所指),绝对可以使用线性引用。我拼凑了一些代码,这些代码应满足您的需求,而不是对元素进行硬编码,而是将其作为参数进行请求。
作为说明,以下使用的线性参考工具采用“路线”(在您情况下为线要素),并根据距离字段将“事件”(在您的情况下为点)沿它们放置。这将导致FeatureLayer,该图层存储在内存中,这就是最后一个将要素复制到输出要素类的功能的原因。
import arcpy
import os
from arcpy import env
#Working directory
wkspace = arcpy.GetParameterAsText(0)
#Line feature class
rtecls = arcpy.GetParameterAsText(1)
#Line Unique ID
rtecls_ID = arcpy.GetParameterAsText(2)
#Table of points to be located
pnttbl = arcpy.GetParameterAsText(3)
#Field in point table that references line point will be located along
pttbl_rteid = arcpy.GetParameterAsText(4)
#Distance field in point table
pttbl_dst = arcpy.GetParameterAsText(5)
#Output Layer, layer is stored in memory. Features still need to be copied to feature class saved to disk
outlayer = arcpy.GetParameterAsText(6)
#Output Feature Class - If shapefile, make sure to include ".shp" at the end.
outclass = arcpy.GetParameterAsText(7)
#Type of feature being located
fttype = "POINT"
#Set Workspace
env.workspace = wkspace
#Build String for input parameters in Linear Referencing tool
pt_props = pttbl_rteid + " " + fttype + " " + pttbl_dst
#Output featureclass path
outfclass = wkspace + os.sep + outclass
# Execute MakeRouteEventLayer
arcpy.MakeRouteEventLayer_lr (rtecls, rtecls_ID, pnttbl, pt_props, outlayer)
#Save feature layer to feature class on disk
arcpy.CopyFeatures_management(outlayer, outfclass)
编辑-使用此工具要考虑的一件事,可能是根据从线末端到末端的距离来定位点的任何操作,都是从线的末端开始。例如,线性参考工具基于线的数字化方向工作。重要的是要确保您有某种方法来确定测量所基于的端点。
解决这样的线性参考问题without importing any modules
超出了我的范围。
我曾经使用过Shapely
(用于处理和分析2D地理空间几何的python软件包。它是BSD许可的:-))
从这里下载。2.6版本是唯一支持arcgis 10 arcpy的版本。安装简单(1.5 MB大小)
现在这里是实现目标的arcpy脚本..原谅我的python ..直到今天我才了解到循环,元组等:)
import arcpy
import math
from arcpy import env
env.workspace = r"C:\testshape"
desc = arcpy.Describe("Rivers.shp")
shapefieldname = desc.ShapeFieldName
rows = arcpy.SearchCursor("Rivers.shp")
temptup = ()
# get ESRI geometries out of their cage..
for row in rows:
feat = row.getValue(shapefieldname)
partnum = 0
for part in feat:
for pnt in feat.getPart(partnum):
if pnt:
temptup += ((pnt.X, pnt.Y),)
else:
print "Interior Ring:"
partnum += 1
# and now the shapely magic :)
import shapely
from shapely.geometry import LineString
lnstr = LineString(temptup)
rsltPoint = lnstr.interpolate(0.5)
print(rsltPoint.x,rsltPoint.y)
注意:如果特征具有曲线段,则此功能将不起作用
我发现这个问题试图做我认为相同的事情。我希望通过arcpy完成所有操作。对我来说,使用线性引用是没有意义的,因为我还没有点事件(而且我不知道如何使用LR来获取它们)。我最终使用的关键是
line = arcpy.Polyline(arrayPts)
pt = line.positionAlongLine (0.99, 'True')
这需要Arc 10.1或更高版本;我无法弄清楚是否在我拥有的ArcInfo许可级别(OP指定的ArcView)下可用。
在上面的示例中,我想要的点不是固定距离,而是整个线长的百分比。为此,我向提供了第二个可选参数positionAlongLine
。如果只想指定绝对距离,则跳过第二个参数。这是文档。
完整的代码示例是
import numpy
ptsList = list()
id = 0
with arcpy.da.SearchCursor('flFL', ["SHAPE@"]) as cursor:
for row in cursor:
arrayPts = row[0].getPart()
line = arcpy.Polyline(arrayPts)
pt = line.positionAlongLine (0.99, 'True')
ptsList.append((id, (pt.getPart().X, pt.getPart().Y)))
id += 1
array = numpy.array([ptsList], \
numpy.dtype([('idfield',numpy.int32),('XY', '<f8', 2)]))
SR = arcpy.Describe("flFL").spatialReference
arcpy.da.NumPyArrayToFeatureClass(array, 'nsegSamplePts', ['XY'], SR)
'flFL'
是我的featureLayer,我要在其上定位点的线 运行速度非常快。NumPyArrayToFeatureClass
这是将我所有的点转储回FeatureClass的一种非常不错的方法(这要归功于我的同事Curtis!)。一直在进行w /的实验,Append_management
但是速度稍慢一些。