2011년 8월 22일 월요일

[ArcObjects] Join Data & Export Layer Code Snippet

레이어와 속성테이블간의 조인 후 데이터 내보내기 코드 샘플입니다.

일반적으로 ArcMap에서 위와 같이 테이블 조인 후 레이어 내보내기를 하려면 아래와 같이 3 단계를 그치면 됩니다.

▣ ArcGIS for Desktop - ArcMap
1. Join Data

2. Export Data
3. Remove joins

▣ Custom Interface
위 3 단계를 다음과 같은 인터페이스를 만들어 조인 후 데이터 저장하는 기능을 한번에 제공할 수도 있습니다.


▣ C# Custom Code
 레이어와 테이블간 조인 후 내보내기하는 코드는 아래와 같습니다. 아래 코드는 ESRI.ArcGIS.GeoDatabaseUI의 IExportOperation 인터페이스를 사용하므로 ArcGIS Desktop에서만 사용가능합니다.

 - 주요 인터페이스
 : IMemoryRelationshipClassFactory , IDisplayRelationshipClass, IExportOperation

using System;

using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.GeoDatabaseUI;
using ESRI.ArcGIS.Carto;
using GeoSpatial.ArcGIS.Core;

namespace ArcGIS.Utility
{
    class JoinExporter
    {
        public IFeatureClass ExportJoinLayer(IFeatureLayer featureLayer, String primaryKey, ITable joinTable, String foreignKey,
            esriRelCardinality relCardinality, IWorkspace outputWorkspace, String outputName)
        {
            IDisplayTable dispTable = (IDisplayTable)featureLayer;

            // opens the memory relationship class specified by the given properties.
            IMemoryRelationshipClassFactory mrClassFactory = new MemoryRelationshipClassFactoryClass();
            IRelationshipClass relClass = mrClassFactory.Open(outputName, (IObjectClass)dispTable.DisplayTable, primaryKey,
                (IObjectClass)joinTable, foreignKey, "Forwards", "Backwards", relCardinality);

            // sets a join based on the specified relationship class and join type.
            IDisplayRelationshipClass distpRC = (IDisplayRelationshipClass)featureLayer;
            distpRC.DisplayRelationshipClass(relClass, esriJoinType.esriLeftOuterJoin);

            // prepare export
            IDataset inuptDataset = (IDataset)dispTable.DisplayTable;
            IDatasetName inputDatasetName = (IDatasetName)inuptDataset.FullName;

            // exports the given feature class to a new feature class.
            IExportOperation exportOperation = new ExportOperationClass();

            // 1. defaults
            IDataset wsDataset = (IDataset)outputWorkspace;
            IFeatureClassName outputFClassName = new FeatureClassNameClass();
            IDatasetName outputDatasetName = (IDatasetName)outputFClassName;
            outputDatasetName.Name = outputName;
            outputDatasetName.WorkspaceName = (IWorkspaceName)wsDataset.FullName;

            // 2. 위 그림의 Export Data 윈도우를 사용
            // bool saveProjection;
            // esriExportTableOptions option;
            // outputDatasetName = exportOperation.GetOptions((IFeatureClass)dispTable.DisplayTable, srcFeatureLayer.Name,
            //    false, true, 0, out saveProjection, out option);

            exportOperation.ExportFeatureClass(inputDatasetName, null, null, null, outputFClassName, 0);

            // finally removes the specified memory relationship class from a standalone table or layer.
            IRelationshipClassCollectionEdit relClassEdit = (IRelationshipClassCollectionEdit)featureLayer;
            relClassEdit.RemoveAllRelationshipClasses();

            // open featureclass
            if (outputFClassName != null)
            {
                IName outputFcName = (IName)outputFClassName;
                return outputFcName.Open() as IFeatureClass;
            }

            return null;
        }
    }
}

2011년 8월 21일 일요일

[foursquare] 2011/08/03 기준 서울/경기 지하철역별 체크인 현황

서울/경기 지하철역별 체크인 순위지도 및 표입니다.
 - [foursquare] 2011/03/04 기준 서울/경기 지하철역별 체크인 순위 지도 및 표

▣ 개요
2011년 8월 3일 기준 서울/경기지역 지하철역별 포스퀘어 체크인 현황입니다.

지도는 오픈소스를 활용해 제작했습니다.
 - PostGIS, GeoServer, GeoExt(ExtJS + OpenLayers)

▣ Excel 파일
 - 2011년 3월 4일과 8월 3일 체크인 현황
 - foursquare_korea_station_checkins_20110803.xlsx

▣ 체크인 순위 20위
 - 2011/03/04

 - 2011/08/03

▣ 역별 체크인 2011/03/04

▣ 역별 체크인 2011/08/03

2011년 8월 8일 월요일

[Tips]ArcToolbox Identity, Intersect Analysis

일반적으로 중첩분석(Overlay Analysis)은 2개 이상의 폴리곤 레이어를 사용합니다. 하지만 조금만 더 응용을 하면 아래와 같은 작업도 가능합니다.

■ 미션
철도 라인데이터와 시군구 행정경계 폴리곤 데이터가 있습니다.
사용자는 철도 라인데이터를 시군구 행정경계별로 잘라내고 ,시군구 행정경계 속성정보를 잘라낸 철도라인 데이터에 계산을 하고자 합니다. 부가적으로 잘라낸 철도 라인데이터 필드에는 시군구별 철도 연장을 계산해야 합니다.

○ 철도 및 행정경계 공간데이터
○ 철도 속성테이블
○ 행정경계 속성테이블

■ ArcGIS Desktop에서 처리하기
○ Identity를 사용하는 경우
Identity 도구를 사용하면 시군구 경계와 Overlay 되지 않는 라인 부분도 남습니다.
Input Features는 Point, Line, Polygon 모두 사용가능하지만 Identity Features는 반드시 폴리곤이어야 합니다.

○ Intersect를 사용하는 경우
Intersect 도구를 사용하면 시군구 경계외 Overlay 되지 않는 라인 부분은 잘려나갑니다.
Input Features는 Point, Line, Polygon 모두 사용가능하며 Output Type을 선택할 수 있습니다. Output Type을 Input으로 선택하면 Input Features 들 중 차원이 가장 낮은(Point > Line > Polygon) Features의 Geometry Type으로 Output Type이 결정됩니다.

○ Post Process - Calculate Geometry
분석결과가 Shapefile일 경우 처리된 결과의 테이블을 열어서 길이(Geometry)를 업데이트 합니다. GeoDatabase를 사용하는 경우에는 Shape_Length 필드에 자동 업데이트 됩니다.

○ ArcToolbox - Modeler
중간에 필드를 추가해야 할 수도 있습니다.

○ 결과

■ 참고
 - Identity Analysis
 - Intersect Analysis

2011년 8월 3일 수요일

[GeoServer] Styling : GeoExt Styler

GeoServer를 사용하다 보면 레이어가 많을 경우 Styling이 난감할 때가 많죠?

물론 ArcGIS Server나 GeoNURIS Desktop 등 상용제품을 사용하는 경우에는 Desktop 편집기를 사용하여 심볼 설정 후 바로 Publishing이 가능(일부 제품에 한함)합니다.

하지만 OpenSource GIS의 경우 사용자에게 친숙한 UI(시간과 비용을 많이 투자해야 하는데 쉽지가 않지요...) 기능이 현재까지는 아쉬운게 현실입니다.

아래는 GeoServer의 Extension인 GeoExt Styler의 사용법을 알아봅니다.

■ GeoExt Styler 설치
○ 참고: http://docs.geoserver.org/latest/en/user/extensions/styler.html
○ REST plugin 설치 확인
GeoExt Styler는 GeoServer REST API Extension을 사용하며, 2.1.x 버전부터는 REST plugin이 Default 패키지로 포함되어 있으므로 설치할 필요는 없습니다.

만약 2.0.x 버전을 사용한다면 다음 순서로 설치하면 됩니다.
Download page의 Other -> REST Config 항목을 선택하여 REST plugin을 다운로드 합니다.
다운로드한 파일을 GeoServer 설치 폴더의 WEB-INF/lib 폴더 아래 압축을 해제합니다.

○ GeoExt Styler 설치
GEoExt Styler는 OpenGeo Suite에서는 기본으로 제공하는 Style 편집기이며, GeoExt Styler extension을 다음 URL에서 다운로드 할 수 있습니다.
 : http://downloads.sourceforge.net/geoserver/styler-1.7.3.zip

GeoServer data directory(GEOSERVER_DATA_DIR)에 다음 그림과 같이 압축해제 합니다.

이제  GeoServer를 재시작합니다.

■ 사용법
다음의 URL로 접속합니다. : http://GEOSEVER_URL/www/styler/index.html
ex)http://localhost:8080/geoserver/www/styler/index.html

최초 접근시 geoserver에 로그온 다이얼로그가 나타나고 geoserver 계정을 입력합니다.


○ 지도가 보이지 않을 때
 GeoExt Styler는 구글맵을 BaseMap 으로 사용합니다. 혹시 지도가 안보이는 경우 다음을 참고하세요.
 styler/index.html 을 텍스트 편집기로 열고 아래 그림과 같이 구글 지도 API KEY를 새로 발급받아 사용합니다.




Layers panel에서 스타일을 편집할 레이어를 체크하면 해당 레이어의 기본 스타일과 함께 지도가 표시됩니다.

Legend panel에서는 Rule을 하나씩 추가하거나 삭제할 수 있으며 순서(상->하)대로 그려지게 됩니다. 또한 Legend panel에서 심볼을 드래그 후 상/하 순서를 변경할 수 있습니다.

편집 후 저장하면 실제 SLD가 저장되며, 저장된 파일을 확인하려면 GeoServer data directory(GEOSERVER_DATA_DIR)의 styles 폴더를 확인하면 됩니다.

물론 이 파일을 직접 편집해도 되고 GeoServer에서 제공하는 Styles 편집기능(텍스트 편집기를 이용해서 XML을 직접 수정/편집해야 함)을 활용해도 됩니다.

○ 위 편집된 고속도로 SLD 예
<?xml version="1.0" encoding="UTF-8"?>
<sld:StyledLayerDescriptor xmlns="http://www.opengis.net/sld" xmlns:sld="http://www.opengis.net/sld" xmlns:ogc="http://www.opengis.net/ogc" xmlns:gml="http://www.opengis.net/gml" version="1.0.0">
  <sld:NamedLayer>
    <sld:Name>highway</sld:Name>
    <sld:UserStyle>
      <sld:Name>highway</sld:Name>
      <sld:Title>highway</sld:Title>
      <sld:Abstract>highway</sld:Abstract>
      <sld:FeatureTypeStyle>
        <sld:Name>name</sld:Name>
        <sld:Rule>
          <sld:Name>default</sld:Name>
          <sld:Title>outline</sld:Title>
          <sld:LineSymbolizer>
            <sld:Stroke>
              <sld:CssParameter name="stroke">#898686</sld:CssParameter>
              <sld:CssParameter name="stroke-width">3</sld:CssParameter>
            </sld:Stroke>
          </sld:LineSymbolizer>
        </sld:Rule>
        <sld:Rule>
          <sld:Name>default</sld:Name>
          <sld:Title>fillcolor</sld:Title>
          <sld:LineSymbolizer>
            <sld:Stroke>
              <sld:CssParameter name="stroke">#FFAA00</sld:CssParameter>
              <sld:CssParameter name="stroke-width">2</sld:CssParameter>
            </sld:Stroke>
          </sld:LineSymbolizer>
        </sld:Rule>
      </sld:FeatureTypeStyle>
    </sld:UserStyle>
  </sld:NamedLayer>
</sld:StyledLayerDescriptor>


현재까지는 복잡한 심볼이나 폰트 설정 등은 불가능하지만 템플릿으로 정의한 후 SLD를 직접 편집할 수 있기 때문에 SLD에 익숙하지 않은 사용자들에게는 편리한 도구로 활용 될 수 있겠네요.


■ 기타 외부 Style 편집기
GeoServer의 Styles 편집기능 및 GeoExt Styler 외에도 SLD를 편집할 수 있는 Open Source 도구들이 있습니다. 아래 사이트를 참고하세요

○ AtlasStyler: http://en.geopublishing.org/AtlasStyler
 - GeoTools를 이용하며 Standalone 버전과 JavaWebStart 버전의 Style 편집기를 사용할 수 있습니다.
Shapefile, External WFS, PostGIS에 직접 접속하여 Style 편집이 가능하며 SLD 미리보기 및 내보내기 기능까지 포함되어 있습니다.


○ QGIS plugin : http://pyqgis.org/repo/contributed
 - Save As SLD : 0.2.0
 - SLD Export : 0.0.1

○ uDig: http://udig.refractions.net/