I'm posting this here in case it's of use to anyone.
Following the advice of the accepted answer by @radu-matei I wrote a basic parser for gadm.org KML files - these are KMZ files which have been unzipped.
<?php
if(!is_dir('./coords')){
mkdir('./coords');
}
$split_at_level = 'NAME_1';
$file = file_get_contents('gadm36_PHL_3.kml');
$parts = explode('</Placemark>', $file);
$data=[];
$last_NAME_1 = false;
foreach($parts as $i => $part){
$lines = explode("\n", $part);
$record=[];
foreach($lines as $line){
$line = trim($line);
if(strpos($line,'SimpleData')!==false){
$key = substr($line,18,6);
$val = strip_tags($line);
$record[$key] = $val;
}
if(strpos($line,'MultiGeometry')!==false){
$line = strip_tags($line);
$coords = explode(' ',$line);
foreach($coords as $coord){
$geo = explode(',',$coord);
$record['outline'][] = ['lat'=>$geo[1],'lng'=>$geo[0]];
}
}
// we have all the data we need and the geographic region has changed so dump the data and free up RAM.
if(isset($record['outline']) && $last_NAME_1!=$record[$split_at_level] && !empty($data)){
$output = [];
foreach($data as $place){
$output[$place['NAME_2']][$place['NAME_3']] = $place['outline'];
}
$filename = $record[$split_at_level].'.json';
file_put_contents('./coords/'.$filename, json_encode($output, JSON_NUMERIC_CHECK));
$last_NAME_1 = $record[$split_at_level];
$data = [];
}
if(!$i && isset($record[$split_at_level])){ // set $last_NAME_1 on first iteration
$last_NAME_1 = $record[$split_at_level];
}
}
$data[] = $record;
}
https://github.com/andyg2/parse-gadm-kml/
PHP Output used as Polygon map https://jsfiddle.net/andyg2/0t1gwnja/22/
function initMap() {
// Create InfoWindow
var infoWindow = new google.maps.InfoWindow;
// Create Map
var map = new google.maps.Map(document.getElementById("map"), {
"center": {
"lat": 17.4102405548096,
"lng": 121.279747009277
},
"zoom": 10,
"mapTypeId": "terrain"
});
// Initiate object to hold
var polyMapZones = {};
var manicipalities = Object.keys(coords);
// first loop for municipalities (cities)
for (var i = 0; i <= manicipalities.length; i++) {
// grab the municipality
var manicipality = coords[manicipalities[i]];
// grab the barangays
var barangays = Object.keys(manicipality);
// second loop for barangays (suburb)
for (var ii = 0; ii <= barangays.length; ii++) {
// Create a unique but arbitrary string for polyMapZones object key
var mapKey = manicipalities[i] + ", " + barangays[ii];
// Generate a polygon from coordinates
polyMapZones[mapKey] = new google.maps.Polygon({
paths: manicipality[barangays[ii]],
strokeColor: "#FF0000",
strokeOpacity: 0.8,
strokeWeight: 2,
fillColor: "#FF0000",
fillOpacity: 0.25,
content: mapKey
});
// Add polygon to map
polyMapZones[mapKey].setMap(map);
// Add click event listener to map
polyMapZones[mapKey].addListener('click', showInfoWindow);
}
}
// function to show the info window (onclick) popup.
function showInfoWindow(event) {
var vertices = this.getPath();
infoWindow.setContent(this.content);
infoWindow.setPosition(event.latLng);
infoWindow.open(map);
}
}
// Example output from PHP parser https://github.com/andyg2/parse-gadm-kml/ (shortened to a couple of locations for brevity)
var coords = {
"Balbalan": {
"Ababa-An": [{
"lat": 17.5102405548096,
"lng": 121.279747009277
}, {
"lat": 17.5029907226563,
"lng": 121.278900146484
}, {
"lat": 17.505220413208,
"lng": 121.253547668457
}, {
"lat": 17.5342903137207,
"lng": 121.25919342041
}, {
"lat": 17.5313892364502,
"lng": 121.282249450684
}, {
"lat": 17.5102405548096,
"lng": 121.279747009277
}
],
"Balantoy": [{
"lat": 17.48344039917,
"lng": 121.235931396484
}, {
"lat": 17.4670391082764,
"lng": 121.223297119141
}, {
"lat": 17.4686908721924,
"lng": 121.222190856934
}, {
"lat": 17.4687004089355,
"lng": 121.220672607422
}, {
"lat": 17.4693698883057,
"lng": 121.219276428223
}, {
"lat": 17.4695892333985,
"lng": 121.217170715332
}, {
"lat": 17.4749698638917,
"lng": 121.20133972168
}, {
"lat": 17.4942092895508,
"lng": 121.213180541992
}, {
"lat": 17.49467086792,
"lng": 121.214233398438
}, {
"lat": 17.4955501556398,
"lng": 121.215431213379
}, {
"lat": 17.4958305358887,
"lng": 121.215713500977
}, {
"lat": 17.4962692260743,
"lng": 121.216003417969
}, {
"lat": 17.497880935669,
"lng": 121.216361999512
}, {
"lat": 17.4981803894044,
"lng": 121.217292785645
}, {
"lat": 17.4991607666016,
"lng": 121.217956542969
}, {
"lat": 17.499969482422,
"lng": 121.218017578125
}, {
"lat": 17.500249862671,
"lng": 121.218948364258
}, {
"lat": 17.5011196136475,
"lng": 121.219749450684
}, {
"lat": 17.5018901824951,
"lng": 121.220642089844
}, {
"lat": 17.5073890686035,
"lng": 121.226982116699
}, {
"lat": 17.505220413208,
"lng": 121.253547668457
}, {
"lat": 17.48344039917,
"lng": 121.235931396484
}
],
"Balbalan Proper": [{
"lat": 17.4271106719971,
"lng": 121.159126281738
}, {
"lat": 17.4291801452637,
"lng": 121.146751403809
}, {
"lat": 17.4823303222656,
"lng": 121.177932739258
}, {
"lat": 17.4749698638917,
"lng": 121.20133972168
}, {
"lat": 17.4695892333985,
"lng": 121.217170715332
}, {
"lat": 17.4693698883057,
"lng": 121.219276428223
}, {
"lat": 17.4687004089355,
"lng": 121.220672607422
}, {
"lat": 17.4686908721924,
"lng": 121.222190856934
}, {
"lat": 17.4670391082764,
"lng": 121.223297119141
}, {
"lat": 17.4664001464845,
"lng": 121.224548339844
}, {
"lat": 17.4666004180909,
"lng": 121.225120544434
}, {
"lat": 17.4672203063965,
"lng": 121.22599029541
}, {
"lat": 17.4665393829346,
"lng": 121.227531433105
}, {
"lat": 17.465030670166,
"lng": 121.228500366211
}, {
"lat": 17.434539794922,
"lng": 121.243347167969
}, {
"lat": 17.425350189209,
"lng": 121.185852050781
}, {
"lat": 17.4241600036622,
"lng": 121.179397583008
}, {
"lat": 17.4271106719971,
"lng": 121.159126281738
}
]
}
};
