Google maps 在谷歌地图中获取多边形中的多边形

Google maps 在谷歌地图中获取多边形中的多边形,google-maps,google-maps-api-3,polygons,Google Maps,Google Maps Api 3,Polygons,在谷歌地图的帮助下,我学会了在谷歌地图上徒手画画。现在我试着在一个多边形内画一个多边形,就像下面的SS 我想在黑色的中获得标记为黄色和绿色的多边形 我不确定这是否可能。请解释一下这个问题 更新:在进一步研究中,我了解到一种称为的方法,用于确定给定的lat/lng点是否在多边形内 但遗憾的是,Google maps提供的多边形中没有默认的多边形检查方法:(这是一个GIS问题。Google maps API并不是一个真正成熟的GIS。如果您想要一个开源解决方案,我建议将您的黄色和绿色多边形加载到P

在谷歌地图的帮助下,我学会了在谷歌地图上徒手画画。现在我试着在一个多边形内画一个多边形,就像下面的SS

我想在黑色的中获得标记为黄色和绿色的多边形

我不确定这是否可能。请解释一下这个问题

更新:在进一步研究中,我了解到一种称为的方法,用于确定给定的lat/lng点是否在多边形内


但遗憾的是,Google maps提供的多边形中没有默认的多边形检查方法:(

这是一个GIS问题。Google maps 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
命令返回与多边形相交的地块。

您可以通过循环通过内部多边形的每个点并使用containsLocation()测试多边形是否包含在外部多边形内,来检查多边形是否位于另一个多边形内


JavaScript map()函数可能无法在较旧的浏览器(IE8或更低版本)中工作。

另一种从@chris smith解决方案中工作的实现可能更快,因为如果它找到外部点,它不会继续循环:

函数isPolygonInsidePolygon(内多边形,外多边形){
var points=innerPolygon.getPath().getArray();
对于(变量i=0;i
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;
};