2013-01-15 73 views
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)...]。2D打開街道地圖數據表示形式

我的問題是這樣的:我導出了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這樣的函數能夠動態計算兩個經緯度點之間的距離並以x,y方式繪製它們?

我想,根本上,我的問題是:如果我創建一個將OSM數據繪製成x,y網格的腳本,我是否會重新發明輪子,還是有更高效的方法來執行此操作?

回答

1

您需要將球面座標(LatLon,使用WGS84)轉換爲笛卡爾座標,例如Google球形墨卡託。

在僞代碼

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)

1

OSGS數據默認在WGS84(EPSG:4326)投影中,該投影基於橢球體地球並以度爲單位測量緯度和經度。

大多數地圖貼圖都是在EPSG:900913「Google」球形梅卡託投影中生成的。該投影基於球形地球,經度和緯度以距離原點米爲單位測量。

它真的好像900913投影將非常適合您的要求。

Here是在兩者之間轉換的一些代碼。您可以考慮使用osm2psql。在導入過程中,所有OSM地圖數據都轉換爲900913投影。剩下的是一個易於訪問Postgres數據庫的OSM地圖數據的所有節點,線和多邊形的數據庫。

我最初被這個過程嚇倒了,但它確實非常簡單,在使用OSM數據時會給你很大的靈活性。

相關問題