Mengidentifikasi kurva / busur sejati di ArcMap?

13

Satu-satunya cara yang baik untuk membuat lingkaran di ArcMap adalah menggunakan true arc, (kurva gabungan) tetapi saya perlu mengubahnya menjadi vertex (densifikasi) karena masalah kompatibilitas. Saya perlu info untuk geodatabase dan SDO_geometry (arcsde)

dan ya ada jalan. Saya menggunakan:

UPDATE layer1 a SET arctype = 'compound' WHERE has_compound_curves(a.shape) <> 0;

dan kemudian menggunakan ET Geotools untuk memadatkan lapisan demi lapisan.

Tetapi harus ada cara yang lebih mudah untuk melakukan ini secara langsung di Oracle atau ArcMap, dan saya hanya ingin memadatkan fitur yang memiliki arc sejati. Saya tidak ingin ada simpul yang tidak perlu pada garis lurus dan sebagainya.

Bagaimana saya bisa mengidentifikasi busur sejati di ArcMap, dan bagaimana saya bisa memadatkannya secepat dan semudah mungkin?

Sama untuk Oracle SQL.

jonaktiv
sumber
Berikut ini adalah utas dari 2006 yang menggunakan VBA untuk menemukan busur sejati, tetapi karena ArcGIS tidak lagi mendukung VBA, apakah ada cara Python atau UI untuk melakukan ini?
RyanKDalton
Saya berharap bahwa "Ide ArcGIS" ini tidak berarti bahwa tidak mungkin untuk menemukan kurva yang benar dalam 10.0.
RyanKDalton

Jawaban:

8

Saya ditanyai pertanyaan ini hari ini ("Bagaimana saya mengidentifikasi jika suatu featureeclass memiliki kurva) dan diberi beberapa saran kode arcpy . Ubah kode berikut sesuai keinginan Anda (variabel flag bukan pesan misalnya)

geometries = arcpy.CopyFeatures_management("inputFeatures", arcpy.Geometry())
import json
for g in geometries:
    j = json.loads(g.JSON)
    if 'curve' in j: print "You have true curves!"
    else: print "No curves here"

No curves here
No curves here
You have true curves!
You have true curves!
No curves here
You have true curves!
No curves here
No curves here
You have true curves!
You have true curves!
You have true curves!
You have true curves!
You have true curves!
KHibma
sumber
4

Dengan menggunakan Densify , segmen Curve disederhanakan melalui densifikasi baik dengan sudut Defleksi Maksimum, atau parameter Deviasi Offset Maksimum.

Jadi segmen garis lurus akan tetap utuh.

geogeek
sumber
1
Meskipun ini tidak akan membantu mengidentifikasi kurva sebenarnya, saya setuju bahwa menggunakan Densify dengan parameter Angle adalah cara cepat dan efektif untuk memadatkannya dengan sangat cepat. Menggunakan parameter Angle juga umumnya akan memadatkan kurva sebenarnya, sedangkan opsi Jarak akan memadatkan semua batas, yang mengarah ke (setidaknya dalam pengujian saya, menggunakan parameter default) hingga 10x peningkatan ukuran file.
RyanKDalton
ok, jadi ada solusi yang berbeda, tetapi masalah saya adalah bahwa saya tidak dapat menggunakan kotak alat pada lapisan sde saya, kami mengunci lapisan untuk checkout / checkin, Yang ingin saya lakukan adalah menjalankan alat / skrip yang menemukan kurva ini dan setelah itu Densify, tetapi jika itu yang Anda katakan yang memadatkan hanya menyentuh busur sejati, saya dapat memeriksa semua fitur, tetapi apakah ada alat edit yang lebih intensif daripada geotools ET
jonaktiv
jawaban ini gis.stackexchange.com/a/37082/2969 mencoba mengekstrak garis lurus, tetapi Anda dapat mengekstrak kurva dengan mengurangi garis lurus dari seluruh lapisan, sehingga Anda dapat menemukan kurva, tanpa menyentuh seluruh data. tetapi saya tidak tahu bagaimana geotools ET bekerja.
geogeek
jonaktiv, alat Densify yang tautannya @geogeek adalah alat inti ArcGIS yang tersedia dengan lisensi ArcEditor atau ArcInfo, bukan bagian dari ET GeoWizards.
RyanKDalton
2

Saya pikir begitu Anda memilihnya, Anda bisa memadatkannya. Kode (yang belum diuji) di bawah ini dapat diadaptasi untuk melakukan ini. (Asumsikan kurva Bezier memenuhi syarat sebagai busur).

public void SelectTrueArcFeatures()
{
    var editor = ArcMap.Application.FindExtensionByName("ESRI Object Editor") as IEditor;
    if (editor.EditState != esriEditState.esriStateEditing)
        throw new Exception("start editing first");
    var fLayer = ((IEditLayers)editor).CurrentLayer;
    if (fLayer.FeatureClass.ShapeType == esriGeometryType.esriGeometryPoint)
        throw new Exception("current edit layer must have polylines or polygons");

    var fSel = fLayer as IFeatureSelection;
    fSel.Clear();
    var fCur = fLayer.FeatureClass.Search(null,false);
    IFeature feat;
    while ((feat = fCur.NextFeature()) != null)
    {
        if(HasAnArc(feat.Shape))    
            fSel.SelectionSet.Add(feat.OID);
    }
    fSel.SelectionChanged();
    System.Runtime.InteropServices.Marshal.FinalReleaseComObject(fCur);
    ArcMap.Document.ActiveView.Refresh();
}

private bool HasAnArc(IGeometry geom)
{
    var segcoll = geom as ISegmentCollection;
    if (segcoll == null)
        return false;
    for (int i = 0; i < segcoll.SegmentCount; i++)
    {
        if (segcoll.get_Segment(i) is ICircularArc 
          || segcoll.get_Segment(i) is IBezierCurve)
          return true;
    }
    return false;
}
Kirk Kuykendall
sumber
apakah skrip pengeditan ini? bagaimana saya akan meletakkan kode ini ke arcmap? dan bagaimana kodenya bekerja, apakah itu menemukan beizercurves atau hanya memperkuat yang telah saya temukan (dipilih)
jonaktiv
Itu adalah c #. Jika Anda belum terbiasa dengan c # (atau kustomisasi .net), Anda mungkin meminta seseorang untuk menulis yang setara dengan python. Untuk menggunakan kode ini, Anda harus mengompilasinya dengan Visual Studio. Itu memilih semua polylines (atau poligon) di layer target edit saat ini yang memiliki segmen non-linear.
Kirk Kuykendall
@jonaktiv Jika Anda menggunakan 9.3.1 Anda bisa melakukan ini dengan VBA dalam skrip kalkulator. Hitung atribut flag, lalu pilih fitur yang memiliki flag. Jika Anda menggunakan 8.3, Anda sebenarnya dapat memperbarui geometri menggunakan kalkulator bidang secara langsung dan tidak memerlukan atribut flag.
Kirk Kuykendall
Hebat! Saya sangat bersyukur, saya khawatir itu tidak mungkin
jonaktiv
2

Berdasarkan jawaban @ KHibma, kursor akses data memiliki token SHAPE@JSONyang dapat digunakan untuk memeriksa kurva tanpa mengimpor jsonmodul.

with arcpy.da.SearchCursor ("InputFeatures", ["OID@", "SHAPE@JSON"]) as curs:
    for oid, json in curs:
        if "curve" in json:
            print "{} is curved".format (oid)
Emil Brundage
sumber
1

Saya menciptakan solusi saya sendiri untuk ini juga, berdasarkan saran dari @geogeek. Saya membuat model yang membandingkan vertex lapisan sumber dengan vertex dari salinan (menggunakan opsi ANGLE) dari lapisan sumber. Outputnya adalah lapisan vertex yang "tidak cocok" dengan sumbernya. Langkah terakhir memilih semua fitur sumber yang memotong titik-titik yang tidak cocok, dengan demikian mengidentifikasi fitur yang mengandung kurva sebenarnya.

Karena model ini tidak membagi fitur pada titik awal dan akhir busur, seluruh fitur akan diekspor. Oleh karena itu, jika Anda memiliki geometri tunggal yang terhubung sebagai "garis-kurva-garis-kurva-reversecurve-garis", seluruh fitur akan menjadi output, bukan hanya bagian kurva. Gunakan titik untuk menentukan di mana kurva yang sebenarnya ada.

Anda dapat mengunduh model yang disebut " Identifikasi True Curves " dari galeri ArcGIS Resource Center "Analysis".

RyanKDalton
sumber
Terima kasih semuanya, ini luar biasa. kami memiliki arcgis 9.3.1 tetapi saya akan menguji pada komputer pribadi saya EDIT: ini adalah alat yang sangat bagus, tetapi tidak cukup cepat: / apa yang saya inginkan adalah dapat mengedit lingkungan untuk menemukan / memilih fitur dengan busur nyata dan kemudian checkout fitur saya dengan true arc dan kemudian densify (adakah alat editing densify lebih dari et geotools, mengapa saya tidak ingin Et getools adalah karena Anda harus mengubah layer target, kami memadatkan mungkin 10 layer berbeda.
jonaktiv