d3.js:混合投影和未投影的地理数据

时间:2017-07-31 14:13:35

标签: d3.js geojson

我用qgis制作的自定义geojson文件制作了一张地图。它已经预测了地理数据而不是lat-long-values但是并没有自动适应svg容器。所以我用transform属性将它移动到了正确的位置。到目前为止,这是我的代码:

var height = 800,
    width = 800;

var svg = d3.select("#map-container")
    .append("svg")
    .attr("width",width)
    .attr("height",height);

d3.queue()
    .defer(d3.json,"./data/Shapefiles_simplyfied_20.json")
    .await(drawMap);

function drawMap(error,bw) {

    if (error) throw error;

    var features = bw.features;

    var map = svg.append("g")
        .attr("class", "kommunen")
        .attr("id","karte-rdb");

    map
        .selectAll("path")
        .data(features)
        .enter().append("path")
        .attr("d", d3.geoPath(null))
        .attr("transform","scale(1,-1)")

    //make the map fit to svg container
    var bbox = d3.select("#karte-rdb")._groups[0][0].getBBox();
    var scaleFactor = d3.min([width / bbox.width, height / bbox.height]);
    var translation = [width - bbox.x,height - bbox.y];

    map
        .attr("transform","scale("+scaleFactor+","+scaleFactor+") translate("+ translation[0] +","+ translation[1] +")")

}

(截断的)geojson看起来像这样:

{
"type": "FeatureCollection",
"name": "Shapefiles",
"crs": {
    "type": "name",
    "properties": {
        "name": "urn:ogc:def:crs:OGC:1.3:CRS84"
    }
},
"features": [{
    "type": "Feature",
    "properties": {
        "GEN": "Area1",
        "BEZ": "RDB-RP"
    },
    "geometry": {
        "type": "MultiPolygon",
        "coordinates": [[[[393361.666451968252659,
        5504072.610383642837405],
        [393366.833893342292868,
        5503968.659385782666504],
        ...

enter image description here

现在我想显示一些带有lat-lon-pairs的csv文件中的点。

Name    lat lon
A   7.601581    49.203633
B   8.008745    50.374521
C   8.11676     49.746425
D   6.657145    50.221658
E   6.942947    49.654687
F   9.62743     51.196755

如何在没有d3.geoProject功能的情况下将它们与投影地理数据一起显示?

1 个答案:

答案 0 :(得分:1)

简短的回答,不容易,有其他选择。

您正在使用的投影数据投影到米或码或其他任何网格上。要将纬度经度点投影到该网格上,您需要使用投影将纬度经度点转换为该网格(您还需要依赖于地图比例,相同的数据,但我们假设您的所有地理数据都使用相同的数据)。投影点的公式将取决于您对已投影图层使用的投影。这比替代方案更复杂:

  1. 由于QGIS中的大多数投影都可以相当容易地转换,您可以将纬度经度坐标(如果以geojson或其他地理格式放置)转换为与数据共享相同投影的投影点。

  2. 另一个选项是“取消投影”已经投影的数据,使其包含lat long对(如果使用d3,通常会使用数据WGS84),然后使用d3投影所有数据。但是,您表示您不想使用d3.projection,因此这可能不太理想。

  3. 这些选项中的任何一个都适用于d3。相反,将geoProjection与geoTransform或null投影相结合会在重新缩放,缩放等时导致很多麻烦。此外,您可以使用.geoTransform来计算您的投影数据,可能与直接缩放和翻译svg相比,em>提供了一些优势。