2016-03-20 64 views
0

我试图在地图上显示GeoJSON多边形。我已经使用通过的OpenLayers具有以下数据提供的例子,但只显示第二多边形:GeoJSON要素坐标不显示在OpenLayers地图上

var geojsonObject = { 
    "type": "FeatureCollection", 
    "crs": { 
     "type": "name", 
    }, 
    "features": [ 
     { 
      "type": "Feature", 
      "geometry": { 
       "type": "Polygon", 
       "coordinates": [[[103.92240800000013,21.69931],[100.93664,21.66959500000013],[108.031899,18.67076]]]     
      } 
     }, 
     { 
      "type": "Feature", 
      "geometry": { 
       "type": "Polygon", 
       "coordinates": [[[-5e6, -1e6], [-4e6, 1e6], [-3e6, -1e6]]]     
      } 
     } 
    ] 
}; 

我使用解析和添加以GeoJSON到地图是作为代码如下:

var vectorSource = new ol.source.Vector({ 
    features: (new ol.format.GeoJSON()).readFeatures(geojsonObject) 
}); 

var vectorLayer = new ol.layer.Vector({ 
    source: vectorSource, 
    style: styleFunction 
}); 

我注意到不同种类的坐标。在第二组中,坐标表示为[-5e6, -1e6],其中e我不明白,在第一组中 - 不起作用 - 它们看起来像[103.92240800000013, 21.69931]

这是我的多边形不显示的可能原因吗?

+1

5e6代表5 x 10^6 - 或5000000.见https://en.wikipedia.org/wiki/Scientific_notation – Sander

+0

当然,好主意必须是这个。我会更新我的第一篇文章 – Kamzz

+0

第二个区域是大约2.000.000 x 2.000.000个单位 - 第一个4 x 8个单位。如果两个功能都显示在同一张地图上,则第一个功能最多显示为非常小(并且可能被大功能隐藏)。如果你从代码中删除大面积会发生什么? – Sander

回答

1

问题是您的两个多边形是使用不同的坐标空间指定的,您需要确定要使用哪个地图投影。默认情况下,OpenLayers使用他们称为“球形墨卡托”的东西,并且没有深入研究细节,几何坐标由2D平面上的像素表示。

理想情况下,您将修复您的GeoJSON以提供同一投影中的所有坐标。如果你不能做到这一点,这里是一个有效的解决方案:

,你说没有工作的样子经度和纬度(GIS)的集坐标,需要进行改造,如果他们将被显示在同层 - 在下面的例子中,我标记那些需要使用以GeoJSONproperties变换,像这样的特点:

var geojsonObject = { 
    type: 'FeatureCollection', 
    // ... 
    features: [ 
     { 
      type: 'Feature', 
      geometry: { 
       type: 'Polygon', 
       coordinates: [/* ... */], 
       properties: { 
        requiresTransform: true // <- custom property 
       } 
      } 
     }, 
     // ... 
    ] 
}; 

之前添加新的特性层源,那么你可以做类似以下:

var features = (new ol.format.GeoJSON()).readFeatures(geojsonObject); 

features.forEach(function(feature){ 
    if(!feature.get('requiresTransform')) 
     return; // ignore 

    var geometry = feature.getGeometry(), 
     coords = geometry.getCoordinates(); 

    if(geometry instanceof ol.geom.Polygon) 
     geometry.setCoordinates(transformPolyCoords(coords)); 
}); 

function transformPolyCoords(/* Array */ a){ 
    return a.map(function(aa){ 
     return aa.map(function(coords){ 
      return ol.proj.transform(coords, 'EPSG:4326', 'EPSG:3857'); 
     }); 
    }); 
} 

有可能是管理这种更清洁的方式,我会想象它涉及保持独立的格式在不同以GeoJSON对象,我不知道这是你期待什么多么接近,但是这是我想出了使用你提供的» working example

+0

非常感谢您的详细解答。 – Kamzz

+0

尽管上面的代码没有问题,但它比需要的复杂得多。查看我的答案以获得更简单的解决方案。 – ahocevar

+0

@ahocevar你在投票之前是否测试过你的选择?当与OP中规定的相同的* GeoJSON *数据集包含以不同投影/格式定义的特征时,解析器不能一致地工作。 – Emissary