¿Identificando verdaderas curvas / arcos en ArcMap?

13

La única buena manera de crear círculos en ArcMap es usar un arco verdadero (curvas compuestas), pero necesito convertirlos en vértices (densificar) debido a un problema de compatibilidad. Necesito información para geodatabase y SDO_geometry (arcsde)

y si hay un camino Yo suelo:

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

y luego usando ET Geotools para densificar capa por capa.

Pero debería haber una manera más fácil de hacer esto directamente en Oracle o ArcMap, y solo quiero densificar las características que tienen un arco verdadero. No quiero vértices innecesarios en líneas rectas, etc.

¿Cómo puedo identificar arcos verdaderos en ArcMap y cómo puedo densificarlos lo más rápido y fácil posible?

Lo mismo para Oracle SQL.

jonaktiv
fuente
Aquí hay un hilo de 2006 que usa VBA para encontrar arcos verdaderos, pero dado que ArcGIS ya no es compatible con VBA, ¿hay alguna forma de Python o UI para hacer esto?
RyanKDalton
Espero que esta "Idea ArcGIS" no signifique que es imposible encontrar curvas verdaderas en 10.0.
RyanKDalton

Respuestas:

8

Hoy me hicieron esta pregunta ("¿Cómo identifico si una clase de entidad tiene curvas?) Y me dieron algunas sugerencias de código arcpy . Modifique el siguiente código como mejor le parezca (una variable de bandera en lugar de un mensaje, por ejemplo)

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
fuente
4

Al usar Densificar , los segmentos de Curva se simplifican a través de la densificación mediante el parámetro Ángulo de deflexión máximo o Desviación de desplazamiento máximo.

Por lo tanto, los segmentos de línea recta se mantendrán intactos.

geogeek
fuente
1
Si bien esto no ayudará a identificar las curvas verdaderas, estoy de acuerdo en que usar Densificar con el parámetro Ángulo es una forma rápida y efectiva de densificarlas muy rápidamente. El uso del parámetro Ángulo también generalmente solo densificará las curvas verdaderas, mientras que la opción Distancia densificará todos los límites, lo que conducirá (al menos en mis pruebas, usando los parámetros predeterminados) a un aumento de hasta 10 veces en el tamaño del archivo.
RyanKDalton
ok, entonces hay diferentes soluciones, pero mi problema es que no puedo usar ninguna caja de herramientas en mi capa sde, estamos bloqueando las capas para pagar / registrar, lo que quiero hacer es ejecutar una herramienta / script que encuentre estas curvas y después de eso Densify, pero si es lo que está diciendo que sólo se toca Densify verdaderos arcos, puedo echa un vistazo a todas las características, pero ¿hay alguna herramienta de edición que se densifica más de GeoTools ET
jonaktiv
esta respuesta gis.stackexchange.com/a/37082/2969 intenta extraer líneas rectas, pero puede extraer curvas restando líneas rectas de toda la capa, para que pueda localizar curvas, sin tocar todos los datos. pero no tengo idea de cómo funciona ET geotools.
geogeek
jonaktiv, la herramienta Densify con la que se vincula @geogeek es una herramienta central de ArcGIS disponible con una licencia ArcEditor o ArcInfo, que no forma parte de ET GeoWizards.
RyanKDalton
2

Creo que una vez que los haya seleccionado, puede densificarlos. El código (no probado) a continuación podría adaptarse para hacer esto. (Asume que las curvas de Bezier califican como arcos).

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
fuente
es este script de edición? ¿Cómo pondré este código en arcmap? y cómo funciona el código, no se encontró beizercurves o sólo se densifica los que he encontrado (seleccionados)
jonaktiv
Esto es C#. Si aún no está familiarizado con c # (o personalización de .net), puede pedirle a alguien que escriba el equivalente con python. Para usar este código, deberá compilarlo con Visual Studio. Selecciona todas las polilíneas (o polígonos) en la capa de destino de edición actual que tienen segmentos no lineales.
Kirk Kuykendall
@jonaktiv Si está utilizando 9.3.1, podría hacer esto con VBA en un script de calculadora. Calcule un atributo de bandera, luego seleccione las características que tienen la bandera. Si está utilizando 8.3, puede actualizar la geometría utilizando la calculadora de campo directamente y no necesitaría un atributo de marca.
Kirk Kuykendall
¡Soberbio! Estoy muy agradecido, temía que no fuera posible
jonaktiv
2

Basándose en la respuesta de @ KHibma, el cursor de acceso a datos tiene el token SHAPE@JSONque se puede usar para verificar curvas sin importar el jsonmódulo.

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
fuente
1

También creé mi propia solución para esto, basada en la sugerencia de @geogeek. Creé un modelo que compara los vértices de las capas de origen con los vértices de una copia densificada (usando la opción ANGLE) de la capa de origen. La salida es una capa de vértices que "no coinciden" con la fuente. El paso final selecciona todas las entidades de origen que se cruzan con los puntos no coincidentes, identificando entidades que contienen curvas verdaderas.

Debido a que este modelo no divide las entidades en los puntos inicial y final del arco, se exportará toda la entidad. Por lo tanto, si tiene una geometría única que está conectada como "línea-curva-línea-curva-curva-línea-inversa", se generará toda la entidad, no solo las porciones de la curva. Use los puntos para determinar dónde existen las curvas reales.

Puede descargar el modelo llamado " Identificar curvas verdaderas " de la galería "Análisis" del Centro de recursos de ArcGIS.

RyanKDalton
fuente
Gracias a todos, esto es genial. tenemos arcgis 9.3.1 pero lo probaré en mi computadora privada EDIT: es una herramienta muy buena, pero no lo suficientemente rápida: / lo que quiero es poder en el entorno de edición encontrar / seleccionar características con arcos verdaderos y luego Pedido Mi características con arcos verdaderos y luego Densify (¿hay herramientas de edición de densificar más et GeoTools, ¿por qué no quiero getools et es porque hay que capa de cambio de destino, que densificar tal vez 10 capas diferentes.
jonaktiv