1

我正在尝试在 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。

4

0 回答 0