首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用openstreetmap的JSON在Google地图上创建多边形。InvalidValueError:不是数组

使用openstreetmap的JSON在Google地图上创建多边形。InvalidValueError:不是数组
EN

Stack Overflow用户
提问于 2021-06-03 12:04:54
回答 1查看 349关注 0票数 0

我想用谷歌地图显示各省之间的边界。在论坛中,据说唯一的方法是调用openstreetmap来获取坐标,然后在Google地图中创建一个多边形。代码失败,不要显示多边形并给出"InvalidValueError:不是数组“。是因为承诺电话吗?还是因为,我没有很好地生成数组?

代码语言:javascript
复制
    function initMap() { 
    map = new google.maps.Map(document.getElementById('map'), {
      // TNF
          zoom: 10,
          center: {lat: 28.4125202, lng: -16.5566306}, 
          mapTypeId: 'roadmap'
    });
            
            
    var promise = $.getJSON('https://nominatim.openstreetmap.org/details.php?place_id=256937694&polygon_geojson=1&format=json'); 

    promise.then(function(data){
        var cachedGeoJson = data; //save the geojson in case we want to update its values
        
        console.log(JSON.stringify(cachedGeoJson));  //OUTPUT-1
        console.log(cachedGeoJson.geometry.coordinates); // OUTPUT-2

        
        for (var i = 0; i < cachedGeoJson.geometry.coordinates.length; i++) {
                var coord = cachedGeoJson.geometry.coordinates[i];
                coord_poligon.push(coord); 
        };
        
        coord_poligon_JSON = JSON.stringify(coord_poligon); 
        console.log(coord_poligon_JSON );  // OUTPUT-3: 

            
        var geoObject = cachedGeoJson.geometry.coordinates;
        var features = [];
        features = geoObject;
        
        var geoJson = {
            "type": "FeatureCollection",
            "features": [{
              "type": "Feature",
              "geometry": {
                "type": "Polygon",
                "coordinates":features,
              },
              "properties": {}
            }]
        };

        console.log(JSON.stringify(geoJson)); // OUTPUT-4

        
    }); // end promise. 

    // Construct the polygon.
    triangleCoords = geoJson;  

    var bermudaTriangle = new google.maps.Polygon({ 
      paths: triangleCoords, 
      strokeColor: '#FF0000',
      strokeOpacity: 0.8,
      strokeWeight: 3,
      fillColor: '#ea0e0e', // red color  
      fillOpacity: 0.20
    });
    bermudaTriangle.setMap(map);
代码语言:javascript
复制
    //OUTPUT-1:
    //{"place_id":256937694,...
    //{"type":"Point","coordinates":[-16.5532956,28.4159024]},"geometry":{"type":"Polygon","coordinates":[[[-16.5705013,28.4080941],[-16.5703805,28.4076554],...

    // OUTPUT-2:    
                //0: (2) [-16.5705013, 28.4080941]
                //1: (2) [-16.5703805, 28.4076554]
                //2: (2) [-16.5701851, 28.4064929]

    // OUTPUT-3: [[[-16.5705013,28.4080941],[-16.5703805,28.4076554],[-16.5701851,28.4064929],...

    // OUTPUT-4: {"type":"FeatureCollection","features":[{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[-16.5705013,28.4080941],[-16.5703805,28.4076554],
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-21 14:01:14

最后,我使用了多边形数组,而不是geoJson。关于:openstreetmap返回(lng,lat)。Google Maps API需要创建多边形(lat,lng),这是相反的顺序,因此:

1-步骤:您必须改变坐标对的顺序,即用协调对(lat,lng)创建一个新的数组:

“”“

代码语言:javascript
复制
    var promise = $.getJSON('https://nominatim.openstreetmap.org/details.php?place_id=256937694&polygon_geojson=1&format=json'); 

    promise.then(function(data){
    
        var cachedGeoJson = data; 
                            
        for (var i = 0; i < cachedGeoJson.geometry.coordinates.length; i++) {
                    
            var lnglat = cachedGeoJson.geometry.coordinates[i];
            for(var j = 0; j < lnglat.length; j++)
            {
                
            var longitud = lnglat[j][0]; // first value on openstreetmap is lng
            var latitud = lnglat[j][1]; // second value is lat
            coord_poligon.push(new google.maps.LatLng(parseFloat(latitud), parseFloat(longitud )));
            
                
            }
        };

“”2-步骤2:将这个新数组(lat,lng)分配给将创建多边形的数组:

“”“

代码语言:javascript
复制
        var triangleCoords = [coord_poligon]; //array inside brackets. IMPORTANT!
                        
        var bermudaTriangle = new google.maps.Polygon({ 
          paths: triangleCoords, // array 
          strokeColor: '#0a6df0', // azul oscuro
          strokeOpacity: 0.8,
          strokeWeight: 3,
          fillColor: '#48cef7', // azul claro 
          fillOpacity: 0.20
        });
        bermudaTriangle.setMap(map);

    
        infoWindow = new google.maps.InfoWindow;


    }); // end promise. 

“”“

完整代码:

“”“

代码语言:javascript
复制
var coord_poligon = [];         
var triangleCoords = [];
    
    
function initMap() { 
map = new google.maps.Map(document.getElementById('map'), {
      zoom: 12,
      center: {lat: 28.4125202, lng: -16.5566306},   // TNF
      mapTypeId: 'roadmap'
});
    
    var promise = $.getJSON('https://nominatim.openstreetmap.org/details.php?place_id=256937694&polygon_geojson=1&format=json'); 

    promise.then(function(data){
    
        var cachedGeoJson = data; 
                
        for (var i = 0; i < cachedGeoJson.geometry.coordinates.length; i++) {
                    
            var lnglat = cachedGeoJson.geometry.coordinates[i];
            for(var j = 0; j < lnglat.length; j++)
            {
                
            var longitud = lnglat[j][0]; // first value on opentreet is  lng
            var latitud = lnglat[j][1]; // second value is lat
            coord_poligon.push(new google.maps.LatLng(parseFloat(latitud), parseFloat(longitud )));
            
                
            }
        };
        
        var triangleCoords = [coord_poligon]; // array dentro de corchetes . IMPORTANT!

        
        var bermudaTriangle = new google.maps.Polygon({ 
          paths: triangleCoords, // array 
          strokeColor: '#0a6df0', // dark blue
          strokeOpacity: 0.8,
          strokeWeight: 3,
          fillColor: '#48cef7', // blue 
          fillOpacity: 0.20
        });
        bermudaTriangle.setMap(map);


        infoWindow = new google.maps.InfoWindow;


    }); // end promise. 
    
} // end initMap()

“”“

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67821161

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档