Need to convert KML files to GPX format? This PHP converter makes it easy to transform Google Earth/Maps KML files into GPS Exchange Format (GPX) for your mapping projects.
Why Convert KML to GPX?
KML (Keyhole Markup Language) is Google’s format for geographic data in Earth and Maps, while GPX is the standard format used by most GPS devices. Converting between these formats lets you use your location data across different platforms and devices.
PHP KML to GPX Converter Code
The code below handles the conversion process. It reads a KML file and outputs valid GPX XML that you can use in GPS devices or compatible software. The script preserves waypoints, tracks, names, and descriptions from your original KML file.
load($u);
$dom_gpx = new DOMDocument('1.0', 'UTF-8');
$dom_gpx->formatOutput = true;
//root node
$gpx = $dom_gpx->createElement('gpx');
$gpx = $dom_gpx->appendChild($gpx);
$gpx_version = $dom_gpx->createAttribute('version');
$gpx->appendChild($gpx_version);
$gpx_version_text = $dom_gpx->createTextNode('1.0');
$gpx_version->appendChild($gpx_version_text);
$gpx_creator = $dom_gpx->createAttribute('creator');
$gpx->appendChild($gpx_creator);
$gpx_creator_text = $dom_gpx->createTextNode('https://mectile.com');
$gpx_creator->appendChild($gpx_creator_text);
$gpx_xmlns_xsi = $dom_gpx->createAttribute('xmlns:xsi');
$gpx->appendChild($gpx_xmlns_xsi);
$gpx_xmlns_xsi_text = $dom_gpx->createTextNode('http://www.w3.org/2001/XMLSchema-instance');
$gpx_xmlns_xsi->appendChild($gpx_xmlns_xsi_text);
$gpx_xmlns = $dom_gpx->createAttribute('xmlns');
$gpx->appendChild($gpx_xmlns);
$gpx_xmlns_text = $dom_gpx->createTextNode('http://www.topografix.com/GPX/1/0');
$gpx_xmlns->appendChild($gpx_xmlns_text);
$gpx_xsi_schemaLocation = $dom_gpx->createAttribute('xsi:schemaLocation');
$gpx->appendChild($gpx_xsi_schemaLocation);
$gpx_xsi_schemaLocation_text = $dom_gpx->createTextNode('http://www.topografix.com/GPX/1/0 http://www.topografix.com/GPX/1/0/gpx.xsd');
$gpx_xsi_schemaLocation->appendChild($gpx_xsi_schemaLocation_text);
$gpx_url = $dom_gpx->createElement('url');
$gpx_url = $gpx->appendChild($gpx_url);
$gpx_url_text = $dom_gpx->createTextNode($u_parts['dirname']);
$gpx_url->appendChild($gpx_url_text);
$gpx_time = $dom_gpx->createElement('time');
$gpx_time = $gpx->appendChild($gpx_time);
$gpx_time_text = $dom_gpx->createTextNode(utcdate());
$gpx_time->appendChild($gpx_time_text);
// placemarks
$names = array();
foreach ($dom_kml->getElementsByTagName('Placemark') as $placemark) {
//name
foreach ($placemark->getElementsByTagName('name') as $name) {
$name = $name->nodeValue;
//check if the key exists
if (array_key_exists($name, $names)) {
//increment the value
++$names[$name];
$name = $name." ({$names[$name]})";
} else {
$names[$name] = 0;
}
}
//description
foreach ($placemark->getElementsByTagName('description') as $description) {
$description = $description->nodeValue;
}
foreach ($placemark->getElementsByTagName('Point') as $point) {
foreach ($point->getElementsByTagName('coordinates') as $coordinates) {
//add the marker
$coordinate = $coordinates->nodeValue;
$coordinate = str_replace(" ", "", $coordinate);//trim white space
$latlng = explode(",", $coordinate);
if (($lat = $latlng[1]) && ($lng = $latlng[0])) {
$gpx_wpt = $dom_gpx->createElement('wpt');
$gpx_wpt = $gpx->appendChild($gpx_wpt);
$gpx_wpt_lat = $dom_gpx->createAttribute('lat');
$gpx_wpt->appendChild($gpx_wpt_lat);
$gpx_wpt_lat_text = $dom_gpx->createTextNode($lat);
$gpx_wpt_lat->appendChild($gpx_wpt_lat_text);
$gpx_wpt_lon = $dom_gpx->createAttribute('lon');
$gpx_wpt->appendChild($gpx_wpt_lon);
$gpx_wpt_lon_text = $dom_gpx->createTextNode($lng);
$gpx_wpt_lon->appendChild($gpx_wpt_lon_text);
$gpx_time = $dom_gpx->createElement('time');
$gpx_time = $gpx_wpt->appendChild($gpx_time);
$gpx_time_text = $dom_gpx->createTextNode(utcdate());
$gpx_time->appendChild($gpx_time_text);
$gpx_name = $dom_gpx->createElement('name');
$gpx_name = $gpx_wpt->appendChild($gpx_name);
$gpx_name_text = $dom_gpx->createTextNode($name);
$gpx_name->appendChild($gpx_name_text);
$gpx_desc = $dom_gpx->createElement('desc');
$gpx_desc = $gpx_wpt->appendChild($gpx_desc);
$gpx_desc_text = $dom_gpx->createTextNode($description);
$gpx_desc->appendChild($gpx_desc_text);
$gpx_sym = $dom_gpx->createElement('sym');
$gpx_sym = $gpx_wpt->appendChild($gpx_sym);
$gpx_sym_text = $dom_gpx->createTextNode('Waypoint');
$gpx_sym->appendChild($gpx_sym_text);
}
}
}
foreach ($placemark->getElementsByTagName('LineString') as $lineString) {
foreach ($lineString->getElementsByTagName('coordinates') as $coordinates) {
//add the new track
$gpx_trk = $dom_gpx->createElement('trk');
$gpx_trk = $gpx->appendChild($gpx_trk);
$gpx_name = $dom_gpx->createElement('name');
$gpx_name = $gpx_trk->appendChild($gpx_name);
$gpx_name_text = $dom_gpx->createTextNode($name);
$gpx_name->appendChild($gpx_name_text);
$gpx_trkseg = $dom_gpx->createElement('trkseg');
$gpx_trkseg = $gpx_trk->appendChild($gpx_trkseg);
$coordinates = $coordinates->nodeValue;
$coordinates = preg_split("/[\s\r\n]+/", $coordinates); //split the coords by new line
foreach ($coordinates as $coordinate) {
$latlng = explode(",", $coordinate);
if (($lat = $latlng[1]) && ($lng = $latlng[0])) {
$gpx_trkpt = $dom_gpx->createElement('trkpt');
$gpx_trkpt = $gpx_trkseg->appendChild($gpx_trkpt);
$gpx_trkpt_lat = $dom_gpx->createAttribute('lat');
$gpx_trkpt->appendChild($gpx_trkpt_lat);
$gpx_trkpt_lat_text = $dom_gpx->createTextNode($lat);
$gpx_trkpt_lat->appendChild($gpx_trkpt_lat_text);
$gpx_trkpt_lon = $dom_gpx->createAttribute('lon');
$gpx_trkpt->appendChild($gpx_trkpt_lon);
$gpx_trkpt_lon_text = $dom_gpx->createTextNode($lng);
$gpx_trkpt_lon->appendChild($gpx_trkpt_lon_text);
$gpx_time = $dom_gpx->createElement('time');
$gpx_time = $gpx_trkpt->appendChild($gpx_time);
$gpx_time_text = $dom_gpx->createTextNode(utcdate());
$gpx_time->appendChild($gpx_time_text);
}
}
}
}
}
header("Content-Type: text/xml");
echo $dom_gpx->saveXML();
}
?>
How the KML to GPX Converter Works
This PHP script handles several key conversion tasks:
- Loads the KML file using PHP’s DOM functions
- Creates a new GPX document with proper XML headers
- Extracts placemarks from KML and converts them to GPX waypoints
- Converts KML LineStrings to GPX tracks
- Preserves names and descriptions from the original file
Using the KML to GPX Converter
To use this converter:
- Copy the code to a PHP file on your server
- Change the $u variable to point to your KML file
- Run the script to get GPX output
The converter is compatible with most KML files from Google Earth and Google Maps. It handles both waypoints (placemarks) and tracks (linestrings).
Additional Resources
For more information about these file formats, check out these resources:
- Google KML Documentation – Official documentation for the KML format
- GPX Format Documentation – Details about the GPX standard
- PHP DOM Documentation – Learn more about PHP’s XML handling
This KML to GPX converter is designed for basic conversion needs. For more complex transformations or special requirements, you might need to modify the code.
Have you tried this KML to GPX converter? Did it work for your files? Let me know in the comments if you have questions or suggestions for improvements!