Avatar billede puddelundercover Nybegynder
01. februar 2007 - 13:08 Der er 19 kommentarer og
2 løsninger

Længde/breddegrader plottet på kort

Hej eksperter,

Jeg har en spas lille opgave:

Jeg har et kort (3858 x 4346 px), hvor jeg kender længde- og breddegrader på øverste venstre og nederste højre hjørne. (Det er ikke et verdenskort, men et udsnit)

Jeg har nu en længde- og breddegrad, som skal plottes ind på kortet.

Det jeg altså skal er at regne top og venstre pixels offset ud på mit koordinat.

Er der nogen der har en god idé?

Med venlig hilsen
Magnus
Avatar billede zynzz Praktikant
01. februar 2007 - 13:42 #1
Avatar billede puddelundercover Nybegynder
01. februar 2007 - 13:45 #2
Der står ikke meget om længde- og breddegrader i dén artikel ;-)
Avatar billede dmdisco Nybegynder
01. februar 2007 - 15:02 #3
jeg lavede dette for en del tid siden men det virker vidst ikke hvis der kommer for mange punkter

<?php
// create the image
$result = mysql_query("SELECT * FROM status WHERE latitude != 'NA' OR longitude != 'NA' GROUP BY latitude, longitude") or die(mysql_error());
header("Content-type: image/png");
$img    = imagecreatefromgif("globe3t.gif");

while ($row = mysql_fetch_assoc($result)) {
    if ($row['longitude'] != "" && $row['longitude'] != "NA" && $row['latitude'] != "" && $row['latitude'] != "NA") {
        $x = round(($row['longitude']+180)*2, 0);
        $y = round((180-($row['latitude']+90))*2, 0);
        //imagesetpixel($img, $x, $y, $red);
        $hitArray[] = $x."|".$y;
    }
}
$hitArray = array_count_values($hitArray);
arsort($hitArray);

foreach ($hitArray as $key => $amount) {
    //imagesetpixel($img, $x, $y, $red);
    list($x, $y) = explode("|", $key);
    $hit[] = array('x' => $x, 'y' => $y, 'amount' => $amount);
}

// color scale
$color1 = imagecolorallocate($img, 212, 0, 0);
$color2 = imagecolorallocate($img, 255, 42, 0);
$color3 = imagecolorallocate($img, 255, 85, 0);
$color4 = imagecolorallocate($img, 255, 127, 0);
$color5 = imagecolorallocate($img, 255, 170, 0);
$color6 = imagecolorallocate($img, 255, 212, 0);
$color7 = imagecolorallocate($img, 255, 255, 0);

$level = ceil($hit[0]['amount']/7);
foreach ($hit as $key => $value) {
    //imagesetpixel($img, $hit[$key]['x'], $hit[$key]['y'], $color[ceil($hit[$key]['amount']/$level)]);
    imagesetpixel($img, $hit[$key]['x'], $hit[$key]['y'], $color7);
    imagesetpixel($img, $hit[$key]['x']+1, $hit[$key]['y'], $color7);
    imagesetpixel($img, $hit[$key]['x']+1, $hit[$key]['y']+1, $color7);
    imagesetpixel($img, $hit[$key]['x'], $hit[$key]['y']+1, $color7);
    //print "\$color[".ceil($hit[$key]['amount']/$level)."]";
}

imagepng($img);
imagedestroy($img);
?>
billedet kan du hente her http://www.freno.dk/eksperten/globe3t.gif
Avatar billede dmdisco Nybegynder
01. februar 2007 - 15:05 #4
kan faktisk ikke huske om jeg fik det til at virke med den color scale jeg havde begyndt at lave som sagt er det et stykke tid siden, men du kan vel bruge det som en start.

jeg hentede lat/long fra http://www.hostip.info/
Avatar billede puddelundercover Nybegynder
01. februar 2007 - 15:16 #5
Hej dmdisco - tak for dit svar ;-)
Idéen i scriptet er god, men problemet er, at dit script er ment på et kort over hele verden - et kort som tager udgangspunkt i 0.000000

Mit kort starter ved La 58.084048 Lo 7.88475 og slutter ved Lo: 13.181534 La: 54.483204

Min idé var måske, at man kunne tage det punkt man ville indsætte, og ligesom nulstille det til mit kort ved at trække kortets startpunkt fra. Så skal man bare finde offsettet ved en eller anden procentmæssig udregning af forholdet mellem kortets start og slutpunkt kontra verdenskortets ditto.

Men hvordan... *glub* dét...
Avatar billede dmdisco Nybegynder
01. februar 2007 - 15:21 #6
jamen det er jo sådanset bare et spørgsmål om matematik (hvilket ikke lige er min stærke side) og burde ikke være noget problem

i mit eksempel var problemet at 0,0 var i midten af billedet men at billedets 0,0 var oppe i højre hjørne men det burde jo så ikek være noget problem for dig
Avatar billede puddelundercover Nybegynder
01. februar 2007 - 15:25 #7
Ja, jeg kan godt se hvad du mener... Puh, jeg tror jeg må sætte mig ned med en kop the og tænke godt og grundigt ;-)
Avatar billede puddelundercover Nybegynder
01. februar 2007 - 19:21 #8
Godt så - Nu er jeg nået et stykke af vejen.
Nu er der opstået et sært problem, som jeg ikke helt kan regne ud hvad skyldes.

Jo længere nord på mit koordinat er, jo større misvisning får jeg i top-offset (left-offset fungerer fint). Kan det have noget med jordens krumning at gøre?

Jeg prøver at korrigere for det, ved procentmæssigt at udregne differencen mellem den største og mindste difference - men, det er åbenbart ikke lineært... Prøv det selv:

http://baadinfo.dk/lola.php

Her er nogle koordinater at lege med:

Skagens spids:
Lo: 10.647125
La: 57.743748

Roskilde:
Lo: 12.091141
La: 55.640593

Nakskov:
Lo: 12.091141
La: 55.640593

Vejle:
Lo: 9.536476
La: 55.707772

Løkken:
Lo: 9.726677
La: 57.380047

(Den henter et stort kort (ca. 1 mb), og sætter en lille rød plet på kortet)

mit script ser sådan her ud:

// Kortetes øverste venstre koordinater
$mlo = 13.181534;
$mla = 58.084048;

// Kortetes mål i decimaler
$mapHeight = 3.600844;
$mapWidth = 5.296784;

// Kortets mål i pixels
$mapPixHeight = 4346;
$mapPixWidth = 3858;

$krumning = 230;

// Poi
$lo = $_POST['lo'];
$la = $_POST['la'];

//Venstre offset
$loPerc = ( (($mlo-$lo) / $mapWidth) * 100 );
// LEFT offset:
$loPl = $mapPixWidth - (( $mapPixWidth / 100 ) * $loPerc);

$laPerc = ( (($mla-$la) / $mapHeight) * 100 );
$laPl = ( $mapPixHeight / 100 ) * $laPerc;

// Korrigerer for fejlen
$krumSub = ($krumning / 100) * (100-$laPerc);
// TOP offset:
$laPl = $laPl - $krumSub;

Håber det giver mening for nogen? :-)
Avatar billede puddelundercover Nybegynder
01. februar 2007 - 19:23 #9
hov.. ud over stavefejlen er følgende galt

// Kortetes øverste venstre koordinater
$mlo = 13.181534;
$mla = 58.084048;

$mlo er ikke kortets øverste venstre, men kortets nederste højre koordinat
Avatar billede puddelundercover Nybegynder
02. februar 2007 - 12:52 #10
Stedet elev pointerede så fint i dag, at det måske er kortets proportioner den er gal med - det må selvfølgelig undersøges, selvom det er et teleatlas-kort...
Avatar billede puddelundercover Nybegynder
02. februar 2007 - 12:53 #11
* Stedets
Avatar billede puddelundercover Nybegynder
02. februar 2007 - 13:00 #12
Forøvrigt har IE vist nogle problemer med at vise kortet, men det funker i Firefox
Avatar billede dmdisco Nybegynder
02. februar 2007 - 13:15 #13
jeg kunne fint se det og ja der kan selvfølgelig sagtens være problemer med selve kortet, men hvor meget kan krumningen spille ind når du har så stort et kort.

desværre kan jeg ikke hjælpe med meget med udregningerne da jeg ikke har tiden til at sætte mig ind i det hele :( men jeg kan prøve at hjælpe med små stykker kode hvis det skulle blive et problem

men jeg kan godt se at der er et problem Vejle la55.7167 lo9.53333 rammer fint men Lyngby la55.6667 lo11.95 rammer helt ved siden af og iøvrigt vil du også skulle lave et check på om de indtastede bredde/længde grader er ved bornholm da den ikke sidder helt hvor den skal på dit kort :)
Avatar billede dmdisco Nybegynder
02. februar 2007 - 13:16 #14
p.s IE6 viser det helt fint her
Avatar billede puddelundercover Nybegynder
02. februar 2007 - 13:26 #15
Hehe ja, bornholm er en helt anden historie, men den skal jeg nok få på plads når det andet fungerer (det er jo så langt væk at man sagtens kan regne det ud på l/b graden at det er bornholm).

Mht. Lyngby, så er dine koordinater lidt galt på den - faktisk plotter mit kort præcis samme punkt som MapQuest:
http://www.mapquest.com/maps/map.adp?searchtype=address&formtype=latlong&latlongtype=decimal&latitude=55.6667&longitude=11.950000

I følge Yahoo Maps er koordinaterne til Lyngby Taarbæk La: 55.788157 Lo: 12.467079, og det rammer den sådan set ok - men man kan godt se at misvisningen allerede er begyndt dér
Avatar billede puddelundercover Nybegynder
02. februar 2007 - 13:39 #16
... Men når jeg nu kigger efter, så er der ret stor forskel på proportionerne mellem mit kort og MapQuests - Mon ikke det er derfor at punkterne bliver skæve i højden? Punkterne på mit kort bliver sat fra hhv. venstre og bund, så hvis kortet er trukket for meget ud i højden i forhold til virkeligheden, så er det vel dér fejlen ligger - Punkterne i bunden af kortet passer jo, men i toppen er den gal.. bum.. Så ska jeg til at lave et nyt kort
Avatar billede dmdisco Nybegynder
02. februar 2007 - 15:15 #17
ja selvfølgelig vil det jo have en betydning men den burde jo være til at teste ved at skifte kortet ud og er fejlen der så enten lave dit kort om eller tage højde for det ved udregningerne.

og ja lyngby koordinaterne kan sagtens være forkerte :) har faktisk aldrig verificeret dem.

nu ved jeg ikke hvad du skal bruge det til men har du overvejet at bruge google map (http://maps.google.com/support/) kan jo være at du kan bruge det til noget
Avatar billede puddelundercover Nybegynder
02. februar 2007 - 16:16 #18
Jeg har bestemt tænkt på at bruge Google Map - Det ville jo gøre det hele meget lettere - Men kortet skal integreres dybere i et system, og der kommer over 1000 punkter på.

Jeg har prøvet at presse kortet sammen, men det har ikke den ønskede effekt... Så jeg må nok bare leve med en hardcoded fejlrettelsesfunktion.
Avatar billede puddelundercover Nybegynder
14. februar 2007 - 10:14 #19
Duu, disco? vil du have nogle points for din indsats? ;)
Avatar billede dmdisco Nybegynder
14. februar 2007 - 10:58 #20
ja men jeg kom jo ikke med nogen brugbar løsning for dig
Avatar billede puddelundercover Nybegynder
14. februar 2007 - 11:03 #21
Nah, men... Så deler vi ;)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester