-
Notifications
You must be signed in to change notification settings - Fork 0
Home
Geo::Index is a Perl module for creating in-memory geographic points indices. Once indexed, fast searches can be run.
Efficient search methods include Search(…)
to get all points
within a distance from a given point, SearchByBounds(…)
to get all
points in an given area, Closest(…)
to get the closest points to a
given point, and Farthest(…)
to get the farthest points from a given
point.
Additional methods are provided to compute distances between arbitrary points
(Distance(…)
, DistanceFrom(…)
, and DistanceTo(…)
)
and to get the size in meters of one degree or the size in degrees of one meter
at a given point (OneDegreeInMeters(…)
and OneMeterInDegrees(…)
,
respectively).
While by default computations are done for the Earth, other bodies can be used
by supplying appropriates radii and circumferences to new(…)
.
This documentation describes Geo::Index version 0.0.8
# Create and populate a geographic index
use Geo::Index;
@points = (
{ lat => 1.0, lon => 2.0 },
{ lat => -90.0, lon => 0.0, name => 'South Pole' },
{ lat => 30.0, lon => -20.0, ele => 123.4 }
);
$point = { lat=>10.0, lon=>20.0 };
$index = Geo::Index->new();
$index->IndexPoints( \@points );
$index->Index( $point );
$index->Index( [ 30, 40 ] );
# Search index
%search_options = ( sort_results => 1, radius=>5_000_000 );
$results = $index->Search( [ -80, 20 ], \%search_options );
print "$$results[0]{name}\n"; # Prints 'South Pole'
# Get all points in the southern hemisphere
$results = $index->SearchByBounds( [ -180, -90, 180, 0 ] );
print "$$results[0]{name}\n"; # Also prints 'South Pole'
($closest) = $index->Closest( [ -80, 20 ] );
print "$$closest{name}\n"; # Also prints 'South Pole'
($closest) = $index->Closest( $points[1], { post_condition=>'NONE' } );
print "$$closest{name}\n"; # Also prints 'South Pole'
($farthest) = $index->Farthest( [ 90, 0 ] );
print "$$farthest{name}\n"; # Also prints 'South Pole'
# Compute distance in meters between two points (using haversine formula)
$m = $index->Distance( { lat=>51.507222, lon=>-0.1275 }, [ -6.2, 106.816667 ] );
printf("London to Jakarta: %i km\n", $m / 1000);
$index->DistanceFrom( [ 90, 0 ] );
$m = $index->DistanceTo( $points[1] );
printf("Pole to pole: %i km\n", $m / 1000);
Further sample code can be found in the examples/
directory.
- Overview
- Points
-
Methods
-
Indexing
new
Index
IndexPoints
Unindex -
Searching
Search
SearchByBounds
Closest
Farthest
AllPoints
Condition functions -
Distance and measurement
Distance
DistanceFrom
DistanceTo
OneDegreeInMeters
OneMeterInDegrees -
Metadata
GetConfiguration
GetStatistics -
Miscellaneous
Sweep
Vacuum
PointCount
-
Indexing
- Alternate method names
- Performance
- Theory of operation
- Bugs and deficiencies
- Version history
- Author and copyright