BorderPatrol
BorderPatrol lets you import a KML file and then check if points are inside or outside the polygons the file defines.
The KML file may have multiple polygons defined, google maps is a good source.
Examples
An example KML file can be found here: http://maps.google.com/maps/ms?ie=UTF8&hl=en&msa=0&ll=38.814031,-103.743896&spn=9.600749,16.248779&z=7&msid=110523771099674876521.00049301d20252132a92c&output=kml
To test if a point is in the region you can either pass a class that responds to x
and y
(like the provided BorderPatrol::Point class) or just pass a longitude latitude pair.
region = BorderPatrol.parse_kml(File.read('spec/support/colorado-test.kml'))
denver = BorderPatrol::Point.new(-105, 39.75)
region.contains_point?(denver) # true
region.contains_point?(-105, 39.75) # also true!
san_francisco = BorderPatrol::Point.new(-122.5, 37.75)
region.contains_point?(san_francisco) # false
region.contains_point?(-122.5, 37.75) # also false!
If you want to use your own point class, just define x
and y
as methods that correspond to longitude
and latitude
.
Pro Tip
You can make KML files easily on Google Maps by clicking "My Maps", drawing shapes and saving the map. Just copy the share link and add "&output=kml" to download the file.g
Dependencies
- Nokogiri
Known Issues
Polygons across the international date line don't work.
Acknowledgements
http://jakescruggs.blogspot.com/2009/07/point-inside-polygon-in-ruby.html for evaluating the algorithm.
http://github.com/nofxx/georuby/ for providing the bounding box code.