Identifier les vraies courbes / arcs dans ArcMap?


13

Le seul bon moyen de créer des cercles dans ArcMap est d'utiliser l'arc véritable (courbes composées), mais je dois les convertir en vertex (densification) en raison d'un problème de compatibilité. J'ai besoin d'informations pour la géodatabase et SDO_geometry (arcsde)

et oui il y a un moyen. J'utilise:

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

puis en utilisant ET Geotools pour densifier couche par couche.

Mais il devrait y avoir un moyen plus simple de le faire directement dans Oracle ou ArcMap, et je veux juste densifier les entités qui ont un véritable arc. Je ne veux pas de sommets inutiles sur des lignes droites, etc.

Comment puis-je identifier les vrais arcs dans ArcMap et comment les densifier aussi rapidement et facilement que possible?

Idem pour Oracle SQL.


Voici un fil de 2006 qui utilise VBA pour trouver de vrais arcs, mais comme ArcGIS ne prend plus en charge VBA, existe-t-il un moyen Python ou UI de le faire?
RyanKDalton

J'espère que cette "Idée ArcGIS" ne signifie pas qu'il est impossible de trouver de vraies courbes dans 10.0.
RyanKDalton

Réponses:


8

On m'a posé cette question aujourd'hui ("Comment puis-je identifier si une classe de traits a des courbes) et on m'a donné quelques suggestions de code arcpy . Modifiez le code suivant comme bon vous semble (une variable indicateur au lieu d'un message par exemple)

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

En utilisant la densification , les segments de courbe sont simplifiés grâce à la densification par le paramètre Angle de déviation maximum ou Ecart de décalage maximum.

Les segments de ligne droite seront donc conservés intacts.


1
Bien que cela n'aide pas à identifier les vraies courbes, je conviens que l'utilisation de la densification avec le paramètre Angle est un moyen rapide et efficace de les densifier très rapidement. L'utilisation du paramètre Angle ne densifie également généralement que les vraies courbes, tandis que l'option Distance densifie toutes les limites, ce qui entraîne (au moins dans mes tests, en utilisant les paramètres par défaut) jusqu'à une augmentation de 10 fois la taille du fichier.
RyanKDalton

ok, donc il y a différentes solutions, mais mon problème est que je ne peux pas utiliser de boîte à outils sur ma couche sde, nous verrouillons les couches pour le checkout / checkin, ce que je veux faire est d'exécuter un outil / script qui trouve ces courbes et après cela, densifier, mais si c'est ce que vous dites, que densifier ne touche que les vrais arcs, je peux vérifier toutes les fonctionnalités, mais existe-t-il un outil d'édition qui densifie plus que ET geotools
jonaktiv

cette réponse gis.stackexchange.com/a/37082/2969 essaie d'extraire des lignes droites, mais vous pouvez extraire des courbes en soustrayant des lignes droites de la couche entière, afin de pouvoir localiser des courbes, sans toucher à toutes les données. mais je n'ai aucune idée du fonctionnement d'ET geotools.
geogeek

jonaktiv, l'outil Densify auquel @geogeek est lié est un outil ArcGIS de base disponible avec une licence ArcEditor ou ArcInfo, ne faisant pas partie de ET GeoWizards.
RyanKDalton

2

Je pense qu'une fois que vous les avez sélectionnés, vous pouvez les densifier. Le code (non testé) ci-dessous pourrait être adapté pour ce faire. (Suppose que les courbes de Bézier sont qualifiées d'arcs).

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

est ce script d'édition? comment vais-je mettre ce code à arcmap? et comment fonctionne le code, trouve-t-il des courbes beizercurves ou densifie-t-il seulement celles que j'ai trouvées (sélectionné)
jonaktiv

C'est c #. Si vous n'êtes pas déjà familier avec c # (ou la personnalisation .net), vous pourriez demander à quelqu'un d'écrire l'équivalent avec python. Pour utiliser ce code, vous devrez le compiler avec Visual Studio. Il sélectionne toutes les polylignes (ou polygones) dans la couche cible d'édition actuelle qui ont des segments non linéaires.
Kirk Kuykendall

@jonaktiv Si vous utilisez 9.3.1, vous pouvez le faire avec VBA dans un script de calculatrice. Calculez un attribut d'indicateur, puis sélectionnez les entités qui ont l'indicateur. Si vous utilisez 8.3, vous pouvez réellement mettre à jour la géométrie à l'aide de la calculatrice de champ directement et n'auriez pas besoin d'un attribut indicateur.
Kirk Kuykendall

Superbe! Je suis très reconnaissant, j'avais peur que ce ne soit pas possible
jonaktiv


2

S'appuyant sur @ la réponse de KHibma, le curseur d'accès aux données a le jeton SHAPE@JSONqui peut être utilisé pour vérifier les courbes sans importer le jsonmodule.

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

J'ai également créé ma propre solution pour cela, sur la base de la suggestion de @geogeek. J'ai créé un modèle qui compare les sommets des calques source avec un sommet d'une copie densifiée (à l'aide de l'option ANGLE) du calque source. La sortie est une couche de sommets qui "ne correspondent pas" à la source. La dernière étape sélectionne toutes les entités source qui coupent les points sans correspondance, identifiant ainsi les entités qui contiennent de vraies courbes.

Étant donné que ce modèle ne divise pas les entités aux points de début et de fin de l'arc, l'entité entière sera exportée. Par conséquent, si vous avez une seule géométrie qui est connectée en tant que "ligne-courbe-ligne-courbe-courbe inversée-ligne", l'entité entière sera sortie, pas seulement les portions de courbe. Utilisez les points pour déterminer où se trouvent les courbes réelles.

Vous pouvez télécharger le modèle appelé « Identifier les vraies courbes » à partir de la galerie «Analyse» d'ArcGIS Resource Center.


Merci à TOUS, c'est génial. nous avons arcgis 9.3.1 mais je vais tester sur mon ordinateur privé EDIT: c'est un très bon outil, mais pas assez rapide cependant: / ce que je veux, c'est être capable d'éditer un environnement pour trouver / sélectionner des fonctionnalités avec de vrais arcs puis consultez mes entités avec de vrais arcs puis densifiez (y a-t-il des outils de densification d'édition plus que et geotools, pourquoi je ne veux pas Et getools parce que vous devez changer de couche cible, nous densifions peut-être 10 couches différentes.
jonaktiv
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.