在@Dr.Molle answer的帮助下,我学会了在Google地图中进行免费手绘。现在我试图在多边形中绘制多边形,如下面的SS
我希望将多边形标记为黄色和绿色within the black
。
我不确定这是否可行。请详细说明这个问题。
更新:进一步研究我了解了一个名为containsLocation(point, polygons)
的方法,该方法用于查找给定的lat / lng点是否在多边形内。
但遗憾的是,没有默认方法来检查Google地图提供的多边形内的多边形:(
答案 0 :(得分:5)
您可以通过循环内部多边形的每个点来检查多边形是否在另一个多边形内,并使用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或更低版本中使用。
答案 1 :(得分:0)
这是一个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
命令返回与多边形相交的宗地。
答案 2 :(得分:0)
通过@ 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;
}