2012년 12월 24일 월요일
[uDig] Locale & Character Set Support for Korean
▣ 메뉴 영문/한글 변경
※ 영문 : Windows -> Preferences 메뉴를 실행 후 General -> Runtime preferences 탭으로 이동하여 Locale for user interface를 ko로 선택 후 탭 중간의 Restart with the above settings 버튼을 실행하여 재시작
※ 한글 : 창 -> 환경설정 실행 후 일반 -> Runtime preferences 탭으로 이동하여 Locale for user interface를 ko로 선택 후 탭 중간의 Restart with the above settings 버튼을 실행하여 재시작
※ 이 외에도 Runtime preferences 탭에서는 자바 힙 메모리를 설정하거나 기본 Workspace(환경설정, 프로젝트, 지도 레이어 정보 등이 저장되는 작업공간)를 변경할 수 도 있음.
▣ Shapefile 등 데이터 소스의 인코딩 문제
※ 영문 : Windows -> Preferences 메뉴를 실행 후 General -> uDig UI 탭에서 Default Character Set을 x-windows-949로 설정 후 재시작
※ 한글 : 창 -> 환경설정 실행 후 일반 -> uDig UI 탭에서 디폴트 케렉터 셋트를 x-windows-949로 설정 후 재시작
※ 만약 파일 데이터 소스의 경우 한글이 깨진 경우 카탈로그 뷰에서 모두 제거 후 케렉터셋 설정하고 다시 불러오면 됨
▣ Ubuntu 12.04 LTS 버전에서 shapefile을 불러온 모습
2012년 12월 18일 화요일
프로그램 언어(또는 스크립트)를 배워야 하는 이유
▣ 도구 및 기간
- 프로그램 도구: eclipse + open source libraries
- 소요기간: 프로그래밍 하루, DB 생성시간 1시간.
- 절차: 센터라인 추출 --> 센터라인의 중심점을 기준으로 양방향으로 일정간격으로 세그멘테이션 --> 속성정보 쿼리 및 갱신
▣ DB 구축 제약사항
- 약 3,000개의 실폭 도로구간이 있으며, 다음의 규칙에 따라 작업할 것
1. 도로의 종류에 따라 60 또는 100미터 간격으로 섹터를 구분
2. 각 섹터별로 섹터 중심점 x, y좌표값 및 고유번호(키 + 일련번호)를 생성
3. 도로 정보 및 행정구역 코드는 특정 레이어를 검색하여 가져올 것
원본 도로구간 |
섹터 구분 결과 |
속성정보 |
2012년 12월 14일 금요일
Polar Grids 만들기
- GXT Online: GXT Toolbox for uDig
▣ Polar Grid from Geometry
다음 화면은 위 그림에서 3번째 polar grids를 생성하는 옵션이다.
- Number of sides가 8 이므로 360/8 = 45도 간격으로 생성.
- Radius 옵션은 100미터 간격으로 1km까지 즉 10개의 링을 구성.
- Radius 옵션에 1000 과 같은 단일 값을 입력하면 위 그림에서 1번째 polar grids를 생성. - Radial Type이 BASE 이면 위 그림에서 2번째 polar grids를 생성.
- Number of sides가 16이면 위 그림에서 4번째 polar grids를 생성.
▣ Polar Grid from FeatureCollection
다음 화면은 레이어(FeatureCollection)로부터 polar grids를 생성하는 옵션이다.
▣ 활용 사례
- 생성 후 Point In Polygon(Spatial Join) 분석 등을 이용하여 포인트의 패턴 분석
도시재생사업에 따른 저소득층의 이주패턴 및 정착방안 연구 |
- GIS - Stack Exchange: Polar grids in ArcGIS
- 임은선 외. 2009. 도시재생사업에 따른 저소득층의 이주패턴 및 정착방안 연구. 경기: 국토연구원
2012년 12월 12일 수요일
Clipping Contest 후기
바로 대용량 데이터 Clipping Contest!
다양한 상업 및 오픈소스 GIS 프로그램들이 참여(?)했으며, 수많은 댓글이 달렸다.
자세한 내용은 아래 참조 사이트들을 방문해 보면 된다.
ESRI의 경우 이에 이의(?)를 제기하고 10.1 버전에 반영하겠다고도 하니 집단 지성의 힘은 참으로 대단하다.
▣ 샘플 데이타 개요
- Contours20Ft : 52,521개로 구성된 등고선 라인 데이터
- StudyArea1MileBuffer : 938개의 버텍스로 구성된 단일 폴리곤 데이터
▣ 정리
- GIS엔진에서 Clip 성능에 영향을 주는 요인들
: Spatial Indexing
: Geometry Engine & Robustness
: Spatial Data I/O
: Clip 전략 및 방법
- 주요 Geometry(Topology) Engine들
: Open Source Java 계열: JTS Topology Suite(GeoTools/uDig/gvSIG...)
: Open Source C 계열: GEOS, 자체(GRASS 등)
: 상용: ESRI(ArcGIS Topology Engine), 기타 자체 엔진
- JTS Topology Suite/GEOS는 이미 충분히 검증됨
- Clip function에 대한 이해
: 다음과 같이 1개 이상 피쳐로 구성된 원본데이터(위 샘플데이터에 의하면 등고선), 여러개의 폴리곤 피쳐로 구성된 클립 영역 데이터가 있다고 가정하자.
: ArcGIS의 경우에는 아래 그림의 왼쪽과 같이 한 개의 라인이 생성
: 몇몇 GIS 프로그램에서는 아래 그림의 오른쪽과 같이 한개 이상의 라인이 생성
: 판단은 각자가 알아서 하시길.
▣ 그렇다면 망고시스템의 GXT Engine은?
- GXT Engine 시 JTS/GeoTools 기반하에 운영되므로 위 jgrasstools & uDig 벤치마킹과 크게 다르지 않다. 또한, 위 [Clip function에 대한 이해]의 그림으로 본다면 ArcGIS 방식을 따른다. 데이터 로딩 시간 약 1분, Clipping 시간 2(1:50 +- 10)분 소요되며, 실제 Clip된 데이터의 사이즈는 약 346MB 이다.
GXT의 경우 Shapefile을 쓸 때, GeoTools(대용량의 데이터를 저장하는 경우 문제가 있음)를 확장하여 사용한다.
* Hardware
* Software
- GXT 1.0.0
▣ Clipping Contest Reference
- Round 2 in which ArcGIS throws in the towel.
- ArcGIS vs QGIS etc Clipping Contest Rematch revisited
- GIS clipping benchmark: jgrasstools & uDig (on JTS & geotools)
- Benchmark contest data set: 878MB ZIP file (ContourClipTest.zip)
2012년 11월 28일 수요일
Creating O-D flow maps with GeoServer
이전 포스팅[[Cartography]Flow Map Renderer]에서 ArcGIS for Desktop - ArcMap 기반의 O-D Flow Map 렌더러를 구현한 적이 있다.
GeoTools의 Filter Function을 확장하여 GeoServer에서 SLD Style로 설정하여 사용이 가능하다.
Filter Function의 경우 ArcGIS 렌더러와는 다르게 지도의 축척이나 크기를 알 수 없어, geometry필드, value 필드, 최소값, 최대값, 최대크기, 유형을 파라미터로 입력받아 처리할 수 있도록 하였다.
축척변경에 따른 크기조정이 불가능하나, WPS Process 및 Rendering Transformations 을 이용하면 가능할 듯하다.
다음은 GeoServer Web Administration 페이지에서 OpenLayers로 미리보기 한 샘플이다.
▣ Arrow
▣ Circle
▣ SLD 예 - Function = odflowmap
다음은 위에서 사용된 라인레이어의 SLD 파일 예이다.
<?xml version="1.0" encoding="utf-8"?> <StyledLayerDescriptor version="1.0.0" ..../1.0.0/StyledLayerDescriptor.xsd"> <NamedLayer> <Name>OD Flow Map</Name> <UserStyle> <Name>OD Flow Map</Name> <FeatureTypeStyle> <Rule> <ogc:Filter> <ogc:And> <ogc:PropertyIsGreaterThanOrEqualTo> <ogc:PropertyName>O_D</ogc:PropertyName> <ogc:Literal>1000</ogc:Literal> </ogc:PropertyIsGreaterThanOrEqualTo> <ogc:PropertyIsEqualTo> <ogc:PropertyName>ADM_CODE_O</ogc:PropertyName> <ogc:Literal>11680</ogc:Literal> </ogc:PropertyIsEqualTo> </ogc:And> </ogc:Filter> <PolygonSymbolizer> <Geometry> <ogc:Function name="odflowmap"> <ogc:PropertyName>the_geom</ogc:PropertyName> <ogc:PropertyName>O_D</ogc:PropertyName> <ogc:Literal>1000</ogc:Literal> <ogc:Literal>8000</ogc:Literal> <ogc:Literal>2500</ogc:Literal> <ogc:Literal>Arrow</ogc:Literal> </ogc:Function> </Geometry> <Fill> <CssParameter name="fill">#FF0000</CssParameter> <CssParameter name="fill-opacity">0.9</CssParameter> </Fill> <Stroke> <CssParameter name="stroke">#FFFFFF</CssParameter> <CssParameter name="stroke-width">0.1</CssParameter> <CssParameter name="fill-opacity">0.1</CssParameter> </Stroke> </PolygonSymbolizer> <LineSymbolizer> <Stroke> <CssParameter name="stroke">#FF0000</CssParameter> <CssParameter name="stroke-width">0.2</CssParameter> <CssParameter name="fill-opacity">0.9</CssParameter> </Stroke> </LineSymbolizer> <TextSymbolizer> <Label> <ogc:PropertyName>O_D</ogc:PropertyName> </Label> <LabelPlacement> <LinePlacement /> </LabelPlacement> <Halo> <Radius>1.5</Radius> <Fill> <CssParameter name="fill">#FFFFFF</CssParameter> </Fill> </Halo> <Fill> <CssParameter name="fill">#0000FF</CssParameter> </Fill> <Font> <CssParameter name="font-family">Arial</CssParameter> <CssParameter name="font-size">10</CssParameter> <CssParameter name="font-style">normal</CssParameter> <CssParameter name="font-weight">bold</CssParameter> </Font> <VendorOption name="followLine">true</VendorOption> <VendorOption name="maxAngleDelta">90</VendorOption> <VendorOption name="maxDisplacement">400</VendorOption> </TextSymbolizer> </Rule> </FeatureTypeStyle> </UserStyle> </NamedLayer> </StyledLayerDescriptor>
▣ Download sample data sets & libraries
- FlowMapforGeoServer.zip
2012년 11월 19일 월요일
[uDig] Altibase Catalog Plugin 확장
○ 테스트환경 : uDig 1.3.2 + GeoTools 8.x + Altibase 5.5.1.0.3
○ 사용법
레이어 메뉴의 [추가...]메뉴를 실행 후 Altibase 데이터베이스 선택 |
서버 접속을 위한 연결정보 입력 또는 기존연결 선택 |
지도에 추가할 레이어 선택 후 완료 |
지도에 레이어 추가, 카탈로그 등록, 테이블 속성 확인 등 |
○ 파일 기반의 GeoTools DataStore들의 uDig Catalog 플러그인 제작
○ 국토지리정보원 NGI Ascii Format DataStore
uDig에서 국토지리정보원 NGI 데이터셋 배치 변환 |
○ ESRI Personal Geodatabase(9.x, 10.x 지원) DataStore
uDig에서 ESRI Personal Geodatabase의 배치 변환 |
2012년 10월 18일 목요일
FOSS4G Korea 2012 망고시스템 발표자료
망고시스템 김기웅, 이한진, 유건우 님이 발표해 주셨습니다
1. Open Source를 이용한 상용 GeoProcessing Engine 구현
2. OGC 표준 서비스를 이용한 Web KOPSS 구현사례
2012년 9월 26일 수요일
FOSS4G Korea 2012 Program
2012년 9월 19일 수요일
[uDig] GeoProcessing Plugin Ⅰ
uDig 은 Java 로 만들어진 Eclipse Rich Client (RCP) 기반의 데스크탑 GIS 프로그램이다. 이미 세종대학교 지구정보공학과에서 몇년 전에 한글화를 진행했었고, uDig은 Spatial Toolbox View 라고 알려진 분석기능이 탑재된 플러그인이 있다.
□ 테스트 환경
- uDig 1.3.1 및 uDig 1.3.2
- 분석 프로세스 : 지도의 레이어와 상호작용 가능한 프로세스 및 GeoTools 프로세스들
□ 플러그인
- Spatial Toolbox와 같은 분석 트리 구조로 구성
- 프로세스의 Input/Output 파라미터 메타 정보를 이용하여 UI 자동 구성
한글화 버전 |
영문버전 |
- Feautre 및 Raster Layer는 콤보박스로 선택
- Bounding box는 아래 그림처럼 xmin, ymin, xmax, ymax 및 crs를 선택하거나 현재 지도의 범위를 가져올 수 있도록 함
- Enum 타입을 파라미터로 사용하는 경우 enum constant를 콤보박스에서 선택
- 좌표체계의 경우 uDig의 좌표체계 선택 윈도우를 활용
- Boolean 타입을 파라미터로 사용하는 경우 체크박스 사용
- 분석결과가 Feature 또는 Raster일 경우 자동으로 지도에 추가
- Mandatory 파라미터 확인
□ 여러가지 분석기능들
□ 래스터 분석기능들
□ 개선사항
- 현재 파라미터 메타정보로 표현이 불가능한 규칙이 있어 확장.
- 분석결과가 레이어가 아닌 경우 현재처럼 텍스트박스에 표시하는 것보다 더 확장하여 HTML 로 표현
□ Reference
- http://udig.refractions.net/
- http://wiki.eclipse.org/index.php/Rich_Client_Platform
- http://udig.refractions.net/confluence/display/EN/Introduction+to+the+Spatial+Toolbox
2012년 8월 29일 수요일
FOSS4G Korea 2012 발표 요청 - FOSS4G Korea 2012 Call For Presentations
2012년 8월 25일 토요일
PostGIS - National Education Center for GIS
샘플데이터셋 및 QGIS, GeoServer, OpenLayers 강의자료는 http://www.osgeo.kr/78 에서 받으실 수 있습니다.
2012년 8월 17일 금요일
Raster Transformation - Rotate
Rotate 45˚ |
- Rotation is, by default, around the lower left corner of the raster.
- The rotation point can be changed with the optional Anchor Point parameter.
- Resampling is only done if the angle is not a multiple of 90.
- The rotation angle specified must be between 0 and 360
- The dataset will be rotated clockwise.
Rotate 45˚(Orange) vs 315˚(Magenta) |
- rotate image
- recalculate extent
* Reference : http://resources.arcgis.com/en/help/main/10.1/#/Rotate/00170000007s000000/
2012년 8월 9일 목요일
2012년 6월 13일 수요일
[ArcGIS] ArcGIS 버전별 필요한 .NET Framework
- ArcGIS의 .NET Support를 사용하기 위해 버전별 필요한 .NET Framework 버전입니다.
- ArcGIS를 신규로 설치하거나 [추가/제거]를 실행할 때 해당 PC에 버전에 맞는 .NET Framework이 설치되어 있지 않으면 설치 목록에 [.NET Support] 항목이 누락됩니다.
• ArcGIS 9.1 - .NET Framework 1.1
• ArcGIS 9.2 - .NET Framework 2.0 or 3.0
• ArcGIS 9.3 - .NET Framework 2.0 or 3.0
• ArcGIS 10.0 - .NET Framework 3.5 SP1
- [.NET Support] 가 설치된 경우에는 ArcGIS 설치 폴더에 DotNet 폴더가 생성됩니다.
2012년 4월 24일 화요일
[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: if (pDestFc == null) return false;
4:
5: try
6: {
7: bool bSucc = false;
8:
9: //추가할 FeatureClass Parameter 생성
10: IVariantArray pArray = new VarArrayClass();
11: pArray.Add(pDestFc);
12:
13: //Geoprocessor선언
14: Geoprocessor pGP = new ESRI.ArcGIS.Geoprocessor.Geoprocessor();
15:
16: //Defualt Spatial Index 계산
17: //CalculateDefaultGridIndex_management (in_features)
18: IGeoProcessorResult pResult = (IGeoProcessorResult)pGP.Execute
19: ("CalculateDefaultGridIndex", pArray, null);
20:
21: if (pResult.Status == esriJobStatus.esriJobSucceeded) //계산성공
22: {
23: //결과 String은.. "Grid1;Grid2;Grid3" 형태로 반환한다.
24: string sGridIdxValue = pResult.ReturnValue.ToString();
25:
26: string[] arrGridValue = sGridIdxValue.Split(';');
27:
28: string sGrid1 = arrGridValue[0].Trim();
29: string sGrid2 = arrGridValue[1].Trim();
30: string sGrid3 = arrGridValue[2].Trim();
31:
32: //기존 SpatialIndex 삭제
33: //RemoveSpatialIndex_management (in_features)
34: pResult = (IGeoProcessorResult)pGP.Execute
35: ("RemoveSpatialIndex", pArray, null);
36:
37: if (pResult.Status == esriJobStatus.esriJobSucceeded)
38: {
39: //새롭게 계산된 Spatial Index 추가
40: //AddSpatialIndex_management (in_features, g1, g2, g3)
41: pArray.Add(sGrid1);
42: pArray.Add(sGrid2);
43: pArray.Add(sGrid3);
44:
45: pResult = (IGeoProcessorResult)pGP.Execute
46: ("AddSpatialIndex", pArray, null);
47:
48: if (pResult.Status == esriJobStatus.esriJobSucceeded)
49: {
50: bSucc = true;
51: }
52: }
53: }
54:
55: System.Runtime.InteropServices.Marshal.ReleaseComObject(pResult);
56: System.Runtime.InteropServices.Marshal.ReleaseComObject(pArray);
57:
58: pResult = null;
59: pGP = null;
60: pArray = null;
61:
62: return bSucc;
63: }
64: catch (Exception Ex)
65: {
66: return false;
67: }
68: }