Я так близок к тому, чтобы
Мой вопрос: как я могу заставить карты google читать файл data.xml, который хранится на моем ftp-сервере?
Файл 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>
Это код PHP для файла XML:
$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);
в$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, и мои карты должны загружаться, но маркеры не отображаются.
Оцените любой ответ на этот вопрос.
Существует три стандартных формата для «сопоставления» XML (XML означает расширяемый язык разметки , вы можете делать с ним то, что хотите).
<coordinates>
, возможны несколько значений, разделенных строками. <Placemark> <name>name</name> <description>go 0.3&#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; };
вопрос о SO о том, как это сделать, используя jquery – пример из этого вопроса
XML-формат проанализирован:
<marker> <lat>44.09972</lat> <lng>-103.17619</lng> </marker>
Широта и долгота сохраняются как содержимое лат / lng-childNodes маркера
Вы можете получить доступ к значениям через:
var latlng = new google.maps.LatLng(parseFloat(markers[i] .getElementsByTagName("lat")[0] .firstChild.nodeValue), parseFloat(markers[i] .getElementsByTagName("lng")[0] .firstChild.nodeValue));