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

时间:2014-07-21 21:02:06

标签: java gps google-earth

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

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

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

    输入纬度输入经度 (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坐标时的路径。

    但是,当我使用此公式将Lat / Long坐标转换为像素坐标时。转换后的像素坐标不一致,如下所示:

    图像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)

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

2 个答案:

答案 0 :(得分:1)

纬度和经度不是距离。

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

答案 1 :(得分:0)

以下是编译和回答您的问题的代码

[1] (39.64581,-79.97168) -> 102,363
[2] (39.64651,-79.97275) -> 354,217
[3] (39.646915,-79.97342) -> 512,133
[4] (39.646538,-79.97279) -> 363,212
[5] (39.646458,-79.97264) -> 328,228

您可能已经互换了x-y坐标。在这种情况下,x ==经度,y ==纬度。

import java.util.*;
import java.awt.geom.*;

public class LatLong {

        private  int  imageW,  imageH;
        private final static   double   west = -79.974642,      north = 39.647556,
                                        east = -79.971244,      south = 39.644675;

        public LatLong (int w, int h) {
                imageW = w;
                imageH = h;
        }

        public List<Point2D> convertLatLongToCoord (List<Point2D> coordinate) {
            List<Point2D> latLong = new ArrayList<Point2D>();
            for (Point2D coord : coordinate) {
                double  x = coord.getY(),       px = imageW * (x-east) / (west-east),
                        y = coord.getX(),       py = imageH * (y-north)/(south-north);
                latLong.add (new Point2D.Double(px,py));
            }
            return latLong;
        }

        public static void main (String[] args) {
                double[] latit = {39.64581, 39.64651, 39.646915, 39.646538, 39.646458},
                        longit = {-79.97168, -79.97275, -79.97342, -79.97279, -79.97264};

                List<Point2D> pointList = new ArrayList<Point2D>();
                for (int i = 0 ; i < latit.length ; i++)
                        pointList.add (new Point2D.Double(latit[i], longit[i]));

                List<Point2D> pixels = new LatLong (800,600).convertLatLongToCoord (pointList);

                for (int i = 0 ; i < latit.length ; i++)
                        System.out.println ("[" + (i+1) + "]\t(" + latit[i] + "," + longit[i] + ") -> " +
                                (int) (pixels.get(i).getX()) + "," + (int) (pixels.get(i).getY()));
}}