Lấy một điểm trên một đa tuyến từ các điểm cuối cho khoảng cách dọc theo đường poly


10

Tôi có điểm bắt đầu và điểm kết thúc của một đa tuyến. Làm thế nào tôi có thể nhận được một điểm trên đa tuyến đó từ các điểm cuối được chỉ định bởi khoảng cách đã cho.

nhập mô tả hình ảnh ở đây

Làm cách nào tôi có thể có được điều này bằng cách sử dụng arcpy với điều kiện tập lệnh này sẽ hoạt động trên ArcView mà không cần nhập bất kỳ mô-đun nào ( Giống như câu trả lời này ). Tôi đang cố gắng không để giá trị mã cứng.

Câu hỏi liên quan:


bạn không nhận được bất kỳ kết quả nào khi sử dụng object.interpolate (distance [, normalized = false])?
vinaya

1
Bạn đã nhận được ở đâu object.interpolate(distance[, normalized=False]). Nó có phải là một phương pháp của Arcpy? Nếu đó là, bạn có thể xin vui lòng gửi liên kết. Tôi đã googled nó, nhưng không tìm thấy nó.
người dùng

đó là phương pháp của shapely .. toblerity.github.com/shapely/ từ nghĩ rằng bạn đã thử nó trong câu hỏi
khác..không

2
Một câu hỏi liên quan khác là gis.stackexchange.com/questions/6476/ , liên quan đến nghịch đảo của vấn đề này (tìm khoảng cách cho điểm). Hai giải pháp có liên quan chặt chẽ với nhau: một khi đa tuyến được thực hiện có thể đo lường được, tất cả các điểm dọc theo nó có thể được giải quyết theo khoảng cách của chúng (và các phân đoạn tùy ý dọc theo nó có thể được xử lý theo các khoảng cách).
whuber

Câu trả lời:



6

Dựa trên nhu cầu của bạn, như @LouisH đã đề cập, sử dụng Tham chiếu tuyến tính chắc chắn là cách tốt nhất. Tôi đã tổng hợp một số mã sẽ đáp ứng nhu cầu của bạn về các yếu tố không mã hóa cứng, mà thay vào đó yêu cầu chúng làm tham số.

Theo giải thích, công cụ tham chiếu tuyến tính được sử dụng bên dưới có "Tuyến đường", trong trường hợp của bạn là các tính năng đường và đặt "Sự kiện", trong trường hợp của bạn là các điểm, dọc theo chúng dựa trên trường khoảng cách. Điều này dẫn đến FeatureLayer, được lưu trữ trong bộ nhớ, đó là lý do cho chức năng cuối cùng sao chép các tính năng vào một featureclass đầu ra.

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)

Chỉnh sửa - Một điều cần suy nghĩ với công cụ này và có thể là bất kỳ thao tác nào để xác định vị trí các điểm dựa trên khoảng cách từ cuối dòng, đó là điểm cuối của dòng bạn sẽ bắt đầu từ đâu. Ví dụ, công cụ tham chiếu tuyến tính hoạt động dựa trên hướng số hóa của một dòng. Điều quan trọng là phải đảm bảo rằng bạn có một số cách để xác định điểm cuối mà các phép đo của bạn dựa trên.


5

Giải quyết một vấn đề tham chiếu tuyến tính như thế này without importing any modulesnằm ngoài phạm vi của tôi ..

Tôi đã sử dụng Shapely(gói python để thao tác và phân tích hình học không gian địa lý 2D. Và đó là BSD được cấp phép :-))

tải về từ đây . Phiên bản 2.6 là phiên bản duy nhất hỗ trợ arcgis 10 arcpy .. Đây là một bản cài đặt đơn giản (kích thước 1,5 MB)

và bây giờ đây là kịch bản phức tạp để đạt được mục đích .. tha thứ cho con trăn của tôi..chỉ hôm nay tôi đã học về các vòng lặp, bộ dữ liệu, v.v.

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)

lưu ý : điều này sẽ không hoạt động nếu tính năng có các đoạn đường cong


2

Tôi thấy câu hỏi này cố gắng làm những gì tôi nghĩ là điều tương tự. Tôi muốn tất cả được thực hiện thông qua arcpy. Sử dụng Tham chiếu tuyến tính không có ý nghĩa với tôi vì tôi chưa có các sự kiện điểm (và tôi không thể tìm ra cách sử dụng LR để có được chúng). Mấu chốt của những gì tôi đã sử dụng là

    line = arcpy.Polyline(arrayPts)
    pt = line.positionAlongLine (0.99, 'True')

Điều này đòi hỏi Arc 10.1 trở lên; Tôi không thể biết liệu điều này có khả dụng dưới mức cấp phép ArcInfo mà tôi có hay không (OP được chỉ định ArcView).

Trong ví dụ của tôi ở trên, tôi muốn một điểm không ở một khoảng cách cố định, nhưng bằng một tỷ lệ phần trăm của chiều dài đường tổng thể. Để làm điều này, tôi đã cung cấp đối số tùy chọn thứ hai cho positionAlongLine. Bạn bỏ qua đối số thứ hai nếu bạn chỉ muốn chỉ định một khoảng cách tuyệt đối. Đây là tài liệu .

Mẫu mã đầy đủ hơn là

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'là tính năng của tôi Người chơi các dòng mà tôi muốn xác định vị trí các điểm. Chạy khá nhanh. NumPyArrayToFeatureClasslà một cách rất hay để chuyển tất cả các điểm của tôi trở lại thành một tính năng (cảm ơn đồng nghiệp của tôi, Curtis cho phần đó!). Đã được thử nghiệm w / Append_managementnhưng đó là một chút chậm hơn.


+1 Cảm ơn đã chia sẻ điều đó. Nó trông giống như một giải pháp một lần tốt khi bạn không muốn đầu tư công sức thiết lập một đa tuyến đo. Lưu ý rằng giải pháp này sử dụng hướng ngầm định của đa tuyến được xác định theo thứ tự lưu trữ tọa độ của nó. Nếu không cẩn thận với điều đó, bạn có thể kết thúc với các điểm được tính bắt đầu từ kết thúc sai. Do đó, sẽ rất tốt nếu tăng cường giải pháp này để cho phép người dùng (bằng cách nào đó) quy định - có lẽ bằng cách nhập một điểm gần một đầu - đó là điểm bắt đầu của đa tuyến.
whuber

1
Điều đó hoàn toàn đúng. Tôi đang sử dụng các đường dây từ một mạng lưới thoát nước, tất cả (được cho là) ​​được định hướng xuôi dòng, vì vậy tôi không phải đối phó với điều này. Nếu định hướng đường không cố ý, nó có thể được sắp xếp như một quá trình trước với những gì tôi đề xuất ở trên. Nếu định hướng là có chủ ý, thì người ta có thể tạo một bản sao, định hướng lại và sử dụng công thức của tôi. Các điểm vẫn sẽ xếp hàng trên dòng featureclass ban đầu đúng cách, ngay cả khi định hướng của nó không có lợi cho phân tích hiện tại.
Roland

1

Có thể là quá mức cần thiết, nhưng nếu bạn có quyền truy cập vào tiện ích mở rộng Phân tích mạng, bạn có thể tạo mạng từ các đường dẫn của mình và sau đó tạo các khu vực dịch vụ xung quanh các điểm đầu vào của mình, chỉ định kích thước SA là khoảng cách quan tâm. Dưới đây là một ví dụ đáng chú ý với 111 mét SA từ điểm:

nhập mô tả hình ảnh ở đây

Sau đó, bạn sẽ phải tìm các điểm mà SA vượt qua dòng.


-1

Tôi nghĩ rằng bạn có thể có được nó bằng phương pháp Feature Vertices To Points (Quản lý dữ liệu). bạn có thể biết thêm thông tin ở đây .

hoặc bạn có thể kiểm tra Split Line At Point (Quản lý dữ liệu) tại đây .

chúng không đủ hoàn toàn nhưng bạn có thể viết mã của riêng mình ...

Tôi hy vọng nó sẽ giúp bạn...


2
Có vẻ như vấn đề với các tùy chọn này là chúng đòi hỏi kiến ​​thức trước về vị trí điểm để phân chia dòng hoặc thêm một đỉnh tại dòng trước khi chia nó. Vị trí điểm đó là những gì không được biết trong câu hỏi trên, vì vậy thật khó để áp dụng một trong những giải pháp này.
Nhận không gian
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.