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과 동일합니다.


여기에 VBA를 사용하여 실제 호를 찾는 2006 년스레드가 있지만 ArcGIS가 더 이상 VBA를 지원하지 않기 때문에이를 수행하는 Python 또는 UI 방법이 있습니까?
RyanKDalton

나는 바라고 이 "는 ArcGIS 아이디어가" 가 10.0에서 진정한 곡선을 찾기 위해 불가능하다는 것을 의미하지 않는다.
RyanKDalton

답변:


8

오늘이 질문을 받았습니다 ( " 특성 클래스에 커브가 있는지 확인하는 방법" ).

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를 사용하는 것이 매우 신속하게 밀도를 높이는 빠르고 효과적인 방법이라는 데 동의합니다. 각도 매개 변수를 사용하면 일반적으로 실제 곡선 만 치밀화되는 반면 거리 옵션은 모든 경계를 치밀하게하여 (적어도 기본 매개 변수를 사용하는 테스트에서) 파일 크기가 최대 10 배 증가합니다.
RyanKDalton

좋아, 다른 해결책이 있지만 내 문제는 내 sde 레이어에서 도구 상자를 사용할 수 없다는 것입니다. 체크 아웃 / 체크인을 위해 레이어를 잠그고 있습니다. 내가 원하는 것은 찾은 도구 / 스크립트를 실행하는 것입니다 이러한 곡선과 그 이후의 Densify, 그러나 만약 당신이 진실한 아크만 터치한다는 것을 말하는 것이면, 나는 모든 기능을 점검 할 수 있지만, ET geotools보다 더 밀도를 높이는 편집 툴이 있습니다
jonaktiv

이 답변 gis.stackexchange.com/a/37082/2969 는 직선을 추출하려고 시도하지만 전체 레이어에서 직선을 빼서 곡선을 추출 할 수 있으므로 전체 데이터를 건드리지 않고 곡선을 찾을 수 있습니다. 그러나 ET geotools가 어떻게 작동하는지 전혀 모른다.
geogeek

@geogeek이 링크하는 Densify 도구 인 jonaktiv는 ET GeoWizard의 일부가 아닌 ArcEditor 또는 ArcInfo 라이센스로 사용할 수있는 핵심 ArcGIS 도구입니다.
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;
}

이 편집 스크립트입니까? 이 코드를 어떻게 아크 맵에 넣을까요? 코드는 어떻게 작동하고, beizercurves를 찾거나 내가 찾은 (선택한) 것을
조밀하게 만드는가

C #입니다. c # (또는 .net 사용자 정의)에 아직 익숙하지 않은 경우 누군가에게 python과 동등한 것을 쓰도록 요청할 수 있습니다. 이 코드를 사용하려면 Visual Studio에서 코드를 컴파일해야합니다. 현재 편집 대상 레이어에서 비선형 세그먼트가있는 모든 폴리 라인 (또는 폴리곤)을 선택합니다.
Kirk Kuykendall

@jonaktiv 9.3.1을 사용하는 경우 계산기 스크립트에서 VBA를 사용하여이 작업을 수행 할 수 있습니다. 플래그 속성을 계산 한 다음 플래그가있는 기능을 선택하십시오. 8.3을 사용하는 경우 실제로 필드 계산기를 사용하여 형상을 업데이트 할 수 있으며 플래그 속성이 필요하지 않습니다.
Kirk Kuykendall

훌륭한! 매우 감사합니다. 불가능한 일이었습니다.
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 "Analysis"갤러리에서 " True Curve 식별 "이라는 모델을 다운로드 할 수 있습니다 .


모두 감사합니다. 너무 큽니다. 우리는 arcgis 9.3.1을 가지고 있지만 개인용 컴퓨터에서 테스트 할 것입니다. 편집 : 그것은 매우 좋은 도구이지만 충분히 빠르지는 않습니다. 진정한 아크로 내 특징을 체크 아웃 한 다음 치밀화하십시오 (et geotools보다 더 많은 치밀화 도구가 있습니까? Et getools를 원하지 않는 이유는 대상 레이어를 변경해야하기 때문에 10 개의 다른 레이어를 고밀도화 할 것입니다.
jonaktiv
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.