Identificare curve / archi reali in ArcMap?


13

L'unico buon modo per creare cerchi in ArcMap è usare l'arco vero (curve composte) ma ho bisogno di convertirli in vertici (densificazione) a causa di un problema di compatibilità. Ho bisogno di informazioni per geodatabase e SDO_geometry (arcsde)

e sì, c'è un modo. Io uso:

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

e quindi usando ET Geotools per densificare strato per strato.

Ma dovrebbe esserci un modo più semplice per farlo direttamente in Oracle o ArcMap, e voglio solo densificare le funzionalità che hanno un vero arco. Non voglio vertici superflui su rette e così via.

Come posso identificare i veri archi in ArcMap e come posso densificarli il più velocemente e facilmente possibile?

Lo stesso per Oracle SQL.


Ecco un thread del 2006 che utilizza VBA per trovare veri archi, ma poiché ArcGIS non supporta più VBA, esiste un modo Python o UI per farlo?
RyanKDalton,

Spero che questa "Idea ArcGIS" non significhi che è impossibile trovare curve vere in 10.0.
RyanKDalton,

Risposte:


8

Oggi mi è stata posta questa domanda ("Come faccio a identificare se una featureclass ha curve) e mi sono stati dati alcuni suggerimenti di codice arcpy . Modifica il codice seguente come ritieni opportuno (una variabile flag invece di un messaggio per esempio)

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

Utilizzando Densify , i segmenti di Curve vengono semplificati attraverso la densificazione tramite il parametro Angolo di deflessione massimo o Deviazione di offset massima.

Quindi i segmenti di linea retta rimarranno intatti.


1
Anche se questo non aiuta a identificare le curve vere, concordo sul fatto che l'uso di Densify con il parametro Angle è un modo rapido ed efficace per densificarle molto rapidamente. L'uso del parametro Angolo generalmente anche densificherà le curve vere, mentre l'opzione Distanza aumenterà la densità di tutti i confini, portando (almeno nei miei test, utilizzando i parametri predefiniti) a un aumento di 10 volte delle dimensioni del file.
RyanKDalton,

ok, quindi ci sono diverse soluzioni, ma il mio problema è che non sono in grado di utilizzare alcun toolbox sul mio livello sde, stiamo bloccando i livelli per il checkout / check-in, quello che voglio fare è eseguire uno strumento / script che trovi queste curve e poi Densify, ma se è quello che stai dicendo che densify tocca solo i veri archi, posso dare un'occhiata a tutte le funzionalità, ma ci sono strumenti di modifica che densificano più di ET geotools
jonaktiv

questa risposta gis.stackexchange.com/a/37082/2969 tenta di estrarre le linee rette, ma è possibile estrarre le curve sottraendo le linee rette da tutto il livello, in modo da poter individuare le curve, senza toccare tutti i dati. ma non ho idea di come funzioni ET geotools.
geogeek,

jonaktiv, lo strumento Densify a cui @geogeek si collega è uno strumento ArcGIS di base disponibile con una licenza ArcEditor o ArcInfo, non parte di ET GeoWizards.
RyanKDalton,

2

Penso che una volta che li hai selezionati, puoi densificarli. Il seguente codice (non testato) potrebbe essere adattato per fare ciò. (Suppone che le curve di Bezier si qualifichino come archi).

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

è questo script di modifica? come inserirò questo codice in arcmap? e come funziona il codice, trova le curve a beizercur o densifica solo quelle che ho trovato (selezionato)
jonaktiv

È c #. Se non hai già familiarità con la personalizzazione di c # (o .net) potresti chiedere a qualcuno di scrivere l'equivalente con Python. Per utilizzare questo codice dovrai compilarlo con Visual Studio. Seleziona tutte le polilinee (o poligoni) nel livello target di modifica corrente che hanno segmenti non lineari.
Kirk Kuykendall,

@jonaktiv Se stai usando 9.3.1 puoi farlo con VBA in uno script di calcolatrice. Calcola un attributo flag, quindi seleziona le funzionalità che hanno il flag. Se stai usando 8.3 puoi effettivamente aggiornare la geometria usando direttamente il calcolatore di campo e non avresti bisogno di un attributo flag.
Kirk Kuykendall,

Stupendo! Sono molto grato, temevo che non fosse possibile
jonaktiv il


2

Basandosi sulla risposta di @ KHibma, il cursore di accesso ai dati ha il token SHAPE@JSONche può essere usato per controllare le curve senza importare il jsonmodulo.

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

Ho creato la mia soluzione anche per questo, sulla base del suggerimento di @geogeek. Ho creato un modello che confronta i vertici dei livelli sorgente con i vertici di una copia densificata (usando l'opzione ANGLE) del livello sorgente. L'output è uno strato di vertici che "non corrispondono" alla sorgente. Il passaggio finale seleziona tutte le funzioni di origine che intersecano i punti senza eguali, identificando in tal modo le caratteristiche che contengono curve vere.

Poiché questo modello non divide le feature all'inizio e alla fine dell'arco, l'intera feature verrà esportata. Pertanto, se si dispone di una singola geometria collegata come "linea-curva-linea-curva-retromarcia-linea", verrà emessa l'intera funzione, non solo le porzioni di curva. Utilizzare i punti per determinare dove esistono le curve effettive.

È possibile scaricare il modello " Identify True Curves " dalla galleria "Analisi" del Centro risorse di ArcGIS.


Grazie a tutti, è fantastico. abbiamo arcgis 9.3.1 ma proverò sul mio computer privato EDIT: è un ottimo strumento, ma non abbastanza veloce però: / quello che voglio è essere in grado di modificare l'ambiente per trovare / selezionare funzionalità con veri archi e quindi controlla le mie caratteristiche con archi veri e poi densifica (ci sono strumenti di modifica densifica più di et geotools, perché non voglio Et getools è perché devi cambiare il livello target, densiamo forse 10 livelli diversi.
jonaktiv
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.