2

我正在尝试使用 D3 JavaScript API 制作波多黎各的交互式地图。但是,波多黎各政府使用的坐标系是旧的兰伯特坐标系。D3 能够处理这样的坐标吗?是否有处理它们的特定投影?(我查看了投影 wiki,找不到任何有用的东西。)如果没有,我能做些什么来将坐标转换为标准经度/纬度吗?

4

1 回答 1

3

您拥有的投影很可能是1983 年国家平面坐标系的一部分,该坐标系在本 NOAA PDF 的第 72 页上定义。您也可以通过在spatialreference.org上搜索“puerto rico”</a>找到它(例如EPSG:2866)。

您可以通过指定EPSG:4326 ( WGS84 ) 目标投影来使用ogr2ogr将 shapefile 重新投影到纬度和经度。例如,要从投影的 shapefile 生成球坐标中的 GeoJSON,您可以说:

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

获得经纬度几何图形后,请参阅任何 D3 地理示例以查看如何在您选择的投影中显示 shapefile。

或者,您可以使用投影坐标按原样显示它。有关更多详细信息,请参阅投影的 TopoJSON 示例,但短处是您可以使用topojson命令行工具在投影坐标中创建TopoJSON文件。那么你根本不需要重新投影!例如,如果您想在 960x500 的空间中显示它:

topojson \
    --width 960 \
    --height 500 \
    --margin 20 \
    -o output.json \
    -- input.shp

(您甚至可以添加一个-s .25参数来将几何图形简化为屏幕分辨率,这对于节省空间和提高渲染速度很有用。)

最后,如果您最终重新投影到纬度和经度,但您仍想在其官方州平面投影中显示波多黎各,您可以使用d3.geo.conicConformalLambert 圆锥保形投影来定义该投影:

var projection = d3.geo.conicConformal()
    .scale(5000) // adjust to your liking
    .rotate([66 + 26/60, 0])
    .center([0, 17 + 50/60])
    .parallels([18 + 2/60, 18 + 26/60])
    .translate([width / 2, height / 2]);

另请参阅项目到边界框示例,了解如何计算比例并自动转换感兴趣的特征。

于 2013-07-04T00:19:13.957 回答