2014-01-09 4 views
2

С помощью @Dr.Molle answer Я научился делать бесплатный чертеж в Google maps. Теперь я пытаюсь получить полигон нарисованный в многоугольнике то, как показано ниже SSПолучите полигоны в пределах полигонов на картах Google

enter image description here

Я хочу, чтобы получить полигоны, отмеченные желтым и зеленым within the black.

Я не уверен, возможно ли это или нет. Прошу пролить свет на эту проблему.

Обновления: на дальнейших исследований я узнал о методе под названием containsLocation(point, polygons), который используется, чтобы найти, является ли данная широта/LNG точка внутри многоугольника или нет.

Но, к сожалению, не существует никакого метода по умолчанию для проверки полигонов в пределах полигона, предоставленной Google карты :(

ответ

0

Это ГИС вопрос. Google Maps API не очень полномасштабный GIS. Если вы хотите, .. с открытым исходным кодом, я предлагаю загрузить ваши желтые и зеленые многоугольники в базу данных PostGIS Затем вы можете запросить базу данных

в качестве примера, вы можете кодировать нарисованный многоугольник как объект пОЛИГОНА, который имеет формат:

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

А затем отправить его в PHP файл с JavaScript, как (вы обернуть это в $.get() команды или аналогичной и возвращающий результаты: JSON

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

В файле PHP, запрос к базе данных PostGIS и возвращают идентификаторы желтый и зеленый многоугольники:

<?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; 
?> 

Это будет возвращать посылки, которые пересекают ваш полигон, используя ST_Intersects команду в PostGIS.

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 или ниже.