Identificando curvas / arcos verdadeiros no ArcMap?

12

A única boa maneira de criar círculos no ArcMap é usar arco verdadeiro (curvas compostas), mas preciso convertê-los em vértice (densificação) devido a um problema de compatibilidade. Preciso de informações para geodatabase e SDO_geometry (arcsde)

e sim, existe um caminho. Eu uso:

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

e então usando ET Geotools para densificar camada por camada.

Mas deve haver uma maneira mais fácil de fazer isso diretamente no Oracle ou ArcMap, e eu só quero densificar os recursos que possuem um arco verdadeiro. Não quero vértices desnecessários em linhas retas e assim por diante.

Como identificar arcos verdadeiros no ArcMap e como densificá-los o mais rápido e fácil possível?

O mesmo para o Oracle SQL.

jonaktiv
fonte
Aqui está um tópico de 2006 que usa o VBA para encontrar arcos verdadeiros, mas como o ArcGIS não suporta mais o VBA, existe uma maneira de Python ou UI fazer isso?
RyanKDalton
Espero que essa "Idéia do ArcGIS" não signifique que seja impossível encontrar curvas verdadeiras no 10.0.
RyanKDalton

Respostas:

8

Fiz essa pergunta hoje ("Como identifico se uma classe de característica tem curvas) e recebi algumas sugestões de código arqueado . Modifique o código a seguir como achar melhor (uma variável de flag em vez de uma mensagem, por exemplo)

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

Usando o Densify , os segmentos da curva são simplificados por meio da densificação pelo parâmetro Maximum Deflection Angle ou Maximum Offset Deviation.

Portanto, os segmentos de linha reta serão mantidos intactos.

geogeek
fonte
1
Embora isso não ajude a identificar as curvas verdadeiras, concordo que o uso de Densify com o parâmetro Angle é uma maneira rápida e eficaz de densificá-las muito rapidamente. O uso do parâmetro Angle também geralmente densifica apenas as curvas reais, enquanto a opção Distância densifica todos os limites, levando a (pelo menos nos meus testes, usando os parâmetros padrão) até um aumento de 10x no tamanho do arquivo.
RyanKDalton
ok, então existem soluções diferentes, mas o meu problema é que não consigo usar nenhuma caixa de ferramentas na minha camada sde, estamos bloqueando as camadas para checkout / check-in. O que eu quero fazer é executar uma ferramenta / script que encontre essas curvas e depois Densify, mas se é o que você está dizendo que densifica apenas toca arcos verdadeiros, posso verificar todos os recursos, mas há alguma ferramenta de edição que densifique mais do que geotools ET
jonaktiv
esta resposta gis.stackexchange.com/a/37082/2969 tenta extrair linhas retas, mas é possível extrair curvas subtraindo linhas retas de toda a camada, para que você possa localizar curvas sem tocar nos dados completos. mas não tenho idéia de como ET geotools funciona.
Geogeek
jonaktiv, a ferramenta Densify à qual o @geogeek se vincula é uma ferramenta central do ArcGIS disponível com uma licença ArcEditor ou ArcInfo, que não faz parte do ET GeoWizards.
perfil completo de RyanKDalton
2

Acho que depois de selecioná-los, você pode densificá-los. O código (não testado) abaixo pode ser adaptado para fazer isso. (Supõe que as curvas de Bezier se qualificam 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
fonte
é este script de edição? como vou colocar esse código no arcmap? e como o código funciona, ele encontra beizercurves ou apenas densifica os que eu encontrei (selecionado)
jonaktiv
É C#. Se você ainda não conhece o c # (ou a personalização do .net), peça a alguém que escreva o equivalente em python. Para usar esse código, você precisará compilá-lo com o Visual Studio. Ele seleciona todas as polilinhas (ou polígonos) na camada atual de destino de edição que possuem segmentos não lineares.
Kirk Kuykendall
@jonaktiv Se você estiver usando o 9.3.1, poderá fazer isso com o VBA em um script de calculadora. Calcule um atributo de sinalizador e selecione os recursos que possuem o sinalizador. Se você estiver usando o 8.3, poderá atualizar a geometria diretamente usando a calculadora de campo e não precisaria de um atributo de flag.
Kirk Kuykendall
Soberbo! Estou muito grato, eu estava com medo que não era possível
jonaktiv
2

Com base na resposta do @ KHibma, o cursor de acesso a dados possui o token SHAPE@JSONque pode ser usado para verificar curvas sem importar o 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
fonte
1

Criei minha própria solução para isso também, com base na sugestão do @geogeek. Criei um modelo que compara os vértices das camadas de origem com os vértices de uma cópia densificada (usando a opção ANGLE) da camada de origem. A saída é uma camada de vértices que "não correspondem" à fonte. A etapa final seleciona todos os recursos de origem que cruzam os pontos não correspondentes, identificando, assim, os recursos que contêm curvas reais.

Como esse modelo não divide os recursos nos pontos inicial e final do arco, todo o recurso será exportado. Portanto, se você tiver uma única geometria conectada como "linha-curva-linha-curva-reversa-curva-linha", todo o recurso será emitido, não apenas as partes da curva. Use os pontos para determinar onde as curvas reais existem.

Você pode fazer o download do modelo chamado " Identify True Curves " na galeria "Analysis" do ArcGIS Resource Center.

RyanKDalton
fonte
Obrigado a todos, isso é tão bom. temos o arcgis 9.3.1, mas testarei no meu computador particular EDIT: é uma ferramenta muito boa, mas não rápida o suficiente: / o que eu quero é poder editar no ambiente para encontrar / selecionar recursos com arcos verdadeiros e depois verificação geral meus recursos com os verdadeiros arcos e densificar (existem ferramentas de edição densificar mais de et GeoTools, por que eu não quero getools et é porque você tem que camada de destino mudança, nós densificar talvez 10 camadas diferentes.
jonaktiv