Google 地图更改 JSON 覆盖单选按钮选择的填充颜色

Google Maps Change fillColor of JSON Overlay On Radio Button Selection

这是一张基本的 Google 地图,带有 JSON 叠加层

COLOR 单选按钮只是从 JSON 文件中提取颜色。

INCOME 单选按钮是一个 Chloropleth 地图,其中颜色或每个单独的多边形基于收入所属的范围。

我想更改 INCOME 地图的 JSON 叠加层的填充颜色。

我有两个决定叶绿体颜色的开关

第一个开关连接到 var incomeColorArea1

第二个开关连接到 var incomeColorArea2

我还有两个单独的 JSON 文件 var area1var area2

我希望第一个开关与 var area1 关联,我希望第二个开关与 var area2

我尝试在下面添加一个简单的 if then 语句:

    if (area1.checked) {
    var incomeColor = incomeColorArea1;
    }   else if (area2.checked) {
    var incomeColor = incomeColorArea2; 
    }

没用。

唯一可行的方法是手动更改:

incomeColorincomeColorArea1incomeColorArea2

在下面的代码中:

    if (color.checked) {    
        return {
          fillColor: feature.getProperty('COLOR'),
          strokeWeight: 1,
          strokeColor: 'black',
          fillOpacity: 0.4,
          strokeOpacity: 1,
          zIndex: 0
        };
      } else if (income.checked) {    
        return {
            fillColor: incomeColor,
            strokeWeight: 1,
            strokeColor: 'black',
            fillOpacity: 0.8,
            strokeOpacity: 1,
            zIndex: 0
        };
      }
    }       

完整代码如下:

   var map;
 //COLORS
 // Income Map Color
 var incomeColor1 = '#f2f0f7';
 var incomeColor2 = '#cbc9e2';
 var incomeColor3 = '#9e9ac8';
 var incomeColor4 = '#756bb1';
 var incomeColor5 = '#54278f';

 // LEGEND SCORES
 // Income Map Score
  //Area 1 incomeScore
  var incomeScore1 = 20000;
  var incomeScore2 = 50000; 
  var incomeScore3 = 80000;
  var incomeScore4 = 110000;
  var incomeScore5 = 140000;
  //Area 2 incomeScore
  var incomeScore6 = 40000;
  var incomeScore7 = 60000; 
  var incomeScore8 = 100000;
  var incomeScore9 = 160000;
  var incomeScore10 = 500000;

  function initAutocomplete() {
  var map = new google.maps.Map(document.getElementById('map'), {
    zoom: 3,
    center: {lat: 40.656963,lng: -112.506664},
    gestureHandling: 'greedy',
    mapTypeControl: false
  });

  var area1 = createArea('https://api.myjson.com/bins/t1mhs');
  var area2 = createArea('https://api.myjson.com/bins/zle5c');
   
function changeMap(feature) {

 var incomeScore = feature.getProperty('INCOME'); 

   var incomeColorArea1 = ""; // polygon fill color

 //Area 1 Income Switch
  switch (true) {
   case ( incomeScore == 0 || incomeScore === null ): // in case of no value
     incomeColor = '#d4d4d4'; break;
   case ( incomeScore <=  incomeScore1): incomeColorArea1 = incomeColor1; break;
   case ( incomeScore <=  incomeScore2): incomeColorArea1 = incomeColor2; break;
   case ( incomeScore <=  incomeScore3): incomeColorArea1 = incomeColor3; break;
   case ( incomeScore <=  incomeScore4): incomeColorArea1 = incomeColor4; break;
   case ( incomeScore <=  incomeScore5): incomeColorArea1 = incomeColor5; break;
   default: incomeColor = '#d4d4d4'; break;
  }
   var incomeColorArea2 = ""; // polygon fill color 
 //Area 2 Income Switch
  switch (true) {
   case ( incomeScore == 0 || incomeScore === null ): // in case of no value
     incomeColor = '#d4d4d4'; break;
   case ( incomeScore <=  incomeScore6):  incomeColorArea2 = incomeColor1; break;
   case ( incomeScore <=  incomeScore7):  incomeColorArea2 = incomeColor2; break;
   case ( incomeScore <=  incomeScore8):  incomeColorArea2 = incomeColor3; break;
   case ( incomeScore <=  incomeScore9):  incomeColorArea2 = incomeColor4; break;
   case ( incomeScore <=  incomeScore10): incomeColorArea2 = incomeColor5; break;
   default: incomeColor = '#d4d4d4'; break;
  }
 
  if (area1.checked) {
  var incomeColor = incomeColorArea1;
  } else if (area2.checked) {
  var incomeColor = incomeColorArea2; 
  }

  if (color.checked) { 
   return {
     fillColor: feature.getProperty('COLOR'),
     strokeWeight: 1,
     strokeColor: 'black',
     fillOpacity: 0.4,
     strokeOpacity: 1,
     zIndex: 0
   };
    } else if (income.checked) {   
   return {
    fillColor: incomeColor,
    strokeWeight: 1,
    strokeColor: 'black',
    fillOpacity: 0.8,
    strokeOpacity: 1,
    zIndex: 0
   };
    }
  }  

  // Infowindow
  var infoWindow = new google.maps.InfoWindow({
    zIndex: 2
  });
  map.addListener('click', function() {
    area1.revertStyle();
    area2.revertStyle();
    infoWindow.close();
  })

  function clickFunc(event) {
    this.revertStyle();
    this.overrideStyle(event.feature, {
      strokeWeight: 2,
      strokeColor: 'black',
      zIndex: 1
    });
  }


  function mouseFunc(event) {
    this.revertStyle();
    this.overrideStyle(event.feature, {
      strokeWeight: 2,
      strokeColor: 'black',
      zIndex: 1
    });
  }

  function createArea(url) {
    var area = new google.maps.Data();
    
 area.loadGeoJson(url);
    area.setStyle(changeMap);
 area.addListener('click', clickFunc);  
    area.addListener('mouseover', mouseFunc);
    return area;
  }

  setArea();

  function setArea() {
    infoWindow.close();
    area1.setMap(document.getElementById('area1').checked ? map : null);
    area2.setMap(document.getElementById('area2').checked ? map : null);
  }

  google.maps.event.addDomListener(document.getElementById('area1'), 'click', setArea);
  google.maps.event.addDomListener(document.getElementById('area2'), 'click', setArea);
  google.maps.event.addDomListener(document.getElementById('color'), 'click', setArea);   
  google.maps.event.addDomListener(document.getElementById('income'), 'click', setArea);   
}
      #map {
        height: 100%;
      }
      /* Optional: Makes the sample page fill the window. */
      html, body {
        height: 100%;
        margin: 0;
        padding: 0;
      }
<div id="content">

<form class="form"">
 <div class="switch-field">
  <input type="radio" id="area1" name="switch-two" checked/>
  <label for="area1">Area 1</label>
  <input type="radio" id="area2" name="switch-two"/>
  <label for="area2">Area 2</label>
 </div>

<label class="container" style="margin-top: 12px;">COLOR
  <input type="radio" checked="checked" name="radio" id="color">
  <span class="checkmark"></span>
</label>
 </br>
<label class="container">INCOME
  <input type="radio" name="radio" id="income">
  <span class="checkmark"></span>
</label>
</form>
</div>
<div id="map"></div>
<script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyCkUOdZ5y7hMm0yrcCQoCvLwzdM6M8s5qk&libraries=places&callback=initAutocomplete" async defer></script>

您的代码中有错字。

area1area2google.maps.Data 对象(以及 HTML 元素 ID),您无法访问 HTML 元素的 'checked' 属性 作为 area1.checked。改变这个:

if (area1.checked) {
  var incomeColor = incomeColorArea1;
} else if (area2.checked) {
  var incomeColor = incomeColorArea2;   
}

至:

if (document.getElementById("area1").checked) {
  incomeColor = incomeColorArea1;
} else if (document.getElementById("area2").checked) {
  incomeColor = incomeColorArea2;
}

proof of concept fiddle

代码片段:

var map;
//COLORS
// Income Map Color
var incomeColor1 = '#f2f0f7';
var incomeColor2 = '#cbc9e2';
var incomeColor3 = '#9e9ac8';
var incomeColor4 = '#756bb1';
var incomeColor5 = '#54278f';

// LEGEND SCORES
// Income Map Score
//Area 1 incomeScore
var incomeScore1 = 20000;
var incomeScore2 = 50000;
var incomeScore3 = 80000;
var incomeScore4 = 110000;
var incomeScore5 = 140000;
//Area 2 incomeScore
var incomeScore6 = 40000;
var incomeScore7 = 60000;
var incomeScore8 = 100000;
var incomeScore9 = 160000;
var incomeScore10 = 500000;

function initAutocomplete() {
  var map = new google.maps.Map(document.getElementById('map'), {
    zoom: 3,
    center: {
      lat: 40.656963,
      lng: -112.506664
    },
    gestureHandling: 'greedy',
    mapTypeControl: false
  });

  var area1 = createArea('https://api.myjson.com/bins/t1mhs');
  var area2 = createArea('https://api.myjson.com/bins/zle5c');

  function changeMap(feature) {
    var incomeScore = feature.getProperty('INCOME');
    var incomeColorArea1 = ""; // polygon fill color

    //Area 1 Income Switch
    switch (true) {
      case (incomeScore == 0 || incomeScore === null): // in case of no value
        incomeColorArea1 = '#d4d4d4';
        break;
      case (incomeScore <= incomeScore1):
        incomeColorArea1 = incomeColor1;
        break;
      case (incomeScore <= incomeScore2):
        incomeColorArea1 = incomeColor2;
        break;
      case (incomeScore <= incomeScore3):
        incomeColorArea1 = incomeColor3;
        break;
      case (incomeScore <= incomeScore4):
        incomeColorArea1 = incomeColor4;
        break;
      case (incomeScore <= incomeScore5):
        incomeColorArea1 = incomeColor5;
        break;
      default:
        incomeColorArea1 = '#d4d4d4';
        break;
    }
    var incomeColorArea2 = ""; // polygon fill color 
    //Area 2 Income Switch
    switch (true) {
      case (incomeScore == 0 || incomeScore === null): // in case of no value
        incomeColorArea2 = '#d4d4d4';
        break;
      case (incomeScore <= incomeScore6):
        incomeColorArea2 = incomeColor1;
        break;
      case (incomeScore <= incomeScore7):
        incomeColorArea2 = incomeColor2;
        break;
      case (incomeScore <= incomeScore8):
        incomeColorArea2 = incomeColor3;
        break;
      case (incomeScore <= incomeScore9):
        incomeColorArea2 = incomeColor4;
        break;
      case (incomeScore <= incomeScore10):
        incomeColorArea2 = incomeColor5;
        break;
      default:
        incomeColorArea2 = '#d4d4d4';
        break;
    }

    if (document.getElementById("area1").checked) {
      var incomeColor = incomeColorArea1;
    } else if (document.getElementById("area2").checked) {
      var incomeColor = incomeColorArea2;
    }

    if (color.checked) {
      return {
        fillColor: feature.getProperty('COLOR'),
        strokeWeight: 1,
        strokeColor: 'black',
        fillOpacity: 0.4,
        strokeOpacity: 1,
        zIndex: 0
      };
    } else if (income.checked) {
      return {
        fillColor: incomeColor,
        strokeWeight: 1,
        strokeColor: 'black',
        fillOpacity: 0.8,
        strokeOpacity: 1,
        zIndex: 0
      };
    }
  }

  // Infowindow
  var infoWindow = new google.maps.InfoWindow({
    zIndex: 2
  });
  map.addListener('click', function() {
    area1.revertStyle();
    area2.revertStyle();
    infoWindow.close();
  })

  function clickFunc(event) {
    this.revertStyle();
    this.overrideStyle(event.feature, {
      strokeWeight: 2,
      strokeColor: 'black',
      zIndex: 1
    });
  }


  function mouseFunc(event) {
    this.revertStyle();
    this.overrideStyle(event.feature, {
      strokeWeight: 2,
      strokeColor: 'black',
      zIndex: 1
    });
  }

  function createArea(url) {
    var area = new google.maps.Data();

    area.loadGeoJson(url);
    area.setStyle(changeMap);
    area.addListener('click', clickFunc);
    area.addListener('mouseover', mouseFunc);
    return area;
  }

  setArea();

  function setArea() {
    infoWindow.close();
    area1.setMap(document.getElementById('area1').checked ? map : null);
    area2.setMap(document.getElementById('area2').checked ? map : null);
  }

  google.maps.event.addDomListener(document.getElementById('area1'), 'click', setArea);
  google.maps.event.addDomListener(document.getElementById('area2'), 'click', setArea);
  google.maps.event.addDomListener(document.getElementById('color'), 'click', setArea);
  google.maps.event.addDomListener(document.getElementById('income'), 'click', setArea);
}
html,
body {
  height: 100%;
  width: 100%;
  margin: 0px;
  padding: 0px;
}

#map {
  height: 85%;
  width: 100%;
}
<div id="content">

  <form class="form">
    <div class="switch-field">
      <input type="radio" id="area1" name="switch-two" checked/>
      <label for="area1">Area 1</label>
      <input type="radio" id="area2" name="switch-two" />
      <label for="area2">Area 2</label>
    </div>

    <label class="container" style="margin-top: 12px;">COLOR
  <input type="radio" checked="checked" name="radio" id="color">
  <span class="checkmark"></span>
</label>
    </br>
    <label class="container">INCOME
  <input type="radio" name="radio" id="income">
  <span class="checkmark"></span>
</label>
  </form>
</div>
<div id="map"></div>
<script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyCkUOdZ5y7hMm0yrcCQoCvLwzdM6M8s5qk&libraries=places&callback=initAutocomplete" async defer></script>