【问题标题】:2D Open Street Map Data Representation in Meters以米为单位的 2D 开放街道地图数据表示
【发布时间】:2013-01-15 16:13:27
【问题描述】:

我正在将 OSM 数据转换为开源 Minecraft 端口(用 javascript - voxel.js 编写)。 javascript 版本的编写方式是,每个体素(任意定义为立方米)都创建为来自单个原点 (x,y,z)(0,0,0) 的关系。

举个例子,如果想要创建一个立方体块,可以简单地生成体素作为与原点 (0,0,0) 的关系:[(0,0,0),(1,0 ,0), (0,1,0)...]。

我的问题是:我已导出 OSM 数据,标准 XML 输出 (.osm) 以纬度和经度绘制节点。我最初的想法是,我可以通过使用Haversine formula 计算每个节点与任意原点 (0,0,0) = (37.77559, -122.41392) 的距离来创建地图,将距离转换为米,找到方位角,并将其绘制为与 (0,0,0) 的关系。

不过,我注意到还有许多其他可用的导出格式:(.osm.pbf、.osm2pgsql、.imposm)。我假设他们以类似的方式(lat、lng)绘制节点,但其中一些能够直接导入数据库(例如 PostgreSQL)。

我听说有人使用像 PostGIS 这样的 PG 插件,但是(因为这是我第一次深入研究 GIS)我不熟悉他们的功能以及 PostGIS 之类的东西是否对我有帮助将 OSM 数据绘制成 2D 体素网格。

附加组件(如 PostGIS)中是否有功能可以让我动态计算两个 Lat/Lng 点之间的距离,并以 x,y 方式绘制它们?

我想,从根本上说,我的问题是:如果我创建一个将 OSM 数据绘制到 x,y 网格中的脚本,我会重新发明轮子,还是有更有效的方法来做到这一点?

【问题讨论】:

    标签: gis postgis minecraft openstreetmap


    【解决方案1】:

    您需要从球坐标(LatLon,使用 WGS84)转换为笛卡尔坐标,例如 googles 球墨卡托。

    在伪代码中

        transform(double lat, double lon) {
    
    double wgs84radius = 6378137;
    double shift = PI * wgs84radius;
    double x = lon * shift / 180;
    double y = log(tan((90+lat)*PI/360)/ (PI/180);
    return {x,y}
    }
    

    这是最简单的方法。请记住,Lat/Lon 是角度,而 x 和 y 是距 (0/0) 的距离

    【讨论】:

      【解决方案2】:

      默认情况下,OSM 数据位于 WGS84 (EPSG:4326) 投影中,该投影基于椭球地球并以度为单位测量纬度和经度。

      大多数地图图块是在 EPSG:900913“Google”球形墨卡托投影中生成的。此投影基于球形地球,纬度和经度从原点开始以米为单位测量。

      看起来 900913 投影确实非常适合您的要求。

      Here 是用于在两者之间进行转换的一些代码。

      您不妨考虑使用osm2psql。在导入过程中,所有 OSM 地图数据都转换为 900913 投影。你剩下的是一个易于访问的 Postgres 数据库中的 OSM 地图数据的所有节点、线和多边形的数据库。

      我最初对这个过程感到害怕,但它确实非常简单,并且在使用 OSM 数据时会给你很大的灵活性。

      【讨论】:

        猜你喜欢
        • 2022-01-04
        • 1970-01-01
        • 2021-06-13
        • 1970-01-01
        • 1970-01-01
        • 2019-11-06
        • 1970-01-01
        • 2020-11-11
        • 1970-01-01
        相关资源
        最近更新 更多