使用Leaflet显示geojson featureCollection

时间:2017-12-02 15:49:49

标签: leaflet geojson map-projections

使用QGIS我已经导出了一个多边形图层作为geojson,我希望用传单发布。这就是geojson的样子[因SO字符限制而被排除]: https://gist.github.com/t-book/88806d12d7f05024b147715be82e6844

这就是我的尝试:

将geojson包装为var:

var states = [{
    "type": "FeatureCollection",
    "crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:EPSG::31468" } },
    "features": [
       { "type": "Feature", "properties": ...
}];

添加为新图层:

L.geoJSON(states, {
    style: function(feature) {
        switch (feature.properties.party) {
            case 'Euerbach': return {color: "#ff0000"};
            case 'Werneck':   return {color: "#0000ff"};
        }
    }
}).addTo(map);

不幸的是没有呈现。如何正确地将此geojson featureCollection添加到我的地图?

1 个答案:

答案 0 :(得分:3)

问题在于您的数据是预测的 - Leaflet期望您的数据不被投影(由长/纬对组成,或在WGS84 / EPSG 4326中“预测”)。有几个解决方案,这里有两个想法:

  • 在QGIS中,导出数据以使其由长/纬度坐标对组成

  • 在显示geojson时使用proj4.js重新投影坐标。

对于第二个,在将geojson添加为图层时,您需要设置coordsToLatLng选项:

var geojson = L.geoJSON(states, {
    coordsToLatLng: function (p) {  
        // return get lat/lng point here.
})

此函数的主体将采用geojson坐标参照系(CRS)中的坐标,并使用proj4将其返回到WGS84。

此外,coordsToLatLng函数要求您返回纬度/长度对。由于你的geojson和proj4代表的数据是[x,y],我们需要在返回新点之前交换我们的值。

这可能看起来像:

var geojson = L.geoJSON(states, {
    coordsToLatLng: function (p) {
        p = proj4(fromProjection,toProjection,p);  // reproject each point
        p = [p[1],p[0]]    // swap the values
        return p;          // return the lat/lng pair
    }
}).addTo(map);

当然,我们需要定义我们的CRS。我在spatialreference.org上查找了你的CRS(它在geojson中指定)并使用提供的CRS和EPSG4326(WGS84)描述来设置我的fromProjection和toPojection:

var fromProjection = '+proj=tmerc +lat_0=0 +lon_0=12 +k=1 +x_0=4500000 +y_0=0 +ellps=bessel +datum=potsdam +units=m +no_defs ';
var toProjection = "+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs ";

总而言之,这给了我们一些like this。 请记住,如果您有大文件,那么在javascript中重新投影它们需要的时间比在适当的CRS中导出它们要长。