Convert from latitude, longitude to x, y

后端 未结 5 1805
夕颜
夕颜 2020-11-30 05:10

I want to convert GPS location (latitude, longitude) into x,y coordinates. I found many links about this topic and applied it, but it doesn\'t give me the correct answer!

5条回答
  •  北海茫月
    2020-11-30 05:27

    I want to share with you how I managed the problem. I've used the equirectangular projection just like @MvG said, but this method gives you X and Y positions related to the globe (or the entire map), this means that you get global positions. In my case, I wanted to convert coordinates in a small area (about 500m square), so I related the projection point to another 2 points, getting the global positions and relating to local (on screen) positions, just like this:

    First, I choose 2 points (top-left and bottom-right) around the area where I want to project, just like this picture:

    Once I have the global reference area in lat and lng, I do the same for screen positions. The objects containing this data are shown below.

    //top-left reference point
    var p0 = {
        scrX: 23.69,        // Minimum X position on screen
        scrY: -0.5,         // Minimum Y position on screen
        lat: -22.814895,    // Latitude
        lng: -47.072892     // Longitude
    }
    //bottom-right reference point
    var p1 = {
        scrX: 276,          // Maximum X position on screen
        scrY: 178.9,        // Maximum Y position on screen
        lat: -22.816419,    // Latitude
        lng: -47.070563     // Longitude
    }
    var radius = 6.371;     //Earth Radius in Km
    
    //## Now I can calculate the global X and Y for each reference point ##\\
    
    // This function converts lat and lng coordinates to GLOBAL X and Y positions
    function latlngToGlobalXY(lat, lng){
        //Calculates x based on cos of average of the latitudes
        let x = radius*lng*Math.cos((p0.lat + p1.lat)/2);
        //Calculates y based on latitude
        let y = radius*lat;
        return {x: x, y: y}
    }
    // Calculate global X and Y for top-left reference point
    p0.pos = latlngToGlobalXY(p0.lat, p0.lng);
    // Calculate global X and Y for bottom-right reference point
    p1.pos = latlngToGlobalXY(p1.lat, p1.lng);
    
    /*
    * This gives me the X and Y in relation to map for the 2 reference points.
    * Now we have the global AND screen areas and then we can relate both for the projection point.
    */
    
    // This function converts lat and lng coordinates to SCREEN X and Y positions
    function latlngToScreenXY(lat, lng){
        //Calculate global X and Y for projection point
        let pos = latlngToGlobalXY(lat, lng);
        //Calculate the percentage of Global X position in relation to total global width
        pos.perX = ((pos.x-p0.pos.x)/(p1.pos.x - p0.pos.x));
        //Calculate the percentage of Global Y position in relation to total global height
        pos.perY = ((pos.y-p0.pos.y)/(p1.pos.y - p0.pos.y));
    
        //Returns the screen position based on reference points
        return {
            x: p0.scrX + (p1.scrX - p0.scrX)*pos.perX,
            y: p0.scrY + (p1.scrY - p0.scrY)*pos.perY
        }
    }
    
    //# The usage is like this #\\
    
    var pos = latlngToScreenXY(-22.815319, -47.071718);
    $point = $("#point-to-project");
    $point.css("left", pos.x+"em");
    $point.css("top", pos.y+"em");
    

    As you can see, I made this in javascript, but the calculations can be translated to any language.

    PS: I'm applying the converted positions to an html element whose id is "point-to-project". In order to use this piece of code on your project you shall create this element (styled as position absolute) or change the "usage" block.

提交回复
热议问题