FAQ
測地線バッファーを作成する方法

ナレッジ番号:5576 | 登録日:2023/07/27 | 更新日:2024/11/21

概要

ITopologicalOperator::Buffer メソッドを使用したバッファーでは座標系の距離単位に応じたユークリッドなバッファーが作成する方法をご紹介いたします。

Image

サンプル コード

このサンプルでは、選択したポイント フィーチャから距離をメートル単位に設定した測地線バッファーを実行します。また、座標系の距離単位に依存しないよう、指定した距離でバッファーを作成するには、測地線距離に基づく IBufferConstruction::ConstructBuffers メソッドを使用しています。

using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.ArcMapUI;
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;


protected override void OnClick()
{
   // 空間参照オブジェクトの取得
   Type t = Type.GetTypeFromProgID("esriGeometry.SpatialReferenceEnvironment");
   System.Object obj = Activator.CreateInstance(t);
   ISpatialReferenceFactory pSpatialReferenceFactory = (ISpatialReferenceFactory)obj;
   IProjectedCoordinateSystem pProjectedCoordinateSystem = pSpatialReferenceFactory.CreateProjectedCoordinateSystem((int)esriSRProjCS4Type.esriSRProjCS_JGD2000_Japan_Zone_9);

   // 選択フィーチャの取得
   IMap pMap = ArcMap.Document.FocusMap;
   IEnumFeature pEenumFeature = (IEnumFeature)pMap.FeatureSelection;
   pEenumFeature.Reset();
   IFeature pFeature = pEenumFeature.Next();

   // 選択フィーチャのジオメトリを取得するために GeometryBag オブジェクトを取得
   IGeometryCollection pPointColl = new GeometryBagClass();

   // GeometryBag オブジェクトに空間参照を設定
   IGeometry pGeometry = (IGeometry)pPointColl;
   pGeometry.SpatialReference = pMap.SpatialReference;

   // 出力バッファーを格納するための空の GeometryBag オブジェクトを取得
   IGeometryCollection pOutputGeoColl = new GeometryBagClass();

   // 選択フィーチャからジオメトリを取得して GeometryBag オブジェクトに追加
   while (pFeature != null)
   {
      IGeometry pPoint = (IGeometry)pFeature.ShapeCopy;
      object g_missing = Type.Missing;
      pPointColl.AddGeometry((IPoint)pPoint, ref g_missing, ref g_missing);
      pFeature = pEenumFeature.Next();
   }

   // 測地線バッファーを実行するための BufferConstraction オブジェクトを取得
   IBufferConstruction pBufferConstruction = new BufferConstructionClass();

   // 測地線バッファーを実行するためのプロパティ(距離単位、測地線バッファーの有効化、オーバーラップの許可)を設定
   IBufferConstructionProperties2 pBufferConstructionProperties = (IBufferConstructionProperties2)pBufferConstruction;
   pBufferConstructionProperties.Unit = pProjectedCoordinateSystem.CoordinateUnit;
   pBufferConstructionProperties.UseGeodesicBuffering = true;
   pBufferConstructionProperties.UnionOverlappingBuffers = true;

   // GeometryBag オブジェトを IEnumGeometry 型にキャスト
   IEnumGeometry pEnumGeometry = (IEnumGeometry)pPointColl;
   pEnumGeometry.Reset();

   // 測地線バッファーの実行
   double distance = 10000;
   pBufferConstruction.ConstructBuffers(pEnumGeometry, distance, pOutputGeoColl);

   // 出力バッファーをグラフィック エレメントで作成
   IGraphicsContainer pGraphicsContainer = (IGraphicsContainer)pMap;
   pGraphicsContainer.DeleteAllElements();

   // 各フィーチャに対して操作
   for (int i = 0; i < pOutputGeoColl.GeometryCount; i++)
   {
      // フィーチャ ジオメトリを取得
      IPolygon pPolygon = (IPolygon)pOutputGeoColl.get_Geometry(i);
      IElement pElement = new PolygonElementClass();
      pElement.Geometry = pPolygon;

      // エレメントをグラフィックコンテナーに追加
      pGraphicsContainer.AddElement(pElement, 0);                  
   }
}
Imports ESRI.ArcGIS.Geometry
Imports ESRI.ArcGIS.Geodatabase
Imports ESRI.ArcGIS.Carto
Imports ESRI.ArcGIS.ArcMapUI

Protected Overrides Sub OnClick()
   ' 空間参照オブジェクトの取得
   Dim t As Type = System.Type.GetTypeFromProgID("esriGeometry.SpatialReferenceEnvironment")
   Dim obj As System.Object = Activator.CreateInstance(t)
   Dim pSpatialReferenceFactory As ISpatialReferenceFactory = CType(obj, ISpatialReferenceFactory)
   Dim pProjectedCoordinateSystem As IProjectedCoordinateSystem = pSpatialReferenceFactory.CreateProjectedCoordinateSystem(esriSRProjCS4Type.esriSRProjCS_JGD2000_Japan_Zone_9)

   ' 選択フィーチャの取得
   Dim pMap As IMap = My.ArcMap.Document.FocusMap
   Dim pEenumFeature As IEnumFeature = CType(pMap.FeatureSelection, IEnumFeature)
   pEenumFeature.Reset()
   Dim pFeature As IFeature = pEenumFeature.Next()

   ' 選択フィーチャのジオメトリを取得するために GeometryBag オブジェクトを取得
   Dim pPointColl As IGeometryCollection = New GeometryBagClass()

   ' GeometryBag オブジェクトに空間参照を設定
   Dim pGeometry As IGeometry = CType(pPointColl, IGeometry)
   pGeometry.SpatialReference = pMap.SpatialReference

   ' 出力バッファを格納するための空の GeometryBag オブジェクトを取得
   Dim pOutputGeoColl As IGeometryCollection = New GeometryBagClass()

   ' 選択フィーチャからジオメトリを取得して GeometryBag オブジェクトに追加
   While Not pFeature Is Nothing
      Dim pPoint As IGeometry = CType(pFeature.ShapeCopy, IGeometry)
      Dim g_missing As Object = Type.Missing
      pPointColl.AddGeometry(pPoint, g_missing, g_missing)
      pFeature = pEenumFeature.Next()
   End While

   ' 測地線バッファを実行するための BufferConstraction オブジェクトを取得
   Dim pBufferConstruction As IBufferConstruction = New BufferConstructionClass()

   ' 測地線バッファを実行するためのプロパティ(距離単位、測地線バッファの有効化、オーバーラップの許可)を設定
   Dim pBufferConstructionProperties As IBufferConstructionProperties2 = CType(pBufferConstruction, IBufferConstructionProperties2)
   pBufferConstructionProperties.Unit = pProjectedCoordinateSystem.CoordinateUnit
   pBufferConstructionProperties.UseGeodesicBuffering = True
   pBufferConstructionProperties.UnionOverlappingBuffers = True

   ' GeometryBag オブジェトを IEnumGeometry 型にキャスト
   Dim pEnumGeometry As IEnumGeometry = CType(pPointColl, IEnumGeometry)
   pEnumGeometry.Reset()

   ' 測地線バッファの実行
   Dim distance As Double = 10000
   pBufferConstruction.ConstructBuffers(pEnumGeometry, distance, pOutputGeoColl)

   ' 出力バッファをグラフィック エレメントで作成
   Dim pGraphicsContainer As IGraphicsContainer = CType(pMap, IGraphicsContainer)
   pGraphicsContainer.DeleteAllElements()

   ' 各フィーチャに対して操作
   For i As Integer = 0 To pOutputGeoColl.GeometryCount - 1
      ' フィーチャ ジオメトリを取得
      Dim pPolygon As IPolygon = CType(pOutputGeoColl.Geometry(i), IPolygon)
      Dim pElement As IElement = New PolygonElementClass()
      pElement.Geometry = pPolygon

      'エレメントをグラフィックコンテナに追加
      pGraphicsContainer.AddElement(pElement, 0)
   Next

   ' アクティブビューのリフレッシュ
   My.ArcMap.Document.ActiveView.Refresh()
   
End Sub

免責事項

★関連ナレッジがみつかりませんでした★こちらをご参照ください。

メタデータ

機能

種類

製品