Is it possible with kml and google maps

旧街凉风 提交于 2019-12-08 13:11:35

I wrote code for doing exactly this, but rather than grids, for areas of the UK.

I had to read the KML file like XML using DOMDocument::load(), this enables you to read the KML file and get the longitude and latitude points it contains. Bear in mind though that I had to change the KML slightly for this to work. Firstly after building your custom map in Google Maps right click and copy the Google Earth link - this will give something like this

http://maps.google.co.uk/maps/ms?ie=UTF8&hl=en&vps=1&jsv=314b&msa=0&output=nl

You should change the output to kml, visit then save the output, I have ommitted part of this URL here as not to give away my map!

http://maps.google.co.uk/maps/ms?ie=UTF8&hl=en&vps=1&jsv=314b&msa=0&output=kml

I then had to remove the <kml> element be removing the following lines

<kml xmlns="http://earth.google.com/kml/2.2">

And

</kml>

This will leave you with just the <Document> element which contains the point. You then read this using DOMDocument and iterate over it to get the coordinates it contains. For example you can then iterate over the Placemarks and their coordinates, creating a polygin and then intersecting that with the long. I used this site for the polygon code http://www.assemblysys.com/dataServices/php_pointinpolygon.php . It is a Util class in this example:

$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;
    }
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!