รับจุดบนเส้นแบ่งจากจุดสิ้นสุดที่กำหนดระยะทางตามเส้นโพลี


10

ฉันมีจุดเริ่มต้นและจุดสิ้นสุดของรูปหลายเหลี่ยม ฉันจะหาจุดบนเส้นหลายเส้นนั้นจากจุดสิ้นสุดที่ระบุโดยระยะทางที่กำหนดได้อย่างไร

ป้อนคำอธิบายรูปภาพที่นี่

ฉันจะรับสิ่งนี้ได้โดยใช้ arcpy โดยที่สคริปต์นี้ควรทำงานบน ArcView โดยไม่ต้องนำเข้าโมดูลใด ๆ ( เช่นคำตอบนี้ ) ฉันพยายามที่จะไม่ให้ค่ารหัสยาก

คำถามที่เกี่ยวข้อง:


คุณไม่ได้รับผลลัพธ์โดยใช้ object.interpolate (ระยะทาง [, ปกติ = เท็จ])?
vinayan

1
คุณได้รับobject.interpolate(distance[, normalized=False])ที่ไหน มันเป็นวิธีการของ arcpy หรือไม่? ถ้าเป็นเช่นนั้นคุณช่วยกรุณาโพสต์ลิงค์ ฉัน googled มัน แต่ไม่พบมัน
ผู้ใช้

มันเป็นวิธีการของหุ่นดี .. toblerity.github.com/shapely/…คิดว่าคุณลองในคำถามอื่น ๆ .. ไม่แน่ใจว่าคุณได้ผลลัพธ์หรือไม่ ..
vinayan

2
คำถามที่เกี่ยวข้องอีกข้อคือgis.stackexchange.com/questions/6476/…ซึ่งเกี่ยวข้องกับการผกผันของปัญหานี้ (ค้นหาระยะทางตามจุดที่กำหนด) โซลูชั่นทั้งสองนั้นมีความสัมพันธ์กันอย่างใกล้ชิด: เมื่อโพลีไลน์ทำการวัดได้คะแนนทั้งหมดสามารถแก้ไขได้ในแง่ของระยะทาง (และส่วนตามอำเภอใจตามระยะทาง)
whuber

คำตอบ:


7

เสียงนี้คล้ายกับ "การอ้างอิงเชิงเส้น" และชุดเครื่องมือนั้นจะพร้อมใช้งานใน ArcView นอกจากนี้คุณสามารถสคริปต์เครื่องมือนี้ได้อย่างง่ายดายมาก

ลิงก์ไปยังความช่วยเหลือของ ESRI สำหรับการอ้างอิงเชิงเส้น


1
+1 นี่คือวิธีการ "ถูกต้อง" ในแง่ของการใช้ความสามารถเต็มที่ที่สร้างขึ้นอย่างชัดเจนสำหรับปัญหานี้
whuber

6

ตามความต้องการของคุณตามที่ @LouisH อ้างถึงการใช้การอ้างอิงเชิงเส้นเป็นวิธีที่จะไปแน่นอน ฉัน cobbled รหัสบางอย่างที่ควรจะตอบสนองความต้องการของคุณไม่ได้เป็นองค์ประกอบที่เข้ารหัสยาก แต่ขอให้พวกเขาเป็นพารามิเตอร์

ตามคำอธิบายเครื่องมืออ้างอิงเชิงเส้นที่ใช้ด้านล่างจะใช้ "เส้นทาง" ในกรณีของคุณคุณสมบัติของเส้นและสถานที่ "เหตุการณ์" ในกรณีของคุณเป็นจุดตามพวกเขาตามสนามระยะทาง สิ่งนี้ส่งผลให้เป็น FeatureLayer ซึ่งถูกเก็บไว้ในหน่วยความจำซึ่งเป็นเหตุผลสำหรับฟังก์ชั่นสุดท้ายที่คัดลอกคุณสมบัติไปที่ classc output

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(ชุดหลามสำหรับการจัดการและการวิเคราะห์รูปทรงเรขาคณิต geospatial 2D และมันเป็นใบอนุญาต BSD :-))

ดาวน์โหลดได้จากที่นี่ เวอร์ชัน 2.6 ซึ่งเป็นเวอร์ชั่นเดียวที่รองรับ arcgis 10 arcpy .. เป็นการติดตั้งง่าย (ขนาด 1.5 MB)

และตอนนี้ที่นี่เป็นสคริปต์ arcpy เพื่อให้บรรลุวัตถุประสงค์ .. ยกโทษให้ฉันหลาม .. เฉพาะวันนี้ฉันเรียนรู้เกี่ยวกับลูป, ทูเปิลและอื่น ๆ :)

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 ที่ฉันมีหรือไม่ (ระบุ OPView 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'คือฟีเจอร์ของฉันเลเยอร์ของบรรทัดที่ฉันต้องการค้นหาคะแนน วิ่งเร็วมาก NumPyArrayToFeatureClassเป็นวิธีที่ดีมากในการทิ้งคะแนนทั้งหมดของฉันกลับไปเป็น featureClass (ขอบคุณ Curtis เพื่อนร่วมงานของฉันสำหรับส่วนนั้น!) เคยทดลอง w / Append_managementแต่มันช้าไปหน่อย


+1 ขอบคุณสำหรับการแบ่งปัน ดูเหมือนว่าเป็นโซลูชันแบบใช้ครั้งเดียวที่ดีเมื่อคุณไม่ต้องการลงทุนความพยายามในการตั้งค่าโพลีไลน์ที่วัดได้ โปรดทราบว่าโซลูชันนี้ใช้การวางแนวโดยนัยของโพลีไลน์ที่กำหนดโดยลำดับที่จัดเก็บพิกัดไว้ หากไม่ได้รับการเอาใจใส่คุณอาจปิดท้ายด้วยคะแนนที่คำนวณได้จากจุดจบที่ผิด ดังนั้นจะเป็นการดีที่จะปรับปรุงโซลูชันนี้เพื่อให้ผู้ใช้ (อย่างใด) กำหนด - บางทีโดยวิธีการป้อนจุดใกล้ปลายด้านหนึ่ง - ซึ่งเป็นจุดเริ่มต้นของ polyline
whuber

1
นั่นเป็นความจริงอย่างแน่นอน ฉันกำลังใช้สายจากเครือข่ายการระบายน้ำซึ่งมีทั้งหมด (ตามที่คาดการณ์ไว้) ที่มุ่งเน้นดาวน์สตรีมดังนั้นฉันจึงไม่ต้องจัดการกับสิ่งนี้ หากการวางแนวบรรทัดไม่ได้ตั้งใจอาจจัดเป็นกระบวนการล่วงหน้าตามที่ฉันแนะนำไว้ข้างต้น หากการปฐมนิเทศมีเจตนาเราก็สามารถทำสำเนาวางแนวใหม่และใช้สูตรของฉันได้ คะแนนจะยังคงสอดคล้องกับคุณลักษณะบรรทัดเดิมอย่างถูกต้องแม้ว่าการวางแนวจะไม่เอื้อต่อการวิเคราะห์ปัจจุบัน
Roland

1

อาจเป็น overkill แต่ถ้าคุณเข้าถึงส่วนขยายการวิเคราะห์เครือข่ายคุณสามารถสร้างเครือข่ายจาก polylines ของคุณแล้วสร้างพื้นที่บริการรอบจุดป้อนข้อมูลของคุณระบุขนาด SA เป็นระยะทางที่น่าสนใจ นี่คือตัวอย่างคร่าวๆกับ SA 111 เมตรจากจุด:

ป้อนคำอธิบายรูปภาพที่นี่

จากนั้นคุณจะต้องหาจุดที่ SA ข้ามเส้น


-1

ฉันคิดว่าคุณสามารถรับได้ด้วยวิธีการคุณลักษณะจุดยอดเยี่ยมเพื่อจุด (การจัดการข้อมูล) คุณจะได้รับข้อมูลเพิ่มเติมที่นี่

หรือคุณสามารถตรวจสอบเส้นแบ่งที่จุด (การจัดการข้อมูล) ที่นี่

มันไม่เพียงพอทั้งหมด แต่คุณสามารถเขียนรหัสของคุณเอง ...

ฉันหวังว่ามันจะช่วยคุณ ...


2
ดูเหมือนว่าปัญหาของตัวเลือกเหล่านี้คือพวกเขาต้องการความรู้ล่วงหน้าเกี่ยวกับตำแหน่งจุดเพื่อแยกเส้นหรือเพื่อเพิ่มจุดยอดที่เส้นก่อนที่จะแยกมัน ตำแหน่งของจุดนั้นคือสิ่งที่ไม่เป็นที่รู้จักในคำถามข้างต้นดังนั้นจึงเป็นการยากที่จะใช้วิธีแก้ไขปัญหาเหล่านี้
Spatial
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.