【问题标题】:Google Maps V3: Draw German State Polygons?Google Maps V3:绘制德国州多边形?
【发布时间】:2012-06-08 03:15:06
【问题描述】:

我需要在某些德国州上绘制彩色多边形。做到这一点的最好方法是什么(或最简单、最快、最……)?我是否需要以某种方式将所有轮廓作为纬度/经度点并根据这些轮廓绘制多边形?还是有更好的办法?

【问题讨论】:

    标签: google-maps google-maps-api-3


    【解决方案1】:

    你想做这样的事情吗? http://www.geocodezip.com/geoxml3_test/v3_FusionTables_query_sidebarF_local.html?country=Germany

    它使用publicly available data in FusionTables, the Natural Earth Data set

     encrypted ID:
     https://www.google.com/fusiontables/DataSource?docid=19lLpgsKdJRHL2O4fNmJ406ri9JtpIIk8a-AchA
     numeric ID:
     https://www.google.com/fusiontables/DataSource?dsrcid=420419
    

    您可以随意设置样式(颜色)。

    代码 sn-p:

    // globals
    var map = null;
    var infoWindow = null;
    var geoXml = null;
    var geoXmlDoc = null;
    var myLatLng = null;
    var myOptions = null;
    var mapCenter = null;
    var geocodeTheCountry = true;
    var gpolygons = [];
    
    // Fusion Table data ID
    var FT_TableID = "19lLpgsKdJRHL2O4fNmJ406ri9JtpIIk8a-AchA"; // 420419;
    var CountryName = "Germany";
    google.load('visualization', '1', {
      'packages': ['corechart', 'table', 'geomap']
    });
    
    function createSidebar() {
      // set the query using the parameters
      var FT_Query2 = "SELECT 'name_0', 'name_1', 'kml_4326' FROM " + FT_TableID + " WHERE name_0 = '" + CountryName + "' ORDER by 'name_1'";
      var queryText = encodeURIComponent(FT_Query2);
      // alert("createSidebar query="+FT_Query2);
      var query = new google.visualization.Query('http://www.google.com/fusiontables/gvizdata?tq=' + queryText);
    
      //set the callback function
      query.send(getData);
    }
    
    // Set a callback to run when the Google Visualization API is loaded.
    google.setOnLoadCallback(createSidebar);
    
    var FTresponse = null;
    
    myLatLng = new google.maps.LatLng(37.422104808, -122.0838851);
    // these set the initial center, zoom and maptype for the map 
    // if it is not specified in the query string
    var lat = 37.422104808;
    var lng = -122.0838851;
    var zoom = 18;
    var maptype = google.maps.MapTypeId.ROADMAP;
    if (!isNaN(lat) && !isNaN(lng)) {
      myLatLng = new google.maps.LatLng(lat, lng);
    }
    infoWindow = new google.maps.InfoWindow();
    //define callback function, this is called when the results are returned
    function getData(response) {
      if (!response) {
        alert('no response');
        return;
      }
      if (response.isError()) {
        alert('Error in query: ' + response.getMessage() + ' ' + response.getDetailedMessage());
        return;
      }
      FTresponse = response;
      //for more information on the response object, see the documentation
      //http://code.google.com/apis/visualization/documentation/reference.html#QueryResponse
      numRows = response.getDataTable().getNumberOfRows();
      numCols = response.getDataTable().getNumberOfColumns();
    
      fusiontabledata = "<table><tr>";
      fusiontabledata += "<th>" + response.getDataTable().getColumnLabel(1) + "</th>";
      //   }
      fusiontabledata += "</tr><tr>";
    
      for (i = 0; i < numRows; i++) {
        fusiontabledata += "<td><a href='javascript:myFTclick(" + i + ")'>" + response.getDataTable().getValue(i, 1) + "</a></td>";
        //    }
        fusiontabledata += "</tr><tr>";
      }
      fusiontabledata += "</table>";
      //display the results on the page
      document.getElementById('sidebar').innerHTML = fusiontabledata;
    }
    
    function infoWindowContent(name, description) {
      content = '<div class="FT_infowindow"><h3>' + name +
        '</h3><div>' + description + '</div></div>';
      return content;
    }
    
    function myFTclick(row) {
      var description = FTresponse.getDataTable().getValue(row, 0);
      var name = FTresponse.getDataTable().getValue(row, 1);
      if (!gpolygons[row]) {
        var kml = FTresponse.getDataTable().getValue(row, 2);
        // create a geoXml3 parser for the click handlers
        var geoXml = new geoXML3.parser({
          map: map,
          zoom: false,
          infoWindow: infoWindow,
          singleInfoWindow: true
        });
    
        geoXml.parseKmlString("<Placemark>" + kml + "</Placemark>");
        geoXml.docs[0].gpolygons[0].setMap(null);
        gpolygons[row] = geoXml.docs[0].gpolygons[0].bounds.getCenter();
      }
      var position = gpolygons[row];
      if (!infoWindow) infoWindow = new google.maps.InfoWindow({});
      infoWindow.setOptions({
        content: infoWindowContent(name, description),
        pixelOffset: new google.maps.Size(0, 2),
        position: position
      });
      infoWindow.open(map);
    }
    
    function initialize() {
      myOptions = {
        zoom: zoom,
        center: myLatLng,
        mapTypeId: maptype
      };
    
      map = new google.maps.Map(document.getElementById("map_canvas"),
        myOptions);
    
      var geocoder = new google.maps.Geocoder();
      if (geocoder && geocodeTheCountry) {
        geocoder.geocode({
          'address': CountryName + " Country"
        }, function(results, status) {
          if (status == google.maps.GeocoderStatus.OK) {
            if (status != google.maps.GeocoderStatus.ZERO_RESULTS) {
              map.setCenter(results[0].geometry.location);
              map.fitBounds(results[0].geometry.viewport);
            } else {
              alert("No results found");
            }
          } else {
            alert("Geocode was not successful for the following reason: " + status);
          }
        });
      }
    
      var FT_Query = "SELECT 'kml_4326' FROM " + FT_TableID + " WHERE 'name_0' = '" + CountryName + "';";
      var FT_Options = {
        suppressInfoWindows: true,
        query: {
          from: FT_TableID,
          select: 'kml_4326',
          where: "'name_0' = '" + CountryName + "';"
        },
        styles: [{
          polygonOptions: {
            fillColor: "#FF0000",
            fillOpacity: 0.35
          }
        }]
      };
      layer = new google.maps.FusionTablesLayer(FT_Options);
      layer.setMap(map);
    
      google.maps.event.addListener(layer, "click", function(event) {
        infoWindow.close();
        infoWindow.setContent(infoWindowContent(event.row.name_1.value, event.row.name_0.value));
        infoWindow.setPosition(event.latLng);
        infoWindow.open(map);
      });
    }
    google.maps.event.addDomListener(window, 'load', initialize);
    html,
    body {
      width: 100%;
      height: 100%;
      margin: 0;
      padding: 0;
    }
    #map_canvas {
      width: 300px;
      height: 100%
    }
    .infowindow * {
      font-size: 90%;
      margin: 0
    }
    <script src="https://geoxml3.googlecode.com/svn/branches/polys/geoxml3.js"></script>
    <script src="http://www.google.com/jsapi"></script>
    <script src="https://maps.googleapis.com/maps/api/js"></script>
    <table style="width:100%; height:100%;">
      <tr style="width:100%; height:90%;">
        <td style="width:60%; height:100%;">
          <div id="map_canvas"></div>
        </td>
        <td>
          <div id="sidebar" style="width:300px;height:400px; overflow:auto"></div>
        </td>
      </tr>
    </table>

    【讨论】:

      【解决方案2】:

      另外,您可以看看 Google GeoChart API,它的功能并不丰富,但非常易于使用。在API playground 中尝试以下代码:

        function drawVisualization() {
        var data = google.visualization.arrayToDataTable([
          ['Province', 'Popularity'],
          ['Bremen', 100],
          ['Niedersachsen', 900],
          ['Saksen', 700],
          ['Saarland', 300],
          ['Bayern', 400]
        ]);
      
           var options = {
              region: 'DE',
              displayMode: 'regions',
              colorAxis: {colors: ['green', 'blue']},
             resolution:'provinces'
            };
      
      
        var geochart = new google.visualization.GeoChart(
            document.getElementById('visualization'));
        geochart.draw(data, options,  {width: 556, height: 347});
      }
      

      【讨论】: