2011-11-07 71 views
1
給定的緯度,經度點

我只能訪問到PHP5(沒有的PostGIS)我如何找出哪些shape文件(郊區)包含在PHP

我有一堆郊區shape文件,並與緯度的幾個事件 - 龍點。我對shapefile沒有經驗。

什麼是最好的方式來檢查哪些形狀文件包含這些拉長點(只使用PHP)?

我是否將形狀文件轉換爲lat長多邊形並使用標準多邊形點交叉方程?

或者是這些一些很棒的PHP庫用於加載/使用Shapefiles?

回答

2

每個shapefile由3部分組成,shp,shx,dbf。 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 

然後,你可以測試一下,看看如果給定的事件在於shape文件的邊界框。

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

你可以把這是一個循環,並得到你的shapefile與給定事件重疊的子集。這並不意味着你的事件在一個給定shapefile的多邊形內,但它會讓你關閉。如果你需要一個確切的解決方案,你將不得不提取多邊形,並在多邊形測試中做一個點。

聲明:考慮上面的代碼僞代碼,我不知道PHP,所以可能有一些錯誤。另外,如果你可以切換到Python,事情變得更容易,現有的庫提供shapefile解析和空間索引,所以你可以高效地確定一個點與某個點的相交點。

編號:ESRI shape文件白皮書,http://www.esri.com/library/whitepapers/pdfs/shapefile.pdf

+0

嘿,歡呼聲。這基本上是我在php中所做的。 –

1

爲了處理shapefile,我建議將它們加載到具有空間關係的數據庫中,並使用數據庫的空間關係功能。

我個人使用PostgreSQL和PostGIS擴展。它有一個用於將shapefile轉換爲SQL插入的實用程序。然後,您可以將您的觀點放入WKT(衆所周知的文本)中,並查詢數據庫中與之相交的shapefile文件。

我不相信php本身有任何處理GIS的內置函數。

EDIT-該死的 - 對不起,我沒有看到(無PostGIS)部分,直到發佈後。您可能能夠將多邊形轉換爲星形並使用多邊形點交叉點。

+1

提問者有沒有的PostGIS訪問。 –

+0

好的歡呼聲我會看看。 –

相關問題