Cartesian Grid Mapping Functions

Nov 11, 2011 at 12:23 AM

Hi all, and welcome to my first CodePlex post!

I've got a little project on my mind at the moment, and its just for interest sake... My general idea is to convert a plot of cartesian points (x,y) to lat/long.

My cartesian points are arranged on an equidistant grid, measuring 1000,1000 with an origin of (0,0) at the top left.

The origin that I would like to measure from is (500,500) i.e. the centre of the map (where the lat/long is known).

The scale of the grid is 1 = 1.2 or 1 pixel = 1.2km.

Question Time:
------------------

1. Is this possible through functions within the DotSpatial framework?
2. I've been able to calculate the distance but bearing from the origin point is proving futile
3. Given the fact that I know the vertical distance, and the horizontal distance between points, do I need to calculate the bearing and distance for the position to be acccurate?

I was hoping to find a BearingTo or From function in the framework, but haven't been able to.

Any thoughts, comments or constructive criticism are welcomed!

Sean

Dec 14, 2011 at 2:57 AM
Edited Dec 14, 2011 at 2:58 AM

I think that you can calculate the azimuth using this function..

 

        public double GetAzimuth(Coordinate origin, Coordinate target) 
        {
             /// geographic coordinates
            if (_proj.Transform.Proj4Name == "longlat" )
            {

                double dlon = toRad(target.X - origin.X);
                double dlat = toRad(target.Y - origin.Y);

                double y=Math.Sin(dlon) * Cos_deg(target.Y);
                double x=Cos_deg(origin.Y) *Sin_deg(target.Y) - Sin_deg(origin.Y) * Cos_deg(target.Y)*Math.Cos(dlon);
                return toRad((toDeg(Math.Atan2(y, x)) + 360.0) % 360.0);
            }else{
            double dx = target.X - origin.X;
            double dy = target.Y - origin.Y;
            if (dx == 0 && dy > 0) return 0;
            if (dx == 0 && dy < 0) return (Math.PI);
            if (dx > 0 && dy == 0) return (Math.PI / 2);
            if (dx < 0 && dy == 0) return (3 * Math.PI / 2);
            if (dx > 0 && dy > 0) return (Math.Atan(dx / dy));
            if (dx > 0 && dy < 0) return (Math.PI + Math.Atan(dx / dy));
            if (dx < 0 && dy < 0) return ((Math.PI) + Math.Atan(dx / dy));
            if (dx < 0 && dy > 0) return ((2 * Math.PI) + Math.Atan(dx / dy));
            return 0;
            }

        }