» »

C# NMEA podatki iz GPS-ja

C# NMEA podatki iz GPS-ja

krneki0001 ::

Spravil sem se programirat in sem si naredil aplikacijo, ki iz GPS-a prebere podatke NMEA. Lepo jih razparsam in dobim sliko, kje so nad mano sateliti, podatke o nadmorski višini in dolžino ter širino kje se nahajam.Podatka vnesem v google maps in me vrže, kot da sem nek v horjulu, namesto zraven trzina.
Problem nastane pri pretvorbi podatka o zemljepisni širini in dolžini.
Podatek dobim v obliki 4604.078,N in 01423.320,E vendat to ni pravi podatek. Ga je treba pretvorit v stopinje, minute in sekunde, da ga lahko podaš stricu googlu, ki te bo potem postavil tja, kjer si zares.

Kako gre v C# pretvorba v stopinje in minute?

Osnoven zapis GPGGA je takle $GPGGA,123519,4807.038,N,01131.000,E,1,08,0.9,545.4,M,46.9,M,,*47
    GGA          Global Positioning System Fix Data
     123519       Fix taken at 12:35:19 UTC
     4807.038,N   Latitude 48 deg 07.038' N
     01131.000,E  Longitude 11 deg 31.000' E
     1            Fix quality: 0 = invalid
                               1 = GPS fix (SPS)
                               2 = DGPS fix
                               3 = PPS fix
			       4 = Real Time Kinematic
			       5 = Float RTK
                               6 = estimated (dead reckoning) (2.3 feature)
			       7 = Manual input mode
			       8 = Simulation mode
     08           Number of satellites being tracked
     0.9          Horizontal dilution of position
     545.4,M      Altitude, Meters, above mean sea level
     46.9,M       Height of geoid (mean sea level) above WGS84
                      ellipsoid
     (empty field) time in seconds since last DGPS update
     (empty field) DGPS station ID number
     *47          the checksum data, always begins with *
Asrock X99 Extreme 4 | Intel E5-2683V4 ES | 64GB DDR4 2400MHz ECC |
Samsung 250GB M.2 | Asus 1070 TI | 850W Antec | LC Tank Buster

KrEn1234 ::

krneki0001 ::

To sem že pogledal, pa ni prav. Garantirano ne, ker dobim ven podatke v obliki 46,04078 in 14,23320.

Sem že pregledal vse te strani in tega tukaj ni. Na kratko ima opisao nekaj, ampak tisto ne dela pravilno.
V kodi, ki je na voljo na codesearch prav od tega njegovega programa, pa tega dela za pretvorbo sploh ni v njegovi kodi.
Asrock X99 Extreme 4 | Intel E5-2683V4 ES | 64GB DDR4 2400MHz ECC |
Samsung 250GB M.2 | Asus 1070 TI | 850W Antec | LC Tank Buster

MrBrdo ::

A ne bo najhitreje, če se zapelješ nekaj km stran, pomeriš še tam kaj ti da google maps in kaj tvoja naprava, in potem sam ugotoviš kvocient? :)
MrBrdo

krneki0001 ::

Rešitev je najdena. Če se bo pa še kdo igral, bom pa tukaj napisal, še zakaj se igram s tem, mogoče še komu omogočim zabavo.

Hardware:
Imam Lenovo S10 3T, ki v originalu ima režo za sim kartico, nima pa modema. Ima pa prosto vodilo mini pci express. Na bolhi sem kupil mini pci express 3G modem MC8780 za 15 evrov. In kupil sem TUŠ-evo sim kartico. Ker je delal prenos preko 3G zelo počasi, sem malo raziskoval zadevo in našel podatek, da je v tem modemu tudi GPS. Dobil sem kompletne driverje in nov firmware za ta modem, vendar ga računalo ni sprejelo. V biosu je "white list" katerih kartic ni dovoljeno dajat v te male prenosnike. Bios sem hacknil in izbrisal "white list" ven, tako da je kartico sprejelo, naložil now firmvare na kartico in sedaj imam 10" GPS.

Software:
Iskal sem program, da bi na svojem velikem računalu pogledal teren kam se podajam, ta program bi mi pa vse te zemljevide shranil na disk. Potem bi jih pa prenesel na prenosnika in ko bi štartal program, bi ta pregledal karte na disku, če jih ni, pa bi se probal priklopiti na internet. To je dovolj dobro za slovenijo in hrvaško, ker imam tuš in vip kartici, pa lahko sproti brskam po netu in si dl-jam karte. Ker programa nisem našel nobebega primernega, sem pa naredil, oziroma ga še delam.

Program je sedaj sfiniširan do te mere, da mi sproti kaže, kje se vozim in sproti dl-ja z neta mape.

Zdej je pa potrebno, da se še karte shranijo na disk, ko se prvič peljem mimo da, ko bom šel naslednjič po isti poti, bo samo še iz diska povleklo karte in mi kazalo kje se vozim. Ta del bo bistveno lažji.


Rešitev:

Zemljepisna širina:
       string Lat1 = fields[1].Substring(0,2);
                string Lat2 = ".";
                string Lat3 = fields[1].Substring(2, 7);
                double Lat4 = Convert.ToDouble(Lat3);

                double degrees_lat = Convert.ToDouble(Lat1);
                double minutes_lat = Math.Round(Lat4 / 6.0, 6);

                string Lat6 = degrees_lat.ToString() + Lat2 + minutes_lat.ToString(); ;
                GPGGA.Latitude = Lat6.Substring(0, 8);


Zemljepisna dolžina:
               string Lon1 = (Convert.ToDouble(fields[3].Substring(0,3))).ToString();
                string Lon2 = ".";
                string Lon3 = fields[3].Substring(3, 7);
                double Lon4 = Convert.ToDouble(Lon3);

                double degrees_lon = Convert.ToDouble(Lon1);
                double minutes_lon = Math.Round(Lon4 / 6.0, 6);
                string Lon6 = degrees_lon.ToString() + Lon2 + minutes_lon.ToString(); ;
                GPGGA.Longitude = Lon6.Substring(0, 8);


In če vpišem v guglmaps sedaj:
string www = "http://maps.google.com/maps?q=" + GPGGA.Latitude+ "," + GPGGA.Longitude + "&sensor=false";
webBrowser1.Navigate(www);


Mi GPS pokaže točno kje se nahajam.
Asrock X99 Extreme 4 | Intel E5-2683V4 ES | 64GB DDR4 2400MHz ECC |
Samsung 250GB M.2 | Asus 1070 TI | 850W Antec | LC Tank Buster

Zgodovina sprememb…

Smurf ::

double minutes_lon = Math.Round(Lon4 / 6.0, 6);

Could be completly off, ampak a ne bi moral tukaj deliti z 60?

krneki0001 ::

Če pozorno prebereš prvi post sem iskal zadevo, da jo podam stricu guglu in njegovim mapam. Ja in podatki so pravilni, če deliš s 60, dobiš pravilen rezultat, seveda. Ampak po tem rezultatu je tebi lepša številka, google maps pa takega podatka ne zna razbrati.

Če deliš s 6 prideš do rezultata v obliki XX.XXXXX (8 znakov) za latitude in longitude. In v taki obliki potem google zna brati tvojo pozicijo v stavku:
"http://maps.google.com/maps?q=" + GPGGA.Latitude+ "," + GPGGA.Longitude + "&sensor=false"


Sprobano danes z GPS-om in vedno pokaže pravilno, kje se nahajaš.
Asrock X99 Extreme 4 | Intel E5-2683V4 ES | 64GB DDR4 2400MHz ECC |
Samsung 250GB M.2 | Asus 1070 TI | 850W Antec | LC Tank Buster

Smurf ::

To potem ni pravilen rezultat? https://maps.google.com/maps?q=46.06797...

krneki0001 ::

Za google maps očitno ne. Kje pa se nahajaš, da te je vrglo sredi travnika?

Mene je malo zraven tega travnika metalo, pa sem iz črnuč.
Asrock X99 Extreme 4 | Intel E5-2683V4 ES | 64GB DDR4 2400MHz ECC |
Samsung 250GB M.2 | Asus 1070 TI | 850W Antec | LC Tank Buster

Zgodovina sprememb…

Smurf ::

Uporabil sem tvoje podatke in delil z 60 namesto 6.

edit: pomoje bo bolje, ce tole pogledam potem, ko ne bom imel vec vrocine

Zgodovina sprememb…

  • spremenil: Smurf ()

krneki0001 ::

Ja, očitno smo vsi bolani, jaz sem testiral kar na poti k zdravniku in nazaj.
Asrock X99 Extreme 4 | Intel E5-2683V4 ES | 64GB DDR4 2400MHz ECC |
Samsung 250GB M.2 | Asus 1070 TI | 850W Antec | LC Tank Buster


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

C#, OBD2 in branje iz porta

Oddelek: Programiranje
191572 (1189) detroit
»

[PHP] Razdalja med dvema koordinatama

Oddelek: Programiranje
5734 (696) Roadkill
»

[C#] seštevanje vrednosti

Oddelek: Programiranje
71129 (1032) mihies
»

Koda kalkulatorja v MS visual C# 2008?

Oddelek: Programiranje
212970 (2307) smukC
»

c# regularni izraz

Oddelek: Programiranje
202011 (1709) darkolord

Več podobnih tem