【问题标题】:How to make multiple geoJson polygons into multiple clickable events如何将多个geoJson多边形制作成多个可点击事件
【发布时间】:2017-02-02 10:04:30
【问题描述】:

我正在以下位置引用 geoJson 文件,以将状态多边形添加到印度地图

https://raw.githubusercontent.com/geohacker/india/master/state/india_telengana.geojson

地图正在使用 googlemaps api

我现在想做的是让每个多边形成为可点击的事件。

在研究中我发现:

  • 关于 stackoverflow 的类似查询尚未得到解答
  • Leaflet 地图有很多帮助,但 googlemaps 没有
  • 有一些建议表明诸如此类的 JSON 文件是数组,但是这些示例中 JSON 文件的构成似乎比我正在访问的要简单得多。在其他示例中很容易看到数组标识符。这些查询也只是试图从数组中返回一个属性,而不是将数组用作可点击事件。

我现在已经创建了一个 JSFiddle,但我无法加载最终的地图(它在小提琴之外加载):

https://jsfiddle.net/everare/df6jbuft/

此处的代码显示我尝试使用 googlemaps https://developers.google.com/maps/documentation/javascript/combining-data 的指导调用事件

HTML:

<div class="container">
<div id="map"style="width:700px;height:700px;border:10px solid black;">              </div>
</div>

Javascript:

//Map construction

var map;
  function initMap() {{
    map = new google.maps.Map(document.getElementById('map'), {
      center: {lat: 22.71, lng: 82.48},
      zoom: 5,
    zoomControl: true,
    zoomControlOptions: {
    position: google.maps.ControlPosition.TOP_LEFT
    },

    styles:[
 {    elementType: 'geometry',    stylers: [ {color: '#242f3e'}]},
 {    elementType: 'labels.text.fill', stylers: [{color: '#746855'}]},
 {    elementType: 'labels.text.stroke', stylers: [{color: '#242f3e'}]},
 {    featureType: 'administrative', elementType: 'geometry', stylers:    [{visibility: 'off'}]},
 {    featureType: 'administrative.locality',elementType:    'labels.text.fill',stylers: [{color: '#d59563'}]},
 {    featureType: 'poi', stylers: [{visibility: 'off'}]},
 {    featureType: 'poi', elementType: 'labels.text.fill',stylers: [{color: '#d59563'}]},
 {    featureType: 'poi.park',    elementType: 'geometry',    stylers: [{color: '#263c3f'}] },
 {    featureType: 'poi.park',   elementType: 'labels.text.fill',    stylers: [{color: '#6b9a76'}]},
 {    featureType: 'road',    stylers: [{visibility: 'off'}]},
 {    featureType: 'road',    elementType: 'geometry', stylers: [{color: '#38414e'}]},
 {    featureType: 'road',    elementType: 'geometry.stroke',    stylers: [{color: '#212a37'}]},
  {    featureType: 'road',    elementType: 'labels.icon',    stylers: [{visibility: 'off'}]},
 {    featureType: 'road',    elementType: 'labels.text.fill',    stylers: [{color: '#9ca5b3'}]},
 {    featureType: 'road.highway', elementType: 'geometry',    stylers: [{color: '#746855'}]},
 {    featureType: 'road.highway', elementType: 'geometry.stroke',stylers: [{color: '#1f2835'}]},
 {    featureType: 'road.highway', elementType: 'labels.text.fill', stylers: [{color: '#f3d19c'}]},
 {    featureType: 'transit',    stylers: [{visibility: 'off'}]},
 {    featureType: 'transit',    elementType: 'geometry',  stylers: [{color: '#2f3948'}]},
 {    featureType: 'transit.station', elementType: 'labels.text.fill', stylers: [{color: '#d59563'}]},
  {    featureType: 'water', elementType: 'geometry',stylers: [{color: '#17263c'}]},
  {    featureType: 'water', elementType: 'labels.text.fill', stylers: [{color: '#515c6d' }]},
 {    featureType: 'water', elementType: 'labels.text.stroke',  stylers: [{color: '#17263c'}]
 }

]  
    });
    }
    // Loads the state boundary polygons from a GeoJSON source. 
    function loadMapShapes() {
        map.data.loadGeoJson('https://raw.githubusercontent.com/geohacker/india/master/state/india_telengana.geojson', { idPropertyName: 'STATE' });
    }

   //Responds to the mouse-in event on a map shape (state).
   //@param {?google.maps.MouseEvent} e

    function mouseInToRegion(e) {
    // set the hover state so the setStyle function can change the border
    e.feature.setProperty('state', 'hover');
    }

    //Polygon style
    map.data.setStyle({
    fillColor: '#FF8000',
    strokeWeight: 1
    });


    // set up  events for google.maps.Data

    map.data.addListener('mouseover', mouseInToRegion);

    // state polygons only need to be loaded once, do them now
    loadMapShapes();

  }

CSS:

body {
background-color: white;
background-repeat: no-repeat;
background-position: 0px 0px; 
}
.container {
position: absolute;
top: 100px;
left: 60px;

【问题讨论】:

  • 有什么代码可以看看你到目前为止做了什么吗?您向给定地址发出 GET 请求以访问数据?
  • 添加了一些代码。抱歉,您介意详细说明 GET 请求吗?
  • HTTP GET 请求是一种将外部数据检索到应用程序中的方法。更多在这里:en.wikipedia.org/wiki/…我会尝试检查今天晚些时候或明天发生的事情,如果我发现任何有用的信息,请告诉你。

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


【解决方案1】:

如果您的map.data.loadGeoJson 生成格式正确的数据对象,则应该已经设置了mapdata。我会console.log 数据以确保生成的对象是您认为的那样。

我不确定这是否是“规范”工作流程,但我的工作流程如下:

  • 定义地图选项;
  • 创建新地图;
  • 定义层(在您的情况下只有 1 个);
  • 将数据加载到图层中;
  • 将图层与地图相关联。

所以我的带有一个数据层的地图代码如下所示:

// Step 1. Define Map Options
// note centroid_lat and centroid_lng are evaluated from the data, elsewhere
var tango = {lat: centroid_lat, lng: centroid_lng};
var mapOptions = {
    zoom: 15,
    center: tango,
    mapTypeId: google.maps.MapTypeId.ROADMAP
  };

// Step 2. Make a new Map object
var map=new google.maps.Map($('#mapcanvas')[0], mapOptions);

// Step 3. Make a new Data Layer object
var cLayer = new google.maps.Data();

// Step 4. Put some data into the layer
$.getJSON("json/myfile.json", function(data){
     d1 = topojson.feature(data, data.objects.address)
     cLayer.addGeoJson(d1);
      });

// Step 5. Assign the new layer to the map    
cLayer.setMap(map);

$.getJSONtopojson 应该清楚地表明此示例使用 jqueryd3js topojson 库。

我创建的大多数图层实际上都使用 PHP 脚本从支持 PostGIS 的 PostgreSQL 数据库中检索数据,该脚本获取一些过滤输入,审查输入(以防止 SQL 注入等),然后在查询中填写变量名它被传递给 PostgreSQL。该查询生成 GeoJSON 并将其通过管道传回 DOM,并在其中附加到数据对象。

所以我填充数据层的代码是

// db_schema, base_table and thisBox are set elsewhere (thisBox is the 
// bounding box of the viewport)
var c_url="v1/ws_base_fetch.php?schema="+db_schema+"&table="+base_table+"&thisBox="+thisBox;
    // console.log('URL is :'+c_url); // testing only
$.getJSON(
    c_url,
    null,
    function success(data) {
       // Add data to layer, specifying address as idPropertyName
       // this makes address unique, and data with duplicate address 
       // will not be loaded (it will be retrieved though)
       cLayer.addGeoJson(data,{idPropertyName:"address"});
    }); 

【讨论】:

  • 我认为 $.getJSON 方法会解决这个问题,因为在小提琴中 map.data.getGeoJson 会返回错误,因为源数据的 MIME 类型是 text/plain 而不是 application/json 或 sth。
  • 您好,感谢您的建议。恐怕它们超出了我对 JSON 的理解。我试图了解您的回复,但我无法确定 JSON 文件中的哪些数据会成为在 Javascript 中用作变量的对象。我希望 JSON 文件中的类别中的一个数据片段可以适应成为一个对象,比如“NAME_1”; “安达曼和尼科巴”,这离现实还远吗? (我曾尝试将它们用作对象标识符,但没有成功)
  • @ElaineE 你身边有了解这些问题的人来帮忙吗?因为您的代码中缺少的一件事可能是 Google Maps API 密钥,所以您的 URL 等的响应类型也可能存在问题。
  • @DekiChan,感谢您的建议。我的代码中有谷歌地图 API,我只使用了一个通用的。 URL 有延迟,但我认为这不会影响我的查询。我只是在寻找一种引用 JSON 多边形的方法
猜你喜欢
  • 2021-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-19
相关资源
最近更新 更多