This article is a brief note on doing the reverse of the
functions described in Article 1. The first article
showed how to plot a longitude and latitude coordinate on a map of the world.
Part 3 explains how to calculate out what longitude and latitude someone was after
when they click on the same map.
Article 1 introduced us to the getlocationcoords
function, which was designed to retrieve screen coordinates for a cylindrical
projection of the world. The reverse of this function is
function getlocationcoords_inv($x,$y, $width,
$height)
{
$lat = ((($y / $height) * 180) - 90) * -1;
$lon =(($x / $width) * 360) - 180;
return array($lat,$lon);
}
This function returns longitude and latitude from screen coordinates.
Annoyingly as simple as that.
To examine what there is of it a little further - $x
and $y are the screen coordinates, $width
and $height store the height and width of the source
image.
Remember that in this instance we assume the map is a COMPLETE
map of the world ( as below ), not a part of it.
So lets put this into a little bit of code.
All we are going to do is create a HTML form and set our world
map as an image map. When you click the map, your browser will POST the coordinates
clicked back to our script. The coordinates are passed in ${image_name}_x
and ${image_name}_y - image_name being
defined by the name="image_name" tag within the <input>
markup. We then simply parse the 2 coordinates through getlocationcoords_inv,
along with the width and height of the image. Along with most of the examples
on this site, we assume for the sake of simplicity that register_globals is on.
The code, along with the other HTML needed, in its most basic
form is:
<?php
if(getenv("REQUEST_METHOD")=="POST")
{
$width = 310;
$height = 155;
$values = getlocationcoords_inv($map_x,$map_y, $width,$height);
}
?>
<html>
<form name="form1" method="post" action="">
<input name="map"
type="image"
id="map"
src="../maps/earth_310.jpg">
</form>
Longitude:<?php print($values[1]);?>
<br>
Latitude:<?php print($values[0]);?>
</html>
And thats it! See the working example at the end of this article.
Summary
This piece of code may be small, but it is perfectly formed. The simplicity
is such that integrating it with some of the other examples on this site will
allow you to create some seemingly complex applications.
You can plot major cities using the code from article
1, calculate objects within a certain distance from that
town, display the coordinates in Degree, Minutes and
Seconds and so much more, all with 50 lines of code.
The code can also be converted to Java ( I know, I've done it ) .. allowing
for dynamic display of coordinates.
|