圏9研究所 工作室

圏9研究所の開発情報資料など

Google Maps Javascript APIで解説地図を作る part02

part02

1.完成

 



2.コード
チェックボックスは消されるのでdocument.writeで書きました

<script>// <![CDATA[
document.write('<form class="map_sisen_form1" name="map_sisen_form1">オーバーレイ選択');
  document.write('<input type="checkbox" id="map_sisen_ch0" onclick="myfunc0();" checked/>九州');
  document.write('<input type="checkbox" id="map_sisen_ch1" onclick="myfunc1();" checked/>扇状地');
  document.write('<input type="checkbox" id="map_sisen_ch2" onclick="myfunc2();" />圏9');
  document.write('<input type="checkbox" id="map_sisen_ch3" onclick="myfunc3();" />地震');
  document.write('<input type="checkbox" id="map_sisen_ch4" onclick="myfunc4();" checked/>地勢図');
  document.write('</form>');
// ]]></script>
</p>
<!-- 地図を表示する div 要素(id="map_sisen")-->
<div id="map_sisen" style="height: 480px; width: 640px;"> </div>
<p>
<script>// <![CDATA[
//
  //  定数設定
  //
  //    center
  //     徳陽駅
  var latlng_centers = ['徳陽市 張含韻',31.14252528930545, 104.38185453414917];    // tokuyo
  //    GroundOverlay
  var latlng_govers = [
    [33.969767872206404, 132.08533213186706],    // kyusyu
    [30.226220095590367, 128.343843675141]
  ];
  //    marker
  //      三星堆遺跡,都江堰
  var latlng_sisens = [
    ['三星堆遺跡',30.992964580094394,104.1998473154064],
    ['都江堰',30.996201991933507,103.61658486285373]
  ];
  //      美人谷,常徳駅
  var latlng_ss = [
    ['美人谷 alan',30.87574509526431, 101.89945936203003],
    ['常徳市 圏9',29.07237455967943, 111.69589519500732]
  ];
  //      アイコン画像
  var url_icon = [
    'http://maps.google.com/mapfiles/ms/icons/green-dot.png',
    'http://maps.google.com/mapfiles/ms/icons/yellow-dot.png',
    'http://maps.google.com/mapfiles/ms/icons/red-dot.png'
  ]
  //    polygon
  //      扇状地構成
  var latlng_polyuppers = [
    [30.887065792544163, 104.42847416449035],
    [31.077209379474276, 103.85203526068176],
    [31.452842104446127, 104.18128178167785],
    [31.302475140588633, 104.41285297918762]
  ];
  var latlng_polylowers = [
    [30.996201991933507, 103.61658486285373],
    [30.40783442127569, 103.82302448797668],
    [30.887065792544163, 104.42847416449035]
  ];
  //    jisin
  //
  var latlng_jisinm = ["四川大地震の震央と強震域", 30.989, 103.329];  // 震央
  var latlng_jisinp = ["強震域",32.290502, 104.862083];  // 強震端
  //
  //  変数定義
  //
  var marker_center;      //  徳陽map中央
  var map_gover_kyusyu;   //  九州地図 GroundOverlay
  var poly_upper;         //  扇状地範囲上側 Polygon
  var poly_lower;         //  扇状地範囲下側 Polygon
  var poly_jsinn;         //  強震域 Polygon
  //
  //  function
  //
  //    marker
  var hoverinfo_center = [];  // 吹き出し center
  var hoverinfo = [];         // 吹き出し 四川とss
  var marker_sisens = [];     // マーカー四川
  var marker_ss = [];         // マーカーss
  var marker_jisin;           // マーカー地震
  //      marker center
  function  make_marker_center() {
    //    center
    var latlng = new google.maps.LatLng(latlng_centers[1], latlng_centers[2]);
    var name = latlng_centers[0];
    var pixelOffset = new google.maps.Size(0, -40);
    var marker = new google.maps.Marker({
      position: latlng,
      zIndex: 5,
      map: map_sisen
    });
    marker_center = marker;
    // マーカーにマウスを乗せたときのイベント
    marker.addListener('mouseover', function() {
      // infoの位置
      hoverinfo_center = new google.maps.InfoWindow({
        map: map_sisen,
        content: name,
        noSuppress: true,
        pixelOffset: pixelOffset
      });
      hoverinfo_center.setPosition(
        latlng
      );
      // マーカーからマウスを降ろしたときのイベント
      marker.addListener('mouseout', function() {
        if(hoverinfo_center)
        hoverinfo_center.close();
      });
    });
  }
  //    marker sisen
  function  make_marker_sisen() {
    marker_sisens = [];
    for(var i = 0; i < latlng_sisens.length; i++) {
      create_Marker(latlng_sisens[i][0],latlng_sisens[i][1],latlng_sisens[i][2],map_sisen,0);
    }
  }
  //    marker ss
  function  make_marker_ss()  {
    marker_ss = [];
    for (var i = 0; i < latlng_ss.length; i++) {
      create_Marker(latlng_ss[i][0],latlng_ss[i][1],latlng_ss[i][2],map_sisen,1);
    }
  }
  //    marker jisin
  function  make_marker_jisin()  {
    marker_jisin = "";
    create_Marker(latlng_jisinm[0],latlng_jisinm[1],latlng_jisinm[2],map_sisen,2);
    //    jisin polygon
    var polArray = [];
    polArray[0] = new google.maps.LatLng(latlng_jisinm[1],latlng_jisinm[2]);
    polArray[1] = new google.maps.LatLng(latlng_jisinp[1],latlng_jisinp[2]);
    poly_jisin = new google.maps.Polygon({
      paths: polArray,
      strokeColor: "#ff0000",
      strokeOpacity: 0.5,
      strokeWeight: 20,
      fillColor: "#ff0000",
      fillOpacity: 0.5,
      map: map_sisen
    });
  }
  //    marker 作成関数
  function  create_Marker(name,lat,lng,map,flag) {
    //marker_sisens[i] = new google.maps.Marker({
    var latlng = new google.maps.LatLng(lat, lng);
    var pixelOffset = new google.maps.Size(0, -40);
    var marker = new google.maps.Marker({
      position: latlng,
      icon: url_icon[flag],
      zIndex: 4,
      map: map
    });
    //        sisen ss 切替
    switch(flag)  {
      case 0:
      marker_sisens.push(marker);
      break;
      case 1:
      marker_ss.push(marker);
      break;
      case 2:
      marker_jisin = marker;
      break;
    }
    // マーカーにマウスを乗せたときのイベント
    marker.addListener('mouseover', function() {
      // infoの位置
      hoverinfo = new google.maps.InfoWindow({
        map: map,
        content: name,
        noSuppress: true,
        pixelOffset: pixelOffset
      });
      hoverinfo.setPosition(
        latlng
      );
      // マーカーからマウスを降ろしたときのイベント
      marker.addListener('mouseout', function() {
        if(hoverinfo)
        hoverinfo.close();
      });
    });
  }

  //    ground overlay kyusyu 九州地図描画
  //      set overlay position
  function  make_gover_kyusyu()  {
    var ne = new google.maps.LatLng(latlng_govers[0][0], latlng_govers[0][1] - 26);
    var sw = new google.maps.LatLng(latlng_govers[1][0], latlng_govers[1][1] - 26);
    var imageBounds = new google.maps.LatLngBounds(sw,ne);
    //    Go overlay
    map_gover_kyusyu = new google.maps.GroundOverlay('https://cdn-ak.f.st-hatena.com/images/fotolife/l/luke24e-hbid/20191123/20191123141007.gif',imageBounds,{opacity: 0.25 },{xIndex: 0 });
    map_gover_kyusyu.setMap(map_sisen);
  }

  //
  //    polygon 扇状地範囲
  function make_polygon(){
    //    upper polygon
    var polArray = [];
    for (i = 0; i < latlng_polyuppers.length; i++) {
      polArray[i] = new google.maps.LatLng(latlng_polyuppers[i][0], latlng_polyuppers[i][1]);
    }
    poly_upper = new google.maps.Polygon({
      paths: polArray,
      strokeColor: "#65f98a",
      strokeOpacity: 0.8,
      strokeWeight: 2,
      fillColor: "#65f98a",
      fillOpacity: 0.25,
      map: map_sisen
    });
    //    lower polygon
    var polArray = [];
    for (i = 0; i < latlng_polylowers.length; i++) {
      polArray[i] = new google.maps.LatLng(latlng_polylowers[i][0], latlng_polylowers[i][1]);
    }
    poly_lower = new google.maps.Polygon({
      paths: polArray,
      strokeColor: "#f9d865",
      strokeOpacity: 0.8,
      strokeWeight: 2,
      fillColor: "#f9d865",
      fillOpacity: 0.25,
      map: map_sisen
    });
  }
  //
  //
  //    google maps call back function
  function initMap() {
    //      LatLng for center of map
    latlng_center_sisen = new google.maps.LatLng(latlng_centers[1], latlng_centers[2]);
    latlng_center_ss = new google.maps.LatLng(
      (latlng_ss[0][1] + latlng_ss[1][1]) / 2, (latlng_ss[0][2] + latlng_ss[1][2]) / 2);
    //      set map options
    mapOptions_base = {
      zoom: 8,
      center: latlng_center_sisen,
      scaleControl: true ,
    }
    mapOptions_terr = {
      mapTypeId: 'terrain',
      styles: [
        {   //  water blue color
          featureType: "water",
          elementType: "all",
          stylers: [
            {visibility: "on"},
            {color: "#0786fa" }
          ]
        },{ //  road invisible
          featureType: "road",
          elementType: "all",
          stylers: [
            {visibility: "off" }
          ]
        },{ //  small administrative invisible
          featureType: "administrative.province",
          elementType: "all",
          stylers: [
            {visibility: "off" }
          ]
        },{
          featureType: "administrative.neighborhood",
          elementType: "all",
          stylers: [
            {visibility: "off" }
          ]
        }
      ]
    }
    mapOptions_road = {
      mapTypeId: 'roadmap',
      styles: [
        { //  road invisible
          featureType: "road",
          elementType: "all",
          stylers: [
            {visibility: "on" }
          ]
        },{ //  small administrative invisible
          featureType: "administrative.province",
          elementType: "all",
          stylers: [
            {visibility: "on" }
          ]
        },{
          featureType: "administrative.neighborhood",
          elementType: "all",
          stylers: [
            {visibility: "on" }
          ]
        }
      ]
    }
    //    make map
    map_sisen = new google.maps.Map(document.getElementById('map_sisen'),mapOptions_base);
    map_sisen.setOptions(mapOptions_terr);
    //      draw marker etc.
    make_gover_kyusyu();
    make_marker_center();
    make_marker_sisen();
    make_polygon();
  }
  //
  //    check box call back
  //      kyusyu ON/OFF
  function myfunc0() {
    var check = document.getElementById("map_sisen_ch0").checked;
    if (check == true) {
      make_gover_kyusyu();
    } else {
      map_gover_kyusyu.setMap(null);
    }
  }
  //      扇状地 ON/OFF
  function myfunc1() {
    var check = document.getElementById("map_sisen_ch1").checked;
    if (check == true) {
      make_polygon();
    } else {
      poly_upper.setMap(null);
      poly_lower.setMap(null);
    }
  }
  //      ss ON/OFF
  function myfunc2() {
    var check = document.getElementById("map_sisen_ch2").checked;
    if (check == true) {
      make_marker_ss();
      map_sisen.setOptions({center: latlng_center_ss});
      map_sisen.setZoom(6);
    } else {
      for(var i = 0; i < marker_ss.length ; i ++) {
        marker_ss[i].setMap(null);
        map_sisen.setOptions({center: latlng_center_sisen});
        map_sisen.setZoom(8);
      }
    }
  }
  //      地震 ON/OFF
  function myfunc3() {
    var check = document.getElementById("map_sisen_ch3").checked;
    if (check == true) {
      make_marker_jisin();
    } else {
      marker_jisin.setMap(null);
      poly_jisin.setMap(null);
    }
  }
  //      地勢図 ON/OFF
  function myfunc4() {
    var check = document.getElementById("map_sisen_ch4").checked;
    if (check == true) {
      map_sisen.setOptions(mapOptions_terr);
    } else {
      map_sisen.setOptions(mapOptions_road);
    }
  }
// ]]></script>
<script src="https://maps.googleapis.com/maps/api/js?key=API_key&amp;callback=initMap" async="" defer="defer"></script>

続く

1 3 NEXT