如何實現經緯度座標和xy座標間的轉換?

在我們的螢幕上,有一張地圖,這張地圖經過縮放、平移、旋轉,最終地理座標和螢幕座標的關係大致如下圖所示:

如何實現經緯度座標和xy座標間的轉換?

這種關係要怎麼描述呢?我們可以假設地圖是一張紙,而螢幕是一堵牆。只要我們有兩個圖釘,我們就能把紙定在牆上。我們把這兩個點稱為錨點。錨點在螢幕座標繫上的座標是(x1,y1)和(x2,y2),對應在地理座標繫上的座標是(lon1,lat1)和(lon2,lat2)。

如何實現經緯度座標和xy座標間的轉換?

那現在的問題就變成了,已知兩個錨點的座標,轉換演演算法有哪些?

(1)地理座標轉螢幕座標:已知任意一點的地理座標(lon,lat),求它在螢幕上的座標(x,y)

(2)螢幕座標轉地理座標:已知任意一點的螢幕座標(x,y),求它的經緯度座標(lon,lat)

1、地理座標平面化

首先是地理座標的平面化轉化。在一個小範圍內(例如是方圓幾公里內),我們可以假設地面是平的,而不是彎的。如果經緯度都用弧度表示,那麼1緯度對應的長度是:

1lat_len=R*lat,其中R是地球半徑。而相同經度間的距離會隨著緯度的增加而減少,在lat這一緯度下,1經度對應的長度是1lon_len=R*lon*cos(lat)。那麼,(lon,lat)這個座標平面化後的座標就是:(R*lon*cos(lat),R*lat)

2、向量法

由已知點和未知點組成兩組向量:由於座標系轉換是線性變換,所以兩組向量有以下特性:(1)兩向量在不同的座標系中的長度比是相同的;(2)兩向量在不同的座標系中的夾角是相同的。

根據上面兩個特性,我們可列出方程組:

設向量1為(dx1,dy1),(dlon1,dlat1),向量2為(dx2,dy2),(dlon2,dlat2),

其中dx1=x2-x1,dy1=y2-y1,dlon1=lon2-lon1,dlat1=lat2-lat1

Dx2=x-x1,dy2=y-y1,dlon2=lon-lon1,dlat2=lat-lat1,

然後k1=norm(dx1,dy1),k2=norm(dlon1,dlat1),k3=norm(dx2,dy2),k4=norm(dlon2,dlat2)

有方程組:

(1)k1/k2 = k3/k4

(2)(dx1*dlon1+dy1*dlat1)/k1/k2 = (dx2*dlon2+dy2*dlat2)/k3/k4

透過解上面的方程組,我們就能得到未知和螢幕座標或未知的地理座標。

3、C#程式碼實現

地理座標轉螢幕座標:

如何實現經緯度座標和xy座標間的轉換?

如何實現經緯度座標和xy座標間的轉換?

螢幕座標轉地理座標:

如何實現經緯度座標和xy座標間的轉換?