Я написал код для выполнения именно этого, но вместо гридов, для районов Великобритании.
Мне пришлось читать файл KML как XML, используя DOMDocument::load()
, это позволяет вам читать файл KMLи получите точки долготы и широты, которые он содержит.Имейте в виду, что мне пришлось немного изменить KML, чтобы это работало.Во-первых, после создания вашей пользовательской карты в Картах Google щелкните правой кнопкой мыши и скопируйте ссылку Google Планета Земля - это даст что-то вроде этого
http://maps.google.co.uk/maps/ms?ie=UTF8&hl=en&vps=1&jsv=314b&msa=0&output=nl
Вам следуетизмените выходные данные на kml
, перейдите на страницу и сохраните выходные данные. Я опустил часть этого URL здесь, чтобы не выдавать свою карту!
http://maps.google.co.uk/maps/ms?ie=UTF8&hl=en&vps=1&jsv=314b&msa=0&output=kml
Затем мне пришлось удалить элемент <kml>
, удалив следующие строки
<kml xmlns="http://earth.google.com/kml/2.2">
И
</kml>
Это оставит вас только с элементом <Document>
, который содержит точку,Затем вы читаете это с помощью DOMDocument и перебираете его, чтобы получить содержащиеся в нем координаты.Например, вы можете перебирать метки и их координаты, создавая полигон и затем пересекая его с длинным.Я использовал этот сайт для кода полигона http://www.assemblysys.com/dataServices/php_pointinpolygon.php.В этом примере это класс Util:
$dom = new DOMDocument();
$dom->load(APPLICATION_PATH . self::REGIONS_XML);
$xpath = new DOMXpath($dom);
$result = $xpath->query("/Document/Placemark");
foreach($result as $i => $node)
{
$name = $node->getElementsByTagName("name")->item(0)->nodeValue;
$polygon = array();
// For each coordinate
foreach($node->getElementsByTagName("coordinates") as $j => $coord)
{
// Explode and parse coord to get meaningful data from it
$coords = explode("\n" , $coord->nodeValue);
foreach($coords as $k => $coordData)
{
if(strlen(trim($coordData)) < 1)
continue;
$explodedData = explode("," , trim($coordData));
// Add the coordinates to the polygon array for use in the
// polygon Util class. Note that the long and lat are
// switched here because the polygon class expected them
// a specific way around
$polygon[] = $explodedData[1] . " " . $explodedData[0];
}
}
// This is your address point
$point = $lat . " " . $lng;
// Determine the location of $point in relation to $polygon
$location = $pointLocation->pointInPolygon($point, $polygon);
// $location will be a string, this is documented in the polygon link
if($location == "inside" || $location == "boundary")
{
// If location is inside or on the boundary of this Placemark then break
// and $name will contain the name of the Placemark
break;
}
}