ArcGIS Desktopを使用して散在するポイントをマップするために動的ページの数を最小化しますか?


10

時々、興味のあるポイントを表示するためにマップブックを作成する必要があります。通常のメッシュを使用してページを作成する最初のステップ:

ここに画像の説明を入力してください

a)単一のポイント(25ページなど)が端にあるページがいくつかあり、b)ページが多すぎるため、このソリューションは好きではありません。

最初の問題はコードを使用して簡単に修正できます。ページ範囲の長方形を関連するポイント範囲の中心に移動します。

ここに画像の説明を入力してください

私はまだそれが好きではありません、ページ数は同じままなので非常に込み合っています。それらはすべて、レポートの複数のコピーで実際のA3用紙ページになることに注意してください。

そこで、ページ数を減らすコードを作成しました。この例では、45から34です。

ここに画像の説明を入力してください

これが達成できる最良の結果かどうかはわかりませんが、

すべてのポイントをキャプチャするために指定されたサイズの長方形の数を最小限に抑えるためにポイントをシャッフルするための最良の戦略(疑似コード、パブリケーション、Pythonライブラリ)は何ですか?確かに、誰かがゲーム理論、軍事芸術、漁業でそれを発見しました

これは元の質問の更新です:

これは、必要な実際の範囲とページサイズを示しています。

ここに画像の説明を入力してください

164ページのうち10ページを表示する拡大ズーム:

ここに画像の説明を入力してください

サンプルポイントフィーチャクラス

長方形のサイズは、制限内に収まるとすぐに変更できます。


2
私の意見では、通常のメッシュが最良のオプションです。彼らはそれに慣れているので、マップリーダーはそのような何かを期待しています。他のオプションは混雑しており、私の意見では混乱しています。確かにあなたが望むことをする最適化アルゴリズムはありますが、あなたの聴衆がそれらを高く評価することはないと思います。+1しかし、あなたがやろうとしていることに感謝しているからです。最後に、ページ数を減らす1つの方法は、スケールを変更することです。
Fezter

私は主にFezterに同意します。不連続なマップブックがその場所にあり、答えを見たいと思う場合があります(共有したい場合は、現在のコードも)。たとえば、各トレイルを独自のマップに配置し、他のトレイルを表示する必要がないトレイルの本です(ただし、相対的な位置にすべてを表示する、より小さな縮尺の単一マップが必要な場合もあります)。例の画像を見るだけで、この場合、ポイントが固有のグループ化プロパティを持たない限り、たとえ追加であっても、ページ間の継続的なカバレッジが必要になると思います。
クリスW

@Fezter、通常のメッシュは、ページサイズが全範囲に匹敵する場合に機能し、これとスケールの変更の両方がここでは該当しません
FelixIP

1
@ MichaelMiles-Stimson、Avenueを使用して行ったことはPythonで実行できます。ジオメトリゲームでは前者が依然として優れているため、前者を使用しました。ポイントを選択し、最も近いマンハッタンの距離を見つけ、マルチポイントを作成し、範囲を取得します。範囲を超えた場合は終了します。元のリストからグループ化されて削除されました、残りに進んでください。私はソート順を重要だと考え、変更しようとしました。ほとんど違いはありません...
FelixIP、2015

1
はい、それはかなりの努力でPythonで実行可能です。ジオメトリを扱うときは、C#でArcObjectsを使用します。クリスが言ったように、彼らはすでにかなり最小限に見えます、なぜあなたが持っているものに固執してそれを完成と呼ぶのではないのですか?
Michael Stimson、

回答:


4

これは答えではありません、興味がある人のために私がPythonソリューションを投稿すると思っただけです:

# ---------------------------------------------------------------------------
# PAGE MAKER
# 
# ---------------------------------------------------------------------------
# Import arcpy module
import arcpy, traceback, os, sys
from arcpy import env

width=650
height=500

try:
    def showPyMessage():
            arcpy.AddMessage(str(time.ctime()) + " - " + message)
    mxd = arcpy.mapping.MapDocument("CURRENT")
    points = arcpy.mapping.ListLayers(mxd,"points")[0]
    pgons = arcpy.mapping.ListLayers(mxd,"pages")[0]

    g=arcpy.Geometry()
    geometryList=arcpy.CopyFeatures_management(points,g)
    geometryList=[p.firstPoint for p in geometryList]
    curT = arcpy.da.InsertCursor(pgons,"SHAPE@")
    while True:
        nPoints=len(geometryList)
        small=[geometryList.pop(0)]
        for p in geometryList:
            small.append(p)
            mPoint=arcpy.Multipoint(arcpy.Array(small))
            ext=mPoint.extent
            cHeight=ext.height
            cWidth=ext.width
            if cHeight>height or cWidth>width:
                small.remove(p)
        mPoint=arcpy.Multipoint(arcpy.Array(small))
        ext=mPoint.extent
        xC=(ext.XMin+ext.XMax)/2
        yC=(ext.YMin+ext.YMax)/2
        LL=arcpy.Point (xC-width/2,yC-height/2)
        UL=arcpy.Point (xC-width/2,yC+height/2)
        UR=arcpy.Point (xC+width/2,yC+height/2)
        LR=arcpy.Point (xC+width/2,yC-height/2)
        pgon=arcpy.Polygon(arcpy.Array([LL,UL,UR,LR]))
        curT.insertRow((pgon,))
        short=filter(lambda x: x not in small,geometryList)
        arcpy.AddMessage('Grabbed %i points, %i to go' %(len(small),len(short)))
        if len(short)==0: break
        geometryList=short[:]
    del mxd
except:
    message = "\n*** PYTHON ERRORS *** "; showPyMessage()
    message = "Python Traceback Info: " + traceback.format_tb(sys.exc_info()[2])[0]; showPyMessage()
    message = "Python Error Info: " +  str(sys.exc_type)+ ": " + str(sys.exc_value) + "\n"; showPyMessage()

最近調査計画に適用しました:

ここに画像の説明を入力してください

更新:

一部のパターンでは、「迷子」ポイントを最初に処理する方法が適しているようです。私は「凸包」の皮を使ってそれらを識別しました、whuberのアイデア、投稿が見つかりません、申し訳ありません。

ここに画像の説明を入力してください


これはあなたが探していた@whuberの投稿ですか? gis.stackexchange.com/a/161855/115
PolyGeo

はい、そうです。以前は「狩り」を開始する前にポイントを並べ替えていました。明日は自分の答えを更新します。デスクトップなしでは簡単ではない
FelixIP

2

これは、最大カバレッジ問題の幾何学的バージョンのように見えます。これは、セットカバレッジ問題と密接に関連しており、これら2つはNP完全です。

したがって、それを解決するには、近似を使用できます。私は次のアルゴリズムを試してみると、それは完全に動作するようです。問題の複雑さのために、私たちは最良の答えを見つけることができません。

  1. Foreachポイントは、ランダムな距離でN = 10の長方形を生成します。長方形がポイントをカバーしていることを確認するだけです(各長方形には少なくとも1つのポイントが属しており、各ポイントは少なくとも1つの長方形に属しています)。
  2. すべてのポイントがカバーされるまで繰り返します。カバーされていないポイントの最大数をカバーする長方形を取得します。ポイントをカバー済みとしてマークします。

このアルゴリズムの実装は、サークル専用です。http//jsfiddle.net/nwvao72r/3/


1
見たことがない場合は、gis.stackexchange.com / q / 227344/115をご覧ください。
PolyGeo
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.