Zidentyfikowanie prawdziwych krzywych / łuków w ArcMap?

13

Jedynym dobrym sposobem tworzenia okręgów w ArcMap jest użycie prawdziwego łuku (krzywe złożone), ale muszę przekonwertować je na wierzchołki (zagęszczenie) z powodu problemu ze zgodnością. Potrzebuję informacji o geobazie danych i SDO_geometry (arcsde)

i tak jest sposób. Używam:

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

a następnie za pomocą ET Geotools zagęścić warstwę po warstwie.

Ale powinien istnieć łatwiejszy sposób na zrobienie tego w Oracle lub ArcMap, a ja chcę tylko zagęścić funkcje, które mają prawdziwy łuk. Nie chcę żadnych niepotrzebnych wierzchołków na liniach prostych i tak dalej.

Jak mogę zidentyfikować prawdziwe łuki w ArcMap i jak mogę je zagęścić tak szybko i łatwo, jak to możliwe?

To samo dotyczy Oracle SQL.

jonaktiv
źródło
Oto wątek z 2006 roku, który używa VBA do znalezienia prawdziwych łuków, ale skoro ArcGIS nie obsługuje już VBA, czy istnieje sposób Pythona lub interfejsu użytkownika, aby to zrobić?
RyanKDalton,
Mam nadzieję, że ten „pomysł ArcGIS” nie oznacza, że ​​nie można znaleźć prawdziwych krzywych w 10.0.
RyanKDalton,

Odpowiedzi:

8

Zadano mi to pytanie dzisiaj („Jak rozpoznać, czy klasa obiektów ma krzywe) i otrzymałem sugestie dotyczące kodu arkadowego . Zmodyfikuj poniższy kod według własnego uznania (na przykład zmienna flagi zamiast komunikatu)

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
źródło
4

Korzystając z funkcji Densify , segmenty krzywej są upraszczane poprzez zagęszczanie za pomocą parametru Maksymalny kąt odchylenia lub Maksymalne odchylenie przesunięcia.

Zatem odcinki linii prostej pozostaną nienaruszone.

geogeek
źródło
1
Chociaż to nie pomoże zidentyfikować prawdziwych krzywych, zgadzam się, że użycie Densify z parametrem Angle to szybki i skuteczny sposób na bardzo szybkie zagęszczenie. Użycie parametru Kąt generalnie tylko zagęści prawdziwe krzywe, natomiast opcja Odległość zagęści wszystkie granice, prowadząc do (przynajmniej w moich testach, przy użyciu parametrów domyślnych) aż do 10-krotnego zwiększenia rozmiaru pliku.
RyanKDalton
ok, więc istnieją różne rozwiązania, ale moim problemem jest to, że nie jestem w stanie użyć żadnego przybornika na mojej warstwie sde, blokujemy warstwy do kasy / meldowania. Chcę uruchomić narzędzie / skrypt, który znajdzie te krzywe, a potem Densify, ale jeśli to, co mówisz, że zagęszczanie dotyka tylko prawdziwych łuków, mogę sprawdzić wszystkie funkcje, ale czy istnieje jakieś narzędzie edycyjne, które zagęszcza więcej niż narzędzia geotermiczne ET
jonaktiv
ta odpowiedź gis.stackexchange.com/a/37082/2969 próbuje wyodrębnić linie proste, ale można wyodrębnić krzywe, odejmując linie proste od całej warstwy, aby można było zlokalizować krzywe bez dotykania całych danych. ale nie mam pojęcia, jak działają narzędzia ET.
geogeek
jonaktiv, narzędzie Densify, do którego prowadzi link @geogeek, to podstawowe narzędzie ArcGIS dostępne z licencją ArcEditor lub ArcInfo, nie będące częścią ET GeoWizards.
RyanKDalton,
2

Myślę, że po ich wybraniu możesz je zagęścić. Poniższy (nieprzetestowany) kod można dostosować w tym celu. (Zakłada się, że krzywe Beziera kwalifikują się jako łuki).

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
źródło
czy ten skrypt edycyjny? jak mogę umieścić ten kod w arcmap? i jak działa kod, czy wyszukuje krzywe beizera, czy tylko zagęszcza te, które znalazłem (
wybrałem
To jest C#. Jeśli nie znasz jeszcze języka c # (lub dostosowywania .net), możesz poprosić kogoś o napisanie odpowiednika w Pythonie. Aby użyć tego kodu, musisz go skompilować za pomocą Visual Studio. Wybiera wszystkie polilinie (lub wielokąty) w bieżącej edycji warstwy docelowej, które mają dowolne segmenty nieliniowe.
Kirk Kuykendall,
@jonaktiv Jeśli używasz wersji 9.3.1, możesz to zrobić za pomocą VBA w skrypcie kalkulatora. Oblicz atrybut flagi, a następnie wybierz obiekty z flagą. Jeśli korzystasz z wersji 8.3, możesz zaktualizować geometrię bezpośrednio za pomocą kalkulatora pola i nie potrzebujesz atrybutu flagi.
Kirk Kuykendall,
Wspaniały! Jestem bardzo wdzięczny, bałem się, że to niemożliwe
jonaktiv
2

Opierając się na odpowiedzi @ KHibma, kursor dostępu do danych ma token, SHAPE@JSONktórego można użyć do sprawdzenia krzywych bez importowania jsonmodułu.

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
źródło
1

Stworzyłem również własne rozwiązanie w tym zakresie, oparte na sugestii @geogeek. Stworzyłem model, który porównuje wierzchołki warstw źródłowych z wierzchołkami z zagęszczonej (przy użyciu opcji KĄT) kopii warstwy źródłowej. Dane wyjściowe to warstwa wierzchołków, które „nie pasują” do źródła. Ostatni krok wybiera wszystkie cechy źródłowe, które przecinają niedopasowane punkty, tym samym identyfikując cechy zawierające prawdziwe krzywe.

Ponieważ ten model nie dzieli operacji na początku i na końcu łuku, cała operacja zostanie wyeksportowana. Dlatego jeśli masz pojedynczą geometrię, która jest połączona jako „linia-krzywa-linia-krzywa-krzywa odwrotna-linia”, zostanie wyprowadzona cała operacja, a nie tylko części krzywej. Użyj punktów, aby ustalić, gdzie istnieją rzeczywiste krzywe.

Możesz pobrać model o nazwie „ Identify True Curves ” z galerii „Analiza” w ArcGIS Resource Center.

RyanKDalton
źródło
Dziękuję WSZYSTKO, to jest świetne. mamy Arcgis 9.3.1, ale przetestuję na moim prywatnym komputerze EDYCJA: jest to bardzo dobre narzędzie, ale nie wystarczająco szybkie: / Chcę, aby w środowisku edytorskim znaleźć / wybrać funkcje z prawdziwymi łukami, a następnie sprawdź moje funkcje za pomocą prawdziwych łuków, a następnie zagęszczaj (czy są jakieś narzędzia do edycji zagęszczające więcej niż geotools, dlaczego nie chcę Et getools, ponieważ musisz zmienić warstwę docelową, zagęszczamy może 10 różnych warstw.
jonaktiv