如何创建适用于D3的GeoJSON?


17

我只是想尝试使用以下方式将.shp文件转换为geoJSON格式:

ogr2ogr -f geoJSON output.json input.shp

执行命令后,似乎没有任何问题。这是output.json的摘录

    {
    "type": "FeatureCollection",

    "features": [
    { "type": "Feature", 
    "properties": { "ID_0": 86, "ISO": "DEU", "NAME_0": "Germany", "ID_1": 1, "NAME_1": "Baden-Württemberg", "NL_NAME_1": null, "VARNAME_1": null, "TYPE_1": "Land", "ENGTYPE_1": "State" }, 
    "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 8.708400940398242, 47.715581894910606 ], [ 8.713716147005524, 47.701734382960055 ], 
...

但是,当我尝试在d3(http://d3js.org/)中使用JSON文件绘制SVG多边形时,输出错误。由于shp文件在QGIS中正确显示,我认为我的使用方式一定有问题ogr2ogr。我得到的SVG并不完全错误,但是似乎找不到一个细节。好像它已经被颠倒了,并且以某种方式扭曲成两个分离的部分。

这是我用来生成svg的javaScript:

//dimensions
var w = 2000;
var h = 2000;

var svg = d3.select("#chart").append("svg")
    .attr("width", w)
    .attr("height", h);

    d3.json(
    "http://localhost:8888/data/data.json",
    function (json) {

    var path = d3.geo.path();

    svg.append("g")
        .attr("class", "black")
        .selectAll("path")
        .data(json.features)
        .enter()
        .append("path")
        .attr("d", path);

有人知道这里出了什么问题吗?我还尝试使用Qgis和myGeodata(http://converter.mygeodata.eu/vector)转换shp文件。但是他们俩都没有按应有的方式工作。

我对整个制图工作还是很陌生的。因此,我很高兴获得一些建议。

非常感谢!

Answers:


7

好的,在d3中使用不同的投影,比例和平移解决了我的问题。由于使用d3.geo.path()时的默认投影是albersUsa,因此有充分的理由尝试其他投影。我想在转换形状文件时使用正确的EPSG规范可以更轻松地解决问题,但是这些晦涩难懂的数字超出了我的理解。

因此,我最后所做的只是简单地使用墨卡托投影,然后将其带到带有convert()的svg-viewport中。

   d3.json(
    "http://localhost:8888/data/data.json",
    function (json) {

    //dimensions
    var w = 2000;
    var h = 2000;

    var svg = d3.select("#chart").append("svg")
    .attr("width", w)
    .attr("height", h);

    //create geo.path object, set the projection to merator bring it to the svg-viewport
    var path = d3.geo.path()
        .projection(d3.geo.mercator()
        .scale(20000)
        .translate([0, 3800]));

    //draw svg lines of the boundries
    svg.append("g")
        .attr("class", "black")
        .selectAll("path")
        .data(json.features)
        .enter()
        .append("path")
        .attr("d", path);
    });

这里有一个链接到形状文件我用所得GeoJSON的。为了简化从GADM获得的shapefile ,我使用了mapshaper

我仍然会对一种省力,更灵活的解决方案感兴趣。因此,如果有人有想法,请先谢谢!但目前我很高兴能认出德国的16个联邦议院!


1
spacereference.org是有关投影和EPSG代码的有用网站。
dmci 2012年

5

您是否尝试过为shapefile和GeoJSON输出指定正确的EPSG代码?例如:

ogr2ogr -f GeoJSON -s_srs EPSG:.... -t_srs EPSG:.... output.json input.shp


可能是问题所在。我什么都没写,主要是因为缺乏知识。但是我找到了解决问题的方法。我一分钟后发布。
Flavio 2012年

3

没错,对于德国地图,您需要更改适合美国数据的默认投影。它以堪萨斯州的某处为中心,并且地图大小为960xsomething。

正确的参数当然也取决于您的地图尺寸。

如果您想使用d3.geo.albers投影(最适合coropleth贴图),这是我的参数:

var w = 415;
var h = 555;

var albers = d3.geo.albers()
    .origin([11, 51])
    .parallels([49, 53])
    .translate([230, 290])
    .scale(4000);

var path = d3.geo.path().projection(albers);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.