[alg] lat/lon omrekenen naar pixel posities

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • EricBruggema
  • Registratie: Maart 2007
  • Laatst online: 23-08 11:22
Hallo allemaal,

Ik ben sinds een paar dagen druk bezig om de XML stream van buienradar om te zetten naar een afbeelding met weer gegevens zoals je dagelijks op het nieuws ziet.

In de stream van buienradar zie je per weer station de lat en longitude en deze wil ik in in een afbeelding verwerken. Het probleem is echter dat ik op een of andere manier niet de juiste posities kan uitrekenen op een kaart.

Voorbeeld van code, waar ik nu mee werk.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<?php

error_reporting(E_ALL); 

$feed = simplexml_load_file( 'http://xml.buienradar.nl' ); 

$arr = array();
foreach( $feed->weergegevens->actueel_weer->weerstations->weerstation as $station_temp ) 
{
    $arr[substr($station_temp->stationnaam, 12, strlen($station_temp->stationnaam) - 12)] = $station_temp;
} 

$im = imagecreatefrompng("nederland.png");

$im_t = imagecreatefrompng("round.png");

imagecopy($im,
         $im_t,
         imagesx($im) - (($arr['Groningen']->lat * 1000) / 2),
         imagesy($im) - (($arr['Groningen']->lon * 1000) / 105),
         0,    
         0,
         imagesx($im_t),
         imagesy($im_t));

imagecopy($im,
         $im_t,
         imagesx($im) - (($arr['Leeuwarden']->lat * 1000) / 2),
         imagesy($im) - (($arr['Leeuwarden']->lon * 1000) / 105),
         0,    
         0,
         imagesx($im_t),
         imagesy($im_t));

imagepng($im);

?>


Nu is de opzet helemaal bagger hoor, had eerst iets wat iets beter werkte maar toen ook stonden de dots niet op de plek waar ze horen.

Kan iemand mij vertellen hoe ik de juiste positie kan uitrekenen?

Voorbeeld van ongeveer posities op het plaatje!
code:
1
2
3
Groningen   = 53.08 / 6.35 = 61px / 490px
Leeuwarden = 53.13 / 5.46 = 61px / 380px
Vlissingen   = 51.27 / 3.36 = 447px / 90px


Voorbeeld plaatje: http://verkooppunten.vbn-..._cent/kaart_nederland.gif

Alvast bedankt voor jullie reacties! :)

Acties:
  • 0 Henk 'm!

  • Arnout
  • Registratie: December 2000
  • Laatst online: 15:29
Je kunt niet zomaar lat/lon op een kaartje projecteren. Daarvoor zul je moeten omrekenen met een projectiemethode. Ik heb voor wap.buienradar.nl dit gebruikt: http://trac.osgeo.org/proj/

Onder debian is dat gewoon apt-get install proj.

Acties:
  • 0 Henk 'm!

  • steffex
  • Registratie: Augustus 2003
  • Laatst online: 12-08 00:24
lat/long -> x/y conversion is denk ik wat je zoekt...

Hoeveel heb je geprobeerd te googlen?

[ Voor 27% gewijzigd door steffex op 09-06-2010 13:37 ]


Acties:
  • 0 Henk 'm!

  • Laurens-R
  • Registratie: December 2002
  • Laatst online: 29-12-2024
stef-o schreef op woensdag 09 juni 2010 @ 13:34:
lat/long -> x/y conversion is denk ik wat je zoekt...
Zoals arnout zegt is dat niet zo simpel. Je hebt met projectie te maken; je hebt namelijk te maken met het feit dat onze aarde rond (doch niet perfect rond) is. Plekken die vanuit jouw kijkpunt wat meer bovenop de sphere liggen hebben minder pixels per meter dan een plek die op het midden voor op de sphere liggen.

Om dat effect te corrigeren gebruiken we projectie, om zodoende een normale platte kaart te krijgen van het punt dat we willen hebben.

Voor het gemak kan je uitgaan van een perfecte cirkel; hoe verder je inzoomed op je kaart des te minder je last hebt van de afwijkingen in het aard oppervlak. Wellicht als je een afstand gaat berekenen die over meerdere landen loopt dat je afwijking een beetje begint op te vallen.

[ Voor 30% gewijzigd door Laurens-R op 09-06-2010 13:42 ]


Acties:
  • 0 Henk 'm!

  • EricBruggema
  • Registratie: Maart 2007
  • Laatst online: 23-08 11:22
Jammer, ik had gehoopt dat er een gemakkelijke manier was om deze punten op de kaart zichtbaar te maken zonder alteveel poespas. En natuurlijk heb ik mijn grote vriend google gebruikt maar bracht mij weinig nuttigs (andere zoektermen).

Denk dat ik zelf de posities maar hardcoded in mijn script ga zetten, scheelt een hoop script werk.

Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 10:43

Matis

Rubber Rocket

Ik weet niet hoeveel zin/tijd je hebt om de tools aan te passen, maar misschien is het een idee om Google Maps te gebruiken omdat je daar wel met lat- en longitudinale getallen kunt werken. Zie ook: http://www.buienradar.nl/iagmp.aspx

Daarnaast staat hier nog een voorbeeldje hoe je kunt terugrekenen van lan/lon naar pixels

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

  • urk_forever
  • Registratie: Juni 2001
  • Laatst online: 16:10
EricBruggema schreef op woensdag 09 juni 2010 @ 14:22:
Jammer, ik had gehoopt dat er een gemakkelijke manier was om deze punten op de kaart zichtbaar te maken zonder alteveel poespas. En natuurlijk heb ik mijn grote vriend google gebruikt maar bracht mij weinig nuttigs (andere zoektermen).

Denk dat ik zelf de posities maar hardcoded in mijn script ga zetten, scheelt een hoop script werk.
Wat je nog kan proberen is je lat/lon (WGS84) coördinaten naar RD (Rijksdriehoek) coördinaten. RD coördinaten zijn namelijk wel projectie coordinaten op een plat vlak. Dat is makkelijker over te zetten naar coordinaten op een plaatje.

Hier een voorbeeld omreken programma

[ Voor 5% gewijzigd door urk_forever op 10-06-2010 21:21 ]

Hail to the king baby!


Acties:
  • 0 Henk 'm!

  • GrooV
  • Registratie: September 2004
  • Laatst online: 16-09 16:01
Volgens mij heeft de buienradar XML een vast aantal meetpunten, waarom zet je deze niet zelf gewoon op de kaart :P

Zowieso klopt de kaart die jij wil gebruiken ook niet, dit soort dingen werkt alleen goed als je zelf ook de kaart tekent of in beheer hebt. Daarnaast moet je de lat/long met Mercator projectie tekenen

Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Dit draadje doet me denken aan Polynomial transformation / Georeferencing - de wiskunde!?
Arnout schreef op woensdag 09 juni 2010 @ 13:30:
Je kunt niet zomaar lat/lon op een kaartje projecteren. Daarvoor zul je moeten omrekenen met een projectiemethode. Ik heb voor wap.buienradar.nl dit gebruikt: http://trac.osgeo.org/proj/
Veel dank voor die site, gebruik hem wel eens (kleine mobiels for the win ;)). Enkel welke projectie is het, want het is blijkbaar geen mercator?
GrooV schreef op donderdag 10 juni 2010 @ 21:33:
Zowieso klopt de kaart die jij wil gebruiken ook niet
Ik zou inderdaad een andere kaart gebruiken, want de kaart in TS ziet er niet uit, en is in ieder geval niet op schaal. :p

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • Arnout
  • Registratie: December 2000
  • Laatst online: 15:29
pedorus schreef op donderdag 10 juni 2010 @ 22:20:
Dit draadje doet me denken aan Polynomial transformation / Georeferencing - de wiskunde!?

[...]

Veel dank voor die site, gebruik hem wel eens (kleine mobiels for the win ;)). Enkel welke projectie is het, want het is blijkbaar geen mercator?
Het plaatje heb ik gewoon van de buienradar site gehaald, ik gebruik projectie enkel om een postcode om te zetten naar een positie op de kaart.
Ben het zowat alweer vergeten, maar volgens mij was het Rijksdriehoek.

Ik gebruik deze aanroep van proj:

PHP:
1
2
        $coord = shell_exec('echo ' . $pos_y . '\n' . $pos_x . '| proj -r +proj=stere +x_0=0 +y_0=0 +lat_0=90 +lon_0=0 +lat_ts=60 +a=6378.137 +b=6356.752');            
        $coord = explode('  ',$coord);

Acties:
  • 0 Henk 'm!

  • EricBruggema
  • Registratie: Maart 2007
  • Laatst online: 23-08 11:22
Ik heb naar alle bronnen gekeken maar kan er helaas niet veel wijs uit worden, mijn wiskunde skills zijn dan ook niet erg hoog zeg maar. Helaas heb ik geen mogelijkheid tot het draaien van proj aangezien ik geen linux/unix draai maar nog steeds plain old winxp...

Hier ben ik trouwens nog mee aan't spelen maar snap de bedoeling niet geheel..

$distance=3963.0 * acos(sin($lat1/57.2958) * sin($lat2/57.2958) + cos($lat1/57.2958) * cos($lat2/57.2958) * cos($lon2/57.2958 - $lon1/57.2958));

Maar we gaan gewoon even door met spelen, maar als iemand meer uitleg kan geven! graag!

Acties:
  • 0 Henk 'm!

  • Stukfruit
  • Registratie: Oktober 2007
  • Niet online
EricBruggema schreef op zaterdag 12 juni 2010 @ 07:42:
Helaas heb ik geen mogelijkheid tot het draaien van proj aangezien ik geen linux/unix draai maar nog steeds plain old winxp...
Hoe kom je er bij dat je daar Linux voor nodighebt?

Dat zit wel Schnorr.


Acties:
  • 0 Henk 'm!

  • EricBruggema
  • Registratie: Maart 2007
  • Laatst online: 23-08 11:22
Klopt, je hebt gelijk; heb er helemaal overheen gekeken! zal nu eens kijken hoe ik dit kan inbouwen.

Acties:
  • 0 Henk 'm!

  • kunnen
  • Registratie: Februari 2004
  • Niet online
Iets dat ik nog ergens had liggen (voor gebruik met Google Maps), geen idee of het correct en/of bruikbaar is:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php

//Y should be between -Pi and Pi. Latitude should be between -85.05112878 and 85.05112878.
  function convert_from_longitude($lon) {
    return $lon*pi()/180;
  }
  function convert_to_longitude($x) {
    return $x/pi()*180;
  }
  function convert_from_latitude($lat) {
    return log((1+sin($lat*pi()/180))/(1-sin($lat*pi()/180)))/2;
  }

  function convert_to_latitude($y) {
    return (180/pi())*asin( (exp(2*$y)-1)/(exp(2*$y)+1) );
  }

?>

[ Voor 3% gewijzigd door kunnen op 13-06-2010 01:14 ]


Acties:
  • 0 Henk 'm!

  • UltimateB
  • Registratie: April 2003
  • Niet online

UltimateB

Pomdiedom

@ThomasB: De aarde is niet rond :)

Maar voor een kleine afstand als nederland kan je best de lat/long verdelen van de uiteinden van nederland en dan everedig versprijden over het plaatje.

"True skill is when luck becomes a habit"
SWIS


Acties:
  • 0 Henk 'm!

  • Tjeemp
  • Registratie: Januari 2005
  • Laatst online: 03-01-2015

Tjeemp

BEER N TEA

Kun je hier niet gewoon Google Maps voor gebruiken met bijbehorende API's? Dan kun je gewoon coördinaten aangeven waar je je item wilt hebben volgens mij, Google doet de positionering / projectie op de kaart.

Ik weet niet zeker of dat een beetje aansluit op wat je zoekt, maar het zou een idee kunnen zijn. Heb er zelf nog niet uitgebreid mee gewerkt, dus weet niet in hoeverre je de vrijheid hebt om dingen te kunnen projecteren. Maar misschien bestaat er ook de mogelijkheid om alleen delen van de API te gebruiken en verder zelf aan te vullen.

www.timovanderzanden.nl | Beer 'n' Tea


Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 10:43

Matis

Rubber Rocket

Tjeemp schreef op zondag 13 juni 2010 @ 02:17:
Kun je hier niet gewoon Google Maps voor gebruiken met bijbehorende API's? Dan kun je gewoon coördinaten aangeven waar je je item wilt hebben volgens mij, Google doet de positionering / projectie op de kaart.

Ik weet niet zeker of dat een beetje aansluit op wat je zoekt, maar het zou een idee kunnen zijn. Heb er zelf nog niet uitgebreid mee gewerkt, dus weet niet in hoeverre je de vrijheid hebt om dingen te kunnen projecteren. Maar misschien bestaat er ook de mogelijkheid om alleen delen van de API te gebruiken en verder zelf aan te vullen.
Zoiets bedoel je :P
http://toaomatis.mine.nu/weather/index2.php

Ik heb zelf al lopen hobby-bobben en het is nog lang niet af, maar het werkt zeer eenvoudig. Je hoeft niet meer te gaan rekenen met coordinaten en pixels etc, maar je kunt gewoon de gegevens aan Google Maps Api geven, die dan op zijn beurt de punten weer goed op de kaart legt.

Het jammere is alleen, dat de Geolocaties van Buienrardar, maar op 1 decimaal achter de komma nouwkeurig zijn, waardoor de punten waaaardeloos geplaatst worden. Het weerstation in Rotterdam wordt zelfs ergens halverwege Goeree Overflakkee geplaats. En Gilze-Rijen wordt richting Turnhout geplaats als je van de Geolocaties van Buienradar uitgaat.
Daarvoor heb ik ook nog een functie geschreven, welke op zijn beurt weer de exacte locatie opvraag met behulp van de Geolocator van Google Maps.

Dat geeft een iets nauwkeurigere plaatsing, maar één station (wat normaal in Scharendijke ligt) pleurt ie nu in Noord-Duitsland neer :P

If money talks then I'm a mime
If time is money then I'm out of time

Pagina: 1