라벨이 C#인 게시물 표시

[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]레이어 라벨 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...

[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:...

[ArcObjects]ArcSDE Connection 정보 저장…

>> ArcObjects로 프로젝트를 진행하던 도중.. FeatureClass나 Table의 정보를 저장하였다가 불러와서 사용해야 하는 기능이 있었다. 로컬 ShapeFile이나 Personal GDB, File GDB의 경우에는 파일의 Path를 저장하여 나중에 해당 Path로 WorkSpace를 잡아주면 되는데… 문제는 SDE상에 올라가 있는 DataSet이다. >> SDE에 올라가있는 데이터의 경우에 필요한 것이 서버정보(IP), 인스턴스(esri_sde), USER, PASSWORD 인데.. 다른건 모두 저장하면 되는데.. 문제는.. PassWord 였다.. 사용자에게 입력받기도 그렇고.. 그렇다고 매번 데이터를 사용할때 마다 PassWord를 입력받기도 그렇고.. >> 일단 다음 코드로 SDE WorkSpace의 ConnectionString을 보았다. 1: IDataset pWSDataSet = (IDataset)pDestDS.Workspace; 2: IWorkspaceName2 pWorkspaceName = (IWorkspaceName2)pWSDataSet.FullName; 3:   4: string sConStr = pWorkspaceName.ConnectionString; >> 결과는 다음과 같다. ENCRYPTED_PASSWORD=0002c45e2fbea2776344f09010b76e10bc831a5900;SERVER=192.xxx.xxx.xxx;INSTANCE=esri_sde;USER=kopss_ws;VERSION=SDE.DEFAULT;AUTHENTICATION_MODE=DBMS >> ENCRYPTED_PASSWORD : 사용자가 입력한 PassWord 를 암호화 하여 저장하고 있다. >> 구글링 및 EDN을 뒤져봤지만 Arc에서 암호화된 값을 복호화하는 방법은 찾을 수 없었다. >> 결국 SD...