Daha çox

Polyline və point shapefiles-dən qrafların kənar siyahısını yaradırsınız?


Çayların / axın seqmentlərinin bir polil şəkli şəkli və seqmentləri (kənarları) arasında kəsişmə nöqtələrinin (qovşaqlarının) bir nöqtə şəkli var. Hər axın seqmenti kəsişmə nöqtəsində başlayır və bitir. İstəyirəm hər bir axın seqmentinin identifikatoru üçün başlanğıc və bitmə qovşağı kimliklərini ehtiva edən bir kənar siyahı faylı (.csv və ya oxşar) yaradın, "Edge ID, ID-dən, ID-yə" bənzər bir formatda (aşağıdakı nümunə şəklinə baxın).

Tercihen buna ArcGIS 10-da bir həll yolu istərdim. İndiyə qədər təkrarlanan bir yanaşma ilə təcrübə etdim (hər kənar seqmentdən təkrarlamaq və + -5m radiusda qovşaq seçmək), ancaq bunun böyük axın üçün optimal olmayacağını düşündüm. şəbəkələr (100,000+ kəsişmə).

Əsas bir nümunə verilənlər bazasını (yuxarıdakı şəklə uyğun bir çox xəttli və bir nöqtə şəkli) yüklədim.


Robbi

Bu laptopda nümunə məlumatlarınızı yükləyə bilmirəm, amma mahiyyəti başa düşürəm. Bu problem, bir neçə sətir skriptində zərif bir həll yolu tapır. Hesab edirəm ki, nöqtələr kəsilib tam olaraq xətt bitiş nöqtələrində - yoxsa XY yerlərinin işləməsi üçün eyni olmalı olduğu üçün əvvəlcə Snap alətini nöqtələrdə çalıştırmanız lazım ola bilər.

Bu bağımsız bir skriptdir (Toolbox-da deyil), buna görə sadəcə sərt kodlanmış yolları ("linefc" və "pointfc" üçün) və sahə adlarını ("FromPointID", "ToPointID", "ID") dəyişdirin və vurun. Python IDE və ya komut istemi.

__author__ = "John K. Tran" __contact__ = "[email protected]" __credits__ = "http://gis.stackexchange.com/questions/158490/extracting-the-closest-point-to-a-line- ərzində-a-polygon-using-arcgis-for desktop "import arcpy linefc = r" C:  Users  Me  Desktop  Sample.gdb  SampleLines "# Bunu polyline xüsusiyyət sinifinizə aparan yolla dəyişdirin. pointfc = r "C:  Users  Me  Desktop  Sample.gdb  SamplePoints" # Bunu nöqtə xüsusiyyət sinifinə aparan yolla dəyişdirin. arcpy.Exists (linefc) və arcpy.Exists (pointfc) təsdiqləyin, "Xətt FC və Nöqtə FC-yə gedən yolların düzgün olduğundan əmin olun." arcpy.da.UpdateCursor ilə (linefc, ["SHAPE @", "FromPointID", "ToPointID"]) linecursor kimi: # "FromPointID" və "ToPointID" -ləri polyline FC-də müvafiq sahə adlarına dəyişdirin. linecursordakı linerow üçün: linegeom = linerow [0] firstpoint = linegeom.firstPoint lastpoint = linegeom.lastPoint firstpointXY = (firstpoint.X, firstpoint.Y) lastpointXY = (lastpoint.X, lastpoint.Y) with arcpy.da.SearchCursor ( pointfc, ["SHAPE @ XY", "ID"]) pointcursor kimi: # Pointcursordakı pointrow üçün "ObjectID" və s. kimi "ID" nizi FC nöqtənizdəki müvafiq sahənin adına dəyişdirin: pointXY = pointrow [0] pointID = pointrow [1] əgər pointXY == firstpointXY: linerow [1] = pointID əgər pointXY == lastpointXY: linerow [2] = pointID del pointcursor linecursor.updateRow (linerow) del linecursor print "Bitti!"

Budur, əldə etdiyim nəticələrin ekran görüntüsü Şəxsiyyət vəsiqəsi(qara) və işarələnmiş nöqtələr üçün s KimdənÜçün (mavi) etiketli sətirlərdə atributlar.

NumPy-də kifayət qədər səlis danışdığınıza görə ArcPy ilə problem yaşamamalısınız. Hər hansı bir probleminiz varsa, mənə bildirin!

* XY yerlərində qeyd. Bəzən CİS-də dəqiqlik səhvləri olur ki, son yüzüncü, milyonuncu və s. Bunu etmədim, ancaq XY-nin olub olmadığını müqayisə etməsi üçün == bərabərliklərində bir tolerantlıq qura bilərsiniz təxminən bərabər deyil tam olaraq bərabərdir. Və ya əminəm ki, orada kimsə ArcGIS-də ətraf mühit dəyişkənliyini, geosessildə həll / tolerantlığı idarə etmək üçün bilir.


--- Robbinin şərhlərinə cavab ---

Salam Robbi,

Buna görə ssenarinin işləməməsini təmin edən bəzi məsələlərin həssaslıqla əlaqəli olduğunu düşünürəm. Formalı sənədlər çoxdan köhnəlmiş məlumat formatlarıdır. Aşağıda mən bir etdim Yerə görə seçin Xətləri "kəsişən" nöqtələr üçün və bütün nöqtələrin xətləri ilə üst-üstə düşmədiyini görə bilərsiniz (ortada test məqsədi ilə həkim olduğunuzu düşündüyüm nöqtə daxil deyil).

Seçilməmiş nöqtələrdən birini yaxşılaşdırsam, 1: 1 miqyasında görə bilərsiniz, nöqtə xəttin kənarındadır. Bu, shapefiles-in XY koordinat məlumatlarını saxlaya biləcəyi məhdud üzən nöqtə dəqiqliyi ilə əlaqəlidir.

(açılmamış)

Bunu həll etməyin yollarından biri də Redaktə etmə Qutusundakı "Snap" alətindən istifadə etməkdir.

(qopdu)

Bu həll ediləcək ən çox məsələlərimizlə birlikdə. Bununla birlikdə, bəzi fromID və toID dəyərləri üçün hələ də * 0 * s boşluqlarını görə bilərsiniz. Bu, shapefile saxlama formatında dəqiqliyin olmaması ilə əlaqədardır (qarşılıqlı əlaqə problemi olmadığı təqdirdə (daha yaxşı dəqiqliyə, daha çox şema seçiminə, saxlama məhdudiyyətinə və s.), Həqiqətən, geodatabase verilənlər bazasına köçməyi təklif edirəm. günlər).

Qalan dəyərləri doldurmaq üçün redaktə etməliyik==bərabərlik və XY koordinatlarının olduqda hesablanması üçün bir riyaziyyat et təxminən əvəzinə bərabərdir tamamilə ekvivalent.

Düz eynilik axtaran əvvəlki kodu dəyişdirdim:

əgər pointXY == firstpointXY: linerow [1] = pointID əgər pointXY == lastpointXY: linerow [2] = pointID

Aralıqdakı dəyərləri axtaran ilə. Koordinat sisteminiz WGS84 (ondalık dərəcə) olduğunuz üçün ekvivalent olaraq 0.0001 DD tolerantlıq seçdim (ekvatorda təxminən 1.1132 m). Sayğaclara əsaslanan koordinat sistemində məs. NAD83, tolerantlığınız üçün 1 m kimi bir şey istifadə edərdiniz.

əgər (firstpointXY [0] -0.00001 

Bu düzəliş edildikdən sonra ... sonra, Attribute Cədvəli hamısı doldurulur.

Sualınızın sonuna çatmaq, cədvəli .csv olaraq ixrac etmək üçün yuxarı soldakı Cədvəl Seçimlərinə keçin >>> İxrac >>> "Növü kimi Saxla: Mətn faylı"və" My_Results.csv "kimi bir ad verin.

* Səmərəlilik haqqında son qeyd: Buna görə də ssenaridə iki iç içə kursor təkrarlanması (hər sətir üçün, hər nöqtədən keçid - 1000 sətir və 100.000 nöqtə üçün 100 milyon keçid) olduğu üçün bir həll atributa sahib olmaq üçün Mekansal Birləşdirmədən istifadə etmək olar hər nöqtənin hansı LineID ilə kəsişdiyini təsvir edir.

Sonra bu LineID-i nöqtə imlecindəki əsas maddə kimi keçir.

arcpy.da.UpdateCursor ilə (linefc, ["SHAPE @", "LineID", "FromPointID", "ToPointID"]) linecursor kimi: linecursor içindəki linerow üçün: arcpy.SetProgressorLabel ("İşlənmə Xətti {0}". format ( count)) linegeom = linerow [0] lineID = linerow [1]… whereclause = "" {0}  "= '{1}'". arcpy.da ilə format ("LineID", str (lineID)). PointCursor kimi SearchCursor (pointfc, ["SHAPE @ XY", "PointID"], ümumi maddə):

Əsasən "yalnız LineID cari çox xəttin LineID ilə uyğunlaşdığı nöqtələri nəzərdən keçirin" dedik. Bu, hər müqayisəni əvvəlcə 100.000 baldan hər dəfə təkrar olaraq 2-yə qədər məhdudlaşdırır. Çox sürətli ...


Videoya baxın: Drawing Geometry in ArcMap (Oktyabr 2021).