gpt4 book ai didi

java - 在简单的圆柱投影上将纬度/经度转换为图像坐标(像素坐标)

转载 作者:太空宇宙 更新时间:2023-11-04 06:39:31 25 4
gpt4 key购买 nike

我从 Google Earth 中拍摄了一张图像,其所有 4 个角的纬度/经度都是已知的。我正在使用 GPS 传感器捕获纬度/经度。我必须使用java将这些捕获的纬度/经度转换为图像坐标(像素坐标)。我将使用图像坐标来模拟车辆在静态 map 上移动(图像取自 Google 地球)。

我找到了这个公式并尝试实现它

  1. 确定 1653x1012 图像中最左侧的经度 (X)
  2. 确定 1653x1012 图像中的最东经度 (Y)
  3. 确定经度差 (Z = Y - X)
  4. 确定 1653x1012 图像中的最北纬度 (A)
  5. 确定 1653x1012 图像中的最南纬度 (B)
  6. 确定纬度差 (C = A - B)给定纬度和经度,以确定他们点击了哪个像素:

J = 输入经度K = 输入纬度

计算X像素

XPixel = CInt(((Y - J) / CDbl(Z)) * 1653)

计算 Y 像素

YPixel = CInt(((A - K) / CDbl(C)) * 1012)

这是我使用的代码。

    import java.awt.geom.Point2D;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.List;

public class LatLongService {
private static LatLongService latLangService;
private BufferedReader reader = null;
private String st;

private LatLongService() {
try {
reader = new BufferedReader(new FileReader(new File(
"resources/GPS_lat_long_2.txt")));
} catch (Exception e) {
e.printStackTrace();
}
}

public static LatLongService getInstance() {
if (latLangService == null)
latLangService = new LatLongService();
return latLangService;
}

public List<Point2D> readLatLongList() {
List<Point2D> pointList = new ArrayList<Point2D>();
StringBuffer xStr;
StringBuffer yStr = new StringBuffer();
try {
while ((st = reader.readLine()) != null) {
xStr = new StringBuffer(st.substring(0, st.indexOf(',')));
yStr = new StringBuffer(st.substring(st.indexOf(',') + 2,
st.length()));
Point2D pt = new Point2D.Double(
new Double(xStr.toString()).doubleValue(), new Double(
yStr.toString()).doubleValue());
pointList.add(pt);
}
} catch (Exception e) {
e.printStackTrace();
try {
reader.close();
} catch (Exception e2) {
e.printStackTrace();
}
}
return pointList;
}


public List<Point2D> convertLatLongToCoord(List<Point2D> coordinate) {
List<Point2D> latLong = new ArrayList<Point2D>();
double westMostLong = -79.974642;
double eastMostLong = -79.971244;
double longDiff = eastMostLong - westMostLong; // (rightmost_longitude -
// leftmost_longitude)

double northMostLat = 39.647556;
double southMostLat = 39.644675;
double latDiff = northMostLat - southMostLat; // (topmost_latitude -
// bottommost_latitude)
for (Point2D coord : coordinate) {
double j = coord.getY();
double k = coord.getX();

double XPixel = (((eastMostLong - j) / longDiff) * 1653);
double YPixel = (((northMostLat - k) / latDiff) * 1012);

Point2D actualCoord = new Point2D.Double(XPixel, YPixel);
latLong.add(actualCoord);
}
return latLong;
}
}

我从 GPS 传感器获得的一些 GPS 纬度/经度

输入纬度 输入经度(39.64581,-79.97168)(39.64651,-79.97275)(39.646915,-79.97342)(39.646538,-79.97279)

[IMG] http://i59.tinypic.com/nbqkk3.png[/IMG]

图中的红线是传感器获取GPS坐标时所走的路径。

但是,当我使用这个公式将纬度/经度坐标转换为像素坐标时。转换后的像素坐标不一致,如下所示:

图像 X 图像 Y(212.0977045, 613.3120444)(732.6127134, 367.4251996)(1058.542672、225.1620965)(752.0712184, 357.5897258)

X、Y(像素)坐标的变化太大。因此,当我尝试根据像素坐标移动车辆时,车辆不会遵循红线或至少接近红线。

车辆移动到红线上方或红线下方,但不能在线上。

为了使车辆基于像素坐标平滑移动,理想情况下我希望从纬度/经度到图像坐标的转换如下所示:

所需图片 X 所需图片 Y(1290, 409)(1289, 409)(1288, 409)(1287, 409)

但我明白了

图像 X 图像 Y(212.0977045, 613.3120444)(732.6127134, 367.4251996)(1058.542672、225.1620965)(752.0712184, 357.5897258)

我希望我能够传达我的问题。

最佳答案

纬度和经度不是距离。

http://geography.about.com/cs/latitudelongitude/a/latlong.htm

我最近参与了一个使用 GPS 的 Arduino 项目。我遵循 minigeo API 方法,将纬度和经度转换为北距和东距 (UTM)。

使用链接中的库可以进行此转换: http://www.ibm.com/developerworks/library/j-coordconvert/

获取最大东距和北距并计算比例

private synchronized void scale() {
int w = 800;
int h = 600;

this.scale = Math.min(
w / (maxEasting - minEasting),
h / (maxNorthing - minNorthing));

oEasting = minEasting;
oNorthing = minNorthing;
}

比转换为 X 和 Y

private int applyScale(double km) {
return (int) (km * scale);
}

private int convertX(double easting) {
return applyScale(easting - oEasting);
}

private int convertY(double northing, int height) {
return 600/*height*/ - applyScale(northing - oNorthing);
}

来源:Minigeo

关于java - 在简单的圆柱投影上将纬度/经度转换为图像坐标(像素坐标),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24874693/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com