我正在尝试在 OpenLayers 地图上叠加有关切萨皮克湾流域的数据。问题是,无论我如何尝试投影数据,分水岭(用 d3 绘制)都不在正确的位置。我用来放大到分水岭的代码在这里:
zoomToWatershed: function() {
// Remove any svg currently on the map
CP.MapFunctions.reset();
// Fetch data from Flask
CP.RequestHandler.get(
"/get_data/watershed_topo",
function(json) {
ws = JSON.parse(json);
watershed_coords = ws.features[0].geometry.coordinates[0];
CP.map.setCenter(CP.cumberland, CP.watershed_zoom);
watershed_coords.forEach(function(pair) {
// Transform from NAD83 to Web Mercator
var t = proj4(proj4.defs["EPSG:4269"], proj4.defs["SR-ORG:7483"], pair);
// Get the pixel values
px = CP.map.getViewPortPxFromLonLat(
new OpenLayers.LonLat(t[0], t[1])
);
pair[0] = px.x;
pair[1] = px.y;
});
// console.log(watershed_coords);
CP.canvas.append("path")
.datum(watershed_coords)
.attr("d", d3.svg.line())
.attr("class", "watershed");
}
);
}
我用于分水岭的形状文件没有 .prj 文件,但 ftp 服务器上的元数据显示使用的投影是 NAD83 (EPSG4269),因此进行了转换。SR-ORG:7483 相当于 EPSG:900913 或网络标准制图投影。
Proj4js 部分在一个单独的 js 文件中定义,如下所示:
proj4.defs["EPSG:4269"] = "+proj=longlat +ellps=GRS80 +datum=NAD83 +no_defs";
proj4.defs["SR-ORG:6864"] = "+proj=merc +lon_0=0 +k=1 +x_0=0 +y_0=0 +a=637813 +b=6378137 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs";
proj4.defs["SR-ORG:7483"] = "+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs";
我的问题是:我哪里出错了?我已经测试了 web 标准制图投影(即 EPSG:900913 和 EPSG:3857,我很确定它们实际上是同一件事),以及标准 EPSG:4326。