--- /tmp/kml/kml.module 2007-09-21 03:27:06.000000000 +1000 +++ kml.module 2008-06-28 21:11:53.000000000 +1000 @@ -688,21 +688,50 @@ function kml_format_placemark($item, $li $output .= " ". $timestamp ."\n"; } } + + // Strip any geometry information from args + $geometrys = array(); + $force_multi = FALSE; + + // Handle MultiGeometry on it's own. + if ($args['MultiGeometry']) { + $geometrys[] = $args['MultiGeometry'] . "\n"; + unset($args['MultiGeometry']); + $force_multi = TRUE; + } + + $geo_types = array('Point', 'LineString', 'LinearRing', 'Polygon', 'Model'); + foreach ($geo_types as $geo_type) { + if ($args[$geo_type]) { + $geometrys[] = "<$geo_type>" . $args[$geo_type] . "\n"; + unset($args[$geo_type]); + } + } // Coordinate information $lat = $item->location['latitude']; $long = $item->location['longitude']; if ($lat && $long) { - $output .= " \n"; + $point = " \n"; $pointelements = array('altitudeMode', 'extrude'); // elements that extend Point foreach ($pointelements as $pointelement) { if ($args[$pointelement]) { - $output .= " <$pointelement>". $args[$pointelement] ."\n"; + $point .= " <$pointelement>". $args[$pointelement] ."\n"; unset($args[$pointelement]); } } - $output .= ' '. $long .','. $lat .','. $alt ."\n"; - $output .= " \n"; + $point .= ' '. $long .','. $lat .','. $alt ."\n"; + $point .= " \n"; + $geometrys[] = $point; + } + if ($force_multi or count($geometrys) > 1) { + $output .= "\n"; + while ($geometrys) { + $output .= array_shift($geometrys); + } + $output .= "\n"; + } else if (count($geometrys)) { + $output .= array_shift($geometrys); } // Address information. Needs city and country at a minimum.