ランダムなポイントからの不規則なポリゴン内の最大の円


8

円の特定の中心に基づいて、不規則なポリゴン(国勢調査地区)内に最大半径の円を作成するアルゴリズムを作成しようとしています。

この動機は、調査に回答した個人の場所を不明瞭にすることです。実際の場所はわかっていますが、さらに分析するためにデータを公開するために、分析で覆い隠す必要があります。

私たちは、個人がいる国勢調査地区によって制約された外半径によって境界が設定された、(ある程度)ある程度の内半径を持つ、調査回答者ごとにドーナツ型のポリゴンを作成します。最終的な場所は、ドーナツポリゴン内にランダムに配置されます。 。

私はここで同様の質問に対する多くの回答を見てきましたが、この特定の場所ではなく、この特定の質問に対する回答はありません。

ドーナツを作成したら、ポリゴン内の個々の応答の位置をランダム化できます。それは比較的簡単です...

あなたのアイデアのおかげで、これまでのところ、私はかなり力ずくで、計算上「高価」または非効率的であるように見えました...


1
特定の場所から目的のポリゴンの境界までの最短距離ではありませんか?
NicklasAvén2013年

どのソフトウェアまたはプログラミング言語を使用していますか?
Pablo

なぜ望ましい環を管と交差させないのですか?さらに良いことに、円形を使用する理由はありません。正方形の環を使用することもできます。これにより、実行が高速になります。
whuber

3
あるように思わほとんど、あるいはまったく合意。いくつかのメソッドの概要は、pから始まります。34当サイトでは、洗練された方法が提案されました。最近の国際ワークグループは、多くの関連する問題を調査しました。マシューズ&ハレルによる最近のレビューが有用である可能性があります。
whuber

3
@whuber、どうもありがとう!私は1998年にGISを使い始めて以来、ヘルプとソースコードを投稿してきたBill Huberと同じだと思います。Avenueスクリプトはすべて大好きで、それらから多くのことを学びました(以下で参照するプログラムはArcViewだと思いますが、それが最近どれほど速く動くか驚くべき!!!)。GIS実践者のコミュニティであなたがどれだけ感謝されているかを知らせたかっただけです!長年の素晴らしいアドバイスに感謝します!
パーシー

回答:


3

このような環内で位置を移動する簡単な方法は、路の境界までの距離のグリッド表示を利用します。国勢調査区のポリゴン表現から始めます(これは通常です)。

  1. それをポリゴン境界(ポリラインレイヤー)に変換します。

  2. 境界までのユークリッド距離グリッドを計算します。

  3. 指定された位置でユークリッド距離を抽出します。

  4. 距離によって定義された範囲内で各位置を移動します。これは、定義により、境界までの最大値です。

通常、それぞれがGISを使用した単一のコマンドのみを必要とするため、シーケンス全体を簡単に自動化し、手動で簡単に実行できます。これらは、各ポイントのバッファを構築する必要がないため、効率的なコマンドです(通常、リングまたは環状体を記述するために数十からほぼ千のポイントを作成します)。検索もランダムな試行も必要ありません。ポイントは、元の国勢調査区内に留まることが保証された金額によって直接置き換えられます。


たとえば、境界までの距離の半分と完全な距離の間に均一に分散された変位によって、47のトラクト内の172,902の場所をランダムな方向に移動しました。これは、移動前の1つのトラクトの一部です。

図1

(黄色の四角は場所を示しています)および移動後:

図2

(現在、灰色の四角は新しい場所を示しています)。全体の操作には1〜2分しかかかりませんでした(古いGISを使用している:-)。

これらの数値をよく比較すると、

  • 現在境界に近いポイント(これらの図で白い「穴」として示されている2つの湖の近くなど)は、必ず境界に近いままです。

  • 境界から遠い点は遠くに移動する傾向があります。

その結果、境界に近い点はおそらく(確かではありませんが)非常に近くで発生しましたが、境界から遠い点は境界から離れた他の場所から発生した可能性があります。これらの2つの傾向は完全にランダムではありません。これらの傾向が提供することを意図していたプライバシーを侵害したい人によって(かなり簡単に)悪用される可能性があります。

より良い方法は、最終的な場所と最初の場所の間のつながりをより希薄でよりランダムにするでしょう。少なくとも、ポイントは、さまざまな(場合によっては任意に小さい)サイズの近傍内ではなく、かなり大きい近傍内で移動する必要があります。このような移動はグリッドで簡単に実行できません。通常、試行錯誤が必要です。元の各ポイントの近傍内に一連のランダムなポイントを生成し、同じ国勢調査地区内にある最初のポイントを選択します。これは、(1)ランダムな動きと(2)ポリゴン内のポイント照会を含むループです。どちらの操作も高速ですが、ループを実装するには少しプログラミングが必要です。

(質問へのコメントで、プライバシーの目的で位置データを偽装するために使用される方法のいくつかの研究へのリンクを提供します。)


2

PostGISでドーナツをテストしたかっただけです

PostGISonlineで試しました。

同じテストを行うには、http//postgisonline.org/map.phpにアクセスします。

「プロパティ」印刷と呼ばれるいくつかのポリゴンがあります。

SELECT * FROM property;

「Map1」を押します

次に、以下をtextareaにコピーして「map2」を押すと、ドーナツコードをテストできます(プロパティマップは残ります)。

SELECT ST_Difference(ST_Buffer(the_geom,dist),ST_Buffer(the_geom,dist/3)) the_geom,dist FROM
(
    SELECT ST_Distance(poly.boundary,points.the_geom) dist, points.the_geom FROM
    (
        SELECT ST_Boundary(the_geom) boundary,the_geom FROM property
    ) poly
    INNER JOIN
    (
        SELECT ST_SetSrid('POINT(137816 267009)'::geometry,3021) the_geom
        UNION ALL
        SELECT ST_SetSrid('POINT(139816 268542)'::geometry,3021) the_geom
        UNION ALL
        SELECT ST_SetSrid('POINT(135016 268102)'::geometry,3021) the_geom
    ) points
    ON ST_Contains(poly.the_geom,points.the_geom)
) a

それはあなたに次のような結果を与えるはずです: ここに画像の説明を入力してください


PostGISは完全に素晴らしいです!ありがとう、それは素晴らしい、素晴らしい仕事です!
パーシー

1

このPythonソリューションが役立つことを願っています。一般的なワークフローは次のとおりです。

  1. ポリゴンをポリラインに変換して、近距離を計算できるようにします
  2. 近距離に基づいてポイントをバッファリングする

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

# Import arcpy module
import arcpy, os
from arcpy import env

env.overwriteOutput = 1

env.workspace = r'C:\sample.gdb\temp'
Dir = env.workspace

# Local variables:
points = "points"
polygon = "polygon"
points_2 = "points"
buffers = "buffers"
polyline = "polyline"

# Polygon To Line
arcpy.PolygonToLine_management(polygon, polyline, "IDENTIFY_NEIGHBORS")

# Near
arcpy.Near_analysis(points, polyline)

# Buffer
arcpy.Buffer_analysis(points_2, buffers, "NEAR_DIST")

ありがとう!それはうまくいくかもしれないように見えます!:-)試してみましょう!
パーシー、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.