我正在将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网格的脚本,我会重新发明轮子,还是有更有效的方法来做到这一点?
答案 0 :(得分:1)
默认情况下,OSM数据位于WGS84(EPSG:4326)投影中,该投影基于椭圆体地球并以度为单位测量纬度和经度。
大多数地图图块都是在EPSG:900913“Google”球形墨卡托投影中生成的。此投影基于球形地球,纬度和经度以距离原点为单位测量。
看起来900913投影看起来非常适合您的要求。
Here是一些用于在两者之间进行转换的代码。
您可能想考虑使用osm2psql。在导入过程中,所有OSM地图数据都将转换为900913投影。您剩下的是一个易于访问的Postgres数据库中OSM地图数据的所有节点,线和多边形的数据库。
我最初被这个过程吓倒了,但它非常简单,在使用OSM数据时会给你很大的灵活性。
答案 1 :(得分: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)
的距离