Определение истинных кривых / дуг в ArcMap?

13

Единственный хороший способ создания кругов в ArcMap - это использовать истинную дугу (составные кривые), но мне нужно преобразовать их в вершину (уплотнение) из-за проблемы совместимости. Мне нужна информация для базы геоданных и SDO_geometry (arcsde)

и да, есть способ. Я использую:

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

а затем с помощью ET Geotools уплотнять слой за слоем.

Но должен быть более простой способ сделать это прямо в Oracle или ArcMap, и я просто хочу уплотнить функции, которые имеют истинную дугу. Я не хочу ненужных вершин на прямых и так далее.

Как я могу определить истинные дуги в ArcMap, и как я могу уплотнить их как можно быстрее и проще?

То же самое для Oracle SQL.

jonaktiv
источник
Вот нить 2006 года, которая использует VBA для поиска истинных дуг, но поскольку ArcGIS больше не поддерживает VBA, есть ли способ сделать это с помощью Python или UI?
RyanKDalton
Я надеюсь, что эта «идея ArcGIS» не означает, что невозможно найти истинные кривые в 10.0.
RyanKDalton

Ответы:

8

Мне задали этот вопрос сегодня («Как я могу определить, есть ли в классе объектов кривые), и мне предложили несколько вариантов кода arcpy . Измените следующий код по своему усмотрению (например, переменная-флаг вместо сообщения)

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
источник
4

При использовании Densify сегменты кривой упрощаются за счет уплотнения с помощью параметра «Максимальный угол отклонения» или «Максимальное отклонение смещения».

Таким образом, отрезки прямых будут сохранены.

geogeek
источник
1
Хотя это не поможет идентифицировать истинные кривые, я согласен с тем, что использование Densify с параметром Angle является быстрым и эффективным способом их очень быстрой уплотнения. Использование параметра «Угол» также обычно только уплотняет истинные кривые, тогда как параметр «Расстояние» уплотняет все границы, приводя (по крайней мере в моих тестах, используя параметры по умолчанию) к увеличению размера файла в 10 раз.
RyanKDalton
Хорошо, так что есть разные решения, но моя проблема в том, что я не могу использовать какой-либо набор инструментов на своем слое sde, мы блокируем слои для извлечения / регистрации. Я хочу запустить инструмент / скрипт, который находит эти кривые и после этого Densify, но если это то, что вы говорите, уплотнение касается только истинных дуг, я могу проверить все объекты, но есть ли какой-либо инструмент редактирования, который уплотняет больше, чем ET geotools
jonaktiv
В этом ответе gis.stackexchange.com/a/37082/2969 пытается извлечь прямые линии, но вы можете извлечь кривые, вычтя прямые линии из всего слоя, чтобы вы могли найти кривые, не затрагивая все данные. но я понятия не имею, как работает ET geotools.
Geogeek
jonaktiv, инструмент Densify, на который ссылается @geogeek, является основным инструментом ArcGIS, доступным по лицензии ArcEditor или ArcInfo, а не частью ET GeoWizards.
RyanKDalton
2

Я думаю, что, выбрав их, вы можете уплотнить их. (Непроверенный) код ниже может быть адаптирован для этого. (Предполагается, что кривые Безье квалифицируются как дуги).

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;
}
Кирк Куйкендалл
источник
это сценарий редактирования? как я помещу этот код в arcmap? и как работает код, находит ли он beizercurves или только уплотняет те, которые я нашел (выбрал)
jonaktiv
Это с #. Если вы еще не знакомы с c # (или настройкой .net), вы можете попросить кого-нибудь написать эквивалент с python. Чтобы использовать этот код, вам необходимо скомпилировать его с помощью Visual Studio. Он выбирает все полилинии (или полигоны) в текущем целевом слое редактирования, которые имеют нелинейные сегменты.
Кирк Куйкендалл
@jonaktiv Если вы используете 9.3.1, вы можете сделать это с помощью VBA в скрипте калькулятора. Рассчитайте атрибут флага, затем выберите объекты, которые имеют флаг. Если вы используете 8.3, вы можете обновить геометрию напрямую, используя калькулятор полей, и вам не понадобится атрибут flag.
Кирк Куйкендалл
Superb! Я очень благодарен, я боялся, что это было невозможно
jonaktiv
2

Основываясь на ответе @ KHibma, курсор доступа к данным имеет токен, SHAPE@JSONкоторый можно использовать для проверки кривых без импорта jsonмодуля.

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

Я также создал собственное решение для этого, основываясь на предложении @geogeek. Я создал модель, которая сравнивает вершины исходных слоев с вершинами из уплотненной (используя опцию ANGLE) копии исходного слоя. Выходные данные представляют собой слой вершин, которые «не соответствуют» источнику. На последнем шаге выбираются все исходные объекты, которые пересекают несопоставленные точки, тем самым идентифицируя объекты, которые содержат истинные кривые.

Поскольку эта модель не разделяет объекты в начальной и конечной точках дуги, весь объект будет экспортирован. Поэтому, если у вас есть одна геометрия, которая связана как «линия-кривая-линия-кривая-обратная кривая-линия», будет выводиться весь объект, а не только части кривой. Используйте точки, чтобы определить, где существуют фактические кривые.

Вы можете загрузить модель под названием « Определение истинных кривых » из галереи «Анализ» в ArcGIS Resource Center.

RyanKDalton
источник
Спасибо ВСЕМ, это так здорово. у нас есть arcgis 9.3.1, но я протестирую на моем частном компьютере РЕДАКТИРОВАТЬ: это очень хороший инструмент, но не достаточно быстрый, хотя: / что я хочу, чтобы иметь возможность в среде редактирования найти / выбрать объекты с истинными дугами, а затем Изучите мои особенности с истинными дугами и затем уплотните (есть ли инструменты редактирования уплотнения больше, чем et geotools, почему я не хочу Et getools, потому что вы должны изменить целевой слой, мы уплотняем возможно 10 различных слоев.
jonaktiv