Визначення справжніх кривих / дуг у 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.


Ось нитка з 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!

4

Використовуючи Densify , сегменти кривої спрощуються за допомогою ущільнення або параметром "Максимальний кут відхилення", або "Максимальним відхиленням зміщення".

Тож сегменти прямої лінії залишатимуться недоторканими.


1
Хоча це не допоможе визначити справжні криві, я погоджуюся, що використання Densify з параметром Angle - це швидкий та ефективний спосіб їх ущільнення дуже швидко. Використання параметра Angle також, як правило, лише ущільнює справжні криві, тоді як параметр відстань ущільнює всі межі, що призводить до (принаймні в моїх тестах, використовуючи параметри за замовчуванням) до 10-кратного збільшення розміру файлу.
RyanKDalton

ОК, тому є різні рішення, але моя проблема полягає в тому, що я не в змозі використовувати жодне поле інструментів на моєму шарі sde, ми фіксуємо шари для оформлення замовлення / реєстрації, що я хочу зробити, це запустити інструмент / скрипт, який знайде ці криві і після цього ущільнюються, але якщо це те, що ви говорите, що ущільнювати лише торкаються справжніх дуг, я можу перевірити всі функції, але чи є який-небудь інструмент редагування, який ущільнює більше, ніж 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 #. Якщо ви ще не знайомі з налаштуваннями c # (або .net), ви можете попросити когось написати еквівалент python. Для використання цього коду вам потрібно буде скомпілювати його з Visual Studio. Він вибирає всі полілінії (або полігони) у поточному цільовому шарі редагування, які мають будь-які нелінійні сегменти.
Кірк Куйкендалл

@jonaktiv Якщо ви використовуєте 9.3.1, ви можете зробити це за допомогою VBA у сценарії калькулятора. Обчисліть атрибут прапора, а потім виберіть функції, у яких є прапор. Якщо ви використовуєте 8.3, ви можете фактично оновлювати геометрію, використовуючи безпосередньо калькулятор поля, і атрибут прапора не знадобиться.
Кірк Куйкендалл

Чудово! Я дуже вдячний, я боявся, що це неможливо
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.


Дякую ВСІМ, це так чудово. у нас є arcgis 9.3.1, але я перевіряю на моєму приватному комп’ютері EDIT: це дуже хороший інструмент, але недостатньо швидкий, хоча: / що я хочу - це вміти в середовищі редагування знайти / вибрати функції з справжніми дугами, а потім перевірити мої функції справжніми дугами, а потім ущільнити (чи є інструменти для редагування ущільнювачів більше, ніж et geotools, чому я не хочу Et getools, тому що ви повинні змінити цільовий шар, ми ущільнюємо, можливо, 10 різних шарів.
jonaktiv
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.