01 kwietnia 2011

Zamiana oraz transformacja współrzędnych GPS na współrzędne płaskie [csharp]

Bardzo długo szukałem podpowiedzi na nurtujące mnie pytanie odnośnie zamiany współrzędnych GPS na współrzędne płaskie by móc obliczyć np długość od jednego pkt do drugiego lub też przeliczyć pole powierzchni obszaru. No i znalazłem na stronie AGH imienia Stanisława Staszica w Krakowie dość proste rozwiązanie. Po niedługim czasie linki wygasły więc postanowiłem je zachować. Link do skryptu w csharp znajduje się na wkej.org.

using System;

using System.Collections.Generic;
using System.Text;


namespace FreeMierniczy
{ 
    public class GeodGPS
    {
        public const double U92_L_ZERO = 19.0;    //Poludnik srodkowy
        public const double U92_FE = 500000.0;    // False Eting
        public const double U92_FN = -5300000.0;  // False Northing
        public const double U92_M_ZERO = 0.9993;  // Wsp. skali
        public const double U92_E = 0.0818191910428;
        // pozostale stale
        public const double PI = 3.14159265358979;
        public const double RO = 6367449.14577;
        public const double A2 = 0.0008377318247344;
        public const double A4 = 0.0000007608527788826;
        public const double A6 = 0.000000001197638019173;
        public const double A8 = 0.00000000000244337624251;
        /* Obliczenie współrzędnej X na podstawie współrzędnych geodezyjnych B,L
        Brad = B * Pi / 180
        Lrad = L * Pi / 180
        Lorad = Lo * Pi / 180
        k = ((1 - E * Sin(Brad)) / (1 + E * Sin(Brad))) ^ (E / 2)
        C = k * Tan((Brad / 2) + (Pi / 4))
        firad = (2 * Atn(C)) - (Pi / 2)
        Xmer = Atn(Sin(firad) / (Cos(firad) * Cos(Lrad - Lorad)))
        Ymer = 0.5 * Log((1 + Cos(firad) * Sin(Lrad - Lorad)) / (1 - Cos(firad) * Sin(Lrad - Lorad)))
        Xgk = Ro * (Xmer + (a2 * Sin(2 * Xmer) *Cosh(2 * Ymer)) + (a4 * Sin(4 * Xmer) * Cosh(4 * Ymer)) + (a6 * Sin(6 * Xmer) *Cosh(6 * Ymer)) + (a8 * Sin(8 * Xmer) *Cosh(8 * Ymer)))
        Współrzędna X Wgs84 = mo * Xgk + FN */

        public double getXU92(double longitude, double latitude)
        {
            
            double brad, lrad, lorad, k, c, firad, xmer, ymer, xgk;
            brad = latitude * PI / 180;
            lrad = longitude * PI / 180;
            lorad = U92_L_ZERO * PI / 180;
            k = Math.Pow(((1 - U92_E * Math.Sin(brad)) / (1 + U92_E * Math.Sin(brad))), U92_E / 2);
            c = k * Math.Tan(brad / 2 + PI / 4);
            firad = 2 * Math.Atan(c) - PI / 2;
            xmer = Math.Atan(Math.Sin(firad) / (Math.Cos(firad) * Math.Cos(lrad - lorad)));
            ymer = 0.5 * Math.Log((1 + Math.Cos(firad) * Math.Sin(lrad - lorad)) / (1 - Math.Cos(firad) * Math.Sin(lrad - lorad)));
            xgk = RO * (xmer + A2 * Math.Sin(2 * xmer) * Math.Cosh(2 * ymer) + 
                A4 * Math.Sin(4 * xmer) * Math.Cosh(4 * ymer) + 
                A6 * Math.Sin(6 * xmer) * Math.Cosh(6 * ymer) + 
                A8 * Math.Sin(8 * xmer) * Math.Cosh(8 * ymer));
            return U92_M_ZERO * xgk + U92_FN;

        }
        /* Obliczenie współrzędnej Y na podstawie współrzędnych geodezyjnych B,L
         Brad = B * Pi / 180
         Lrad = L * Pi / 180
         Lorad = Lo * Pi / 180
         k = ((1 - E * Sin(Brad)) / (1 + E * Sin(Brad))) ^ (E / 2)
         C = k * Tan((Brad / 2) + (Pi / 4))
         firad = (2 * Atn(C)) - (Pi / 2)
         Xmer = Atn(Sin(firad) / (Cos(firad) * Cos(Lrad - Lorad)))
         Ymer = 0.5 * Log((1 + Cos(firad) * Sin(Lrad - Lorad)) / (1 - Cos(firad) * Sin(Lrad - Lorad)))
         Ygk = Ro * (Ymer + (a2 * Cos(2 * Xmer) * Sinh(2 * Ymer)) + (a4 * Cos(4 * Xmer) * Sinh(4 * Ymer)) + (a6 * Cos(6 * Xmer) *Sinh(6 * Ymer)) + (a8 * Cos(8 * Xmer) * Sinh(8 * Ymer)))
         Współrzędna Y Wgs84 = mo * Ygk + FE */
        public double getYU92(double longitude, double latitude)
        {
            double brad, lrad, lorad, k, c, firad, xmer, ymer, ygk;
            brad = latitude * PI / 180;
            lrad = longitude * PI / 180;
            lorad = U92_L_ZERO * PI / 180;
            k = Math.Pow(((1 - U92_E * Math.Sin(brad)) / (1 + U92_E * Math.Sin(brad))), U92_E / 2);
            c = k * Math.Tan(brad / 2 + PI / 4);
            firad = 2 * Math.Atan(c) - PI / 2;
            xmer = Math.Atan(Math.Sin(firad) / (Math.Cos(firad) * Math.Cos(lrad - lorad)));
            ymer = 0.5 * Math.Log((1 + Math.Cos(firad) * Math.Sin(lrad - lorad)) / (1 - Math.Cos(firad) * Math.Sin(lrad - lorad)));
            ygk = RO * (ymer + A2 * Math.Cos(2 * xmer) * Math.Sinh(2 * ymer) +
                A4 * Math.Cos(4 * xmer) * Math.Sinh(4 * ymer) +
                A6 * Math.Cos(6 * xmer) * Math.Sinh(6 * ymer) +
                A8 * Math.Cos(8 * xmer) * Math.Sinh(8 * ymer));
            return U92_M_ZERO * ygk + U92_FE;
        }

       
    }
}

06 marca 2011

[OpenOffice] OpenOffice Base Data Systemowa

Gdy chcemy wstawić datę systemową w OpenOffice Base można to użyć w następujący sposób:
  1. W menu Tools->SQL(Polska wersja: Narzędzia->SQL) wprowadzamy np coś takiego:
ALTER TABLE "NazwaTabeli" ALTER COLUMN "KolumnazData" SET DEFAULT CURRENT_DATE;
ALTER TABLE "
NazwaTabeli" ALTER COLUMN "KolumnazData" SET DEFAULT CURRENT_TIME;
ALTER TABLE "
NazwaTabeli" ALTER COLUMN "KolumnazData" SET DEFAULT CURRENT_TIMESTAMP;
i można się cieszyć automatycznym wstawianiem daty do tabeli.

Więcej szczegółów na forum: http://user.services.openoffice.org/en/forum/viewtopic.php?f=13&t=8471