【问题标题】:GeoJSON feature coordinates not displaying on OpenLayers mapGeoJSON 要素坐标未显示在 OpenLayers 地图上
【发布时间】:2016-03-20 14:47:52
【问题描述】:

我正在尝试在地图上显示一个 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]

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

【问题讨论】:

  • 5e6 代表 5 x 10^6 - 或 5000000。见en.wikipedia.org/wiki/Scientific_notation
  • 当然,好主意一定是这个。我会更新我的第一篇文章
  • 第二个区域大约是 2.000.000 x 2.000.000 个单位 - 第一个区域是 4 x 8 个单位。如果两个要素都显示在同一张地图上,那么第一个要素充其量只会显得非常小(并且可能被大要素隐藏)。如果从代码中删除大区域会发生什么?
  • 如果我删除第一个,第二个会显示,但如果我删除第二个,第一个也不会显示。不过谢谢你的想法
  • 这个问题令人困惑。目前尚不清楚 OP 是否要求处理具有不同投影几何的无效 GeoJSON,或者他们是否需要帮助从 GeoJSON 中正确显示数据,同时考虑到不同的数据和视图投影。

标签: javascript openlayers-3 geojson


【解决方案1】:

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

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

您所说的不起作用的集合看起来像经度和纬度 (GIS) 坐标,如果它们要显示在同一层上,则需要对其进行转换 - 在下面的示例中,我已经使用 GeoJSON properties 标记了需要转换的功能,如下所示:

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

【讨论】:

  • 非常感谢您的详细回答。
  • 虽然上面的代码没有任何问题,但它比它需要的复杂得多。请参阅我的答案以获得更简单的解决方案。
  • @ahocevar 在否决我之前你有没有测试过你的替代方案?当 OP 中规定的相同 GeoJSON 数据集包含以不同投影/格式定义的特征时,解析器无法始终如一地工作。
  • 对不起,我误解了这个问题。我应该否决这个问题,而不是你的答案。一旦答案被解锁/编辑,我会再次投票。
  • @ahocevar : 我们不能在定义地图以转换坐标时进行配置吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-02
  • 1970-01-01
相关资源
最近更新 更多