谷歌地图上的多个标记来自xml文件

时间:2014-01-08 13:28:33

标签: php mysql xml google-maps google-maps-api-3

我非常接近这个工作

我的问题是:如何让google地图读取存储在我的ftp服务器上的data.xml文件?

xml文件如下所示:

<markers>
<marker>
    <lat>57.709</lat>
    <lng>11.9799</lng>
    </marker>
<marker>
    <lat>57.6468</lat>
    <lng>11.9961</lng>
    </marker>
</markers>

这是地图的代码:

<script
src="http://maps.googleapis.com/maps/api/js?key=AIzaSyDY0kkJiTPVd2U7aTOAwhc9ySH6oHxOIYM&sensor=false">
</script>

<script type="text/javascript">
function initialize() {
  var myLatlng = new google.maps.LatLng(57.4419, 11.1419);
  var myOptions = {
    zoom: 20,
    center: myLatlng,
    mapTypeId: google.maps.MapTypeId.ROADMAP
  }
  var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
  downloadUrl("data.xml", function(data) {
    var markers = data.documentElement.getElementsByTagName("marker");
    for (var i = 0; i < markers.length; i++) {
      var latlng = new google.maps.LatLng(parseFloat(markers[i].getAttribute("lat")),
                                  parseFloat(markers[i].getAttribute("lng")));
      var marker = new google.maps.Marker({position: latlng, map: map});
     }
   });
}
</script>

这是XML文件的PHP代码:

$xml="<markers>\n\t\t"; 
while($data=mysql_fetch_array($result))
{
    $xml .="<marker>\n\t\t";
    $xml .= "<lat>".$data['latitude']."</lat>\n\t\t";
    $xml .= "<lng>".$data['longitude']."</lng>\n\t\t";
    $xml .="</marker>\n\t";
}
$xml.="</markers>\n\r";
$handle = fopen('data.xml', 'w') or die('Cannot open data.xml');
fwrite($handle, $xml);

它保存为data.xml,我的地图应加载,但不会显示任何标记。

感谢对此的任何回应。

2 个答案:

答案 0 :(得分:0)

纬度和经度存储为标记的lat / lng-childNodes的内容

您可以通过以下方式访问这些值:

var latlng = new google.maps.LatLng(parseFloat(markers[i]
                                                .getElementsByTagName("lat")[0]
                                                  .firstChild.nodeValue),
                                    parseFloat(markers[i]
                                                .getElementsByTagName("lng")[0]
                                                  .firstChild.nodeValue));

答案 1 :(得分:0)

“映射”XML有三种标准格式(XML代表eXtensible Markup Language,您可以根据需要使用它。)

  • KML - <coordinates>元素的内容,可以用字符串分隔多个值。
<Placemark>
    <name>name</name>
    <description>go 0.3&amp;#160;mi</description>
    <Point>
        <coordinates>-103.17619,44.09972,0</coordinates>
    </Point>
</Placemark>

example parser - geoxml3

<marker lat="44.09972" lng="-103.17619" />

使用您在问题中发布的代码解析:

var markers = data.documentElement.getElementsByTagName("marker");
for (var i = 0; i < markers.length; i++) {
  var latlng = new google.maps.LatLng(parseFloat(markers[i].getAttribute("lat")),
                              parseFloat(markers[i].getAttribute("lng")));
  var marker = new google.maps.Marker({position: latlng, map: map});
 }
  • 单独元素中的纬度/经度内容
<marker>
  <latitude>44.09972</latitude>
  <longitude>-103.17619</longitude>
</marker>

通过获取<latitude><longitude>元素的内容进行解析:

var markers = data.documentElement.getElementsByTagName("marker");
for (var i = 0; i < markers.length; i++) {
  var latlng = new google.maps.LatLng(parseFloat(nodeValue(markers[i].getElementByTagName("latitude")[0])),
                                      parseFloat(nodeValue(markers[i].getElementByTagName("longitude")[0])));
  var marker = new google.maps.Marker({position: latlng, map: map});
}

来自geoxml3

//nodeValue: Extract the text value of a DOM node, with leading and trailing whitespace trimmed
function nodeValue (node) {
  var retStr="";
  if (!node) {
    return '';
  }
  if(node.nodeType==3||node.nodeType==4||node.nodeType==2){
    retStr+=node.nodeValue;
  } else if(node.nodeType==1||node.nodeType==9||node.nodeType==11){
    for(var i=0;i<node.childNodes.length;++i){
      retStr+=arguments.callee(node.childNodes[i]);
    }
  }
  return retStr;
};

question on SO about how to do this using jquery - example from that question

解析xml格式:

<marker>
  <lat>44.09972</lat>
  <lng>-103.17619</lng>
</marker>