简体   繁体   English

使用XMLHttpRequest加载KML谷歌地图,无法加载KML

[英]Using XMLHttpRequest to load KML google maps, cannot load KML

I have to use XMLHttpRequest to grab a kml file, because I cannot directly make changes to the KML and needed to draw out polygons with their own separate infowindows with details on them that is stored in the KML but not as a description tag or anything like that so I couldn't just grab it easily. 我必须使用XMLHttpRequest来获取kml文件,因为我无法直接对KML进行更改,因此需要使用自己的单独信息窗口绘制多边形,并在KML中存储其详细信息,但不能将其作为描述标签或类似内容这样我就不能轻易抓住它。 I managed to do this, and the polygons display and the infowindows work. 我设法做到了,多边形显示出来并且信息窗口起作用了。 Its a sizable program so I didn't display it here, but basically when I load the getKML function of mine, it would not work in the development environment or present issues. 它是一个相当大的程序,所以我在这里没有显示它,但是基本上,当我加载我的getKML函数时,它不能在开发环境中工作或出现问题。 Whereas it would work well on my localhost. 它将在我的本地主机上很好地工作。

This is the error message I keep getting: Uncaught NetworkError: Failed to execute 'send' on 'XMLHttpRequest': Failed to load ' https://someURL/polygons_live.kml '. 这是我一直收到的错误消息:未捕获的NetworkError:无法在'XMLHttpRequest'上执行'send':无法加载' https://someURL/polygons_live.kml '。

Heres the code, you really only need the first couple lines to look at because thats where xmlhttprequest is used, also excuse me for the messy code, still an intern and refactoring: 继承人的代码,您实际上只需要看前几行,因为那是使用xmlhttprequest的地方,也请原谅我为凌乱的代码,仍然是一个实习生和重构:

  /** Calls using xmlhttprequest to grab the kml file
  * and later prints it out as one or more polygons
  */
function getKML(kmlUrl) {
var xmlRequest = new XMLHttpRequest();
xmlRequest.open("GET", kmlUrl, false);
xmlRequest.send();
xmlDoc = xmlRequest.responseXML;
var x = xmlDoc.getElementsByTagName("Placemark");
// travels through each Placemark tag in the kml files
var outage_time, restoration_time, event_number_value, fillColour, borderColour;
var objArray = [];

for (var i = 0; i < x.length; i++) {
    // uses momentjs api to create human readable dates
    var date_format = "MMM DD, hh:mm a";
    // gets the event number
    event_number_value = x[i].getElementsByTagName("SimpleData")[2].childNodes[0].nodeValue;
    // gets outage start time
    var outage_time_value = x[i].getElementsByTagName("SimpleData")[3].childNodes[0].nodeValue;
    var outage_time_moment = moment(outage_time_value);
    outage_time = outage_time_moment.format(date_format);
    // gets estimated restoration time
    var restoration_time_value = x[i].getElementsByTagName("SimpleData")[5].childNodes[0].nodeValue;
    // checks to see if we have a restoration time or not
    if (restoration_time_value === "2001-01-01T00:00:00") {
        restoration_time = "Not yet determined";
    } else {
        var restoration_time_moment = moment(restoration_time_value);
        restoration_time = restoration_time_moment.format(date_format);
    }
    // gets the coordinates of the polygon
    var coords = x[i].getElementsByTagName("coordinates")[0].childNodes[0].nodeValue;
    var coordinate = coords.split(",0 ");
    var coordJoined = coordinate.join();
    var coordAgain = coordJoined.split(",");
    // gets the colour of the polygon
    var colour = x[i].getElementsByTagName("styleUrl")[0].childNodes[0].nodeValue;
    // determines the colour out of yellow, orange and red
    if (colour === "#Style1") {
        fillColour = '#f1c40f';
        borderColour = '#f1c40f';
    } else if (colour === "#Style2") {
        fillColour = '#e67e22';
        borderColour = '#e67e22';
    } else {
        fillColour = '#c0392b';
        borderColour = '#c0392b';
    }

    // creates objects and adds it to array to be later used as data
    var obj = {
        eventID : event_number_value,
        offTime : outage_time,
        restoreTime : restoration_time,
        fill : fillColour,
        borderCol : borderColour
    };
    objArray.push(obj);

    // create a LatLng array out of the coordinate string
    var polygonCoords = new Array();
    var j = 0;
    var z = j + 1;
    //var firstCoord = new google.maps.LatLng();
    while (z < coordAgain.length) {
        // adds the first and last latLng to the array of polygonCoords
        if ((j % 2) == 0) {
            var co1 = parseFloat(coordAgain[z]);
            var co2 = parseFloat(coordAgain[j]);
            var newLatLng = new google.maps.LatLng(co1, co2);
            polygonCoords.push(newLatLng);
        } else {
            var co1 = parseFloat(coordAgain[j]);
            var co2 = parseFloat(coordAgain[z]);
            var newLatLng = new google.maps.LatLng(co1, co2);
            polygonCoords.push(newLatLng);
        }
        j++;
        z++;
    }
    //removes last coordinate as its useless as its not a number
    polygonCoords.pop();

    /** Adds the polygon to a polygon array
     * and maps it onto the map
     */
    var newPoly = new google.maps.Polygon({
        paths : polygonCoords,
        strokeColor : objArray[i].borderCol,
        strokeOpacity : 0.35,
        strokeWeight : 2,
        fillColor : objArray[i].fill,
        fillOpacity : 0.35
    })
    newPoly.setMap(map);
    newPoly.set("eventNum", objArray[i].eventID);
    newPoly.set("offTime", objArray[i].offTime);
    newPoly.set("resTime", objArray[i].restoreTime);

    google.maps.event.addListener(newPoly, 'click',
            attachInfoWindow(newPoly));
    polyArray.push(newPoly);
}
}

Update 1: I actually found this error later on appearing in my console: XMLHttpRequest cannot load https://someurl/polygons_live.kml . 更新1:实际上,我稍后在控制台中发现此错误:XMLHttpRequest无法加载https://someurl/polygons_live.kml No 'Access-Control-Allow-Origin' header is present on the requested resource. 所请求的资源上没有“ Access-Control-Allow-Origin”标头。 Origin ' https://someurl ' is therefore not allowed access. 因此,不允许访问源' https:// someurl '。

Its a cross-domain request issue, I'm going to start using relative addresses to point to when grabbing my kml. 这是一个跨域请求问题,在开始获取我的kml时,我将开始使用相对地址来指向。

It resolved my issue. 它解决了我的问题。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM