0

我正在将 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公式计算每个节点与任意原点(0,0,0)=(37.77559,-122.41392)的距离来创建地图,将距离转换为米,找到轴承,并将其绘制为与 (0,0,0) 的关系。

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

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

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

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

4

2 回答 2

1

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

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

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

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

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

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

于 2013-02-11T13:20:50.853 回答
1

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

在伪代码中

    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) 的距离

于 2013-02-11T14:57:51.583 回答