我正在将OSM数据转换成一个开源的Min克拉夫特端口(用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,0)的关系。
但是,我注意到还有许多其他的导出格式可用:(.osm.pbf、.osm2pgsql、.imposm)。我假设它们以类似的方式绘制节点(lat、液化天然气),但其中一些节点能够直接导入数据库(例如PostgreSQL)。
我听说过一些人使用PG插件,比如PostGIS,但是(因为这是我第一次深入地理信息系统),我不熟悉他们的能力,也不知道像PostGIS这样的东西是否能帮助我将OSM数据绘制成二维体素网格。
在像PostGIS这样的加载项中是否有函数可以让我动态地计算两个Lat/Lng点之间的距离,并以x,y的方式绘制它们呢?
我想,从根本上讲,我的问题是:如果我创建一个脚本,将OSM数据绘制成一个x,y网格,我会重新发明轮子,还是有更有效的方法来做到这一点?
发布于 2013-02-11 14:57:51
您需要从球面坐标(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)的距离。
发布于 2013-02-11 13:20:50
在WGS84 (EPSG:4326)投影中,OSM数据是默认的,该投影基于椭球地球,以度为单位测量纬度和经度。
大多数地图瓷砖都是在EPSG:900913“谷歌”球面墨卡托投影中生成的。这一投影是基于一个球面地球,纬度和经度是以米为单位从原点测量的。
实际上,900913的投影看起来非常符合您的需求。
这里是在两者之间进行转换的一些代码。
您可能会考虑使用osm2psql。在导入过程中,所有的OSM映射数据都转换为900913投影。剩下的是一个包含OSM地图数据的所有节点、线和多边形的数据库,该数据库易于访问Postgres数据库。
最初我被这个过程吓倒了,但它确实非常简单,在使用OSM数据时会给您带来很大的灵活性。
https://stackoverflow.com/questions/14341941
复制相似问题