2014-01-09 136 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或更低版本。