java 坐标转换_java – 将图像X,Y坐标转换为经度和纬度?

我设置了特定静态地图图像的最小经度和纬度值.那张地图图片是某个国家的剪影.

/**

* Maximum longitude value of the map

*/

private float mapLongitudeMax;

/**

* Minimum longitude value of the map

*/

private float mapLongitudeMin;

/**

* Maximum latitude value of the map

*/

private float mapLatitudeMax;

/**

* Minimum latitude value of the map

*/

private float mapLatitudeMin;

我有一个名为mapImage的BufferedImage.

我有一个我和朋友一起写的方法,它接收经度和纬度,并在地图上给你一个X和Y位置,这样你就可以在地图上绘制一些东西.

现在,如果我想在地图上移动鼠标,我希望它显示我的鼠标位置的经度/纬度,这意味着我需要创建一个方法,将鼠标位置的X和Y转换为经度和纬度,这应该做与我的另一种方法相反.

这是我将地球坐标转换为图像X和Y的方法:

protected Location getCoordinatesByGlobe(float latitude,float longitude) {

/**

* Work out minimum and maximums,clamp inside map bounds

*/

latitude = Math.max(mapLatitudeMin,Math.min(mapLatitudeMax,latitude));

longitude = Math.max(mapLongitudeMin,Math.min(mapLongitudeMax,longitude));

/**

* We need the distance from 0 or minimum long/lat

*/

float adjLon = longitude - mapLongitudeMin;

float adjLat = latitude - mapLatitudeMin;

float mapLongWidth = mapLongitudeMax - mapLongitudeMin;

float mapLatHeight = mapLatitudeMax - mapLatitudeMin;

float mapWidth = mapImage.getWidth();

float mapHeight = mapImage.getHeight();

float longPixelRatio = mapWidth / mapLongWidth;

float latPixelRatio = mapHeight / mapLatHeight;

int x = Math.round(adjLon * longPixelRatio) - 3;// these are offsets for the target icon that shows.. eedit laterrr @oz

int y = Math.round(adjLat * latPixelRatio) + 3; //

// turn it up

y = (int) (mapHeight - y);

return new Location(x,y);

}

现在我试着思考,第一个进入脑海中的想法就是反过来做同样的事情…所以我开始这样做,我遇到了类似的问题,我没有经度就得到adjLon或adjLat的值或纬度,所以这不能简单地通过反转来完成.我对坐标系统都很陌生,所以对我来说有点混乱,但我开始追上它.

有什么提示吗?

编辑(不可能?)

根据this answer,你不可能真正得到真实的结果,因为地球不是平坦的,它不能真正转换成具有经度和纬度的平面地图而不实施真正的数学算法以使其适应变化.

我的代码中有几个原因导致答案不准确:

>由于上述原因

>因为我的X,Y值是整数而不是浮点数.

所以现在我的问题是,如果我的方法真的不可能吗?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MATLAB提供了一个方便的函数来将纬度经度和度坐标转换为ECEF(地心地固坐标系)坐标。该函数称为lla2ecef()。 在MATLAB,可以使用以下代码将纬度经度和度坐标转换为ECEF坐标系。 ```matlab % 定义输入的经度纬度和高度(度坐标) lat = 39.9075; % 维度(度) lon = 116.3972; % 经度(度) h = 50; % 高度(米) % 调用lla2ecef函数进行转换 [x, y, z] = lla2ecef(lat, lon, h); % 打印转换后的结果 fprintf('ECEF坐标:x=%f,y=%f,z=%f\n', x, y, z); ``` 上述代码,我们首先定义了输入的纬度经度和高度(以度为单位)。然后,我们调用lla2ecef()函数,将这些度坐标转换为ECEF坐标。最后,我们使用fprintf()函数打印出转换后的ECEF坐标。 需要注意的是,经度纬度的单位必须是度,而高度的单位必须是米。此外,转换后的ECEF坐标将以米为单位。 希望这个回答能帮到你! ### 回答2: ECEF(Earth-Centered, Earth-Fixed)坐标系是一种地心固定坐标系,用于描述地球上的点的位置。下面是使用MATLAB将纬度经度和度坐标转换为ECEF坐标系的步骤: 1. 首先,我们需要知道地球的半长轴和短轴的数值。通常情况下,半长轴是6378137米,短轴是6356752.3142米。 2. 确定我们要计算的目标点的纬度经度和高度(以度为单位)。 3. 计算出地球的第一偏心率(eccentricity)的平方,可以使用公式 e² = (a²-b²)/a² ,其a是半长轴,b是短轴。 4. 将纬度经度转换为弧度,可以使用公式 rad = deg * (pi/180)。 5. 计算目标点在地球上的曲率半径 rho = a / sqrt(1 - e² * sin²(lat)),其lat是纬度的弧度表示。 6. 计算目标点相对于x轴方向的ECEF坐标的分量,可以使用公式 x = (rho + alt) * cos(lat) * cos(lon)。 7. 计算目标点相对于y轴方向的ECEF坐标的分量,可以使用公式 y = (rho + alt) * cos(lat) * sin(lon)。 8. 计算目标点相对于z轴方向的ECEF坐标的分量,可以使用公式 z = (rho * (1-e²) + alt) * sin(lat)。 最终得到的x、y和z值就是目标点在ECEF坐标系的位置。这些坐标可以用来实现地球上的定位和导航等应用。MATLAB提供了一些内置函数来简化这些计算过程,例如lla2ecef和geodetic2ecef等函数可以直接将纬度经度和高度转换为ECEF坐标。 ### 回答3: ECEF(地心地固坐标系)是一种基于地球的心和固定的坐标系,用于描述地球上的位置。在Matlab,可以通过以下方法将纬度经度和度坐标转换为ECEF坐标系: 首先,需要知道地球的半长轴(a)和短轴(b)以及偏心率的平方(e^2)的数值。这些参数可根据地球的椭球体模型来确定。 其次,将给定的纬度(latitude)和经度(longitude)转换为弧度值。可以使用Matlab的deg2rad函数将角度转换为弧度。 然后,根据以下公式计算ECEF坐标系的X、Y和Z值: N = a / sqrt(1 - e^2 * sin(latitude)^2) X = (N + h) * cos(latitude) * cos(longitude) Y = (N + h) * cos(latitude) * sin(longitude) Z = (N * (1 - e^2) + h) * sin(latitude) 其,h是海拔高度。如果没有提供海拔高度,则可以将h设为0。 最后,得到的X、Y和Z值即为在ECEF坐标系下的位置。 需要注意的是,ECEF坐标系的X、Y和Z坐标与地心纬度经度和度坐标系下的位置存在正负关系和单位差异。为了获得更常用的纬度经度和度坐标系下的位置,可以将ECEF坐标系下的位置转换为地心纬度经度和度坐标系,这也是Matlab提供的函数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值