GIS 開発における一般的な座標系変換に関する質問 (Unity と MapBox を例に挙げて)

序文

GIS 開発の過程で、地理データの視覚化のために、国内外の主流の開発キットまたはサードパーティのマップ プラグインで使用される座標系が統一されていないため、精度、データのマッチングなどの問題が相まって、座標位置が問題になります. 難しい, ここでは、関連情報とあなたが習得したものに基づいて、一般的に使用される座標系と変換について簡単に紹介します. Mapbox と Unity を例にとると, 緯度と経度と unity の世界座標間の変換は に実装されていますコード。

1. 一般的に使用される座標系

GIS の開発中によく触れる座標系には、地理座標系、平面投影座標系、空間直角座標系の 3 つの主なタイプがあります. 以下は、この導入に基づいており、単一の座標系は説明した。

1.1 地理座標系

地理座標系とは簡単に言えば、緯度と経度を使って地上の点を表す球座標系で、単位は度で、地心座標系と高麗人参座標系に分けることができます。

1.1.1 地心座標系

地球の重心を原点とする空間デカルト座標系、または球の中心が地球の重心と一致する地球楕円体を基準とする測地座標系。
WGS-84 と CGCS2000 は地心座標系に属します。

1.1.2 パラメトリック座標系

高麗人参座標系は、基準楕円体の幾何中心を原点とする測地座標系であり、ガウス射影計算により平面デカルト座標系に変換することができる。
一般的な朝鮮人参の座標系には、北京 54 と西安 80 があります。

1.2 平面投影座標系

簡単に言えば、ある数学的な規則 (投影タイプ) に従って経緯線を平面に投影し、地点を表す X 値と Y 値に基づいて座標系を取得することです. 単位は通常メートルであり、いくつかの投影座標系と多くの投影方法があります.ここでは、一般的に使用されるいくつかの投影座標系、メルカトル図法、ガウス・クリューガー図法、UTM図法、およびランベルト等角図法を示します.

1.2.1 メルカトル図法

地球 (楕円体) が円柱の中に置かれ、標準緯線が円柱に接していると仮定した等角正接円筒図法で、地球の中心に光源があると仮定し、その上にグラフィックスを配置します。球面が円柱に投影され、次に円柱に投影されます。体積膨張は、標準緯線のメルカトル図法です。方向と角度の正確性は保証されますが、標準緯線からは遠くなります。緯糸の間隔が広いほど、形状変形が深刻になります。
ここに画像の説明を挿入
ほとんどの外国の地図メーカーは、Goole Map、mapbox などの Web メルカトル図法を使用しています。通常のメルカトル図法との違いは、楕円体が標準球に置き換えられていることです。

1.2.2 UTM プロジェクション

正式名称は「ユニバーサル横メルカトル図法」、等角横正割円筒図法です。楕円柱は南緯 80 度と北緯 84 度で地球を切断し、中央子午線の長さの比率は 0.9996 であり、投影後、互いに切断する 2 つの子午線は変形しません。すべての距離、方向、形状、および面積は、中央子午線の 15 度以内でかなり正確です。ただし、15° バンドを超えると、横メルカトル図法では、サイズ、距離、方向の歪みが大幅に増加します。横メルカトル図法は正角図法であり、形状は小​​さな領域で正確です。
ここに画像の説明を挿入
私の国の衛星画像データは、一般的に UTM 投影法を使用しています。

1.2.3 ガウス・クリューガー図法

「等角横円筒図法」とも呼ばれ、中央子午線の長さは変わらず、横メルカトル図法の変形でもあります。この種の図法は、長さや面積の変形が少なく、計算が容易なため、大縮尺の地形図の作図に広く使用されています。

円筒図法は地球全体をリアルに表現するのに適しており、メルカトル図法はナビゲーションによく使用され、横メルカトル図法は大規模なマッピングに最適です。

1.2.4 ランベルト正角円錐図法

直円錐を使用して球面を切断または切断し、等角条件を適用して地球の表面を円錐面に投影し、母線に沿って平面に展開することを想像してください。投影後、緯線は同心円の円弧であり、経線は同心円の半径です。角歪みがなく、縦糸と横糸の長さの比率は同じです。緯度に沿って分布する中緯度地域の中縮尺および小規模地図の作成に適しています。私の国の 1:1 百万の地形図は、ランベルト図法を採用しています。
ここに画像の説明を挿入

円筒図法とは異なり、円錐図法は一般に地球規模で大縮尺の地図を作成するのには適しておらず、大陸や地域の地図作成に適しています。

1.3 空間直交座標系

また、Unity で使用される 3 次元座標系です.X、Y、および Z の値を使用して、空間内の点を表します.緯度および経度座標系で変換できます.平面投影座標系とスペース デカルト座標系は、デカルト座標系に属します。.

1.4 単位座標系

1.4.1 ワールド座標

Unity のワールド座標は、左手座標系を使用した Unity ワールドの 3 次元座標です。このうち、transform.Position は Unity ワールド全体での位置座標を指し、transform.LocalPosition は親オブジェクトの位置からの相対座標、つまりローカル座標を指します。

1.4.2 画面座標

画面左下を座標原点とし、上がY軸の正方向、右がX軸の正方向、そのZ軸座標が負の値カメラのワールド座標における Z 軸の

1.4.3 ビューポート座標系

画面座標パラメータを標準化すると、その Z 軸座標はカメラのワールド座標の Z 軸の負の値になり、深さを示します。

1.4.4 GUI 座標系

原点は 2 次元座標系の左上隅にあり、Z 値は常に 0 です。

2. 座標系間の変換

2.1 サードパーティの地図で一般的に使用される座標系

基礎となるインターフェース(HTML5 Geolocation または ios、Android API) によって GPS デバイスを介して取得された座標は、WGS-84 座標系、つまり元の座標データを使用します.中国では、WGS-84 データは厳しく制限されているため、中国で一般的に使用されている地図の座標系は、すべてまたは多かれ少なかれ偏差があります;
Gaode 地図、Tencent 地図、および Google China 地図は、火星座標系としても知られる GCJ-02 座標系を使用します。 Wgs-84 座標系; Baidu
マップBD-09 座標系が使用され、これは火星座標系に基づいて再度暗号化されます;
mapboxなどのほとんどの外国のマップは Web メルカトル (投影法)、つまり WGS84 を使用しますWeb メルカトル投影座標系、デフォルト ベース マップは、Wgs-84 座標系を使用して openstreetmap から転送されます。

2.2 よく使われる座標変換

2.2.1 いくつかの一般的に使用される投影座標系と WGS84 との間の変換

座標変換の詳細なPythonコード入力
ここに画像の説明を挿入
このブロガーが提供している変換Pythonコードは非常に詳細です. 変換関係は上図のようになっているのでここでは紹介しません. 後の作者が他の言語を元に座標変換コードを書くかもしれません.または指示のある他の座標系。

2.2.2 球座標とデカルト座標の変換

球座標は、地球の中心を原点とするデカルト座標 (α, β, r) → (x, y, z) に変換されます。デカルト座標は、球座標 (x, y, z) → (α
ここに画像の説明を挿入
, β, r) :
ここに画像の説明を挿入

3. mapbox の緯度経度座標と単位座標の相互変換

主に Mapbox 関連の関数の呼び出しであり、特定の関数の内容は MapBox で表示できます。

3.1 画面座標を緯度経度に変換する

(1) メインコード

mousePosScreen.z = _referenceCamera.transform.localPosition.y;
//屏幕坐标默认Z=0,这里将相机到平面的垂直距离赋给Z
var pos = _referenceCamera.ScreenToWorldPoint(mousePosScreen);
//将屏幕上的点转换到世界坐标中
var latlongDelta = _mapManager.WorldToGeoPosition(pos);
//世界坐标转经纬度,_mapManager为AbstractMap类

(2) WorldToGeoPosition 詳細コード

public virtual Vector2d WorldToGeoPosition(Vector3 realworldPoint)
		{
    
    
			var scaleFactor = Mathf.Pow(2, (InitialZoom - AbsoluteZoom));
			//InitialZoom:初始地图放大系数;AbsoluteZoom:当前地图放大系数
			//scaleFactor:缩放因子为2的InitialZoom - AbsoluteZoom次方
			return (Root.InverseTransformPoint(realworldPoint)).GetGeoPosition(CenterMercator, WorldRelativeScale * scaleFactor);
			//InverseTransformPoint:将世界空间转换为局部空间
			//GetGeoPosition:得到地理坐标系,根据墨卡托坐标和WgS坐标的转换公式
			//CenterMercator为中心位置的墨卡托坐标
		}

3.2 緯度と経度を世界座標に変換する

(1) メインコード

Vector3 WorldPosition =_mapManager=GeoToWorldPoisition(location);
//location为当前位置经纬度
WorldPosition.y=---;
//根据需要给高度赋值,若有瓦片无需此行代码,则默认根据瓦片赋高度值

(2) 詳細コード

var scaleFactor = Mathf.Pow(2, (InitialZoom - AbsoluteZoom));
var worldPos = Conversions.GeoToWorldPosition(latitudeLongitude, CenterMercator, WorldRelativeScale * scaleFactor).ToVector3xz();
//墨卡托转世界坐标
return Root.TransformPoint(worldPos);
//这里根据需要将3D坐标转换世界坐标或本地坐标

4. 結論

このブログの内容は主に、この部分の理論についての理解を深めるために、私自身が情報を収集し、要約することを目的としています.完全に正しいとは限りません.参考用です.間違いがあれば修正してください. !

                                                  部分图片源于网络,侵删!

おすすめ

転載: blog.csdn.net/qq_44706002/article/details/126870510