2014-01-09 137 views
2

@Dr.Molle answer的幫助下,我學會了做在Google地圖上的自由手繪。現在,我試圖讓一個多邊形的東西中所繪製的多邊形像下面SS在Google地圖中獲取多邊形內的多邊形

enter image description here

我想標記爲黃色和綠色within the black的多邊形。

我不知道這是否是可以或不可以。請澄清一下這個問題。

更新:在進一步研究中,我學到了一種稱爲containsLocation(point, polygons)這是用來查找指定緯度/經度點是否在多邊形內或沒有。

但遺憾的是沒有默認的方法來檢查由谷歌提供的多邊形中的多邊形映射:(

回答

0

這是一個GIS問題。谷歌地圖API是不是一個真正的全面的GIS。如果你想要一個。開源的解決方案,我建議加載你的黃色和綠色的多邊形到PostGIS的數據庫,然後你就可以查詢數據庫

舉個例子,你可以編碼所繪製的多邊形作爲具有格式的多邊形對象:

POLYGON((lon lat, lon lat, lon lat, lon lat, ... lon lat)) 

然後發送給從像JavaScript的PHP文件(你會在$.get()命令或類似的包裝這並返回JSON結果:

getParcels.php?bounds=POLYGON((lon lat, lon lat, lon lat, lon lat, ... lon lat)) 

在PHP文件,查詢PostGIS的數據庫,並返回的ID黃色和綠色的多邊形:

<?php 
$pgcon = pg_connect ("dbname=gis user=gisuser connect_timeout=5") or die ('Can not connect to PG server'); 
if (!$pgcon) { 
    echo "No connection to GIS database.\n"; 
} 
$bounds = urldecode($_GET["bounds"]; 
$ewkt = 'SRID=4326;' . $bounds); 
$json = ''; // this will contain your output 
// Here I am returning the polygon geometry and the parcelID... 
$query .= <<<EOD 
SELECT 
    ST_AsGeoJSON(the_geom) as geom, 
    parid 
FROM 
    parcels 
WHERE 
    ST_Intersects(the_geom, ST_GeomFromEWKT($1)); 
EOD; 

$result = pg_query_params($pgcon, $query, array($ewkt)); 

if($result) { 
$json = '{"type":"FeatureCollection", "features":['; 
    while($row = pg_fetch_assoc($result)) { 
     $json .= '{"geometry":' . $row['geom'] . ','; 
     $json .= '"type":"Feature","properties":{"parid":"' . $row['parid'] . '"}},'; 
    } 
    $json = substr($json, 0,-1).']}'; 
} 

echo $json; 
?> 

這將返回交叉使用的PostGIS的ST_Intersects命令你的多邊形包裹。

3

可以檢查一個多邊形是另一個多邊形內通過內多邊形的每個點循環並測試是否它被利用containsLocation容納在外多邊形內()。

var isPolygonInsidePolygon = function (innerPolygon, outerPolygon) { 
    var pointsInside = 0; 
    var pointsOutside = 0; 
    innerPolygon.getPath().getArray().map(function (x) { 
     (google.maps.geometry.poly.containsLocation(x, outerPolygon)) ? pointsInside++ : pointsOutside++; 
    }); 
    return (pointsOutside > 0) ? false : true; 
}; 

JavaScript map()函數可能不適用於較舊的瀏覽器,IE8或更低版本。