从沿折线给定距离的端点获取折线上的点


10

我有一条折线的起点和终点。如何从给定距离指定的端点上获得该折线上的点。

在此处输入图片说明

如果该脚本应在ArcView上运行而无需导入任何模块,则如何使用arcpy来获得此信息(如此答案)。我正在尝试不对值进行硬编码。

相关问题:


您没有使用object.interpolate(distance [,normalized = False])得到任何结果吗?
vinayan

1
你从哪儿得到的object.interpolate(distance[, normalized=False])。这是arcpy的方法吗?如果是的话,请您发布链接。我用谷歌搜索,但没有找到。
用户

这是shapely的方法.. toblerity.github.com/shapely / ...认为您在另一个问题中尝试过.. 不确定是否获得结果..
vinayan 2012年

2
另一个相关的问题是gis.stackexchange.com/questions/6476/…,它与该问题的反方向有关(确定该点的距离)。这两个解决方案紧密相关:一旦折线成为可测量的,沿它的所有点就可以根据它们的距离来寻址(沿它的任意线段可以通过距离范围来寻址)。
ub

Answers:


7

这听起来类似于“线性引用”,并且该工具集将在ArcView中可用。此外,您可以非常轻松地编写此工具的脚本。

链接到ESRI帮助以进行线性参考


1
+1从使用明确为此问题创建的成熟功能的意义上来说,这是“正确”的方法。
ub

6

根据您的需求(如@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)

编辑-使用此工具要考虑的一件事,可能是根据从线末端到末端的距离来定位点的任何操作,都是从线的末端开始。例如,线性参考工具基于线的数字化方向工作。重要的是要确保您有某种方法来确定测量所基于的端点。


5

解决这样的线性参考问题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)

注意:如果特征具有曲线段,则此功能将不起作用


2

我发现这个问题试图做我认为相同的事情。我希望通过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但是速度稍慢一些。


+1感谢您的分享。当您不想花费精力建立可测量的折线时,这似乎是一个不错的一次性解决方案。请注意,此解决方案使用折线的隐式方向,该折线的方向由其坐标的存储顺序决定。如果不注意这一点,您可能会从错误的末端开始计算点。因此,最好是增强此解决方案,以使用户(以某种方式)能够规定(也许通过在一端附近输入一个点)来规定(即折线的起点)。
whuber

1
确实是这样 我使用的是来自排水网络的管线,这些管线全部(据说)都指向下游,因此我不必进行处理。如果线的方向不是故意的,则可以将其作为对我上面建议的一种预处理。如果定向是故意的,则可以进行复制,重新定向并使用我的食谱。即使其方向不利于当前分析,这些点仍将正确地排列在原始线要素类上。
罗兰

1

可能有些大材小用,但是如果您可以访问Network Analysis扩展,则可以从折线创建网络,然后在输入点周围创建服务区域,并指定SA大小作为感兴趣的距离。这是一个距离该点111米SA的粗略示例:

在此处输入图片说明

然后,您将必须找到SA越过线的点。


-1

我认为您可以使用要素顶点到点(数据管理)方法来获得它。您可以在此处获得更多信息。

或者您可以在此处签出“在点处分割线(数据管理)” 。

它们还不够,但是您可以编写自己的代码...

我希望它可以帮助您...


2
这些选项的问题似乎在于,它们需要先知道点的位置才能分割线,或在分割线之前在线上添加顶点。该点的位置在上面的问题中是未知的,因此很难应用这两种解决方案。
获取空间
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.