ArcMap'ta gerçek eğrileri / yayları mı tanımlıyorsunuz?


13

ArcMap'te daireler oluşturmanın tek iyi yolu gerçek ark (bileşik eğriler) kullanmaktır, ancak bir uyumluluk sorunu nedeniyle bunları tepe noktasına (yoğunlaştırma) dönüştürmem gerekiyor. Geodatabase ve SDO_geometry (arcsde) için bilgiye ihtiyacım var

ve evet bir yolu var. Kullanırım:

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

ve daha sonra katman katman yoğunlaştırmak için ET Geotools kullanımı.

Ancak bunu Oracle veya ArcMap'te basit bir şekilde yapmanın daha kolay bir yolu olmalı ve sadece gerçek ark olan özellikleri yoğunlaştırmak istiyorum. Düz çizgilerde gereksiz köşeler istemiyorum vb.

ArcMap'ta gerçek yayları nasıl belirleyebilirim ve bunları mümkün olduğunca hızlı ve kolay bir şekilde nasıl yoğunlaştırabilirim?

Oracle SQL için de aynı şey geçerli.


İşte 2006'dan gerçek yayları bulmak için VBA kullanan bir iş parçacığı , ancak ArcGIS artık VBA'yı desteklemediğinden, bunu yapmanın bir Python veya UI yolu var mı?
RyanKDalton

Bu "ArcGIS Idea" nın 10.0'da gerçek eğrileri bulmanın imkansız olduğu anlamına gelmediğini umuyorum .
RyanKDalton

Yanıtlar:


8

Bugün bu soruyu sordum ("Bir özellik sınıfı eğrileri olup olmadığını nasıl belirleyebilirim) ve bazı arcpy kodu önerileri verildi . Uygun gördüğünüz gibi aşağıdaki kodu değiştirin

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!

4

Yoğunlaştır kullanılarak , Eğri segmentleri Maksimum Sapma Açısı veya Maksimum Ofset Sapma parametresi ile yoğunlaştırma yoluyla basitleştirilir.

Böylece Düz çizgi segmentleri bozulmadan korunacaktır.


1
Bu gerçek eğrileri tanımlamaya yardımcı olmasa da, Densify'ı Angle parametresiyle kullanmanın, bunları çok hızlı bir şekilde yoğunlaştırmanın hızlı ve etkili bir yolu olduğunu kabul ediyorum. Angle parametresini kullanmak genellikle yalnızca gerçek eğrileri yoğunlaştırırken, Mesafe seçeneği tüm sınırları yoğunlaştırır (en azından benim testlerimde, varsayılan parametreleri kullanarak) dosya boyutunda 10 kat artışa yol açar.
RyanKDalton

Tamam, bu yüzden farklı çözümler var, ama benim sorunum sde katmanımda herhangi bir araç kutusu kullanamıyorum, biz ödeme / check-in için katmanları kilitliyoruz, yapmak istediğim bir araç / komut dosyası çalıştırmaktır. Bu eğriler ve bundan sonra Yoğunlaştır, ancak yoğunlaştırmanın sadece gerçek yaylara dokunmasını söylüyorsanız, tüm özelliklere göz atabilirim, ancak ET geotools'tan daha yoğun olan herhangi bir düzenleme aracı var mı
jonaktiv

bu cevap gis.stackexchange.com/a/37082/2969 düz çizgileri ayıklamaya çalışır, ancak tüm çizgiden düz çizgileri çıkararak eğrileri ayıklayabilirsiniz, böylece tüm verilere dokunmadan eğrileri bulabilirsiniz. ama ET geotools'un nasıl çalıştığı hakkında hiçbir fikrim yok.
geogeek

@geogeek'in bağlandığı Yoğunlaştırma aracı jonaktiv, ET GeoWizards'ın bir parçası değil, bir ArcEditor veya ArcInfo lisansıyla kullanılabilen temel bir ArcGIS aracıdır.
RyanKDalton

2

Bence onları seçtikten sonra yoğunlaştırabilirsiniz. Aşağıdaki (test edilmemiş) kod, bunu yapmak için uyarlanabilir. (Bezier eğrilerinin yay olarak nitelendirildiği varsayılır).

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;
}

bu düzenleme betiği mi? bu kodu arcmap'e nasıl koyacağım? ve kod nasıl çalışır, beizercurves bulur mu veya sadece bulduğumları yoğunlaştırır mı (seçili)
jonaktiv

Bu C#. C # (veya .net özelleştirmesi) hakkında henüz bilginiz yoksa birinden python ile eşdeğerini yazmasını isteyebilirsiniz. Bu kodu kullanmak için Visual Studio ile derlemeniz gerekir. Geçerli düzenleme hedef katmanındaki doğrusal olmayan bölümleri olan tüm çoklu çizgileri (veya çokgenleri) seçer.
Kirk Kuykendall

@jonaktiv 9.3.1 kullanıyorsanız, bunu bir hesap makinesi komut dosyasında VBA ile yapabilirsiniz. Bir bayrak niteliğini hesaplayın, ardından bayrağı olan özellikleri seçin. 8.3 kullanıyorsanız, doğrudan alan hesap makinesini kullanarak geometriyi güncelleyebilirsiniz ve bir bayrak özniteliğine ihtiyaç duymazsınız.
Kirk Kuykendall

Süper! Çok minnettarım, mümkün olmadığından korkuyordum
jonaktiv


2

@ KHibma cevabını temel alan veri erişim imleci, modülü SHAPE@JSONiçe aktarmadan eğrileri kontrol etmek için kullanılabilecek jetona sahiptir json.

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

1

@Geogeek'in önerisine dayanarak, bunun için de kendi çözümümü yarattım. Kaynak katmanların köşe noktalarını, kaynak katmanın yoğunlaştırılmış (ANGLE seçeneğini kullanarak) köşe noktalarıyla karşılaştıran bir model oluşturdum. Çıktı, kaynağa "uyuşmayan" bir köşe katmanıdır. Son adım, eşleşmeyen noktalarla kesişen tüm kaynak özellikleri seçerek gerçek eğriler içeren özellikleri belirler.

Bu model yayın başlangıç ​​ve bitiş noktalarındaki özellikleri bölmediğinden, tüm özellik dışa aktarılır. Bu nedenle, "line-curve-line-curve-reversecurve line" olarak bağlı tek bir geometriniz varsa, yalnızca eğri kısımları değil, tüm özellik çıktılanır. Gerçek eğrilerin nerede bulunduğunu belirlemek için noktaları kullanın.

ArcGIS Resource Center "Analysis" galerisinden " Gerçek Eğrileri Tanımla " adlı modeli indirebilirsiniz .


Teşekkürler TÜM, bu harika. arcgis 9.3.1 var ama özel bilgisayarımda test edeceğim EDIT: çok iyi bir araçtır, ancak yeterince hızlı değil: / istediğim şey gerçek yaylarla özellikleri bulmak / seçmek için ortamı düzenleme yeteneğine sahip olmak ve daha sonra özellikleri gerçek yaylar ile kontrol ve daha sonra yoğunlaştırmak (et jeotools daha fazla düzenleme yoğunlaştırma araçları var mı, neden Et getools istemiyorum çünkü hedef katmanı değiştirmek zorunda, belki 10 farklı katmanları yoğunlaştırmak.
jonaktiv
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.