Unity3d Gis 坐标转换

近期在做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 initialization
	void Start () {
		InitBasicNum ();//初始化參数
	}

	// Update is called once per frame
	void 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的类,事实上写的非常easy:

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有一段时间了  纯属个人兴趣。如今还没毕业,以后还会遇到非常多问题 ,希望自己有毅力能坚持。更新博文以自省。

学海无涯 不进则退

时间: 2024-12-28 22:33:21

Unity3d Gis 坐标转换的相关文章

GIS坐标转换具体操作

坐标系转换 关于不同椭球体之间的坐标转换,网上资料大都笼统的介绍说是精度要求不高时采用三参数转换,精度要求较高时使用七参数转换法. 本文以国内某一地方坐标系为例,转到WGS84坐标系下的实际方法分布介绍: 国内地方坐标系一般为城建坐标系,椭球一般为Beijing 1954椭球稍微变形得到,投影方法一般为高斯-克吕格投影. 1.计算七参数 a.拿到三个以上地方坐标系下的控制点坐标,用GPS测量对应控制点的WGS84经纬度坐标.(关于控制点地方坐标,一般当地测绘院都会有,可以向其购买.应当了解当地地

Unity3d坐标与NGUI坐标转换

A物体在NGUI空间,父节点C,B物体在Unity3d空间.AC的渲染相机为camera2d,B的渲染相机为camera3d,如果我们希望把A物体设置在B物体上面10像素的位置上,但是A物体仍旧在NGUI空间,可以如下设置: Vector3 result = Vector3.zero; Vector3 screen3dPos = camera3d.WorldToScreenPoint(B.position); result = camera2d.ScreenToWorldPoint(screen

gis空间分析案例_7参数单坐标转换

商务科技合作:向日葵,135-4855__4328,xiexiaokui#qq.com 功能: 对输入的单个坐标,利用7参数,一步进行坐标变换,使用极为直观,极大的方便了测绘工作.Arcgis并不直接一步支持7参数坐标转换. 特点: 1. 地理处理工具,可以与任何arcgis工具和语言集成 2. 精度高,实测误差小于1mm 3. 兼容强,支持所有arcgis坐标系 4. 操作便,直接输入坐标,选择坐标系 5. 效率高,可以批处理文件 使用方法: 输入坐标,设定输入坐标系,输出坐标系,指定转换7参

分享:Unity3D模型跟随鼠标移动功能的小脚本 (屏幕坐标和三维空间坐标转换)

using UnityEngine; using System.Collections; public class ModelsPosChange : MonoBehaviour { RaycastHit hit; private Transform Icon; bool isMove = false; void FixedUpdate() { if (isMove) { Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); i

unity3d 坐标系

unity3d使用的是左手坐标系,即伸出左手,让拇指和食指成"L"形,大拇指向右,食指向上.其余的手指指向前方.这样就建立了一个左手坐标系.拇指.食指和其余手指分别代表x,y,z轴的正方向. 1.世界坐标系:unity3d中所有的gameobjet在视图中都是以世界坐标显示在场景中(左手坐标系,3d空间),由transform.position可以获得该位置坐标. 2.屏幕坐标系:以像素定义的,以屏幕左下角为(0,0)点,右上角(screen.width,screen.height),

南沙政府应急系统之GIS一张图(arcgis api for flex)讲解(二)鹰眼模块

讲解GIS功能模块实现之前,先大概说一下flexviewer的核心配置文件config.xml,系统额GIS功能widget菜单布局.系统的样式.地图资源等等都是在这里配置的,这里对flexviewer不熟悉的朋友,要先去flexviewer官网了解或者网上的其他资源了解才行; 鹰眼模块在config.xml文件的配置如下: <widget right="0" bottom="0" config="widgets/OverviewMap/Overvi

[Unity3D]Unity3D叙利亚NGUI血液和技能的冷却效果

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 喜欢我的博客请记住我的名字:秦元培,我的博客地址是blog.csdn.net/qinyuanpei. 转载请注明出处,本文作者:

[Unity3D]Unity3D再叙NGUI之血条及技能冷却效果

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 喜欢我的博客请记住我的名字:秦元培,我的博客地址是blog.csdn.net/qinyuanpei. 转载请注明出处,本文作者:

[Unity3D入门]分享一个自制的入门级游戏项目&quot;坦克狙击手&quot;

[Unity3D入门]分享一个自制的入门级游戏项目"坦克狙击手" 我在学Unity3D,TankSniper(坦克狙击手)这个项目是用来练手的.游戏玩法来自这里(http://www.4399.com/flash/127672_3.htm),虽然抄袭了人家的创意,不过我只用来练习(目前还很不成熟,离人家的境界相差很大),坦克.导弹.建筑模型来自网络,应该不会有版权问题吧. 由于模型和代码总共10M以上了,需要源代码和发布的Windows版.网页版程序的同学麻烦点个赞并留下你的邮箱~ 到