webForumDet fria alternativet

GIS-programmeringsproblem

7 svar · 390 visningar · startad av lillebror

lillebrorMedlem sedan apr. 20041 597 inlägg
#1

Hej,

Jag håller på och försöker lära mig hur man plottar geografiska koordinater på en världskarta. Nu har jag testat ett färdigt exempel där man utgår från en världskarta (i form av en bild) som man sedan sätter ut en fördefinierad punkt på. Så långt fungerar allting. Nu försöker jag komma underfund med hur jag ska modifiera funktionen när jag enbart har en bildsektion som täcker Sverige.

Hela koden jag använder mig av ser ut så här:

<?php

// These are the coordinates the location we wish to plot.<br> // These are being passed in the URL, but we will set them to a 
// default if nothing is passed.

if(empty($long))$long = 17.058678;
if(empty($lat)) $lat = 57.267256;

// First we load the background/base map. We assume it's located in same dir

// as the script.
// This can be any format but we are using JPG in this example // We will also allocate the color for the marker 

$im = imagecreatefromjpeg("earth_310.jpg");
$red = imagecolorallocate ($im, 255,0,0);

// Next need to find the base image size.
// We need these variables to be able scale the long/lat coordinates.

$scale_x = imagesx($im);
$scale_y = imagesy($im); 

$pt = getlocationcoords($lat, $long, $scale_x, $scale_y);

// Now mark the point on the map using a red 4 pixel rectangle 

imagefilledrectangle($im,$pt["x"]-3,$pt["y"]-3,$pt["x"]+3,$pt["y"]+3,$red);
#imagestring($im,2,1,$scale_y-20,"Courtesy of www.staycanada.ca",$red);

// Return the map image. We are using a PNG format as it gives better final image quality than a JPG
header("Content-Type: image/png");
imagepng($im);
imagedestroy($im);

function getlocationcoords($lat, $lon, $width, $height)
{  
    $x = (($lon + 180) * ($width / 360));
    $y = ((($lat * -1) + 90) * ($height / 180));
    return array("x"=>round($x),"y"=>round($y));
}
// Now we convert the long/lat coordinates into screen coordinates
?>

Funktionen jag anser mig behöva ända på är följande:

function getlocationcoords($lat, $lon, $width, $height)
{  
    $x = (($lon + [B]180[/B]) * ($width / [B]360[/B]));
    $y = ((($lat * -1) + [B]90[/B]) * ($height / [B]180[/B]));
    return array("x"=>round($x),"y"=>round($y));
}

Så här långt har jag lyckats förstå att man anger storleken på kartbilden (denna funktion utgår ifrån att du visar hela världskartan i form av en cylindrisk projektion liknande den bifogade bilden till vänster) samt koordinaten för den punkt man vill ange i decimalform. Dimensionen i X-led delas med 360 som är antal grader runt jordklotet medan dimensionen i Y-led delas med 180 grader (från sydpolen till nordpolen). Vidare tycker jag mig se ett samband att 360 halveras till 180 och att 180 har halverats till 90.

Den andra kartan jag bifogat som jag nu vill använda mig av är 7 grader bred och 15 grader i höjdled. Dessa världen har jag försökt stoppa in i stället för 360 och 180 som $width och $height ska delas med.

Har ännu inte fått det att fungera. Tar gärna emot tips! :)

earth_310.jpgrelimap.jpg
lillebrorMedlem sedan apr. 20041 597 inlägg
#2

När jag använder denna karta så ritas punkten på Öland ut på rätt sätt...

map.png
lillebrorMedlem sedan apr. 20041 597 inlägg
#3

Nu har jag lyckats få lite rätsida på mina problem. Har kommit en bit på väg och nu lyckats få ut en koordinat på Sverigekartan som stämmer någorlunda överrens med verkligheten. Dock får jag inte kartan (bildens) geografiska hörn att helt och hållet stämma överrens med de i kartatlasen för just nu hamnar min angivna koordinat en aningen fel.

Jag har angett en koordinat för ölands norra udde som i decimalform är:

long = 16.250000
lat = 63.833333

Enligt den bifogade bildfilen hamnar nu punkten (den röda) på den sydvästra sidan av Gotland. Jag har i en kartbok mätt ut MAX och MIN värden för longitud respektive latitud för min bild och angett det i min funktion så att den vet vilken yta som den har att spela med.

Så här ser funktionen ut så här långt:

function latlon_to_pix($lat,$lon, $width, $height) {
	$lat = abs($lat);
	$lon = abs($lon);

	$x_min   = 0;  $x_max   = $width;
	$y_min   = 0;  $y_max   = $height;
	$lon_min = 12.416667; $lon_max = 18;
	$lat_min = 61.516667; $lat_max = 77.183333;

	$x = $x_min + ($x_max - $x_min) * 
		( ($lon - $lon_min) / ($lon_max - $lon_min) );
	$y = $y_max - ($y_max - $y_min) * 
		(($lat - $lat_min) / ($lat_max - $lat_min) );

	return array("x"=>round($x),"y"=>round($y));
}

Får klura vidare lite men tänkte bara berätta hur långt jag kommit om det är någon som håller på med något liknande! :e

sweden.png
UlfTMedlem sedan maj 20018 027 inlägg
#4

Tittar jag i min kartbok, får jag det till att lon_min borde vara ungefär 11 grader.

lillebrorMedlem sedan apr. 20041 597 inlägg
#5

Stämmer inte riktigt när jag matar in 11 grader i funktionen. Jag får lon_min till 12 grader 25 minuter OST. Var får du lon_max till?

UlfTMedlem sedan maj 20018 027 inlägg
#6

Lon_max får jag till 22 grader, på ett ungefär.

Lat_min = 55,5 grader
Lat_max = runt 67-68 grader

Med andra ord helt andra värden än de du har kommit fram till. Jag antar att du borde ta de longituder/latituder som faktiskt gäller för kartans yttre begränsningar. Det är i vart fall så jag har gjort när jag har skattat dessa gränser. Kolla i en kartbok där de har angett longituder/latituder, så får du se.

lillebrorMedlem sedan apr. 20041 597 inlägg
#7

Jag har kollat i Motormännens vägatlas och tagit värdena därifrån och konverterat till decimalform. Konstigt att jag inte fick det att stämma tidigare jämfört med de värden du kom fram till.

Dessa värden använder jag nu:

$lon_min = 10.415; $lon_max = 22.17;
$lat_min = 55.337; $lat_max = 68.6;

Följande punkter har jag utgått ifrån för att definiera kartans olika sidor.

lat_min = smygehuk
lat_max = treriksröset
lon_min = strömstad
lon_max = luleå

Dessa värden fick jag fram från susning.nu. Sedan sökte jag på Norrköping exempelvis och angav den som en punkt. Efter det ändrade jag på dessa ovan nämnda värden tills punkten befann sig exakt där Norrköping skall vara. Detta måste väl vara en gångbar metod för att kalibrera? Det stämnde hyffsat bra när jag angav andra städer med geografiska värden från susning.nu. Felkällan här är nog att jag inte kan bestämma kartans lat_max eftersom det är svårt att avgöra exakt var den punkten är i en riktig kartatlas.

Om jag köper kartmaterial från Latmäteriverket utgår jag ifrån att jag får exakta koordinater för kartans alla olika hörn så att jag kan malla in den rätt?!

UlfTMedlem sedan maj 20018 027 inlägg
#8

lillebror skrev:

Om jag köper kartmaterial från Latmäteriverket utgår jag ifrån att jag får exakta koordinater för kartans alla olika hörn så att jag kan malla in den rätt?!

Det beror på vad för slags kartmaterial du köper. En del kartor är i vektorform. Då har alla detaljer koordinater satta på sig. En del andra kartor är i rasterform. Då brukar man få med en tillhörande fil som innehåller koordinaterna för ett av hörnen, samt storleken på en pixel, utifrån vilken man sedan kan beräkna de andra koordinaterna. Var beredd på att koordinaterna kan ges i RT90-systemet. Då är det bara att glömma longitud och latitud.

136 ms totalt · 3 externa anrop · v20260731065814-full.2b84b982
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
133 ms — hämta tråd, inlägg och bilagor (db)