2011년 2월 26일 토요일

[ArcObjects] Creating a multipart color ramp

ArcMap 래스터 레이어에서 Multipart Color Ramp를 사용하는 Stretch Renderer를 ArcObjects를 사용하여 적용할 경우에 다음 단계를 따라하면 쉽게(?) 가능합니다.
 

▣ ArcMap Raster Stretch Renderer
▣ Style Manager - ColorRamps 
▣ MultiPart Color Ramp Properties 
3개( Red ~ Yellow, Yellow ~ Cyan, Cyan ~ Blue)의 Algorithmic Color Ramp로 구성

▣ Algorithmic Color Ramp
각 Algorithmic Color Ramp는 From Color ~ To Color로 구성 

▣ C# Code Snippet
private void AddRasterLayer()
{
      IMap targetMap = GetMap();
      IRasterLayer rasterLayer = CreateRasterLayer();

      rasterLayer.Renderer = CreateMultiPartColorRamp(rasterLayer.Raster);
      targetMap.AddLayer(rasterLayer);
}

private IRasterRenderer CreateMultiPartColorRamp(IRaster srcRaster)
{
      IRasterStretchColorRampRenderer stretchColorRamp = new RasterStretchColorRampRendererClass();
      IRasterRenderer rasterRenderer = (IRasterRenderer)stretchColorRamp;
      rasterRenderer.Raster = srcRaster;
      rasterRenderer.Update();

      // create multipart color ramp
      IMultiPartColorRamp mpColorRamp = new MultiPartColorRampClass();

      // using red, green blue index
      mpColorRamp.AddRamp(CreateAlgorithmicColorRamp(ToColor(255, 0, 0), ToColor(255, 255, 0)));
      mpColorRamp.AddRamp(CreateAlgorithmicColorRamp(ToColor(255, 255, 0), ToColor(0, 255, 255)));
      mpColorRamp.AddRamp(CreateAlgorithmicColorRamp(ToColor(0, 255, 255), ToColor(0, 0, 255)));

      // or using system color
      mpColorRamp.AddRamp(CreateAlgorithmicColorRamp(ToColor(Color.Red), ToColor(Color.Yellow)));
      mpColorRamp.AddRamp(CreateAlgorithmicColorRamp(ToColor(Color.Yellow), ToColor(Color.Cyan)));
      mpColorRamp.AddRamp(CreateAlgorithmicColorRamp(ToColor(Color.Cyan), ToColor(Color.Blue)));

      // create ramp
      mpColorRamp.Size = 255;
      bool sOK = false;
      mpColorRamp.CreateRamp(out sOK);

      stretchColorRamp.BandIndex = 0;
      stretchColorRamp.ColorRamp = mpColorRamp;

      rasterRenderer.Update();
      rasterRenderer.ResamplingType = rstResamplingTypes.RSP_BilinearInterpolation;

      return rasterRenderer;
}

private IColorRamp CreateAlgorithmicColorRamp(IColor fromColor, IColor toColor)
{
      IAlgorithmicColorRamp algColorRamp = new AlgorithmicColorRampClass();

      algColorRamp.Algorithm = esriColorRampAlgorithm.esriCIELabAlgorithm;
      algColorRamp.FromColor = fromColor;
      algColorRamp.ToColor = toColor;

      return algColorRamp;
}

private IRgbColor ToColor(int red, int green, int blue)
{
      IRgbColor rgbColor = new RgbColorClass();

      rgbColor.Red = red;
      rgbColor.Green = green;
      rgbColor.Blue = blue;
      rgbColor.UseWindowsDithering = true;

      return rgbColor;
}

private IRgbColor ToColor(System.Drawing.Color color)
{
      IRgbColor rgbColor = new RgbColorClass();

      rgbColor.RGB = System.Drawing.ColorTranslator.ToWin32(color);
      if (color == System.Drawing.Color.Transparent)
      {
          rgbColor.NullColor = true;
      }

      rgbColor.UseWindowsDithering = true;

      return rgbColor;
}

2011년 2월 17일 목요일

[foursquare]Making a Heatmap

외출도 못하고 머리도 식힐 겸 제가 foursquare를 사용하면서 체크인한 장소를 대상으로 Heatmap 서비스를 하나 만들어봤습니다.

1. 관련 라이브러리
 - DBMS: PostgreSQL 9.0 + PostGIS 1.5.2
 - Web Server: Apache Tomcat
 - GIS Library: GeoTools
 - IDE: Eclipse + Java + GeoEXT(OpenLayers)
 - Data: Foursquare API를 이용한 약 1300여개의 포인트 데이터
 - Base Map: Google Map(좌표체계: EPSG:900913)


2. 기능
 - 로그인하면 최근의 Check-in Venue ID를 기준으로 Data 수집 후 포인트를 PostgreSQL 업데이트(WGS84 경위도)
 - Heatmap Layer는 OpenLayers에서 지원하는 레이어 중 WMS(OGC Web Map Service) 레이어로 등록
 - 관심지역으로 이동하면 WMS 인터페이스(Time 포함)를 통해 Heatmap 이미지 요청
 - 관심지역의 Extent에 포함하는 체크인 데이터
 - 좌표변환(WGS84경위도 -> EPSG:900913) 및 축척별 Heatmap 생성 후 반환


3. 예
◎ 수도권
◎ 서울
◎ 안양
◎ 지방

2011년 2월 11일 금요일

[Proximity Analysis] - Euclidean Allocation

Raster 기반 Proximity Analysis 중  Euclidean Allocation 분석이 있습니다. 


이는 포인트 데이터로 Thiessen Polygon을 만드는 것과 유사한데요, 구현 과정에서 ArcGIS 결과와 달라 한참을 헤메다가 오차 부분을 해결할 수 있었네요.


우선 그림을 보시죠. 회색 선은 Thiessen Polygon을 Overlay했습니다.
이런 오차가 발생하는 원인은 무엇을까요? ArcGIS에서는 포인트를 일단 Raster로 변환 후 계산을 한답니다. ^^
When the input source data is a feature class, the source locations are converted internally to a raster before performing the Euclidean analysis. The resolution of the raster can be controlled with the Output cell size parameter.


■ ArcGIS Euclidean Allocation
■ Custom Euclidean Allocation
■ ArcGIS 알고리즘 적용 Euclidean Allocation
마지막으로 각 셀에 Feature의 ID 대신 거리값이 입력되면 바로 Euclidean Distance 분석이   됩니다.


참고: ArcGIS Proximity analysis

[Shapefile]Hexagonal Grid Dataset

Hexagonal Grid Shapefile dataset 입니다.


■ 첨부파일 : korea_hexagonal_grid.shp

■ Cell 반경 5km
■ Cell 반경 3km
■ Cell 반경 2.5km