Poli çizgi boyunca mesafe verilen uç noktalardan bir çoklu çizgi üzerinde bir nokta alın


10

Bir çoklu çizginin başlangıç ​​noktası ve bitiş noktası var. Belirli bir mesafe ile belirtilen uç noktalardan bu çoklu çizgi üzerinde nasıl bir nokta alabilirim?

resim açıklamasını buraya girin

Bu komut dosyasının herhangi bir modülü içe aktarmadan ArcView üzerinde çalışması şartıyla arcpy kullanarak bunu nasıl alabilirim ( Bu yanıt gibi ). Sabit kod değerleri için çalışmıyorum.

İlgili Soru:


object.interpolate (distance [, normalized = False]) kullanarak sonuç alamıyor musunuz?
vinayan

1
Bunu nereden object.interpolate(distance[, normalized=False]). Arkpy yöntemi mi? Eğer öyleyse, lütfen bağlantıyı gönderebilir misiniz? Google'ı aradım, ama bulamadım.
kullanıcı

bu düzgün bir yöntemdir .. toblerity.github.com/shapely/… diğer soruda denediğinizi düşünüyorum .. sonuç aldığınızdan emin değilsiniz ..
vinayan

2
Başka bir ilgili soru, bu sorunun tersi ile ilgili olan gis.stackexchange.com/questions/6476/… (noktaya verilen mesafeyi bulun). İki çözüm birbiriyle yakından ilişkilidir: çoklu çizgi ölçülebilir hale getirildikten sonra, onun üzerindeki tüm noktalar mesafeleri açısından ele alınabilir (ve bunun üzerindeki rastgele segmentler mesafe aralıklarıyla ele alınabilir).
whuber

Yanıtlar:



6

@LouisH'un belirttiği gibi, ihtiyaçlarınıza bağlı olarak, Doğrusal Referansı kullanmak kesinlikle gitmenin yoludur. Ben sabit kodlama elemanları değil, yerine parametre olarak talep ihtiyacını karşılamak gerekir bazı kod birlikte Arnavut kaldırımı.

Açıklama olarak, aşağıda kullanılan Doğrusal referans aracı "Rotalar" ı alır, sizin durumunuzda çizgi özellikleri ve "Olaylar" ı, sizin durumunuzda noktaları bir mesafe alanına göre yerleştirir. Bu, özellikleri bir çıktı özellik sınıfına kopyalayan son işlevin nedeni olan bellekte saklanan bir FeatureLayer ile sonuçlanır.

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)

Düzenle - Bu araçla düşünülmesi gereken bir şey ve bir satırın sonundan olan mesafeye göre noktaları bulmak için herhangi bir işlem, satırın hangi ucundan başlayacağınızdır. Örneğin, doğrusal referans aracı bir çizginin sayısallaştırılmış yönüne göre çalışır. Ölçümlerinizin hangi uç noktaya dayandığını belirlemenin bir yoluna sahip olmanız önemlidir.


5

Bunun gibi doğrusal bir referans problemi çözmek without importing any modulesbenim aralığımın ötesinde.

Kullandım Shapely(2D jeo-uzamsal geometrilerin manipülasyonu ve analizi için python paketi. Ve BSD lisanslı :-))

buradan indirebilirsiniz . Arcgis 10 arcpy'ı destekleyen tek sürüm olan 2.6 sürümü .. Basit bir kurulumdur (1.5 MB boyut)

ve şimdi burada amaç ulaşmak için arcpy komut dosyası .. benim piton affet .. sadece bugün döngüler, tuples vb öğrendim :)

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)

not : özelliğin eğri segmentleri varsa bu çalışmaz


2

Bu soruyu aynı şey olduğunu düşündüğüm şeyi yapmaya çalışırken buldum. Her şeyin arcpy ile yapılmasını istedim. Doğrusal Referans'ı kullanmak benim için anlamlı değildi çünkü nokta olayları zaten yok (ve bunları elde etmek için LR'yi nasıl kullanacağımı anlayamadım). Sonunda kullandığım şey,

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

Bunun için Ark 10.1 veya üstü gerekir; Bunun sahip olduğum ArcInfo lisanslama düzeyinin altında olup olmadığını anlayamadım (OP belirtilen ArcView).

Yukarıdaki örneğimde, sabit bir mesafede değil, toplam hat uzunluğunun yüzdesi ile bir nokta istedim. Bunu yapmak için ikinci isteğe bağlı argümanı sağladım positionAlongLine. Yalnızca mutlak bir mesafe belirtmek istiyorsanız, ikinci argümanı atlarsınız. İşte doktor .

Daha dolgun kod örneği

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'Noktaları bulmak istediğim satırların katmanı. Oldukça hızlı çalışır. NumPyArrayToFeatureClasstüm puanlarımı tekrar bir featureClass'a dökmenin çok güzel bir yoluydu (bu bölüm için meslektaşım Curtis'e teşekkürler!). W deniyordu Append_managementama bu biraz daha yavaştı.


+1 Bunu paylaştığınız için teşekkürler. Ölçülen bir çoklu çizgi oluşturma çabasına yatırım yapmak istemediğinizde iyi bir kerelik çözüm gibi görünüyor. Bu çözümün, koordinatlarının saklanma sırasına göre belirlenen çoklu çizginin örtülü yönünü kullandığını unutmayın. Buna dikkat edilmezse, yanlış uçtan başlayarak hesaplanan puanlarla kurtulabilirsiniz. Bu nedenle, kullanıcının (belki de bir uca yakın bir noktayı girerek), çoklu hattın başlangıcı olan bir şekilde (bir şekilde) şart koşmasını sağlamak için bu çözümü geliştirmek güzel olacaktır.
whuber

1
Bu kesinlikle doğru. Tüm (sözde) aşağı akış odaklı bir drenaj ağından çizgiler kullanıyorum, bu yüzden bu başa çıkmak zorunda değildi. Çizgi yönü kasıtlı değilse, yukarıda önerdiğim şeye bir ön işlem olarak düzenlenebilir. Yönlendirme kasıtlıysa, bir kopyasını yapabilir, yeniden yönlendirebilir ve tarifimi kullanabilir. Yönleri mevcut analize uygun olmasa bile, noktalar orijinal çizgi özellik sınıfı üzerinde düzgün bir şekilde hizalanacaktır.
Roland

1

Aşırılık olabilir, ancak Ağ Analizi uzantısına erişiminiz varsa, çoklu çizgilerinizden bir ağ oluşturabilir ve daha sonra , giriş uzaklığınızın çevresinde ilgi alanı olarak SA boyutunu belirterek hizmet alanları oluşturabilirsiniz . İşte 111 metrelik SA'lı bir cursory örneği:

resim açıklamasını buraya girin

O zaman SA'nın çizgiyi aştığı noktaları bulmanız gerekir.


-1

Bence Nokta Noktaları Özellik (Veri Yönetimi) yöntemi ile alabilirsiniz. Eğer fazla bilgi alabilirsiniz burada .

ya da Noktadan Bölünmüş Satır'ı (Veri Yönetimi) buradan kontrol edebilirsiniz .

Tamamen yeterli değiller ama kendi kodunuzu yazabilirsiniz ...

umarım sana yardımcı olur ...


2
Bu seçeneklerle ilgili sorun, çizgiyi bölmek veya bölmeden önce çizgiye bir köşe eklemek için nokta konumu hakkında önceden bilgi sahibi olmaları gerektiği gibi görünüyor. Bu nokta, yukarıdaki soruda bilinmeyen şeydir, bu nedenle bu çözümlerden birini uygulamak zordur.
Mekansal Olun
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.