라벨이 ArcObjects인 게시물 표시

[ArcObjects]Spatial Grid Index 계산하기..

- ArcCatalog에서 SDE로 FeatureClass(특히 Shapefile)를 업로드 할 때 Spatial Index가 모두 빠져 있는 경우가 있다. - GDB나 FGDB 라면 그냥 Copy & Paste로 데이터를 복사할 경우엔 Spatial Index가 모두 딸려와 정상적으로 생성이 되지만.. ArcCatalog의 Import나 Export 기능을 사용할 때 (Shapefile의 경우에는 Copy & Paste가 되지 않음) 난감한 경우가 있다. - ArcCatalog에서 FeatrueClass 속성 창을 보면 Spatial Index를 자동 계산해주는 버튼이 있지만 하나씩 해야 한다. 100개 이상의 레이어를 올리고 하나씩 눌러가며 계산했던 적이 있다. 헐~ - ArcToolBox > Feature Class > Calculate Default Spatial Grid Index 툴을 사용하면 계산이 가능하다. Batch로 해서 하면 되지만 해본 결과 계산은 잘되지만 적용이 잘 되지 않는 듯 하다. 속성창에는 계산된 값이 보여지는데 Preview를 하면 여전히 로드되지 않는다. - 아래 코드는 ArcObjects를 사용하여 FeatureClass의 Default Spatial Index를 계산해 주는 코드이다. - 참조된 라이브러리는 > ESRI.ArcGIS.Geoprocessor > ESRI.ArcGIS.Geoprocessing - Geoprocessor 인터페이스의  Excute 메서드를 사용하여 직접 ArcToolBox를 사용한다. - CalculateDefaultGridIndex > RemoveSpatialIndex > AddSpatialIndex   순서로 생성한다.   1: private bool CalculateDefaultSpatialIndex(IFeatureClass pDestFc) 2: { 3: i...

[ArcObjects]INeighborhoodOp.FocalStatistics…

이미지
* esriSpatialAnalyst 라이브러리의 INeighborhoodOp 인터페이스는 다양한 집계함수를 제공한다. 해당 인터페이스를 사용하기 위해서는 부가적으로 [Spatial Analyst Extension]이 필요하다. * 다양한 집계 함수들 중에 프로젝트에서는 FocalStatistics 를 사용했다. 집계할 값이 들어 있는 라스터 레이어를 특정 탐색 범위에 맞게 Sum을 수행한 결과 라스터를 필요로 했다. * FocalStatistics의 기본적인 계산과정은 다음 그림과 같다. * Block과는 다르게 Focal은 탐색영역을 Overlap 하면서 픽셀 하나하나의 값을 계산해 나간다. 그럼으로 분석에 있어서 탐색영역의 크기와 모양을 정하는 것이 키 포인트 였다. * FocalStatistics의 탐색영역은 esriGeoAnalyst라이브러리의 IRasterNeighborhood 인터페이스를 통해 다양한 모양과 크기로 정의할 수 있다. * 기본적인 탐색영역의 모양은 다음과 같다. * 이번 프로젝트의 탐색영역과 분석환경에 대한 제약사항은 다음과 같았다.    > 분석 Raster의 CellSize는 10m * 10m 으로 한다.    > 탐색영역의 모양은 원형으로 하며, 원의 지름은 총 110m로 한다.    > 원형의 탐색영역에 포함되는 Cell의 갯수는 총 101개가 되어야 한다. * ArcGIS의 ToolBox를 활용하여 반지름이 55m의 원형으로 탐색했을 경우의 탐색반경에 포함되는 Cell은 다음과 같았다. * Raster 분석에 있어서 반지름이 55m인 원을 그리고 해당 원안에 개별 Cell의 중심점이 포함 된다면 탐색범위에 포함된다고 기술문서에 나와 있었지만 실제 위 그림처럼 이해가 안가는 부분이 있다. * 결국 해답은 다음과 같았다. 바깥쪽 점선이 반지름이 55m인 원이지만 해당 선상에는 대상 Cell의 중심점이 존재하지 않는다. ...

[ArcObjects]레이어 라벨 Expression 적용하기..

이미지
- 시군구별 데이터 매칭률을 계산하고 결과를 도면에 표시하는 기능을 추가하기 위해서 개발 하던중 도면에 표시할때 시군구 명칭과 매칭률을 동시에 라벨로 표현해야 했다. - ArcMap 에서는 아래 그림과 같이 Label 속성에서 Expression을 사용해 VBScript 를 통해 다양한 라벨을 만들어 표현할 수 있다. - 이런 형식으로 라벨을 만들어 표현하기 위해서 ArcObjects에서는 아래의 방법으로 구현이 가능하다. - 주요 인터페이스     > ESRI.ArcGIS.Carto.IAnnotateLayerPropertiesCollection     > ESRI.ArcGIS.Carto.IAnnotateLayerProperties     > ESRI.ArcGIS.Carto.IAnnotationExpressionEngine     > ESRI.ArcGIS.Carto.IAnnotationExpressionParser - VBScript 라벨 생성 함수 소스 1: /// <summary> 2: /// VBScript 형식의 라벨 표현 3: /// </summary> 4: /// <param name="pFeatureLayer"></param> 5: /// <param name="sExpression"></param> 6: /// <param name="pTextSym"></param> 7: public static void SetLayerLabelByVBScriptEngine(IFeatureLayer pFeatureLayer, string sExpression, ITextSymbol pTextSym) 8: { 9: IGeoFeatureLayer pGeoFLa...

ArcGIS to SLD(Styled Layer Descriptor) 기능정의

이미지
ArcMap의 레이어를 SLD(Styled Layer Descriptor) 파일로 내보내기 위한 도구 개발 SLD 변환도구 이전글:  SLD(Styled Layer Descriptor) Converter & Editor?  참조 ▣ SLD 지원 대상  - GeoServer : SLD 1.0.0 + Vendor Option  - ArcGIS 10 + .NET C# + Custom ICommand 구현 ▣ GeoServer에서의 SLD 지원 현황  - 현재 GeoSErver에서 SLD 인코딩은 ISO-8859-1을 사용하며 utf-8로 저장 후 GeoServer Administrator 페이지에서 Style을 수정하는 경우 헤더 부분 및 한글이 깨지는 현상 발생  - 그러나 저장 후 GeoServer Data Directory의 styles 폴더에서 sld를 열고 한글 입력 후 재실행하면 작동은 함    - <?xml version="1.0" encoding="ISO-8859-1"?>    - <?xml version="1.0" encoding="utf-8"?>  - GeoServer의 Styling( http://docs.geoserver.org/stable/en/user/styling/index.html ) user guide를 분석하여 Vendor Option 등을 확인  - Arc2Earth 도구를 이용하여 각각의 렌더러 및 심볼 지원 벤치마킹    - 테스트 결과 부분적으로 GeoServer에서 오류 발생 ▣ 기능 정의  - 저장할 파일의 인코딩 선택  - Point Symbol일 경우 아이콘(ExternalGraphic, png)로 저장할 수 있는 옵션 선택  - 아이콘으로 저장할 경우 아이콘 크기 설정: 16 * 16, ...

[ArcObjects]두 FeatureClass의 XY Domain 범위 합치기..

  > 두 개의 A, B FeatureClass를 Merge하여 하나의 FeatureClass로 만드는 과정에서.. > A의 Fields를 사용하여 새로운 FeatureClass를 만들고 A와 B의 FeatureClass의 Geometry를 Insert 하는 과정에서 A의 SpatialReference에 정의된 XY Domain의 범위에서 벗어난 Geometry가 B에 존재한다면 “The coordinates or measures are out of bounds.” 이라는 오류가 발생했다. > 물런 IBasicGeoprocessor 인터페이스의 Merge 메소드를 사용하면 별 문제 없이 작업이 가능하겠지만 단순한 Merge 작업이 아닌 중간에 어떠한 프로세스가 들어간다면 어쩔 수없이 수동으로 Merge작업을 해야 한다. > 위 오류는 ArcMap에서 Edit 작업 시에도 정의된 Domain 범위 이외의 지역에 새로운 Geometry를 저장하려 할 경우 같은 오류가 발생한다. > END(ESRI Developer Network)에 따르면 XY Domain의 범위는 최초 FeatureClass가 생성될 때 지정되면 변경할 수가 없단다.. ㅜㅜ > 결국 새로운 FeatureClass의 SpatialReference를 설정할 때 A, B 두 개의 XY Domain을 비교하여 넓은 범위의 XY Domain을 찾아서 설정한 후에 작업을 진행하면 된다. > 아래 코드는 두 개의 FeatureClass의 XY Domain을 비교하여 새로운 XY Domain을 설정하는 코드이다. 1: private void RecalculateDomain(IFeatureClass pFC1, IFeatureClass pFC2, IFields pFields) 2: { 3: if (pFC1 == null ) return ; 4: if (pFC2 == null ) return ; 5:...