我用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],
...
现在我想显示一些带有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功能的情况下将它们与投影地理数据一起显示?
答案 0 :(得分:1)
简短的回答,不容易,有其他选择。
您正在使用的投影数据投影到米或码或其他任何网格上。要将纬度经度点投影到该网格上,您需要使用投影将纬度经度点转换为该网格(您还需要依赖于地图比例,相同的数据,但我们假设您的所有地理数据都使用相同的数据)。投影点的公式将取决于您对已投影图层使用的投影。这比替代方案更复杂:
由于QGIS中的大多数投影都可以相当容易地转换,您可以将纬度经度坐标(如果以geojson或其他地理格式放置)转换为与数据共享相同投影的投影点。
另一个选项是“取消投影”已经投影的数据,使其包含lat long对(如果使用d3,通常会使用数据WGS84),然后使用d3投影所有数据。但是,您表示您不想使用d3.projection,因此这可能不太理想。
这些选项中的任何一个都适用于d3。相反,将geoProjection与geoTransform或null投影相结合会在重新缩放,缩放等时导致很多麻烦。此外,您可以使用.geoTransform
来计算您的投影数据,可能>与直接缩放和翻译svg相比,em>提供了一些优势。