1

私はPHP5にしかアクセスできません(PostGISはありません)

郊外のシェープファイルがたくさんあり、緯度経度ポイントを含むいくつかのイベントがあります。シェープファイルの経験はありません。

どのシェープファイルにこれらの緯度経度ポイントが含まれているかを確認する最良の方法は何ですか (PHP のみを使用)?

シェープファイルを緯度と経度のポリゴンに変換し、標準のポリゴンとポイントの交差方程式を使用する必要がありますか?

それとも、シェープファイルをロード/操作するための素晴らしい PHP ライブラリですか?

4

3 に答える 3

2

各シェープファイルは、shp、shx、dbf の 3 つの部分で構成されています。shp ファイルにはジオメトリが含まれます。shx は shp へのアクセスを支援するためのインデックスです。dbf は、各レコードのデータを含む単純な古い dbase ファイルです。

次のように、shp ファイルからバウンディング ボックスを抽出できます。

$handle = fopen("path/to/file.shp","rb");
fseek($handle, 36);
$min_x = unpack("d",fread($handle,8);
$min_y = unpack("d",fread($handle,8);
$max_x = unpack("d",fread($handle,8);
$max_y = unpack("d",fread($handle,8);
// Note, this code will only work on a little-endian machine
// You'll need to do a byte swap on big endian systems

次に、特定のイベントがシェープファイルの境界ボックス内にあるかどうかをテストできます。

if (($event_x >= $min_x) && ($event_x <= $max_x) 
      && ($event_y >= $min_y) && ($event_y <= $max_y))

これをループにして、特定のイベントと重複するシェープファイルのサブセットを取得できます。これは、イベントが特定のシェープファイルのポリゴン内にあるという意味ではありませんが、近づくことはできます。正確なソリューションが必要な場合は、ポリゴンを抽出し、ポイント イン ポリゴン テストを実行する必要があります。

免責事項: 上記のコードの疑似コードを考慮してください。私は php を知らないので、おそらくいくつかのバグがあります。また、Python に切り替えることができれば、はるかに簡単になります。シェープファイルの解析と空間インデックスを提供する既存のライブラリがあるため、ポイントが交差するポリゴンを非常に効率的な方法で正確に判断できます。

参照: ESRI Shapefile ホワイトペーパー、http ://www.esri.com/library/whitepapers/pdfs/shapefile.pdf

于 2011-11-17T20:29:20.613 に答える
1

シェープファイルを操作するには、空間リレーションを含むデータベースにシェープファイルをロードし、データベースの空間リレーション機能を使用することをお勧めします。

私は個人的にこれにPostGIS拡張機能を備えたPostgreSQLを使用しています。シェープファイルを SQL 挿入に変換するためのユーティリティがあります。次に、ポイントを WKT (well-known text) に入力し、それが交差するシェープファイルについてデータベースにクエリを実行できます。

PHP自体にGISを処理するための組み込み関数があるとは思いません。

EDIT-くそー-申し訳ありませんが、投稿後まで(PostGISなし)の部分が表示されませんでした。ポリゴンを wkt に変換して、ポリゴンとポイントの交差点を使用できる場合があります。

于 2011-11-07T01:24:14.053 に答える