xearth and path cross¶
As a final comment in the geolocation and path cross entry I wrote:
If you think of any good uses forupoints
, drop me a mail. Cool new uses with attached patches are even better!
The first chunk of feedback I received was from a co-worker, Kelly
Turner, who asked how difficult it would be to use upoints
with
xearth’s marker files. The answer is not too difficult, not too
difficult at all.
As a little background the reason for wanting access to the data in marker files is that our internal contact database allows us to export a file containing a subset of our contact’s known current locations [1]. The original reasoning behind the feature was to allow simple visualisation of a team’s members, for example to quickly locate somebody who is close to a customer’s site.
I’ve reworked the original edist.py
script in to something a little
more generic, and it also now includes a new module,
xearth
, that can import locations from an xearth marker
file. Unfortunately, I can’t use an example generated from our system
because I don’t have permission to publish the data but I’ll give an
example of its usage with a public file:
>>> from upoints import xearth
>>> earth_markers = urllib.urlopen("http://xplanet.sourceforge.net/Extras/earth-markers-schaumann")
>>> markers = xearth.Xearths(earth_markers)
>>> print(repr(markers['Cairo']))
Xearth(30.05, 31.25, 'Egypt')
>>> print(markers['Warsaw'])
Poland (N52.250°; E021.000°)
There are plenty of comments in the xearth
file, but
what you get from the Xearths
is a dictionary
with the location name as a key, and value consisting of a tuple of
a Point
object and any associated comments from
the source file.
You can use all the methods, such as
distance()
and
bearing()
, that are defined in the
Point
class on Xearth
objects.
>>> print("Suva to Tokyo is %i kM" % markers['Suva'].distance(markers['Tokyo']))
Suva to Tokyo is 7253 kM
>>> print("Vienna to Brussels on %i°" % markers['Vienna'].bearing(markers['Brussels']))
Vienna to Brussels on 293°
With the original purpose of the marker file export feature being
finding people local to a customer it would be nice to use
xearth
to do the same in a more programmatic way, and of
course that is possible too.
>>> Customer = xearth.point.Point(52.015, -0.221)
>>> for marker in markers:
... distance = Customer.distance(markers[marker])
... if distance < 300:
... print("%i kM - %s, %s" % (distance, marker, markers[marker]))
57 kM - London, United Kingdom (N51.500°; W000.170°)
Imagining for a second the customer lives in my house, the only marker within 300 kilometres of me in the city marker file we’ve imported is London.
I’ll end this entry with similar text to that which created it: If you
think of any good uses for upoints
, drop me a mail. Cool new
uses with attached patches are even better!
[1] | All thanks to Simon Woods according to the source code repository, so a big thanks to him! |