Jump to content

Recommended Posts

Posted

Hey guys.

I was going through some old site code while doing a major recode and rebuild, when I found some code I used earlier on in the year that I want to tidy up and put out there for the community.

The story is that I was moving from far north-west queensland, australia to tasmania, australia. A roadtrip of about 4000 Km. I wanted to be able to post to my blog en-route and provide a map so that my family and friends could see where I was at.

The first thing was a simple little php script that logged into a pop3 mailbox and parsed a email into a blog post.

I also had a similar script that parsed and stored a gps location.

Being kinda poor, owning an old phone with no wap and sms' being so cheap, I found a free sms to email gateway.

This allowed me to post my blogs as well as update my location in a database.

The second piece of code took the gps points out of a route (from .... to ....) in a google maps kml file (the compressed file in a kmz file) and drew them using the image functions in php. I also drew some other kml files into the image to give me state borders, etc. I also drew some city points and names, giving a result something like this:

postimage24.jpg

Posted

its a bit of a mess mashup atm... i'll strip some email addresses and pwds and so on tonight and post teh code

update: first gen code:

Not sure if this is working, my host is down, i gotta install wamp and test it tonight

<?php


//function get coords
function getCoords($filename, $linebreak = true)
{
  

  // open kml file
$mapfile = file($filename);
$coordsindex = 0;
$nextline = false;

// step throught kml file and extract all coordinates
foreach ($mapfile as $line)
{
  if($nextline)
  {
    $thesepoints = explode(' ', $line);
    foreach ($thesepoints as $point)
    {
      
      $thesecoords = explode(',', $point);
      // convert to absolute values
      for($i=0;$i<count($thesecoords);$i++)
      {
        $thesecoords[$i] = abs($thesecoords[$i]);
      }
      
      // build coords array
      if(count($thesecoords) == 3)
      {
        $coords[$coordsindex] = $thesecoords;
        //print_r($thesecoords);
        //echo('<br />' . '/n');
        $coordsindex++;
      }
      
    }
    if($linebreak)
      {
      $coords[$coordsindex] = 'fred';
      $coordsindex++;
      }
  }

  if(strstr($line, '<coordinates>'))
  {
    $nextline = true;
  } else {
    $nextline = false;
  }
}
  
  return $coords;
  
}

// function drawRoute()
function drawRoute($coords, $map, $ratio, $latoffset, $lonoffset, $color, $points, $repair = false)
{
//echo('----<br />');
$longcolor = imagecolorallocate($map, 255, 0, 0);

// draw route
$previouspoint = $coords[0];
$point = 0;
$breakpoints = false;

foreach($coords as $currentpoint)
{

  if($currentpoint == 'fred')
  {
  $breakpoints = true;
  } else {
  if($breakpoints) { $previouspoint = $currentpoint; }
  $pointdistance = round(sqrt(((($ratio * ($currentpoint[0] + $latoffset))-($ratio * ($previouspoint[0] + $latoffset)))*(($ratio * ($currentpoint[0] + $latoffset))-($ratio * ($previouspoint[0] + $latoffset)))) + ((($ratio * ($currentpoint[1] + $lonoffset))-($ratio * ($previouspoint[1] + $lonoffset)))*(($ratio * ($currentpoint[1] + $lonoffset))-($ratio * ($previouspoint[1] + $lonoffset))))));
  if($pointdistance > 7 && (round($ratio * ($previouspoint[0] + $latoffset) != round($ratio * ($currentpoint[0] + $latoffset))) && (round($ratio * ($previouspoint[1] + $lonoffset)) != round($ratio * ($currentpoint[1] + $lonoffset)))))
  {
    if($repair) { $previouspoint = $currentpoint; }
  }
  if($point < $points) {
imageline($map, 
  round($ratio * ($previouspoint[0] + $latoffset)), 
  round($ratio * ($previouspoint[1] + $lonoffset)), 
  round($ratio * ($currentpoint[0] + $latoffset)), 
  round($ratio * ($currentpoint[1] + $lonoffset)), 
  $color);

  $point++;
  $breakpoints = false;

  }
  
  

  
  
  /*
  $pointdistance = round(sqrt(((($ratio * ($currentpoint[0] + $latoffset))-($ratio * ($previouspoint[0] + $latoffset)))*(($ratio * ($currentpoint[0] + $latoffset))-($ratio * ($previouspoint[0] + $latoffset)))) + ((($ratio * ($currentpoint[1] + $lonoffset))-($ratio * ($previouspoint[1] + $lonoffset)))*(($ratio * ($currentpoint[1] + $lonoffset))-($ratio * ($previouspoint[1] + $lonoffset))))));
  if($pointdistance > 7 && (round($ratio * ($previouspoint[0] + $latoffset) != round($ratio * ($currentpoint[0] + $latoffset))) && (round($ratio * ($previouspoint[1] + $lonoffset)) != round($ratio * ($currentpoint[1] + $lonoffset)))))
  {
    echo('Long point: ' . $pointdistance . '<br />');
    print_r($currentpoint);
    echo('<br />');
    print_r($previouspoint);
    echo('<br />(' . $point . '/' . count($coords) . ')<br />');
    imageline($map, 
  round($ratio * ($previouspoint[0] + $latoffset)), 
  round($ratio * ($previouspoint[1] + $lonoffset)), 
  round($ratio * ($currentpoint[0] + $latoffset)), 
  round($ratio * ($currentpoint[1] + $lonoffset)), 
  $longcolor);
  }
*/
  
    
  //debugging
  //if(!(round($ratio * ($previouspoint[0] + $latoffset)) < $width && round($ratio * ($previouspoint[0] + $latoffset)) > 1)) echo(' 1 ' . round($ratio * ($previouspoint[0] + $latoffset)) . '<br />');
  //if(!(round($ratio * ($previouspoint[1] + $lonoffset)) < $height && round($ratio * ($previouspoint[1] + $lonoffset)) > 1)) echo(' 2 ' . round($ratio * ($previouspoint[1] + $lonoffset)) . '<br />');
  //if(!(round($ratio * ($currentpoint[0] + $latoffset)) < $width && round($ratio * ($currentpoint[0] + $latoffset)) > 1)) echo(' 3 ' . round($ratio * ($currentpoint[0] + $latoffset)) . '<br />');
  //if(!(round($ratio * ($currentpoint[1] + $lonoffset)) < $height && round($ratio * ($currentpoint[1] + $lonoffset)) > 1)) echo(' 4 ' . round($ratio * ($currentpoint[1] + $lonoffset)) . '<br />');
  
  
  $previouspoint = $currentpoint;
}




}
}

    //function drawplaces
function drawplaces2($filename, $map,  $ratio, $latoffset, $lonoffset, $color)
{
  // open coma delimited file
$mapfile = file($filename);
$previousxposition = 0;
$previousyposition = 0;
$previousname = '';
// step throught kml file and extract all coordinates
foreach ($mapfile as $line)
{
  $datum = explode(',', $line);
  $place = $datum[0];
  $latitude = abs($datum[4]);
  $longitude = abs($datum[3]);
  $currentxposition = round($ratio * ($latitude + $latoffset));
  $currentyposition = round($ratio * ($longitude + $lonoffset));
  if((($currentxposition > $previousxposition) && ($currentxposition < ($previousxposition+(imagefontwidth(2)*strlen($previousname))))) && (($currentyposition > ($previousyposition-(imagefontheight(2)))) && ($currentyposition < ($previousyposition+(imagefontheight(2))))))
  {
    $overlapoffset = imagefontheight(2);
  }
  else
  {
    $overlapoffset = 0;
  }
  imagefilledellipse($map, round($ratio * ($latitude + $latoffset)), round($ratio * ($longitude + $lonoffset)), 8, 8, $color);
  imagestring($map, 2, round($ratio * ($latitude + $latoffset))+10, round($ratio * ($longitude + $lonoffset))+10+$overlapoffset, $place, $color);
  $previousxposition = $currentxposition;
  $previousyposition = $currentyposition;
  $previousname = $place;
}

  
}

// function colorPoints()
function colorPoints($coords, $map, $ratio, $latoffset, $lonoffset, $color, $points)
{

foreach($coords as $currentpoint)
{
    if($currentpoint != 'fred')
  {
  if($point < $points) {
  imagefill($map, 
  round($ratio * ($currentpoint[0] + $latoffset)), 
  round($ratio * ($currentpoint[1] + $lonoffset)), 
  $color);
  }
  $point++;
  
  }

}


}
  

// settings
$imagewidth = 500; $imageheight = 500;
$frames = 1;

// retrieve main route
$coords = getCoords($kmlfile);

// determine max and min lat and lon values
$minlat = 1000; $maxlat = -1000; $minlon = 1000; $maxlon = -1000;
foreach($coords as $gpscoord)
{
if($gpscoord != 'fred')
  {
  if($gpscoord[0] < $minlat) $minlat = $gpscoord[0];
  if($gpscoord[0] > $maxlat) $maxlat = $gpscoord[0];
  if($gpscoord[1] < $minlon) $minlon = $gpscoord[1];
  if($gpscoord[1] > $maxlon) $maxlon = $gpscoord[1];
  }
}
//echo('Minlat: ' . $minlat . '<br />');
//echo('Maxlat: ' . $maxlat . '<br />');
//echo('Minlon: ' . $minlon . '<br />');
//echo('Maxlon: ' . $maxlon . '<br />');

// determine total lat and lon range
$totlat = $maxlat - $minlat;
$totlon = $maxlon - $minlon;
//echo('Totlat: ' . $totlat . '<br />');
//echo('Totlon: ' . $totlon . '<br />');

// calculate ideal image ratio
$gpsratio = $totlat / $totlon;
if($gpsratio >= 4/3) $ratio = $imagewidth / ($totlat * 2);
if($gpsratio < 4/3) $ratio = $imageheight / ($totlon * 2);
//echo('Original Ratio (w/h): ' . $gpsratio . '<br />');
//echo('Ratio (pixels/degree): ' . $ratio . '<br />');

// determine image width and height
$width = round($ratio * $totlat * 2);
$height = round($ratio * $totlon * 2);
//echo('Width: ' . $width . '<br />');
//echo('Height: ' . $height . '<br />');

// determine offset constants
$latoffset = -($minlat) + ($totlat * 0.5) + ((($imagewidth - $width)/2)/$ratio);
$lonoffset = -($minlon) + ($totlon * 0.5) + ((($imageheight - $height)/2)/$ratio);
//echo('Lat Offset: ' . $latoffset . '<br />');
//echo('Lon Offset: ' . $lonoffset . '<br />');

// calculate points per frame
$pointsperframe = count($coords) / $frames;

// begin animation loop
for($frame = 0; $frame < $frames; $frame++)
{

// create image
$map = ImageCreateTrueColor($imagewidth, $imageheight);
$white = imagecolorallocate($map, 255, 255, 255);
$black = imagecolorallocate($map, 0, 0, 0);
$aabbcc = imagecolorallocate($map, 0xaa, 0xbb, 0xcc);
$aaccbb = imagecolorallocate($map, 0xaa, 0xcc, 0xbb);
$nnccbb = imagecolorallocate($map, 0x00, 0xcc, 0xbb);
$red = imagecolorallocate($map, 255, 0, 0);
imagefill($map, 0, 0, $white);
imagesetthickness($map, 3);

// draw states
$aus1 = getCoords('aus1.kml');
$aus2 = getCoords('aus2.kml');
$aus3 = getCoords('aus3.kml');
$aus4 = getCoords('aus4.kml');
$aus5 = getCoords('aus5.kml');
$aus6 = getCoords('aus6.kml');
$aus7 = getCoords('aus7.kml');
drawRoute($aus1, $map, $ratio, $latoffset, $lonoffset, $aabbcc, count($aus1));
drawRoute($aus2, $map, $ratio, $latoffset, $lonoffset, $aabbcc, count($aus2));
drawRoute($aus3, $map, $ratio, $latoffset, $lonoffset, $aabbcc, count($aus3));
drawRoute($aus4, $map, $ratio, $latoffset, $lonoffset, $aabbcc, count($aus4));
drawRoute($aus5, $map, $ratio, $latoffset, $lonoffset, $aabbcc, count($aus5));
drawRoute($aus6, $map, $ratio, $latoffset, $lonoffset, $aabbcc, count($aus6));
drawRoute($aus7, $map, $ratio, $latoffset, $lonoffset, $aabbcc, count($aus7));

// color map
//$states = getCoords('states.kml');
//colorPoints($states, $map, $ratio, $latoffset, $lonoffset, $nnccbb, count($states));

//draw places
drawplaces2($locationsfile, $map,  $ratio, $latoffset, $lonoffset, $black);

// draw main route
imagesetthickness($map, 4);
drawRoute($coords, $map, $ratio, $latoffset, $lonoffset, $aaccbb, ($pointsperframe*($frame+1)));


//draw places
drawplaces2($locationsfile, $map,  $ratio, $latoffset, $lonoffset, $black);


// fetch most recent position
//include('../includes/dbvars.php');
//mysql_connect($dbhost, $dbuser, $dbpassword);
//mysql_select_db($dbname);
//$posquerystring = 'SELECT * FROM `gpsposition` ORDER BY `time` DESC LIMIT 0 , 1';
//$posquery = mysql_query($posquerystring);
//$pos = mysql_fetch_assoc($posquery);
//print_r($pos);

// draw recent position

/*
imagesetthickness($map, 5);
imageellipse($map, round($ratio * ($pos['latitude'] + $latoffset)), round($ratio * ($pos['longitude'] + $lonoffset)), 15, 15, $red);
imageellipse($map, round($ratio * ($pos['latitude'] + $latoffset)), round($ratio * ($pos['longitude'] + $lonoffset)), 14, 14, $red);
imageellipse($map, round($ratio * ($pos['latitude'] + $latoffset)), round($ratio * ($pos['longitude'] + $lonoffset)), 13, 13, $red);
imageellipse($map, round($ratio * ($pos['latitude'] + $latoffset)), round($ratio * ($pos['longitude'] + $lonoffset)), 12, 12, $red);
imageellipse($map, round($ratio * ($pos['latitude'] + $latoffset)), round($ratio * ($pos['longitude'] + $lonoffset)), 11, 11, $red);
imageellipse($map, round($ratio * ($pos['latitude'] + $latoffset)), round($ratio * ($pos['longitude'] + $lonoffset)), 10, 10, $red);
imageellipse($map, round($ratio * ($pos['latitude'] + $latoffset)), round($ratio * ($pos['longitude'] + $lonoffset)), 9, 9, $red);
imageellipse($map, round($ratio * ($pos['latitude'] + $latoffset)), round($ratio * ($pos['longitude'] + $lonoffset)), 2, 2, $red);
imageellipse($map, round($ratio * ($pos['latitude'] + $latoffset)), round($ratio * ($pos['longitude'] + $lonoffset)), 3, 3, $red);
*/


// save image
imagejpeg($map, 'map' . $frame . '.jpg', 75);
header("Content-type: image/jpeg");
imagejpeg($map, NULL, 75);
imagedestroy($map);
$links[$frame] = '<img src="map' . $frame . '.jpg" /><br />';
//echo($frame . '<br />');

// end animation loop
}

// output links
//foreach ($links as $link)
//{
  //echo($link);
//}
?>

This was originally going to be used to draw a series of images with the route drawing through. The end result to be turned into video for home videos. This is a static, single frame version.

Posted

This is gonna take a bit longer than I had originally planned. I want to find a better way to extract the co-ordinates from the kml files.

Also trying to rewrite my blog code, so it might take a while

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...