Friday, May 17, 2024
 Popular · Latest · Hot · Upcoming
143
rated 0 times [  147] [ 4]  / answers: 1 / hits: 21891  / 10 Years ago, tue, may 20, 2014, 12:00:00

So, I am attempting to draw multiple polygons onto a google map via polygon spatial data from my MySQL table. I have a php script that outputs the following XML based off my table data.



<subdivision name=Auburn Hills>
<coord lat=39.00748 lng=-92.323222/>
<coord lat=39.000843 lng=-92.323523/>
<coord lat=39.000509 lng=-92.311592/>
<coord lat=39.007513 lng=-92.311378/>
<coord lat=39.00748 lng=-92.323222/>
</subdivision>
<subdivision name=Vanderveen>
<coord lat=38.994206 lng=-92.350645/>
<coord lat=38.985033 lng=-92.351074/>
<coord lat=38.984699 lng=-92.343092/>
<coord lat=38.981163 lng=-92.342234/>
<coord lat=38.984663 lng=-92.3335/>
<coord lat=38.993472 lng=-92.333179/>
<coord lat=38.994206 lng=-92.350645/>
</subdivision>


My issue is that the javascript I am using to try and draw each shape onto the map is returning odd coordinates. using an alert, I can see that the array that is meant to store the coordinates for the new google.maps.Polygon is returning the first latitude and longitude pair for each shape and drawing a line segment as opposed to the full polygon. The problematic javascript is below.



function initialize() {
var mapOptions = {
...
};

var map = new google.maps.Map(document.getElementById('map-canvas'),
mapOptions);
var arr = new Array();
var polygons = [];

downloadUrl(subdivision-coordinates.php, function(data) {
var xml = data.responseXML;
var subdivision = xml.documentElement.getElementsByTagName(subdivision);
for (var i = 0; i < subdivision.length; i++) {
var coordinates = xml.documentElement.getElementsByTagName(subdivision)[i].getElementsByTagName(coord);
arr.push( new google.maps.LatLng(
parseFloat(coordinates[i].getAttribute(lat)),
parseFloat(coordinates[i].getAttribute(lng))
));

polygons.push(new google.maps.Polygon({
paths: arr,
strokeColor: '#FF0000',
strokeOpacity: 0.8,
strokeWeight: 2,
fillColor: '#FF0000',
fillOpacity: 0.35
}));
polygons[polygons.length-1].setMap(map);
}
});
}
function downloadUrl(url, callback) {
..blah..blah stuff from google
}
function doNothing() {}
google.maps.event.addDomListener(window, 'load', initialize);


The issue seems to be clearly related to how I am pushing the data into the array arr. I've tried a few different methods of handling it and nothing seems to be working (I am admittedly a novice when it comes to javascript). Any advice would be greatly appreciated!


More From » mysql

 Answers
4

The google.maps.Polygon paths property takes an array of arrays of google.maps.LatLngs. You need to process through each subdivision as its own array and either push it as a separate path into the one polygon or (as below) create a new polygon for each.


    var subdivision = xml.getElementsByTagName("subdivision");
for (var i = 0; i < subdivision.length; i++) {
arr = [];
var coordinates = xml.documentElement.getElementsByTagName("subdivision")[i].getElementsByTagName("coord");
for (var j=0; j < coordinates.length; j++) {
arr.push( new google.maps.LatLng(
parseFloat(coordinates[j].getAttribute("lat")),
parseFloat(coordinates[j].getAttribute("lng"))
));

bounds.extend(arr[arr.length-1])
}
polygons.push(new google.maps.Polygon({
paths: arr,
strokeColor: '#FF0000',
strokeOpacity: 0.8,
strokeWeight: 2,
fillColor: '#FF0000',
fillOpacity: 0.35
}));
polygons[polygons.length-1].setMap(map);
}

working fiddle


code snippet:




function initialize() {
var mapOptions = {
zoom: 5,
center: new google.maps.LatLng(40, -117),
mapTypeId: google.maps.MapTypeId.ROADMAP
};

var map = new google.maps.Map(document.getElementById('map-canvas'), mapOptions);
var arr = new Array();
var polygons = [];
var bounds = new google.maps.LatLngBounds();

// downloadUrl(subdivision-coordinates.php, function(data) {
var xml = xmlParse(xmlString);
var subdivision = xml.getElementsByTagName(subdivision);
// alert(subdivision.length);
for (var i = 0; i < subdivision.length; i++) {
arr = [];
var coordinates = xml.documentElement.getElementsByTagName(subdivision)[i].getElementsByTagName(coord);
for (var j = 0; j < coordinates.length; j++) {
arr.push(new google.maps.LatLng(
parseFloat(coordinates[j].getAttribute(lat)),
parseFloat(coordinates[j].getAttribute(lng))
));

bounds.extend(arr[arr.length - 1])
}
polygons.push(new google.maps.Polygon({
paths: arr,
strokeColor: '#FF0000',
strokeOpacity: 0.8,
strokeWeight: 2,
fillColor: '#FF0000',
fillOpacity: 0.35
}));
polygons[polygons.length - 1].setMap(map);
}
// });
map.fitBounds(bounds);
}
var xmlString = '<subdivisions><subdivision name=Auburn Hills><coord lat=39.00748 lng=-92.323222/><coord lat=39.000843 lng=-92.323523/><coord lat=39.000509 lng=-92.311592/><coord lat=39.007513 lng=-92.311378/><coord lat=39.00748 lng=-92.323222/></subdivision><subdivision name=Vanderveen><coord lat=38.994206 lng=-92.350645/><coord lat=38.985033 lng=-92.351074/><coord lat=38.984699 lng=-92.343092/><coord lat=38.981163 lng=-92.342234/><coord lat=38.984663 lng=-92.3335/><coord lat=38.993472 lng=-92.333179/><coord lat=38.994206 lng=-92.350645/></subdivision><subdivisions>';

/**
* Parses the given XML string and returns the parsed document in a
* DOM data structure. This function will return an empty DOM node if
* XML parsing is not supported in this browser.
* @param {string} str XML string.
* @return {Element|Document} DOM.
*/
function xmlParse(str) {
if (typeof ActiveXObject != 'undefined' && typeof GetObject != 'undefined') {
var doc = new ActiveXObject('Microsoft.XMLDOM');
doc.loadXML(str);
return doc;
}

if (typeof DOMParser != 'undefined') {
return (new DOMParser()).parseFromString(str, 'text/xml');
}

return createElement('div', null);
}

google.maps.event.addDomListener(window, 'load', initialize);

#map-canvas,
body,
html {
height: 100%;
width: 100%;
}

<script src=http://maps.google.com/maps/api/js?key=AIzaSyCkUOdZ5y7hMm0yrcCQoCvLwzdM6M8s5qk></script>
<div id=map-canvas></div>




[#70928] Sunday, May 18, 2014, 10 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
mira

Total Points: 460
Total Questions: 108
Total Answers: 99

Location: American Samoa
Member since Fri, Aug 26, 2022
2 Years ago
mira questions
;