Javascript 如何使用外部数据集填充地图图例?

Javascript 如何使用外部数据集填充地图图例?,javascript,google-maps-api-3,Javascript,Google Maps Api 3,我试图使用外部数据集文件显示带有大小圆圈的地图图例,但图例未显示所需的实际信息 如果我在JS代码中创建一个数据数组,这似乎是可行的,但我需要它来处理从中提取的.JS文件 我正在使用的JavaScript如下所示: var map; function initMap() { map = new google.maps.Map(document.getElementById('map'), { zoom: 10, center: { lat: 27.964157,

我试图使用外部数据集文件显示带有大小圆圈的地图图例,但图例未显示所需的实际信息

如果我在JS代码中创建一个数据数组,这似乎是可行的,但我需要它来处理从中提取的.JS文件

我正在使用的JavaScript如下所示:

var map;

function initMap() {
map = new google.maps.Map(document.getElementById('map'), {
    zoom: 10,
    center: {
        lat: 27.964157,
        lng: -82.452606
    },
    mapTypeControl: false,
    streetViewControl: false,
    //    mapTypeId: 'terrain',
    //     disableDefaultUI: true,
    //      gestureHandling: 'none',
    //          zoomControl: false,


});



var script = document.createElement('script');

script.src = 'https://trialscout.com/Scripts/landscapedata/tampadata_geojsonp.js';
document.getElementsByTagName('head')[0].appendChild(script);

map.data.setStyle(function (feature) {
    var nctcount = feature.getProperty('count_of_nct_id');        
    return {
        icon: getCircle(nctcount)
    };
});


var icons = [];

var legend = document.getElementById('legend');
for (var key in icons) {
var type = icons[key];
var name = type.name;
var icon = type.icon;
var scale = type.scale;
var opacity = type.fillOpacity;
var div = document.createElement('div');
div.innerHTML = "<img src='data:image/svg+xml;utf8,<svg viewBox=\"0 0 100 100\" height=\"" + 8 * scale / 8 + "\" width=\"" + 8 * scale / 8 + "\" xmlns=\"http://www.w3.org/2000/svg\"><circle cx=\"50\" cy=\"50\" r=\"50\" style=\"fill: green; stroke: white; stroke-width: 1;\" opacity=\"" + opacity + "\"/></svg>'> " + name;
legend.appendChild(div);
}

  map.controls[google.maps.ControlPosition.RIGHT_BOTTOM].push(legend);

}


function getCircle(nctcount) {
var nctamt = nctcount;
if (nctamt <= 10) {
    return {
        path: google.maps.SymbolPath.CIRCLE,
        fillOpacity: 1,
        fillColor: 'green',
        scale: 5,
        strokeColor: 'white',
        strokeWeight: .5,
        name: "<= 10"
    };
}

else if (nctamt <= 100) {
    return {
        path: google.maps.SymbolPath.CIRCLE,
        fillOpacity: .8,
        fillColor: 'green',
        scale: 10,
        strokeColor: 'white',
        strokeWeight: .5,
        name: "<= 100"
    };
}

else if (nctamt <= 250) {
    return {
        path: google.maps.SymbolPath.CIRCLE,
        fillOpacity: .6,
        fillColor: 'green',
        scale: 15,
        strokeColor: 'white',
        strokeWeight: .5,
        name: "<= 250"
    };
}

else if (nctamt <= 500) {
    return {
        path: google.maps.SymbolPath.CIRCLE,
        fillOpacity: .4,
        fillColor: 'green ',
        scale: 20,
        strokeColor: 'white',
        strokeWeight: .5,
        name: "<= 500"
    };
}

else if (nctamt <= 2000) {
    return {
        path: google.maps.SymbolPath.CIRCLE,
        fillOpacity: .2,
        fillColor: 'green',
        scale: 25,
        strokeColor: 'white',
        strokeWeight: .5,
        name: "<= 2000"
    };
}

else {
    return {
        path: google.maps.SymbolPath.CIRCLE,
        fillOpacity: .2,
        fillColor: 'green',
        scale: 35,
        strokeColor: 'white',
        strokeWeight: .5,
        name: "> 2000"
    };
}

}

function tslandscape_callback(response) {
map.data.addGeoJson(response);
}
var映射;
函数initMap(){
map=new google.maps.map(document.getElementById('map'){
缩放:10,
中心:{
拉脱维亚:27.964157,
液化天然气:-82.452606
},
mapTypeControl:false,
街景控制:错误,
//mapTypeId:'地形',
//disableDefaultUI:true,
//手势处理:“无”,
//动物控制:错误,
});
var script=document.createElement('script');
script.src=https://trialscout.com/Scripts/landscapedata/tampadata_geojsonp.js';
document.getElementsByTagName('head')[0].appendChild(脚本);
map.data.setStyle(函数(特性){
var nctcount=feature.getProperty('count\u of'nct\u id');
返回{
图标:getCircle(nctcount)
};
});
var图标=[];
var legend=document.getElementById('legend');
用于(变量输入图标){
变量类型=图标[键];
var name=type.name;
var icon=type.icon;
var-scale=type.scale;
var opacity=type.fillOpacity;
var div=document.createElement('div');
div.innerHTML=“”>“+名称;
图例.附件(部门);
}
map.controls[google.maps.ControlPosition.RIGHT\u BOTTOM].push(图例);
}
函数getCircle(nctcount){
var nctamt=nctcount;

if(nctamt一个选项是使用我的答案中的代码,并创建一个创建固定图例的函数(而不是尝试从数据动态生成它)



您很好地将问题分解并隔离为“它与X(数组daya)一起工作,但我需要以X的格式获取Y(某些文件??),但我无法检索Y”---然而,你的问题有很多额外的漏洞。我需要花很长时间来检查你的代码,找出X的格式,以及为什么你不能得到Y,以及你是如何试图得到Y的---所以试着把这个问题隔离开来。如果你的外部数据真的是
js
文件而不是一个JSON文件,您需要设置一个服务器端请求,然后将数据发送给您,或者让您的服务器说可以从域外提取脚本(请参阅CORS).但这样做基本上是对安全问题敞开了大门,因为你在外面并不拥有安全问题domain@CodyG.我确实拥有这个外部域。它是一个geojson.js文件。代码中有指向它的链接。数据正确地显示在地图上,但我无法根据getCircle函数中指定的比例在图例中显示圆圈ion.initMap可能是在加载geojson.js文件中的数据之前调用的。是否设置了调试日志/点以查看数据在需要时是否可用?数据正在填充映射,因此正在加载。我只需要根据getCircle函数中的信息填充图例。
function makeLegend(map) {
  var legendmap = {
    scale1: {population: 8},
    scale2: {population: 80},
    scale3: {population: 200},
    scale4: {population: 450},
    scale5: {population: 1900},
    scale6: {population: 5000}
  };
  var icons = [];
  // Construct the circle for each value in legendmap.
  // Note: We scale the area of the circle based on the population.
  for (var entry in legendmap) {
    // Add the circle for this entry to the map.
    var icon = getCircle(legendmap[entry].population);
    if (!icons[icon.scale])
      icons[icon.scale] = icon;
  }

  var legend = document.getElementById('legend');
  for (var key in icons) {
    var type = icons[key];
    var name = type.name;
    var icon = type.icon;
    var scale = type.scale;
    var opacity = type.fillOpacity;
    var div = document.createElement('div');
    div.innerHTML = "<img src='data:image/svg+xml;utf8,<svg viewBox=\"0 0 100 100\" height=\"" + 8 * scale / 8 + "\" width=\"" + 8 * scale / 8 + "\" xmlns=\"http://www.w3.org/2000/svg\"><circle cx=\"50\" cy=\"50\" r=\"50\" style=\"fill: green; stroke: white; stroke-width: 1;\" opacity=\"" + opacity + "\"/></svg>'> " + name;
    legend.appendChild(div);
  }
  // add the created legend to the map
  map.controls[google.maps.ControlPosition.RIGHT_BOTTOM].push(legend);
}