Dapatkan titik pada polyline dari titik akhir yang diberikan jarak sepanjang poly line

10

Saya memiliki titik awal dan titik akhir polyline. Bagaimana saya bisa mendapatkan titik pada polyline itu dari titik akhir yang ditentukan oleh jarak yang diberikan.

masukkan deskripsi gambar di sini

Bagaimana saya bisa mendapatkan ini dengan menggunakan arcpy asalkan skrip ini harus bekerja pada ArcView tanpa mengimpor modul apa pun ( Seperti jawaban ini ). Saya mencoba untuk tidak memasukkan nilai kode.

Pertanyaan terkait:

pengguna
sumber
apakah Anda tidak mendapatkan hasil menggunakan object.interpolate (jarak [, dinormalkan = Salah])?
vinayan
1
Di mana Anda dapatkan object.interpolate(distance[, normalized=False]). Apakah ini metode arcpy? Jika ya, tolong kirimkan tautannya. Saya mencari di Google, tetapi tidak menemukannya.
pengguna
itu adalah metode shapely .. toblerity.github.com/shapely/ ... pikir Anda sudah mencobanya di pertanyaan
lain..tidak
2
Pertanyaan terkait lainnya adalah gis.stackexchange.com/questions/6476/… , yang berkaitan dengan kebalikan dari masalah ini (temukan jarak yang diberikan titiknya). Dua solusi terkait erat: sekali polyline dibuat terukur, semua titik di sepanjang itu dapat diatasi dalam hal jarak mereka (dan segmen yang sewenang-wenang di sepanjang itu dapat diatasi dengan rentang jarak).
Whuber

Jawaban:

7

Ini terdengar mirip dengan "Linear Referencing" dan toolset itu akan tersedia di ArcView. Selain itu, Anda dapat membuat skrip alat ini dengan sangat mudah.

Tautan ke Bantuan ESRI untuk Referensi Linear

Louis H
sumber
1
+1 Ini adalah pendekatan "benar" dalam arti menggunakan kemampuan matang yang dibuat secara tegas untuk masalah ini.
whuber
6

Berdasarkan kebutuhan Anda, seperti yang dimaksud @LouisH, menggunakan Linear Referencing jelas merupakan cara yang harus dilakukan. Saya mengumpulkan beberapa kode yang harus memenuhi kebutuhan Anda bukan elemen hard-coding, tetapi meminta mereka sebagai parameter.

Sebagai penjelasan, alat referensi Linear yang digunakan di bawah ini mengambil "Rute", dalam kasus Anda fitur garis, dan tempat "Acara", dalam kasus Anda titik, di sepanjang mereka berdasarkan bidang jarak. Ini menghasilkan FeatureLayer, yang disimpan dalam memori, yang merupakan alasan untuk fungsi terakhir yang menyalin fitur-fitur tersebut ke dalam suatu kelas fitur keluaran.

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)

Sunting - Satu hal yang perlu dipikirkan dengan alat ini, dan kemungkinan operasi apa pun untuk menemukan titik berdasarkan jarak dari ujung garis, adalah dari ujung mana Anda akan memulai. Alat referensi linear, misalnya, bekerja berdasarkan arah digital dari sebuah garis. Penting untuk memastikan bahwa Anda memiliki beberapa cara untuk mengidentifikasi titik akhir yang menjadi dasar pengukuran Anda.

Dapatkan Tata Ruang
sumber
5

Memecahkan masalah referensi linear seperti ini without importing any modulesberada di luar jangkauan saya ..

Saya telah menggunakan Shapely(paket python untuk manipulasi dan analisis geometri geospasial 2D. Dan ini berlisensi BSD :-))

unduh dari sini . Versi 2.6 yang merupakan satu-satunya yang mendukung arcgis 10 arcpy..Ini adalah instalasi sederhana (ukuran 1,5 MB)

dan sekarang di sini adalah skrip arcpy untuk mencapai tujuan .. maafkan python saya .. hanya hari ini saya belajar tentang loop, tuple dll :)

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)

Catatan : ini tidak akan berfungsi jika fitur memiliki segmen kurva

Vinayan
sumber
2

Saya menemukan pertanyaan ini mencoba melakukan apa yang saya pikir adalah hal yang sama. Saya ingin semuanya dilakukan melalui arcpy. Menggunakan Linear Referencing tidak masuk akal bagi saya karena saya belum memiliki poin acara (dan saya tidak tahu cara menggunakan LR untuk mendapatkannya). Inti dari apa yang akhirnya saya gunakan adalah

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

Ini membutuhkan Arc 10.1 atau lebih tinggi; Saya tidak dapat mengetahui apakah ini tersedia di bawah tingkat lisensi ArcInfo yang saya miliki (OP ArcView tertentu).

Dalam contoh saya di atas, saya ingin sebuah titik tidak pada jarak tetap, tetapi dengan persentase dari keseluruhan panjang garis. Untuk melakukan ini, saya memberikan argumen opsional kedua ke positionAlongLine. Anda melewatkan argumen kedua jika Anda hanya ingin menentukan jarak absolut. Ini dok .

Sampel kode yang lebih lengkap adalah

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'adalah featureLayer saya di mana saya ingin mencari titik. Berjalan cukup cepat. NumPyArrayToFeatureClassadalah cara yang sangat bagus untuk membuang semua poin saya kembali ke featureClass (terima kasih kepada rekan saya Curtis untuk bagian itu!). Telah bereksperimen dengan Append_managementtetapi itu agak lebih lambat.

Roland
sumber
+1 Terima kasih telah membagikannya. Ini terlihat seperti solusi satu kali yang baik ketika Anda tidak ingin menginvestasikan upaya menyiapkan polyline yang terukur. Perhatikan bahwa solusi ini menggunakan orientasi implisit dari polyline yang ditentukan oleh urutan penyimpanan koordinatnya. Jika tidak dilakukan dengan hati-hati, Anda mungkin berakhir dengan poin yang dihitung mulai dari ujung yang salah. Dengan demikian akan lebih baik untuk meningkatkan solusi ini untuk memungkinkan pengguna (entah bagaimana) menentukan - mungkin dengan cara memasukkan titik dekat salah satu ujung - yang merupakan awal dari polyline.
Whuber
1
Itu memang benar. Saya menggunakan saluran dari jaringan drainase yang semuanya (seharusnya) berorientasi ke hilir, jadi saya tidak harus berurusan dengan ini. Jika orientasi garis tidak disengaja, itu bisa diatur sebagai pra-proses untuk apa yang saya sarankan di atas. Jika orientasi disengaja, maka seseorang dapat membuat salinan, mengarahkan kembali, dan menggunakan resep saya. Poin-poin tersebut masih akan berbaris pada garis fitur asli dengan benar, bahkan jika orientasinya tidak kondusif untuk analisis saat ini.
Roland
1

Mungkin merupakan pembunuhan yang berlebihan, tetapi jika Anda memiliki akses ke ekstensi Analisis Jaringan Anda bisa membuat jaringan dari polyline Anda dan kemudian membuat area layanan di sekitar titik input Anda, menentukan ukuran SA sebagai jarak yang diinginkan. Berikut ini adalah contoh sepintas dengan 111 meter SA dari titik:

masukkan deskripsi gambar di sini

Maka Anda harus menemukan poin di mana SA melintasi garis.

Radek
sumber
-1

saya pikir Anda bisa mendapatkannya dengan metode Feature Vertices To Points (Manajemen Data). Anda bisa mendapatkan info lebih lanjut di sini .

atau Anda dapat memeriksa Split Line At Point (Manajemen Data) di sini .

mereka tidak cukup sepenuhnya tetapi Anda dapat menulis kode Anda sendiri ...

Saya harap ini membantu Anda ...

Aragon
sumber
2
Sepertinya masalah dengan opsi-opsi ini adalah bahwa mereka membutuhkan pengetahuan sebelumnya tentang lokasi titik untuk membagi garis, atau menambahkan simpul pada garis sebelum membelahnya. Lokasi titik itu adalah apa yang Tidak diketahui dalam pertanyaan di atas, sehingga sulit untuk menerapkan salah satu dari solusi ini.
Dapatkan Spasial