1. 程式人生 > >地理座標與螢幕座標轉換(VC++)

地理座標與螢幕座標轉換(VC++)

在底層GIS開發中,我們經常會碰到空間資料視覺化問題,當我們拿到地理資料之後,我們該怎麼把它展現在我們的計算機螢幕中呢,這或許是一個比較簡單的問題。

我們知道,地理座標系是我們使用者自定義的座標系,而顯示在計算機螢幕上的座標是基於螢幕座標來繪製的,那麼改如何轉化呢?

首先,我們來熟悉幾個概念:

地理座標系,通常原點在左下角,X軸的方向是向右遞增,Y軸的方向是向上遞增。

螢幕座標系,通常它的原點在左上角,X軸的方向向右遞增,Y軸的方向是向下遞增的。正好與地理座標系相反。

第一種方法:

中心點配對法,將檢視的中心和地理空間的中心點匹配,然後給定一個地理座標根據該座標和視野中心點的偏移和比例尺來進行計算就可以獲得螢幕座標,反之也是如此;

關於這種方法,可以參考其他的資料。

其實這種方法也很簡單,像ArcGIS等GIS軟體就是基於這種轉換方式進行的。其程式碼如下:

地理座標轉螢幕座標

	OGRPoint ptCenter = GetMapCenter();		//地圖中心點
	POINT pt;
	pt.x = draw->m_ScreenWidth/2 + (long)((poPoint->getX()-ptCenter.getX())*draw->m_Scale+0.5);
	pt.y = draw->m_ScreenHeigh/2 - (long)((poPoint->getY()-ptCenter.getY())*draw->m_Scale+0.5);
	return pt;

螢幕座標轉地理座標

	OGRPoint ptCenter = GetMapCenter();		//地圖中心點
	POINT pt;
	pt.x = draw->m_ScreenWidth/2 + (long)((poPoint->getX()-ptCenter.getX())*draw->m_Scale+0.5);
	pt.y = draw->m_ScreenHeigh/2 - (long)((poPoint->getY()-ptCenter.getY())*draw->m_Scale+0.5);
	return pt;

下過如下圖所示:



第二種方法:利用相似比(完整顯示地圖)

這幅圖是網上的一副圖片,我希望沒有版權問題。

通常情況下,我們取X和Y方向比例因子較大的作為比例因子,即

double xScale = rect.Width()/width;		//x方向的比例係數
				double yScale = rect.Height()/height;	//y方向的比例係數
				double scale = max(xScale,yScale);


從而地理座標轉換為螢幕座標的程式碼如下:

pts[index].x = (int)((poPoint->getX()-minx)*scale);
 				pts[index].y = (int)(rect.Height()-(poPoint->getY()-miny)*scale);


GDI裝置描述表(device context,DC)包含了特定的顯示裝置的資訊、影象的顯示屬性及特定的顯示視窗等資訊,用GDI程式設計的第一步必須獲取當前的裝置描述表的控制代碼(hDC),然後將該控制代碼作為引數呼叫GDI提供的API函式。我們在繪圖時,通常是各個地理實體分別繪製,以線串為例:

//以下程式碼是根據直線的方法繪製
			for (int index = 0; index < numPoints - 1; index ++)
			{
				dcMem.MoveTo(pts[index]);
				dcMem.LineTo(pts[index + 1]);
			}


這只是在這方面的初步探索,還有就是現實效率不高,當元素特別多時,就顯得非常慢,在以後會逐步加入空間索引機制,加快圖形搜尋和顯示效率,下面是執行結果的截圖,