FAQ
ArcPy (ArcMap): 六角形のインデックス ポリゴンを作成するツール

ナレッジ番号:2720 | 登録日:2023/05/29 | 更新日:2024/11/21

概要

六角形のインデックス ポリゴンを作成するサンプル ツールをご紹介します。

入力パラメータ

  • [範囲フィーチャクラス] : フィーチャ クラス、またはフィーチャ レイヤを設定します。
  • [X 方向のポリゴン数] : X 方向に作成するポリゴン数を入力します。
  • [1 辺の長さを指定] : 1 辺の長さを入力する場合は、チェックを入れます。
  • [長さ] : [1 辺の長さを指定] のチェックを入れた場合のみ有効となります。作成する六角形の 1 辺の長さを入力します。
  • [出力フィーチャクラス]: 出力するポリゴン フィーチャクラスの場所、名前

Image

内容

[範囲フィーチャクラス] に指定した フィーチャクラス範囲に、[X 方向のポリゴン数] で指定した数の六角形ポリゴンを作成します。Y 方向へは [範囲フィーチャクラス] に指定したフィーチャクラスの範囲と [X 方向のポリゴン数] で指定したポリゴン数から 六角形ポリゴンの 1 辺の長さを計算し、[範囲フィーチャクラス] の範囲に納まるように自動でポリゴン数を決定します。

また、[1 辺の長さを指定] にチェックを入れた場合は、[X 方向のポリゴン数] に入力した数は無効となり、代わりに [長さ] に入力した値を使用して、六角形ポリゴンを作成します。X 方向、Y 方向に作成されるポリゴン数は、[範囲フィーチャクラス] に指定したフィーチャクラスの範囲と [長さ] に入力した値から自動的に計算します。

なお、[長さ] に指定する数値の単位は、[範囲フィーチャクラス] に指定しているフィーチャクラスに定義されている座標系の単位を使用します。そのため、10 進経緯度単位の座標系が定義されているフィーチャクラスを指定した場合、[長さ] には 10 進経緯度単位の値を入力する必要があります。10 進経緯度単位の座標系が定義されているフィーチャクラスをお持ちの場合は、メートル単位の座標系に変換するか、[X 方向のポリゴン数] を指定してメッシュ ポリゴンを作成することをお勧めします。

同様に、出力されるフィーチャクラスの座標系も [範囲フィーチャクラス] に指定したフィーチャクラスに定義されている座標系がそのまま使用されます。

使用手順

  1. zip ファイルをダウンロードし、任意のフォルダに解凍します。
  2. ArcMap を起動し、データを追加します。
  3. [カタログ] ウィンドウで解凍により作成されたフォルダを展開します。
  4. フォルダ内の「CreateHexa」ツールボックスを展開し、[六角形インデックス ポリゴンの作成] ツールをダブルクリックします。
  5. パラメータを入力し、ツールを実行します。

ダウンロード

六角形インデックス ポリゴンの作成

※ ans4979.zip という名前の zip ファイルがダウンロードされます。

Python ソース コード

# coding:cp932
# Purpose : 六角形 インデックス ポリゴンの作成ツール
#
# Author : ESRIジャパン

# ArcPy サイト パッケージ、math、os モジュールのインポート
import arcpy,math,os.path


# パラメータの設定
extentFC = arcpy.GetParameterAsText(0)
UseLength = arcpy.GetParameterAsText(2)
outData = arcpy.GetParameterAsText(4)

outWS = os.path.dirname(outData)
outFC = os.path.basename(outData)

# フィーチャクラスの範囲を取得
desc = arcpy.Describe(extentFC)
SR = desc.spatialReference

XMax = desc.extent.XMax
XMin = desc.extent.XMin
YMax = desc.extent.YMax
YMin = desc.extent.YMin

XLength = XMax-XMin
YLength = YMax-YMin

# 範囲とポリゴン数から 1 辺の長さを計算
if UseLength == "true":
    length = arcpy.GetParameter(3)
    Maxi = round(XLength/ (2 *(math.sqrt(length ** 2 - (length/2)**2)))) + 2
elif UseLength == "false":
    PolygonX = arcpy.GetParameter(1)
    length =  math.sqrt(((XLength/(PolygonX-1)/2) **2)*4/3)
    Maxi = PolygonX

Maxj = math.ceil((YLength - (length *2)) / (length * 1.5) ) +2
FirstCentroid = arcpy.Point(XMin,YMin)

# 出力フィーチャクラスを作成
out = arcpy.CreateFeatureclass_management(outWS,outFC,"POLYGON","","","",SR)

# 六角形インデックス ポリゴンの作成
j = 1
while j < Maxj + 1:
    i = 1
    # 奇数行
    if j % 2 == 1:
      while i < Maxi +1:
            point1 = arcpy.Point()
            point1.X = FirstCentroid.X + (2*i -1) * math.sqrt(length ** 2 - (length/2)**2)
            point1.Y = FirstCentroid.Y + (3*j -2) * length/2

            point2 = arcpy.Point()
            point2.X = FirstCentroid.X + 2 * (i-1) *(math.sqrt(length ** 2 - (length/2)**2))
            point2.Y = FirstCentroid.Y + 0.5 *(3 * j-1) * length

            point3 = arcpy.Point()
            point3.X = FirstCentroid.X + (2*i -3) * math.sqrt(length ** 2 - (length/2)**2)
            point3.Y = FirstCentroid.Y + (3*j -2) * length/2

            point4 = arcpy.Point()
            point4.X = FirstCentroid.X + (2*i -3) * math.sqrt(length ** 2 - (length/2)**2)
            point4.Y = FirstCentroid.Y + (3 * j -4) * length/2

            point5 = arcpy.Point()
            point5.X = FirstCentroid.X + 2 * (i-1) *(math.sqrt(length ** 2 - (length/2)**2))
            point5.Y = FirstCentroid.Y + 0.5 *(3 * j-5) * length

            point6 = arcpy.Point()
            point6.X = FirstCentroid.X + (2*i -1) * math.sqrt(length ** 2 - (length/2)**2)
            point6.Y = FirstCentroid.Y + (3 * j -4) * length/2

            ary = arcpy.Array()
            ary.add(point1)
            ary.add(point2)
            ary.add(point3)
            ary.add(point4)
            ary.add(point5)
            ary.add(point6)

            polygon = arcpy.Polygon(ary,SR)

            cur = arcpy.InsertCursor(out.getOutput(0))
            row = cur.newRow()
            row.shape = (polygon)
            cur.insertRow(row)
            i += 1
    # 偶数行
    else:
      while i < Maxi:
            point1 = arcpy.Point()
            point1.X = FirstCentroid.X + 2 * i *(math.sqrt(length ** 2 - (length/2)**2))
            point1.Y = FirstCentroid.Y + (1.5 * j -1) * length

            point2 = arcpy.Point()
            point2.X = FirstCentroid.X + (2*i -1) * math.sqrt(length ** 2 - (length/2)**2)
            point2.Y = FirstCentroid.Y + 0.5 *(3 * j-1) * length

            point3 = arcpy.Point()
            point3.X = FirstCentroid.X + 2 * (i-1) *(math.sqrt(length ** 2 - (length/2)**2))
            point3.Y = FirstCentroid.Y + (1.5 * j - 1) * length

            point4 = arcpy.Point()
            point4.X = FirstCentroid.X + 2 * (i-1) *(math.sqrt(length ** 2 - (length/2)**2))
            point4.Y = FirstCentroid.Y + (1.5 * j-2) * length

            point5 = arcpy.Point()
            point5.X = FirstCentroid.X + (2*i -1) * math.sqrt(length ** 2 - (length/2)**2)
            point5.Y = FirstCentroid.Y + (1.5 * j-2.5) * length

            point6 = arcpy.Point()
            point6.X = FirstCentroid.X + 2 * i *(math.sqrt(length ** 2 - (length/2)**2))
            point6.Y = FirstCentroid.Y + (1.5 * j-2) * length

            ary = arcpy.Array()
            ary.add(point1)
            ary.add(point2)
            ary.add(point3)
            ary.add(point4)
            ary.add(point5)
            ary.add(point6)

            polygon = arcpy.Polygon(ary,SR)

            cur = arcpy.InsertCursor(out.getOutput(0))
            row = cur.newRow()
            row.shape = (polygon)
            cur.insertRow(row)
            i += 1
    j += 1
try:
    del row, cur
except:
    ErrorMessage = u"""
指定した長さが範囲の長さを超えている可能性があります。
範囲と長さを確認してください。
"""
    arcpy.AddError(ErrorMessage)

こちらのサンプルはあくまでもコーディングの見本であり、ツール実行時に発生したエラーの対処方法につきましては、サポート対象外とさせていただきます。また、操作方法やソースコードに関するご質問は別途有償の開発者サポート契約にてご対応させていただきます。新規バージョンに対応したツールを継続的に提供することを保証するものでもないことも予めご承知おきください。なお、ツールを利用して生じたいかなる損害についても弊社では責任を負いかねます。

メタデータ

機能

種類

製品

バージョン