Unity3d Gis 座標轉換

來源:互聯網
上載者:User

  最近在做unity3d與Gis結合的項目,最基本的就是座標的轉換問題,比如把經緯度為(166.23.9.27 , 39.55.15.74) 轉換到unity裡面成相應的位置點,廢話不多說 上代碼:

using UnityEngine;using System.Collections;public class SaiGetLatLog : MonoBehaviour {public Transform firstPoint; //Unity中左上點public Transform secondPoint;//Unity中右下點public SaiEarth firstSai;//地圖中對應的左上經緯度點public SaiEarth secondSai;//地圖中對應的右下經緯度點private float z_offset,x_offset,z_w_offset,x_w_offset;private RaycastHit rayHit;// Use this for initializationvoid Start () {InitBasicNum ();//初始化參數}// Update is called once per framevoid Update () {if (Input.GetMouseButton (0) && Physics.Raycast (Camera.main.ScreenPointToRay (Input.mousePosition), out rayHit, Mathf.Infinity)) {print ( getWorldPoint(firstSai).x+","+ getWorldPoint(firstSai).z);}}void InitBasicNum(){firstSai = new SaiEarth (new Vector3 (116f, 23f, 9.27f), new Vector3 (39f, 55f, 15.74f));secondSai = new SaiEarth (new Vector3(116f,23f,44.39f),new Vector3(39f,54f,44.27f));z_offset = Mathf.Abs ((firstSai.latitude.x+firstSai.latitude.y/60+firstSai.latitude.z/3600) - (secondSai.latitude.x+secondSai.latitude.y/60+secondSai.latitude.z/3600));//地圖中的維度差x_offset = Mathf.Abs ((firstSai.longitude.x+firstSai.longitude.y/60+firstSai.longitude.z/3600)-(secondSai.longitude.x+secondSai.longitude.y/60+secondSai.longitude.z/3600));//地圖中的經度差 z_w_offset = Mathf.Abs (firstPoint.localPosition.z - secondPoint.localPosition.z);//unity中的維度差 x_w_offset = Mathf.Abs (firstPoint.localPosition.x - secondPoint.localPosition.x);//unity中的經度差}Vector3 getWorldPoint(SaiEarth se)//由經緯度得到位置點{float tempX = (float)(se.longitude.x + se.longitude.y / 60 + se.longitude.z / 3600 - (secondSai.longitude.x + secondSai.longitude.y / 60 + secondSai.longitude.z / 3600));float tempZ = (float)(se.latitude.x + se.latitude.y / 60 + se.latitude.z / 3600 - (secondSai.latitude.x + secondSai.latitude.y / 60 + secondSai.latitude.z / 3600));float _tempX = (float)(tempX * x_w_offset / x_offset + secondPoint.localPosition.x);float _tempZ = (float)(tempZ * z_w_offset / z_offset + secondPoint.localPosition.z);return new Vector3((float)_tempX,0f,(float)_tempZ);}SaiEarth getLatLon(Vector3 curPoint)//由位置點得到經緯度{SaiEarth tempEarth = new SaiEarth();float _z_offset = Mathf.Abs (curPoint.z - secondPoint.localPosition.z) * z_offset / z_w_offset;float _x_offset = Mathf.Abs (curPoint.x - secondPoint.localPosition.x) * x_offset / x_w_offset;float resultX = _x_offset + (secondSai.longitude.x + secondSai.longitude.y/60 + secondSai.longitude.z/3600);float resultZ = _z_offset + (secondSai.latitude.x + secondSai.latitude.y/60 + secondSai.latitude.z/3600);tempEarth.longitude = new Vector3 ((int)resultX, (int)((resultX - (int)resultX)*60),((resultX - (int)resultX)*60 - (int)((resultX - (int)resultX)*60))*60);tempEarth.latitude = new Vector3 ((int)resultZ, (int)((resultZ - (int)resultZ)*60),((resultZ - (int)resultZ)*60 - (int)((resultZ - (int)resultZ)*60))*60);return tempEarth;}}

上面有一個SaiEarth的類,其實寫的很簡單:

using UnityEngine;using System.Collections;public class SaiEarth  {public Vector3 longitude;public Vector3 latitude;public SaiEarth(){}public SaiEarth(Vector3 longitude,Vector3 latitude){this.latitude = latitude;this.longitude = longitude;}public string toString(){return "Lat:"+this.latitude + ",Long:" + this.longitude;}}
OK 完工。

做u3d有一段時間了  純屬個人興趣,現在還沒畢業,以後還會遇到很多問題 ,希望自己有毅力能堅持,更新博文以自省!  

學海無涯 不進則退

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.