Unity3d Gis 坐标转换

本文介绍如何在Unity3D中实现经纬度坐标到场景位置的转换,并提供具体实现代码。通过计算经纬度差值与Unity场景坐标差值的比例关系,实现了地理信息系统的坐标映射。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在做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的类,其实写的很简单:

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;
    }
}

来源:http://blog.youkuaiyun.com/saide6000/article/details/26992945

 

转载于:https://www.cnblogs.com/dj1232090/p/5628572.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值