在@Dr.Molle answer的帮助下,我学会了在Google地图中进行自由手绘。现在我试图在多边形中绘制多边形,如下面的SS
我想得到黄色和绿色within the black
标记的多边形。
我不确定这是否可行。请详细说明这个问题。
更新:在进一步研究中,我了解了一种名为containsLocation(point, polygons)
的方法,该方法用于查找给定的lat / lng点是否在多边形内。
但遗憾的是,没有默认方法来检查Google地图提供的多边形内的多边形:(
您可以通过循环内部多边形的每个点来检查多边形是否在另一个多边形内,并使用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或更低版本中使用。
这是一个GIS问题。谷歌地图API并不是一个完整的GIS。如果您需要开源解决方案,我建议您将黄色和绿色多边形加载到PostGIS数据库中。然后您可以查询数据库。
例如,您可以将绘制的多边形编码为POLYGON对象,其格式为:
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
命令返回与多边形相交的宗地。
从@ chris-smith解决方案工作的替代实现可能更快,因为如果找到外部点,它不会保持循环:
function isPolygonInsidePolygon( innerPolygon, outerPolygon ) {
var points = innerPolygon.getPath().getArray();
for( var i = 0; i < points.length; i++ ){
if( ! google.maps.geometry.poly.containsLocation( points[i], outerPolygon) ){
return false;
}
}
return true;
}