各シェープファイルは、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