border_patrol-sgonyea 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/.gitignore ADDED
@@ -0,0 +1,5 @@
1
+ *~
2
+ #*
3
+ *.sw*
4
+ .bundle
5
+ /Gemfile.lock
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --backtrace
data/Gemfile ADDED
@@ -0,0 +1,2 @@
1
+ source :rubygems
2
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,19 @@
1
+ Copyright © 2009 Square, Inc.
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the “Software”), to deal
5
+ in the Software without restriction, including without limitation the rights
6
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ copies of the Software, and to permit persons to whom the Software is
8
+ furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in all
11
+ copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19
+ SOFTWARE.
data/README.markdown ADDED
@@ -0,0 +1,49 @@
1
+ # BorderPatrol
2
+
3
+ BorderPatrol allows you import a KML file and then check if points are inside or outside the polygons the file defines.
4
+
5
+ The KML file may have multiple polygons defined, google maps is a good source.
6
+
7
+ ## Examples
8
+
9
+ An example KML file can be found here:
10
+ 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
11
+
12
+ 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.
13
+
14
+ region = BorderPatrol.parse_kml(File.read('spec/support/colorado-test.kml'))
15
+ denver = BorderPatrol::Point.new(-105, 39.75)
16
+ region.contains_point?(denver) # true
17
+ region.contains_point?(-105, 39.75) # also true!
18
+ san_francisco = BorderPatrol::Point.new(-122.5, 37.75)
19
+ region.contains_point?(san_francisco) # false
20
+ region.contains_point?(-122.5, 37.75) # also false!
21
+
22
+ If you want to use your own point class, just define `x` and `y` as methods that correspond to `longitude` and `latitude`.
23
+
24
+ ## Performance
25
+ It's definitely not going to beat a specialized system like PostGIS or SOLR, but it also doesn't have to go across the network to get results.
26
+ We've been using it successfully in critical paths in production with zero impact. Here's a benchmark checking 10,000 random points against the sample files included in the specs.
27
+
28
+ user system total real
29
+ colorado region 0.240000 0.010000 0.250000 ( 0.249663)
30
+ multi polygon region 0.610000 0.020000 0.630000 ( 0.631532)
31
+
32
+
33
+ ## Pro Tip
34
+
35
+ 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
36
+
37
+ ## Dependencies
38
+
39
+ * Nokogiri
40
+
41
+ ## Known Issues
42
+
43
+ Polygons across the international date line don't work.
44
+
45
+ ## Acknowledgements
46
+
47
+ http://jakescruggs.blogspot.com/2009/07/point-inside-polygon-in-ruby.html for evaluating the algorithm.
48
+
49
+ http://github.com/nofxx/georuby/ for providing the bounding box code.
data/Rakefile ADDED
@@ -0,0 +1,9 @@
1
+ require 'rubygems'
2
+ require 'bundler/gem_tasks'
3
+ Bundler.setup
4
+
5
+ require 'rake'
6
+
7
+ require 'rspec/core/rake_task'
8
+ RSpec::Core::RakeTask.new(:spec)
9
+ task :default => :spec
@@ -0,0 +1,24 @@
1
+ # encoding: utf-8
2
+
3
+ $:.push File.expand_path("../lib", __FILE__)
4
+ require 'border_patrol/version'
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = "border_patrol-sgonyea"
8
+ s.version = BorderPatrol::VERSION
9
+ s.authors = ["Zach Brock", "Matt Wilson"]
10
+ s.email = "eng@squareup.com"
11
+ s.date = "2011-07-06"
12
+ s.description = "Lets you import a KML file and then check if points are inside or outside region polygons defined by the file."
13
+ s.summary = "Import and query KML regions"
14
+ s.homepage = "http://github.com/square/border_patrol"
15
+
16
+ s.require_paths = ["lib"]
17
+ s.files = `git ls-files`.split("\n")
18
+ s.test_files = `git ls-files -- spec/*`.split("\n")
19
+
20
+ s.add_dependency("nokogiri", ">= 1.4.3.1")
21
+
22
+ s.add_development_dependency("rake")
23
+ s.add_development_dependency("rspec", "~> 2.6.0")
24
+ end
@@ -0,0 +1 @@
1
+ require 'border_patrol'
@@ -0,0 +1,30 @@
1
+ module BorderPatrol
2
+ class InsufficientPointsToActuallyFormAPolygonError < ArgumentError; end
3
+ class Point < Struct.new(:x, :y); end
4
+
5
+ def self.parse_kml(string)
6
+ doc = Nokogiri::XML(string)
7
+
8
+ polygons = doc.search('Polygon').map do |polygon_kml|
9
+ parse_kml_polygon_data(polygon_kml.to_s)
10
+ end
11
+ BorderPatrol::Region.new(polygons)
12
+ end
13
+
14
+ private
15
+ def self.parse_kml_polygon_data(string)
16
+ doc = Nokogiri::XML(string)
17
+ coordinates = doc.xpath("//coordinates").text.strip.split(/\s+/)
18
+ points = coordinates.map do |coord|
19
+ x, y, z = coord.strip.split(',')
20
+ BorderPatrol::Point.new(x.to_f, y.to_f)
21
+ end
22
+ BorderPatrol::Polygon.new(points)
23
+ end
24
+ end
25
+
26
+ require 'set'
27
+ require 'nokogiri'
28
+ require 'border_patrol/version'
29
+ require 'border_patrol/polygon'
30
+ require 'border_patrol/region'
@@ -0,0 +1,77 @@
1
+ require 'forwardable'
2
+ module BorderPatrol
3
+ class Polygon
4
+ extend Forwardable
5
+ def initialize(*args)
6
+ args.flatten!
7
+ args.uniq!
8
+ raise InsufficientPointsToActuallyFormAPolygonError unless args.size > 2
9
+ @points = Array.new(args)
10
+ end
11
+
12
+ def_delegators :@points, :size, :each, :first, :include?, :[], :index
13
+
14
+ def ==(other)
15
+ # Do we have the right number of points?
16
+ return false unless other.size == size
17
+
18
+ # Are the points in the right order?
19
+ first, second = first(2)
20
+ index = other.index(first)
21
+ return false unless index
22
+ direction = (other[index-1] == second) ? -1 : 1
23
+ # Check if the two polygons have the same edges and the same points
24
+ # i.e. [point1, point2, point3] is the same as [point2, point3, point1] is the same as [point3, point2, point1]
25
+ each do |i|
26
+ return false unless i == other[index]
27
+ index = index + direction
28
+ index = 0 if index == size
29
+ end
30
+ true
31
+ end
32
+
33
+ # Quick and dirty hash function
34
+ def hash
35
+ @points.inject(0) { |sum, point| sum += point.x + point.y }
36
+ end
37
+
38
+ def contains_point?(point)
39
+ return false unless inside_bounding_box?(point)
40
+ c = false
41
+ i = -1
42
+ j = self.size - 1
43
+ while (i += 1) < self.size
44
+ if ((self[i].y <= point.y && point.y < self[j].y) ||
45
+ (self[j].y <= point.y && point.y < self[i].y))
46
+ if (point.x < (self[j].x - self[i].x) * (point.y - self[i].y) /
47
+ (self[j].y - self[i].y) + self[i].x)
48
+ c = !c
49
+ end
50
+ end
51
+ j = i
52
+ end
53
+ return c
54
+ end
55
+
56
+ def inside_bounding_box?(point)
57
+ bb_point_1, bb_point_2 = bounding_box
58
+ max_x = [bb_point_1.x, bb_point_2.x].max
59
+ max_y = [bb_point_1.y, bb_point_2.y].max
60
+ min_x = [bb_point_1.x, bb_point_2.x].min
61
+ min_y = [bb_point_1.y, bb_point_2.y].min
62
+
63
+ !(point.x < min_x || point.x > max_x || point.y < min_y || point.y > max_y)
64
+ end
65
+
66
+ def bounding_box
67
+ max_x, min_x, max_y, min_y = -Float::MAX, Float::MAX, -Float::MAX, Float::MAX
68
+ each do |point|
69
+ max_y = point.y if point.y > max_y
70
+ min_y = point.y if point.y < min_y
71
+ max_x = point.x if point.x > max_x
72
+ min_x = point.x if point.x < min_x
73
+ end
74
+ [Point.new(min_x, max_y), Point.new(max_x, min_y)]
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,12 @@
1
+ module BorderPatrol
2
+ class Region < Set
3
+ def contains_point?(*point)
4
+ point = case point.length
5
+ when 1 then point.first
6
+ when 2 then BorderPatrol::Point.new(point[0],point[1])
7
+ else raise ArgumentError, "#{point} is invalid. Arguments can either be an object, or a longitude,lattitude pair."
8
+ end
9
+ any? { |polygon| polygon.contains_point?(point) }
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,3 @@
1
+ module BorderPatrol
2
+ VERSION = "0.2.0"
3
+ end
@@ -0,0 +1,21 @@
1
+ #!/usr/bin/env ruby -w
2
+ require "spec/spec_helper"
3
+ require 'benchmark'
4
+
5
+ colorado_region = BorderPatrol.parse_kml(File.read('spec/support/colorado-test.kml'))
6
+ multi_polygon_region = BorderPatrol.parse_kml(File.read('spec/support/multi-polygon-test.kml'))
7
+ Benchmark.bm(20) do |x|
8
+ x.report("colorado region") do
9
+ 10000.times do |i|
10
+ multiple = (rand(2) == 1) ? -1 : 1
11
+ colorado_region.contains_point?(rand * 180 * multiple, rand * 180 * multiple)
12
+ end
13
+ end
14
+
15
+ x.report("multi polygon region") do
16
+ 10000.times do |i|
17
+ multiple = (rand(2) == 1) ? -1 : 1
18
+ multi_polygon_region.contains_point?(rand * 180 * multiple, rand * 180 * multiple)
19
+ end
20
+ end
21
+ end
data/script/ci ADDED
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env ruby -w
2
+
3
+ def run(command)
4
+ system(command) || abort("`#{command}` failed")
5
+ end
6
+
7
+ run("gem install bundler") if `gem list bundler | grep bundler`.empty?
8
+
9
+ run "bundle check || bundle install"
10
+ run "rake"
@@ -0,0 +1,139 @@
1
+ require 'spec_helper'
2
+
3
+ describe BorderPatrol::Polygon do
4
+ describe "==" do
5
+ it "is true if polygons are congruent" do
6
+ points = [BorderPatrol::Point.new(1, 2), BorderPatrol::Point.new(3, 4), BorderPatrol::Point.new(0, 0)]
7
+ poly1 = BorderPatrol::Polygon.new(points)
8
+ poly2 = BorderPatrol::Polygon.new(points.unshift(points.pop))
9
+
10
+ poly1.should == poly2
11
+ poly2.should == poly1
12
+ poly3 = BorderPatrol::Polygon.new(points.reverse)
13
+ poly1.should == poly3
14
+ poly3.should == poly1
15
+
16
+ end
17
+
18
+ it "cares about order of points" do
19
+ points = [BorderPatrol::Point.new(1, 2), BorderPatrol::Point.new(3, 4), BorderPatrol::Point.new(5, 5), BorderPatrol::Point.new(0, 0)]
20
+ poly1 = BorderPatrol::Polygon.new(points)
21
+ points = [BorderPatrol::Point.new(5, 5), BorderPatrol::Point.new(1, 2), BorderPatrol::Point.new(0, 0), BorderPatrol::Point.new(3, 4)]
22
+ poly2 = BorderPatrol::Polygon.new(points)
23
+
24
+ poly1.should_not == poly2
25
+ poly2.should_not == poly1
26
+
27
+ end
28
+
29
+ it "is false if one polygon is a subset" do
30
+ poly1 = BorderPatrol::Polygon.new(BorderPatrol::Point.new(1, 2), BorderPatrol::Point.new(3, 4), BorderPatrol::Point.new(0, 0))
31
+ poly2 = BorderPatrol::Polygon.new(BorderPatrol::Point.new(1, 2), BorderPatrol::Point.new(3, 4), BorderPatrol::Point.new(0, 0), BorderPatrol::Point.new(4, 4))
32
+ poly2.should_not == poly1
33
+ poly1.should_not == poly2
34
+ end
35
+
36
+ it "is false if the polygons are not congruent" do
37
+ poly1 = BorderPatrol::Polygon.new(BorderPatrol::Point.new(1, 2), BorderPatrol::Point.new(3, 4), BorderPatrol::Point.new(0, 0))
38
+ poly2 = BorderPatrol::Polygon.new(BorderPatrol::Point.new(2, 1), BorderPatrol::Point.new(3, 4), BorderPatrol::Point.new(0, 0))
39
+ poly2.should_not == poly1
40
+ poly1.should_not == poly2
41
+ end
42
+ end
43
+
44
+ describe "#initialize" do
45
+ it "stores a list of points" do
46
+ points = [BorderPatrol::Point.new(1, 2), BorderPatrol::Point.new(3, 4), BorderPatrol::Point.new(0, 0)]
47
+ polygon = BorderPatrol::Polygon.new(points)
48
+ points.each do |point|
49
+ polygon.should include point
50
+ end
51
+ end
52
+
53
+ it "can be instantiated with a arbitrary argument list" do
54
+ points = [BorderPatrol::Point.new(1, 2), BorderPatrol::Point.new(3, 4), BorderPatrol::Point.new(0, 0)]
55
+ poly1 = BorderPatrol::Polygon.new(* points)
56
+ poly2 = BorderPatrol::Polygon.new(points)
57
+ poly1.should == poly2
58
+ end
59
+
60
+ it "raises if less than 3 points are given" do
61
+ points = [BorderPatrol::Point.new(1, 2), BorderPatrol::Point.new(2, 3)]
62
+ expect { BorderPatrol::Polygon.new(points) }.to raise_exception(BorderPatrol::InsufficientPointsToActuallyFormAPolygonError)
63
+ points = [BorderPatrol::Point.new(1, 2)]
64
+ expect { BorderPatrol::Polygon.new(points) }.to raise_exception(BorderPatrol::InsufficientPointsToActuallyFormAPolygonError)
65
+ points = []
66
+ expect { BorderPatrol::Polygon.new(points) }.to raise_exception(BorderPatrol::InsufficientPointsToActuallyFormAPolygonError)
67
+ end
68
+
69
+ it "doesn't store duplicated points" do
70
+ points = [BorderPatrol::Point.new(1, 2), BorderPatrol::Point.new(3, 4), BorderPatrol::Point.new(0, 0)]
71
+ duplicate_point = [BorderPatrol::Point.new(1, 2)]
72
+ polygon = BorderPatrol::Polygon.new(points + duplicate_point)
73
+ polygon.size.should == 3
74
+ points.each do |point|
75
+ polygon.should include point
76
+ end
77
+ end
78
+ end
79
+
80
+ describe "#bounding_box" do
81
+ it "returns the (max top, max left), (max bottom, max right) as points" do
82
+ points = [BorderPatrol::Point.new(-1, 3), BorderPatrol::Point.new(4, -3), BorderPatrol::Point.new(10, 4), BorderPatrol::Point.new(0, 12)]
83
+ polygon = BorderPatrol::Polygon.new(points)
84
+ polygon.bounding_box.should == [BorderPatrol::Point.new(-1, 12), BorderPatrol::Point.new(10, -3)]
85
+ end
86
+ end
87
+
88
+ describe "#contains_point?" do
89
+ before do
90
+ points = [BorderPatrol::Point.new(-10, 0), BorderPatrol::Point.new(10, 0), BorderPatrol::Point.new(0, 10)]
91
+ @polygon = BorderPatrol::Polygon.new(points)
92
+ end
93
+
94
+ it "is true if the point is in the polygon" do
95
+ @polygon.contains_point?(BorderPatrol::Point.new(0.5, 0.5)).should be_true
96
+ @polygon.contains_point?(BorderPatrol::Point.new(0, 5)).should be_true
97
+ @polygon.contains_point?(BorderPatrol::Point.new(-1, 3)).should be_true
98
+ end
99
+
100
+ it "does not include points on the lines with slopes between vertices" do
101
+ @polygon.contains_point?(BorderPatrol::Point.new(5.0, 5.0)).should be_false
102
+ @polygon.contains_point?(BorderPatrol::Point.new(4.999999, 4.9999999)).should be_true
103
+ @polygon.contains_point?(BorderPatrol::Point.new(0, 0)).should be_true
104
+ @polygon.contains_point?(BorderPatrol::Point.new(0.000001, 0.000001)).should be_true
105
+ end
106
+
107
+ it "includes points at the vertices" do
108
+ @polygon.contains_point?(BorderPatrol::Point.new(-10, 0)).should be_true
109
+ end
110
+
111
+ it "is false if the point is outside of the polygon" do
112
+ @polygon.contains_point?(BorderPatrol::Point.new(9, 5)).should be_false
113
+ @polygon.contains_point?(BorderPatrol::Point.new(-5, 8)).should be_false
114
+ @polygon.contains_point?(BorderPatrol::Point.new(-10, -1)).should be_false
115
+ @polygon.contains_point?(BorderPatrol::Point.new(-20, -20)).should be_false
116
+ end
117
+ end
118
+
119
+ describe "#inside_bounding_box?" do
120
+ before do
121
+ points = [BorderPatrol::Point.new(-10, 0), BorderPatrol::Point.new(10, 0), BorderPatrol::Point.new(0, 10)]
122
+ @polygon = BorderPatrol::Polygon.new(points)
123
+ end
124
+
125
+ it "is false if it is outside the bounding box" do
126
+ @polygon.inside_bounding_box?(BorderPatrol::Point.new(-10, -1)).should be_false
127
+ @polygon.inside_bounding_box?(BorderPatrol::Point.new(-20, -20)).should be_false
128
+ @polygon.inside_bounding_box?(BorderPatrol::Point.new(1, 20)).should be_false
129
+ end
130
+
131
+ it "returns true if it is inside the bounding box" do
132
+ @polygon.inside_bounding_box?(BorderPatrol::Point.new(9, 5)).should be_true
133
+ @polygon.inside_bounding_box?(BorderPatrol::Point.new(-5, 8)).should be_true
134
+ @polygon.inside_bounding_box?(BorderPatrol::Point.new(1, 1)).should be_true
135
+ end
136
+
137
+ end
138
+ end
139
+
@@ -0,0 +1,50 @@
1
+ require 'spec_helper'
2
+
3
+ describe BorderPatrol::Region do
4
+ it "is a Set" do
5
+ BorderPatrol::Region.new.should be_a Set
6
+ end
7
+
8
+ it "stores the polygons provided at initialization" do
9
+ region = BorderPatrol::Region.new([create_polygon, create_polygon(1), create_polygon(2)])
10
+ region.length.should == 3
11
+ end
12
+
13
+ describe "#contains_point?" do
14
+ subject { BorderPatrol::Region.new(@polygons) }
15
+
16
+ it "raises an argument error if contains_point? takes more than 3 arguments" do
17
+ expect { subject.contains_point? }.to raise_exception ArgumentError
18
+ expect { subject.contains_point?(1,2,3) }.to raise_exception ArgumentError
19
+ end
20
+
21
+ it "returns true if any polygon contains the point" do
22
+ point = BorderPatrol::Point.new(1,2)
23
+ @polygons = [create_polygon, create_polygon(30)]
24
+
25
+ subject.contains_point?(point).should be_true
26
+ end
27
+
28
+ it "returns false if no polygons contain the point" do
29
+ point = BorderPatrol::Point.new(-1,-2)
30
+ @polygons = [create_polygon, create_polygon(30)]
31
+
32
+ subject.contains_point?(point).should be_false
33
+ end
34
+
35
+ it "transforms (x,y) coordinates passed in into a point" do
36
+ @polygons = [create_polygon, create_polygon(30)]
37
+
38
+ subject.contains_point?(1,2).should be_true
39
+ end
40
+ end
41
+
42
+ def create_polygon(start=0)
43
+ BorderPatrol::Polygon.new(
44
+ BorderPatrol::Point.new(start,start),
45
+ BorderPatrol::Point.new(start + 10, start),
46
+ BorderPatrol::Point.new(start + 10, start + 10),
47
+ BorderPatrol::Point.new(start, start + 10))
48
+ end
49
+
50
+ end
@@ -0,0 +1,70 @@
1
+ require 'spec_helper'
2
+
3
+ describe BorderPatrol do
4
+ Support_Folder = Bundler.root + 'spec/support'
5
+
6
+ describe ".parse_kml" do
7
+ it "returns a BorderPatrol::Region containing a BorderPatrol::Polygon for each polygon in the KML file" do
8
+ kml_data = File.read(Support_Folder + "multi-polygon-test.kml")
9
+ region = BorderPatrol.parse_kml(kml_data)
10
+ region.length.should == 3
11
+ region.each {|p| p.should be_a BorderPatrol::Polygon}
12
+ end
13
+
14
+ context "when there is only one polygon" do
15
+ it "returns a region containing a single polygon" do
16
+ kml_data = File.read(Support_Folder + "colorado-test.kml")
17
+ region = BorderPatrol.parse_kml(kml_data)
18
+ region.length.should == 1
19
+ region.each {|p| p.should be_a BorderPatrol::Polygon}
20
+ end
21
+ end
22
+
23
+ context "xmlns attributes" do
24
+ it "should not care about the xmlns of the <kml> tag" do
25
+ kml_data = File.read(Support_Folder + "elgin-opengis-ns-test.kml")
26
+ region = BorderPatrol.parse_kml(kml_data)
27
+ region.length.should == 7
28
+ region.each {|p| p.should be_a BorderPatrol::Polygon}
29
+ end
30
+ end
31
+ end
32
+
33
+ describe ".parse_kml_polygon_data" do
34
+ it "returns a BorderPatrol::Polygon with the points from the kml data in the correct order" do
35
+ kml = <<-EOM
36
+ <Polygon>
37
+ <outerBoundaryIs>
38
+ <LinearRing>
39
+ <tessellate>1</tessellate>
40
+ <coordinates>
41
+ -10,25,0.000000
42
+ -1,30,0.000000 10,1,0.000000
43
+ 0,-5,000000
44
+ -10,25,0.000000
45
+ </coordinates>
46
+ </LinearRing>
47
+ </outerBoundaryIs>
48
+ </Polygon>
49
+ EOM
50
+ polygon = BorderPatrol.parse_kml_polygon_data(kml)
51
+ polygon.should == BorderPatrol::Polygon.new(BorderPatrol::Point.new(-10, 25), BorderPatrol::Point.new(-1, 30), BorderPatrol::Point.new(10, 1), BorderPatrol::Point.new(0, -5))
52
+ end
53
+ end
54
+
55
+ describe BorderPatrol::Point do
56
+ describe "==" do
57
+ it "is true if both points contain the same values" do
58
+ BorderPatrol::Point.new(1,2).should == BorderPatrol::Point.new(1,2)
59
+ end
60
+
61
+ it "is true if one point contains floats and one contains integers" do
62
+ BorderPatrol::Point.new(1,2.0).should == BorderPatrol::Point.new(1.0,2)
63
+ end
64
+
65
+ it "is false if the points contain different values" do
66
+ BorderPatrol::Point.new(1,3).should_not == BorderPatrol::Point.new(1.0,2)
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,5 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+ Bundler.setup
4
+
5
+ require 'border_patrol'
@@ -0,0 +1,37 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <kml xmlns="http://earth.google.com/kml/2.2">
3
+ <Document>
4
+ <name>Colorado</name>
5
+ <description><![CDATA[]]></description>
6
+ <Style id="style1">
7
+ <LineStyle>
8
+ <color>40000000</color>
9
+ <width>3</width>
10
+ </LineStyle>
11
+ <PolyStyle>
12
+ <color>73FF0000</color>
13
+ <fill>1</fill>
14
+ <outline>1</outline>
15
+ </PolyStyle>
16
+ </Style>
17
+ <Placemark>
18
+ <name>Shape 1</name>
19
+ <description><![CDATA[]]></description>
20
+ <styleUrl>#style1</styleUrl>
21
+ <Polygon>
22
+ <outerBoundaryIs>
23
+ <LinearRing>
24
+ <tessellate>1</tessellate>
25
+ <coordinates>
26
+ -109.050293,41.008923,0.000000
27
+ -102.057495,41.004776,0.000000
28
+ -102.046509,36.993778,0.000000
29
+ -109.044800,36.998165,0.000000
30
+ -109.050293,41.008923,0.000000
31
+ </coordinates>
32
+ </LinearRing>
33
+ </outerBoundaryIs>
34
+ </Polygon>
35
+ </Placemark>
36
+ </Document>
37
+ </kml>
@@ -0,0 +1,201 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <kml xmlns="http://www.opengis.net/kml/2.2">
3
+ <Document>
4
+ <Folder>
5
+ <name>elgin</name>
6
+ <Schema name="elgin" id="elgin">
7
+ <SimpleField name="Name" type="string"/>
8
+ <SimpleField name="Description" type="string"/>
9
+ <SimpleField name="STATEFP" type="string"/>
10
+ <SimpleField name="PLACEFP" type="string"/>
11
+ <SimpleField name="PLACENS" type="string"/>
12
+ <SimpleField name="PLCIDFP" type="string"/>
13
+ <SimpleField name="NAMELSAD" type="string"/>
14
+ <SimpleField name="LSAD" type="string"/>
15
+ <SimpleField name="CLASSFP" type="string"/>
16
+ <SimpleField name="CPI" type="string"/>
17
+ <SimpleField name="PCICBSA" type="string"/>
18
+ <SimpleField name="PCINECTA" type="string"/>
19
+ <SimpleField name="MTFCC" type="string"/>
20
+ <SimpleField name="FUNCSTAT" type="string"/>
21
+ <SimpleField name="ALAND" type="float"/>
22
+ <SimpleField name="AWATER" type="float"/>
23
+ <SimpleField name="INTPTLAT" type="string"/>
24
+ <SimpleField name="INTPTLON" type="string"/>
25
+ </Schema>
26
+ <Placemark>
27
+ <name>Elgin</name>
28
+ <Style>
29
+ <LineStyle>
30
+ <color>ff0000ff</color>
31
+ </LineStyle>
32
+ <PolyStyle>
33
+ <fill>0</fill>
34
+ </PolyStyle>
35
+ </Style>
36
+ <ExtendedData>
37
+ <SchemaData schemaUrl="#elgin">
38
+ <SimpleData name="Name">Elgin</SimpleData>
39
+ <SimpleData name="STATEFP">17</SimpleData>
40
+ <SimpleData name="PLACEFP">23074</SimpleData>
41
+ <SimpleData name="PLACENS">02394641</SimpleData>
42
+ <SimpleData name="PLCIDFP">1723074</SimpleData>
43
+ <SimpleData name="NAMELSAD">Elgin city</SimpleData>
44
+ <SimpleData name="LSAD">25</SimpleData>
45
+ <SimpleData name="CLASSFP">C1</SimpleData>
46
+ <SimpleData name="CPI">Y</SimpleData>
47
+ <SimpleData name="PCICBSA">Y</SimpleData>
48
+ <SimpleData name="PCINECTA">N</SimpleData>
49
+ <SimpleData name="MTFCC">G4110</SimpleData>
50
+ <SimpleData name="FUNCSTAT">A</SimpleData>
51
+ <SimpleData name="ALAND">96307737</SimpleData>
52
+ <SimpleData name="AWATER">1409979</SimpleData>
53
+ <SimpleData name="INTPTLAT">+42.0396385</SimpleData>
54
+ <SimpleData name="INTPTLON">-088.3217093</SimpleData>
55
+ </SchemaData>
56
+ </ExtendedData>
57
+ <MultiGeometry>
58
+ <Polygon>
59
+ <outerBoundaryIs>
60
+ <LinearRing>
61
+ <coordinates>-88.238023,42.038151 -88.237948,42.038151 -88.237792,42.038154 -88.237725,42.038154 -88.237651,42.038155 -88.237647,42.038272 -88.237638,42.038625 -88.237635,42.038743 -88.237641,42.038752 -88.237622,42.039166 -88.237567,42.040443 -88.237549,42.040869 -88.237567,42.041442 -88.237622,42.043161 -88.237641,42.043735 -88.237661,42.044515 -88.23761,42.045468 -88.237612,42.045581 -88.237623,42.046027 -88.237626,42.046149 -88.237635,42.046518 -88.237638,42.046641 -88.237628,42.046773 -88.237169,42.046774 -88.236895,42.04677 -88.236645,42.046768 -88.235691,42.046818 -88.23529,42.04684 -88.23501,42.046839 -88.234317,42.046836 -88.234171,42.046836 -88.233892,42.046835 -88.2337,42.04683 -88.233126,42.046817 -88.233064,42.046816 -88.233034,42.04669 -88.233031,42.046425 -88.233025,42.045631 -88.233023,42.045367 -88.232987,42.04433 -88.23288,42.041219 -88.232845,42.040183 -88.232503,42.040189 -88.231478,42.040208 -88.231137,42.040215 -88.230577,42.040246 -88.229213,42.040278 -88.229173,42.038721 -88.229172,42.038404 -88.229033,42.03841 -88.228695,42.038428 -88.228617,42.038431 -88.228479,42.038437 -88.228082,42.038466 -88.227709,42.038664 -88.225003,42.040805 -88.224927,42.040693 -88.226037,42.036796 -88.230191,42.036792 -88.230322,42.036811 -88.230296,42.036999 -88.230166,42.037958 -88.230123,42.038278 -88.230231,42.038275 -88.230558,42.038268 -88.230667,42.038266 -88.230749,42.038263 -88.230995,42.038258 -88.231078,42.038257 -88.231267,42.038252 -88.231838,42.03824 -88.232028,42.038236 -88.232364,42.038228 -88.232654,42.038222 -88.233739,42.038201 -88.234535,42.038188 -88.235162,42.038179 -88.235188,42.037799 -88.235266,42.036662 -88.235293,42.036283 -88.235375,42.036028 -88.235623,42.035267 -88.235706,42.035013 -88.235734,42.034895 -88.235818,42.034541 -88.235846,42.034423 -88.235868,42.034233 -88.235906,42.033915 -88.235657,42.033874 -88.235469,42.033843 -88.235122,42.033777 -88.235059,42.033765 -88.235185,42.032778 -88.235231,42.032428 -88.235435,42.03242 -88.236048,42.0324 -88.236253,42.032393 -88.236653,42.034434 -88.236579,42.034621 -88.23636,42.035182 -88.236287,42.03537 -88.23625,42.035512 -88.236141,42.035939 -88.236105,42.036082 -88.236727,42.035785 -88.236784,42.035758 -88.237619,42.037371 -88.237705,42.037538 -88.238023,42.038151</coordinates>
62
+ </LinearRing>
63
+ </outerBoundaryIs>
64
+ </Polygon>
65
+ <Polygon>
66
+ <outerBoundaryIs>
67
+ <LinearRing>
68
+ <coordinates>-88.316828,42.043559 -88.316488,42.04354 -88.31641,42.042909 -88.316953,42.042958 -88.316974,42.04357 -88.316828,42.043559</coordinates>
69
+ </LinearRing>
70
+ </outerBoundaryIs>
71
+ </Polygon>
72
+ <Polygon>
73
+ <outerBoundaryIs>
74
+ <LinearRing>
75
+ <coordinates>-88.352789,42.103556 -88.352639,42.103556 -88.347582,42.103556 -88.346471,42.103556 -88.344897,42.103557 -88.344123,42.10356 -88.341892,42.103569 -88.339247,42.103581 -88.336862,42.103562 -88.335209,42.103563 -88.33521,42.103385 -88.335178,42.100036 -88.335172,42.0994 -88.335141,42.096233 -88.335158,42.094385 -88.335162,42.093508 -88.33517,42.091482 -88.335182,42.088843 -88.335189,42.088587 -88.339543,42.088575 -88.339564,42.086696 -88.335282,42.086607 -88.335358,42.085602 -88.335398,42.084113 -88.335533,42.084122 -88.335547,42.083561 -88.335414,42.083564 -88.330633,42.083534 -88.330665,42.081152 -88.326021,42.081115 -88.325859,42.076566 -88.329881,42.078318 -88.331122,42.078862 -88.33183,42.079172 -88.332468,42.079554 -88.332321,42.079631 -88.332442,42.079758 -88.332538,42.079936 -88.332553,42.079971 -88.332633,42.080157 -88.332632,42.080767 -88.332562,42.081201 -88.332449,42.081518 -88.332359,42.081796 -88.33258,42.081915 -88.332761,42.082024 -88.333751,42.08241 -88.334528,42.082769 -88.334872,42.082973 -88.335031,42.083307 -88.335175,42.083089 -88.335119,42.081595 -88.335375,42.080704 -88.335492,42.080746 -88.33962,42.082593 -88.349779,42.087137 -88.349717,42.088587 -88.349653,42.090126 -88.349394,42.096285 -88.35231,42.096363 -88.352292,42.096863 -88.352322,42.097848 -88.352277,42.098404 -88.352681,42.103342 -88.352793,42.103341 -88.352789,42.103556</coordinates>
76
+ </LinearRing>
77
+ </outerBoundaryIs>
78
+ </Polygon>
79
+ <Polygon>
80
+ <outerBoundaryIs>
81
+ <LinearRing>
82
+ <coordinates>-88.421253,41.98762 -88.419019,41.987667 -88.416827,41.987296 -88.4145,41.986729 -88.414356,41.987531 -88.414142,41.987472 -88.41227,41.987031 -88.412711,41.987703 -88.412501,41.98827 -88.41101,41.988963 -88.4087,41.988228 -88.408627,41.986908 -88.406991,41.98703 -88.407035,41.987907 -88.405297,41.987946 -88.40517,41.987922 -88.40512,41.987903 -88.405022,41.987906 -88.404992,41.987127 -88.400449,41.987156 -88.399108,41.987165 -88.399123,41.989026 -88.399134,41.990061 -88.399132,41.990092 -88.399136,41.990115 -88.399136,41.990224 -88.399143,41.991378 -88.399608,41.991388 -88.399612,41.9918 -88.399631,41.993667 -88.399632,41.99369 -88.402572,41.994293 -88.402707,41.994146 -88.403093,41.993729 -88.404487,41.99222 -88.404586,41.992311 -88.408917,41.993376 -88.408946,41.994698 -88.407765,41.994712 -88.407751,41.994923 -88.407751,41.995274 -88.407779,41.995597 -88.407891,41.99637 -88.408074,41.997256 -88.408496,41.998156 -88.409859,41.99817 -88.409861,41.998459 -88.409961,41.998465 -88.410093,41.998463 -88.410151,42.000027 -88.410202,42.001347 -88.410067,42.001352 -88.408717,42.001397 -88.408717,42.001953 -88.410089,42.001932 -88.410224,42.001927 -88.410429,42.007221 -88.410446,42.008065 -88.410464,42.008716 -88.410329,42.008719 -88.408711,42.008719 -88.408695,42.008493 -88.406985,42.008499 -88.406566,42.008493 -88.402525,42.008521 -88.402105,42.008533 -88.40194,42.008527 -88.401877,42.008592 -88.4014,42.008914 -88.400997,42.008648 -88.399839,42.007843 -88.399076,42.007408 -88.39913,42.008359 -88.399097,42.009585 -88.399083,42.010138 -88.398935,42.010094 -88.398905,42.010272 -88.398315,42.010113 -88.395835,42.009449 -88.395869,42.009283 -88.396113,42.00847 -88.394973,42.008106 -88.394777,42.008997 -88.394747,42.009135 -88.392993,42.008683 -88.392326,42.008511 -88.392351,42.008389 -88.392571,42.007669 -88.390732,42.00728 -88.390539,42.007291 -88.390525,42.007026 -88.390509,42.006693 -88.385654,42.006651 -88.385624,42.006637 -88.383086,42.005509 -88.383075,42.005699 -88.37828,42.004605 -88.375864,42.004054 -88.376196,42.001375 -88.375521,41.996529 -88.375478,41.995859 -88.375402,41.995199 -88.375265,41.994137 -88.375231,41.99325 -88.375315,41.991784 -88.375373,41.991465 -88.37602,41.991458 -88.38035,41.991429 -88.384982,41.991399 -88.385563,41.991392 -88.385984,41.991388 -88.395482,41.991331 -88.396571,41.991325 -88.398739,41.991369 -88.39876,41.990389 -88.398766,41.989031 -88.39875,41.986976 -88.39875,41.984705 -88.395033,41.984768 -88.395074,41.986996 -88.395081,41.987225 -88.390499,41.987379 -88.390495,41.987122 -88.390434,41.984196 -88.390371,41.981471 -88.38825,41.981408 -88.385583,41.981429 -88.385537,41.980201 -88.385631,41.977023 -88.385625,41.974561 -88.385625,41.974057 -88.389363,41.975233 -88.395138,41.977627 -88.395153,41.981272 -88.395242,41.984101 -88.401426,41.983981 -88.405137,41.984003 -88.405566,41.983989 -88.407335,41.983924 -88.407293,41.977811 -88.410905,41.977937 -88.410947,41.977013 -88.414223,41.976257 -88.409728,41.983838 -88.408574,41.985183 -88.40861,41.986481 -88.412846,41.985945 -88.414349,41.986159 -88.414417,41.983688 -88.414419,41.983632 -88.414428,41.982804 -88.414419,41.982116 -88.415037,41.982112 -88.417475,41.982129 -88.419076,41.982905 -88.419707,41.982371 -88.422762,41.983596 -88.423442,41.983589 -88.423054,41.983778 -88.42286,41.984118 -88.422957,41.984506 -88.423199,41.984748 -88.423636,41.984845 -88.423684,41.987261 -88.423677,41.98757 -88.421253,41.98762</coordinates>
83
+ </LinearRing>
84
+ </outerBoundaryIs>
85
+ <innerBoundaryIs>
86
+ <LinearRing>
87
+ <coordinates>-88.4051,41.998555 -88.40034,41.998604 -88.400212,41.998606 -88.40027,41.998243 -88.400357,41.997881 -88.400602,41.997186 -88.400904,41.996583 -88.401004,41.996392 -88.401322,41.995811 -88.401348,41.995763 -88.401455,41.995675 -88.396743,41.994408 -88.396625,41.994376 -88.396622,41.994194 -88.3955,41.994061 -88.394393,41.994243 -88.394291,41.994261 -88.394197,41.994737 -88.39413,41.996444 -88.394093,41.997326 -88.390754,41.997284 -88.390752,41.997381 -88.39068,42.002826 -88.390815,42.002834 -88.390817,42.004185 -88.390857,42.006067 -88.396413,42.006053 -88.398123,42.006049 -88.399041,42.006054 -88.400172,42.006157 -88.400357,42.005782 -88.400601,42.005306 -88.400648,42.002939 -88.400202,42.002951 -88.400023,42.002956 -88.400083,42.00161 -88.400249,42.001602 -88.401857,42.001611 -88.405215,42.001547 -88.4051,41.998555</coordinates>
88
+ </LinearRing>
89
+ </innerBoundaryIs>
90
+ </Polygon>
91
+ <Polygon>
92
+ <outerBoundaryIs>
93
+ <LinearRing>
94
+ <coordinates>-88.432567,41.983493 -88.432039,41.983903 -88.432034,41.984869 -88.432034,41.984916 -88.432034,41.986497 -88.432035,41.986674 -88.432032,41.98679 -88.43159,41.986849 -88.43159,41.986718 -88.431593,41.986474 -88.431616,41.984917 -88.431635,41.984077 -88.430775,41.98365 -88.430766,41.983506 -88.430767,41.981935 -88.429263,41.978878 -88.424364,41.977714 -88.420434,41.97849 -88.418731,41.977914 -88.417136,41.977375 -88.418591,41.975434 -88.412188,41.975289 -88.407773,41.975143 -88.407916,41.97175 -88.407918,41.971572 -88.413305,41.97203 -88.417148,41.972306 -88.419957,41.972498 -88.419945,41.972663 -88.419852,41.97393 -88.421453,41.973979 -88.421404,41.973025 -88.421387,41.972694 -88.421389,41.972539 -88.422276,41.972376 -88.423087,41.971938 -88.423457,41.971374 -88.423635,41.971373 -88.424273,41.971432 -88.424364,41.974785 -88.42437,41.974973 -88.424376,41.975201 -88.424418,41.976574 -88.432617,41.976283 -88.432587,41.980485 -88.432567,41.983493</coordinates>
95
+ </LinearRing>
96
+ </outerBoundaryIs>
97
+ </Polygon>
98
+ <Polygon>
99
+ <outerBoundaryIs>
100
+ <LinearRing>
101
+ <coordinates>-88.449438,42.072721 -88.440785,42.072671 -88.440505,42.072667 -88.440286,42.07267 -88.4389,42.071559 -88.439099,42.07154 -88.440316,42.071505 -88.440234,42.066676 -88.449437,42.066572 -88.449438,42.072721</coordinates>
102
+ </LinearRing>
103
+ </outerBoundaryIs>
104
+ </Polygon>
105
+ <Polygon>
106
+ <outerBoundaryIs>
107
+ <LinearRing>
108
+ <coordinates>-88.455113,42.063024 -88.451359,42.063026 -88.445699,42.063062 -88.436938,42.063024 -88.435759,42.063021 -88.435759,42.060902 -88.430374,42.061049 -88.427429,42.061097 -88.426785,42.061091 -88.426781,42.063148 -88.426779,42.06326 -88.426515,42.063241 -88.426221,42.063266 -88.425901,42.063335 -88.425893,42.063208 -88.425855,42.056982 -88.424849,42.056959 -88.422154,42.056957 -88.421326,42.056956 -88.421365,42.057851 -88.421431,42.061632 -88.421473,42.064039 -88.421458,42.06418 -88.4212,42.064236 -88.420741,42.064337 -88.416673,42.06523 -88.414588,42.065696 -88.414684,42.065582 -88.414501,42.065127 -88.414447,42.064997 -88.411981,42.065622 -88.41142,42.065782 -88.411335,42.065806 -88.411466,42.065966 -88.41184,42.066431 -88.411004,42.066847 -88.41066,42.06703 -88.409507,42.067025 -88.40983,42.067118 -88.411177,42.067497 -88.411278,42.067526 -88.412489,42.070273 -88.412782,42.069927 -88.412961,42.069716 -88.413068,42.069551 -88.413194,42.069369 -88.413294,42.069223 -88.413445,42.069425 -88.414663,42.071058 -88.414832,42.071372 -88.415061,42.071322 -88.415091,42.07139 -88.416187,42.074391 -88.416377,42.074405 -88.416529,42.074406 -88.416781,42.075099 -88.416951,42.075596 -88.416824,42.075639 -88.416864,42.075766 -88.414827,42.075973 -88.413367,42.076122 -88.411359,42.076351 -88.411333,42.076354 -88.411298,42.076358 -88.410001,42.076501 -88.409974,42.076504 -88.410281,42.085164 -88.406834,42.085225 -88.404964,42.085266 -88.40497,42.085979 -88.403736,42.087086 -88.402966,42.087776 -88.402899,42.087864 -88.402228,42.088528 -88.401791,42.087592 -88.399939,42.087791 -88.399879,42.088834 -88.398137,42.088849 -88.398085,42.08885 -88.397206,42.088825 -88.39531,42.088788 -88.395056,42.088783 -88.395016,42.088838 -88.394912,42.088781 -88.394808,42.088708 -88.394488,42.088509 -88.393947,42.088175 -88.393853,42.088118 -88.392874,42.087523 -88.391417,42.086632 -88.389632,42.08554 -88.386478,42.083586 -88.386537,42.083529 -88.387462,42.082635 -88.387919,42.082232 -88.387933,42.081014 -88.387333,42.081023 -88.38716,42.081217 -88.385994,42.081818 -88.385918,42.081707 -88.384331,42.081718 -88.38429,42.080535 -88.384276,42.075662 -88.384169,42.070981 -88.39102,42.072757 -88.393949,42.073477 -88.393949,42.074137 -88.393993,42.074678 -88.394174,42.074552 -88.396405,42.073764 -88.397132,42.073504 -88.397225,42.07344 -88.397729,42.072771 -88.39789,42.072503 -88.393929,42.072575 -88.393941,42.07301 -88.391142,42.072287 -88.384206,42.070445 -88.384132,42.068055 -88.384122,42.067234 -88.384122,42.066887 -88.384122,42.066852 -88.383493,42.066858 -88.385836,42.06319 -88.386149,42.063389 -88.386601,42.062654 -88.386662,42.062536 -88.387362,42.062851 -88.387301,42.062973 -88.386887,42.063729 -88.387441,42.064056 -88.385848,42.066834 -88.385821,42.066882 -88.387538,42.066877 -88.387567,42.067865 -88.391141,42.067878 -88.393826,42.067894 -88.393822,42.068616 -88.393858,42.069961 -88.396875,42.069895 -88.396731,42.066965 -88.396724,42.066818 -88.39625,42.066815 -88.394301,42.066207 -88.392555,42.065479 -88.392593,42.06535 -88.39335,42.063678 -88.402185,42.065304 -88.405686,42.066304 -88.405596,42.065903 -88.405348,42.064768 -88.402374,42.064178 -88.402374,42.06451 -88.395272,42.063412 -88.386734,42.061881 -88.3867,42.060834 -88.38473,42.060873 -88.384701,42.061602 -88.384697,42.061737 -88.381117,42.06028 -88.38102,42.060241 -88.381065,42.060097 -88.381662,42.058982 -88.382345,42.057821 -88.380613,42.057488 -88.379509,42.056911 -88.37921,42.056822 -88.378007,42.058763 -88.377953,42.058886 -88.376488,42.058238 -88.376487,42.0581 -88.376336,42.05805 -88.376292,42.053444 -88.376193,42.050445 -88.376177,42.05031 -88.369872,42.05031 -88.370178,42.04925 -88.363468,42.04925 -88.363443,42.048909 -88.359928,42.048754 -88.358723,42.048701 -88.359151,42.046603 -88.359143,42.046601 -88.359233,42.04629 -88.359212,42.04604 -88.35913,42.045009 -88.358601,42.045133 -88.356856,42.044921 -88.357033,42.044386 -88.357173,42.044057 -88.35921,42.038133 -88.356822,42.037627 -88.355314,42.037269 -88.354947,42.037182 -88.354953,42.037739 -88.354957,42.038021 -88.354052,42.039781 -88.353803,42.03978 -88.353367,42.040576 -88.353652,42.040686 -88.354126,42.039789 -88.355855,42.039879 -88.354596,42.042295 -88.354715,42.042327 -88.354817,42.042401 -88.354638,42.042897 -88.354406,42.042818 -88.352673,42.042512 -88.353268,42.041321 -88.353324,42.041221 -88.35299,42.041079 -88.352901,42.04122 -88.350843,42.040656 -88.350549,42.039895 -88.350324,42.039945 -88.349678,42.039945 -88.349182,42.039841 -88.348708,42.039635 -88.348278,42.039377 -88.347955,42.039107 -88.347879,42.038939 -88.347621,42.039016 -88.346651,42.038398 -88.346234,42.038398 -88.346264,42.036939 -88.344934,42.036766 -88.342196,42.036405 -88.341988,42.036887 -88.341976,42.037084 -88.342644,42.037136 -88.342626,42.037319 -88.342527,42.037785 -88.342099,42.037757 -88.342014,42.038877 -88.342776,42.038855 -88.342793,42.038946 -88.341094,42.038908 -88.341103,42.039688 -88.341125,42.041754 -88.341115,42.043951 -88.338435,42.043935 -88.337628,42.043964 -88.336626,42.043943 -88.335856,42.043895 -88.335536,42.043877 -88.335238,42.043809 -88.333337,42.043247 -88.3328,42.043773 -88.333034,42.043852 -88.335438,42.044668 -88.336861,42.045116 -88.337794,42.04552 -88.339065,42.046367 -88.339631,42.046743 -88.34009,42.04705 -88.341144,42.047723 -88.341143,42.049981 -88.341055,42.050198 -88.34313,42.050332 -88.343105,42.048972 -88.343951,42.049555 -88.345205,42.050456 -88.345321,42.050538 -88.348329,42.052669 -88.34879,42.053005 -88.349563,42.053433 -88.350293,42.053606 -88.350135,42.056259 -88.35005,42.057544 -88.350763,42.057569 -88.351148,42.057671 -88.351514,42.057986 -88.352577,42.058785 -88.352928,42.05904 -88.353252,42.059255 -88.353483,42.059442 -88.353452,42.060378 -88.353384,42.060405 -88.353256,42.060492 -88.353133,42.060523 -88.352981,42.060572 -88.352797,42.060608 -88.352567,42.060662 -88.352273,42.060684 -88.351184,42.060815 -88.351067,42.060814 -88.350909,42.060819 -88.350795,42.060888 -88.35054,42.060816 -88.350294,42.060756 -88.349859,42.060662 -88.349443,42.060588 -88.349053,42.060533 -88.34853,42.060472 -88.336791,42.059263 -88.33558,42.059139 -88.335372,42.059117 -88.334194,42.058996 -88.332265,42.058798 -88.332032,42.058773 -88.330984,42.058662 -88.327556,42.058307 -88.327202,42.058271 -88.317193,42.057234 -88.317151,42.05723 -88.315887,42.057104 -88.315371,42.057048 -88.31537,42.057491 -88.317403,42.057668 -88.317795,42.057703 -88.31778,42.058086 -88.317779,42.05812 -88.31555,42.058159 -88.315394,42.058149 -88.315429,42.058264 -88.315425,42.058397 -88.318544,42.058337 -88.320897,42.058396 -88.320627,42.058297 -88.320621,42.058081 -88.320966,42.058078 -88.321364,42.058083 -88.321763,42.058095 -88.322254,42.058115 -88.322903,42.058157 -88.324122,42.05827 -88.324992,42.058364 -88.325912,42.058456 -88.327528,42.058622 -88.335403,42.059433 -88.335246,42.061675 -88.336066,42.061763 -88.335996,42.06209 -88.333515,42.062004 -88.332224,42.061979 -88.332021,42.063325 -88.333217,42.063874 -88.335651,42.065052 -88.337623,42.065961 -88.339729,42.066929 -88.34049,42.066143 -88.341044,42.064859 -88.341085,42.064392 -88.34114,42.063344 -88.341191,42.060032 -88.341566,42.060072 -88.341986,42.060126 -88.342431,42.060196 -88.342677,42.060241 -88.342975,42.060302 -88.343051,42.060318 -88.343564,42.060444 -88.34394,42.060547 -88.344168,42.060618 -88.344612,42.060768 -88.34529,42.061021 -88.345597,42.061143 -88.346174,42.061356 -88.346388,42.061427 -88.346941,42.061581 -88.347093,42.061615 -88.347576,42.061712 -88.347774,42.061742 -88.348167,42.061792 -88.348505,42.061819 -88.348919,42.061835 -88.349334,42.061834 -88.349582,42.061825 -88.349784,42.061813 -88.350049,42.061792 -88.350424,42.061751 -88.350437,42.061749 -88.350646,42.061716 -88.350884,42.061673 -88.351177,42.061614 -88.351449,42.061553 -88.351925,42.061423 -88.352124,42.061359 -88.352117,42.061461 -88.3527,42.06172 -88.353497,42.062165 -88.353889,42.062422 -88.3541,42.062568 -88.354462,42.062847 -88.355011,42.063365 -88.355435,42.063872 -88.355607,42.064115 -88.355607,42.064203 -88.355622,42.064254 -88.355651,42.064303 -88.355687,42.06438 -88.351938,42.064349 -88.35193,42.064494 -88.355687,42.064534 -88.355715,42.064646 -88.35574,42.064675 -88.354315,42.064701 -88.354397,42.066828 -88.353396,42.066835 -88.353343,42.072451 -88.35335,42.072579 -88.352028,42.072642 -88.351223,42.072534 -88.350768,42.072386 -88.350574,42.075209 -88.352422,42.075198 -88.352422,42.076985 -88.354902,42.076986 -88.355132,42.07694 -88.355128,42.078902 -88.355127,42.079325 -88.354859,42.079321 -88.3493,42.079302 -88.345992,42.079143 -88.345991,42.081655 -88.346013,42.081814 -88.345157,42.081809 -88.33914,42.081777 -88.33912,42.08163 -88.338665,42.081658 -88.338212,42.081668 -88.337845,42.081349 -88.337478,42.080984 -88.337213,42.08062 -88.336927,42.080088 -88.336849,42.079907 -88.336764,42.079708 -88.3365,42.079163 -88.33601,42.078089 -88.335758,42.078997 -88.335708,42.079176 -88.335641,42.079761 -88.335671,42.080374 -88.335507,42.080313 -88.335193,42.080205 -88.335189,42.079866 -88.335187,42.079795 -88.335154,42.078939 -88.335124,42.078156 -88.335008,42.078922 -88.334862,42.079844 -88.334548,42.079847 -88.331796,42.078615 -88.330235,42.077917 -88.325237,42.075795 -88.32153,42.074254 -88.321934,42.074176 -88.316847,42.071937 -88.316574,42.071827 -88.305775,42.06973 -88.297571,42.068109 -88.296704,42.067959 -88.296054,42.067704 -88.295011,42.067122 -88.294576,42.066732 -88.294336,42.066501 -88.29408,42.066529 -88.29373,42.066501 -88.293433,42.066451 -88.29318,42.066168 -88.292906,42.066002 -88.292552,42.065905 -88.292217,42.0659 -88.292079,42.065965 -88.292072,42.06645 -88.29206,42.066832 -88.29184,42.067332 -88.291342,42.068386 -88.291282,42.068516 -88.291089,42.069429 -88.291171,42.069725 -88.291335,42.070003 -88.295371,42.068475 -88.305624,42.070126 -88.305232,42.070937 -88.305783,42.070932 -88.306371,42.070937 -88.306512,42.070879 -88.306583,42.070674 -88.307494,42.07064 -88.307446,42.073415 -88.306111,42.073639 -88.301678,42.073882 -88.299587,42.074156 -88.296508,42.074055 -88.291631,42.073725 -88.291634,42.075377 -88.290381,42.075366 -88.29037,42.074744 -88.290069,42.074735 -88.289269,42.074718 -88.289244,42.074522 -88.289243,42.0744 -88.288186,42.074385 -88.288141,42.07403 -88.288126,42.073917 -88.287861,42.073917 -88.28774,42.073916 -88.287441,42.073917 -88.287209,42.073912 -88.287187,42.07415 -88.287177,42.0743 -88.286966,42.074298 -88.286734,42.074291 -88.286386,42.074286 -88.286021,42.074287 -88.286015,42.074746 -88.280851,42.074214 -88.277005,42.074102 -88.277005,42.07376 -88.277308,42.072808 -88.277201,42.069035 -88.277248,42.067244 -88.277247,42.066992 -88.274147,42.066991 -88.274149,42.070424 -88.274809,42.070782 -88.274799,42.071217 -88.274725,42.072364 -88.27477,42.072516 -88.27374,42.07244 -88.273738,42.07243 -88.27371,42.072377 -88.273604,42.07225 -88.273555,42.072182 -88.273504,42.072057 -88.273218,42.071547 -88.273143,42.071315 -88.273047,42.071112 -88.272998,42.070971 -88.272854,42.070734 -88.272705,42.070477 -88.272392,42.07005 -88.272338,42.069966 -88.272285,42.069814 -88.272144,42.069532 -88.27213,42.069435 -88.271949,42.069221 -88.2719,42.06913 -88.27176,42.068785 -88.27171,42.068619 -88.271694,42.068515 -88.2717,42.068377 -88.271736,42.068166 -88.271772,42.06805 -88.271773,42.067823 -88.271801,42.067791 -88.271866,42.067766 -88.271911,42.067758 -88.272022,42.067776 -88.272068,42.06779 -88.272134,42.067825 -88.272168,42.067824 -88.272203,42.067802 -88.272238,42.067786 -88.272311,42.067775 -88.272332,42.067759 -88.272386,42.067649 -88.272394,42.067594 -88.272385,42.067562 -88.272351,42.067543 -88.272273,42.067535 -88.272173,42.067554 -88.272124,42.067553 -88.272093,42.06754 -88.27208,42.067516 -88.272073,42.067437 -88.272059,42.067381 -88.272059,42.067335 -88.272111,42.067239 -88.272291,42.066998 -88.272452,42.066939 -88.27252,42.066823 -88.272531,42.066791 -88.273029,42.066804 -88.277125,42.066828 -88.282065,42.066736 -88.285907,42.066704 -88.286629,42.067229 -88.289628,42.069441 -88.290209,42.069937 -88.290273,42.069542 -88.290279,42.069467 -88.290441,42.06861 -88.290468,42.068508 -88.290776,42.067118 -88.290945,42.066641 -88.29147,42.065931 -88.291668,42.06451 -88.291712,42.064088 -88.290728,42.064555 -88.289872,42.064963 -88.28967,42.065155 -88.288871,42.065656 -88.287621,42.065938 -88.28477,42.065913 -88.284481,42.065912 -88.282819,42.06591 -88.27854,42.065902 -88.278318,42.065901 -88.276996,42.065899 -88.273432,42.065892 -88.273262,42.065917 -88.272843,42.066032 -88.272458,42.066067 -88.272081,42.06607 -88.271133,42.066125 -88.270682,42.066041 -88.26974,42.065975 -88.269624,42.066072 -88.269539,42.066463 -88.269546,42.066537 -88.269414,42.06653 -88.269439,42.068329 -88.269646,42.069069 -88.270251,42.071235 -88.270282,42.071343 -88.266662,42.070998 -88.265904,42.070536 -88.265122,42.07041 -88.264916,42.070377 -88.263465,42.069233 -88.263219,42.068723 -88.26191,42.068396 -88.261715,42.068642 -88.261295,42.069321 -88.254289,42.06858 -88.254254,42.067227 -88.243644,42.067375 -88.243392,42.067052 -88.243467,42.067054 -88.243649,42.067055 -88.24442,42.067059 -88.244678,42.067061 -88.244986,42.067063 -88.245911,42.067069 -88.24622,42.067071 -88.246596,42.067073 -88.247491,42.067073 -88.248441,42.067073 -88.251307,42.067058 -88.252469,42.067053 -88.252579,42.067052 -88.252803,42.067051 -88.253475,42.067048 -88.253699,42.067047 -88.253718,42.067047 -88.253776,42.067047 -88.253796,42.067048 -88.254131,42.067025 -88.254249,42.067018 -88.254384,42.067009 -88.255138,42.066961 -88.255474,42.06694 -88.255828,42.066964 -88.256119,42.067198 -88.256613,42.067584 -88.257107,42.067768 -88.257304,42.06785 -88.257705,42.067882 -88.258218,42.067581 -88.258351,42.067297 -88.258351,42.066926 -88.258351,42.066821 -88.258352,42.06682 -88.258355,42.066598 -88.258355,42.066509 -88.258356,42.066497 -88.258357,42.066405 -88.258286,42.066235 -88.257303,42.066206 -88.257193,42.066203 -88.256589,42.066185 -88.253801,42.066225 -88.252634,42.066243 -88.251606,42.066274 -88.251103,42.06627 -88.246509,42.066237 -88.244978,42.066226 -88.244462,42.066218 -88.242914,42.066195 -88.242398,42.066188 -88.241654,42.066177 -88.241653,42.066072 -88.241652,42.065914 -88.241651,42.065879 -88.241643,42.064322 -88.241642,42.064153 -88.241635,42.063003 -88.241634,42.062814 -88.241633,42.062756 -88.241627,42.061715 -88.241622,42.060669 -88.241608,42.057531 -88.241604,42.056485 -88.241603,42.056201 -88.24167,42.053309 -88.241744,42.052211 -88.241782,42.051967 -88.241855,42.048744 -88.241669,42.048734 -88.241172,42.048708 -88.241094,42.046603 -88.241056,42.045289 -88.240683,42.045307 -88.240096,42.045314 -88.23953,42.045316 -88.23953,42.046474 -88.239678,42.046477 -88.239678,42.046617 -88.239693,42.048748 -88.238431,42.048767 -88.238311,42.048771 -88.238313,42.048725 -88.238339,42.047524 -88.238371,42.046842 -88.238413,42.046632 -88.238388,42.046212 -88.238378,42.046037 -88.238379,42.045321 -88.238368,42.044755 -88.238365,42.044515 -88.238281,42.044282 -88.238168,42.043743 -88.238088,42.040868 -88.238107,42.040437 -88.238127,42.040009 -88.238159,42.039147 -88.238167,42.038951 -88.238162,42.038717 -88.238154,42.038603 -88.23813,42.038263 -88.238123,42.03815 -88.238209,42.038148 -88.238469,42.038145 -88.238556,42.038144 -88.238539,42.038118 -88.238488,42.038043 -88.238472,42.038018 -88.238244,42.037536 -88.23756,42.036092 -88.237333,42.035611 -88.237455,42.035311 -88.237823,42.034412 -88.237946,42.034113 -88.237916,42.034049 -88.237826,42.033859 -88.237796,42.033796 -88.237671,42.033485 -88.237146,42.032364 -88.236272,42.030492 -88.236363,42.029712 -88.236637,42.027373 -88.236647,42.027292 -88.236729,42.026594 -88.236374,42.026586 -88.236381,42.026422 -88.236402,42.026005 -88.236203,42.025994 -88.236174,42.026353 -88.235595,42.026302 -88.235078,42.026258 -88.234984,42.027128 -88.234702,42.029738 -88.234608,42.030608 -88.234584,42.030609 -88.234478,42.030612 -88.234275,42.030618 -88.234088,42.030615 -88.233958,42.030614 -88.233809,42.030608 -88.233364,42.030591 -88.233296,42.030589 -88.233216,42.030582 -88.233287,42.029991 -88.23333,42.029637 -88.232242,42.02956 -88.232219,42.029893 -88.23218,42.030487 -88.231694,42.030442 -88.230752,42.030357 -88.230353,42.030313 -88.230239,42.0303 -88.230068,42.030282 -88.229908,42.030272 -88.229753,42.030272 -88.229703,42.030265 -88.229288,42.03023 -88.228901,42.03019 -88.228811,42.030176 -88.228758,42.030167 -88.228565,42.030151 -88.228693,42.029896 -88.22886,42.029596 -88.229105,42.029098 -88.229325,42.028568 -88.229425,42.028215 -88.230467,42.024848 -88.23086,42.023127 -88.230876,42.023026 -88.230156,42.022985 -88.227996,42.022865 -88.227276,42.022826 -88.226446,42.022134 -88.223956,42.020061 -88.223127,42.019371 -88.223056,42.019312 -88.222843,42.019135 -88.222773,42.019076 -88.223117,42.018925 -88.224148,42.018472 -88.224493,42.018322 -88.225411,42.017917 -88.228165,42.016705 -88.229084,42.016302 -88.228963,42.016246 -88.228603,42.016079 -88.228483,42.016024 -88.228363,42.015969 -88.227974,42.015791 -88.227929,42.015774 -88.227462,42.015598 -88.226922,42.015431 -88.22672,42.01537 -88.226366,42.015268 -88.226191,42.015227 -88.22592,42.015165 -88.225628,42.015109 -88.225596,42.015106 -88.22556,42.015102 -88.225453,42.015093 -88.225418,42.01509 -88.225431,42.014839 -88.225473,42.014089 -88.225487,42.013839 -88.225521,42.013223 -88.225625,42.011378 -88.22565,42.010943 -88.225645,42.010763 -88.225631,42.010098 -88.225618,42.009421 -88.226189,42.008868 -88.226709,42.008879 -88.227374,42.008894 -88.227956,42.008906 -88.228518,42.008919 -88.22854,42.009884 -88.228546,42.010103 -88.22856,42.010686 -88.228619,42.01109 -88.229287,42.013028 -88.229448,42.013567 -88.231263,42.014506 -88.232613,42.014214 -88.232289,42.01487 -88.232619,42.014719 -88.232698,42.01472 -88.233099,42.014728 -88.233413,42.013195 -88.233417,42.013175 -88.23377,42.011449 -88.235146,42.004727 -88.23954,42.006148 -88.242875,42.007227 -88.24308,42.006978 -88.243176,42.006726 -88.241907,42.006248 -88.239178,42.005221 -88.239378,42.00482 -88.237969,42.004269 -88.237579,42.004117 -88.23768,42.002915 -88.237629,42.002915 -88.237438,42.002922 -88.237019,42.002939 -88.236713,42.002954 -88.236472,42.002966 -88.236479,42.002932 -88.2365,42.002831 -88.236508,42.002798 -88.236821,42.001096 -88.237276,41.998627 -88.236876,41.998527 -88.236864,41.997534 -88.236849,41.996259 -88.236829,41.994529 -88.236787,41.994529 -88.236662,41.994529 -88.236621,41.99453 -88.236642,41.994446 -88.236705,41.994197 -88.236727,41.994115 -88.236058,41.994127 -88.235627,41.994136 -88.235527,41.994138 -88.234051,41.994164 -88.233383,41.994176 -88.232861,41.994184 -88.232764,41.994186 -88.232273,41.994194 -88.231298,41.99421 -88.230777,41.99422 -88.230414,41.994226 -88.229969,41.994234 -88.229327,41.994244 -88.228965,41.994251 -88.228744,41.994254 -88.228084,41.994265 -88.227864,41.994269 -88.227859,41.993915 -88.227844,41.993622 -88.227834,41.993404 -88.22782,41.992753 -88.227815,41.99168 -88.227813,41.991033 -88.228386,41.991032 -88.22911,41.991031 -88.229184,41.991031 -88.229258,41.991031 -88.229389,41.991031 -88.230217,41.99103 -88.231355,41.99103 -88.231494,41.99103 -88.231634,41.99103 -88.232461,41.991029 -88.232475,41.991027 -88.232475,41.991366 -88.232475,41.991827 -88.233074,41.991599 -88.233079,41.99159 -88.233117,41.991552 -88.233164,41.991518 -88.233242,41.991479 -88.233643,41.991341 -88.234155,41.991172 -88.234562,41.991021 -88.234575,41.991017 -88.234567,41.990673 -88.234531,41.98913 -88.234475,41.986727 -88.234501,41.986725 -88.234582,41.986721 -88.234609,41.986721 -88.234619,41.98672 -88.234652,41.986718 -88.234664,41.986718 -88.234678,41.986717 -88.234722,41.986715 -88.234737,41.986715 -88.234774,41.986713 -88.234885,41.986708 -88.234923,41.986707 -88.235319,41.986689 -88.236508,41.986638 -88.236774,41.986627 -88.236905,41.986626 -88.236903,41.986879 -88.236894,41.988123 -88.236862,41.992615 -88.236852,41.994113 -88.236864,41.994022 -88.2369,41.99375 -88.236913,41.99366 -88.237062,41.993661 -88.237512,41.993666 -88.237662,41.993668 -88.237684,41.993753 -88.237751,41.994008 -88.237774,41.994094 -88.237853,41.994092 -88.238093,41.994087 -88.238173,41.994086 -88.238515,41.994078 -88.238694,41.994075 -88.239541,41.994057 -88.239803,41.994052 -88.239884,41.994051 -88.240319,41.994043 -88.241625,41.99402 -88.242061,41.994013 -88.242147,41.994011 -88.242387,41.994007 -88.242407,41.994006 -88.242494,41.994005 -88.242627,41.994002 -88.243027,41.993995 -88.243161,41.993993 -88.243464,41.993987 -88.244039,41.993975 -88.244529,41.993966 -88.245927,41.993938 -88.246676,41.993927 -88.247555,41.993915 -88.24753,41.994038 -88.24752,41.994425 -88.247511,41.994589 -88.247412,41.99662 -88.247379,41.997298 -88.247355,41.998048 -88.247336,41.998459 -88.247178,42.001944 -88.247126,42.003106 -88.247094,42.00376 -88.247067,42.004343 -88.24704,42.00491 -88.247014,42.005695 -88.247012,42.005723 -88.246982,42.006378 -88.246966,42.006717 -88.24693,42.007484 -88.246921,42.007736 -88.24691,42.008076 -88.247123,42.008133 -88.247236,42.008164 -88.247648,42.008275 -88.247682,42.008283 -88.247765,42.008302 -88.247981,42.008354 -88.247979,42.008454 -88.247979,42.008517 -88.247978,42.00857 -88.248,42.008753 -88.248012,42.008853 -88.25042,42.009763 -88.251323,42.010112 -88.252994,42.010741 -88.254596,42.011362 -88.256605,42.012121 -88.257378,42.012326 -88.258101,42.012451 -88.258763,42.012495 -88.259762,42.012514 -88.260633,42.012429 -88.261906,42.012197 -88.262976,42.011986 -88.263372,42.011916 -88.263371,42.011939 -88.263276,42.013816 -88.263278,42.013859 -88.263282,42.01395 -88.263283,42.013967 -88.263572,42.015417 -88.264565,42.01541 -88.265877,42.015026 -88.266077,42.015026 -88.266069,42.014758 -88.267645,42.01499 -88.267671,42.014526 -88.267877,42.014526 -88.268503,42.014529 -88.268503,42.014284 -88.26859,42.01429 -88.268597,42.014035 -88.268685,42.012973 -88.268699,42.012795 -88.268838,42.012807 -88.269343,42.012816 -88.269329,42.012349 -88.269372,42.012364 -88.269574,42.01245 -88.269839,42.012569 -88.269995,42.012639 -88.27025,42.012766 -88.270674,42.013006 -88.270894,42.013144 -88.271335,42.013455 -88.271601,42.013663 -88.271833,42.013863 -88.272215,42.014229 -88.272391,42.014419 -88.272577,42.014657 -88.272727,42.01485 -88.273008,42.015275 -88.273181,42.015579 -88.273244,42.015583 -88.274139,42.015633 -88.274956,42.015687 -88.278374,42.015647 -88.279605,42.015649 -88.279767,42.015429 -88.280006,42.012842 -88.280072,42.012602 -88.28018,42.012226 -88.280773,42.01223 -88.28103,42.012239 -88.28286,42.012288 -88.285076,42.012329 -88.287678,42.012159 -88.287966,42.011883 -88.285188,42.011966 -88.286338,42.01018 -88.288438,42.010248 -88.288274,42.010715 -88.289036,42.010861 -88.28861,42.011268 -88.29009,42.011479 -88.290016,42.012291 -88.289999,42.012542 -88.291519,42.012509 -88.294334,42.012609 -88.294538,42.012608 -88.300223,42.012646 -88.301987,42.012685 -88.302014,42.012211 -88.302116,42.010337 -88.302108,42.005924 -88.302102,42.005734 -88.307636,42.005715 -88.31137,42.005628 -88.311354,42.006093 -88.311354,42.006253 -88.31517,42.006323 -88.315109,42.006936 -88.315905,42.006898 -88.316211,42.00688 -88.316714,42.006868 -88.318015,42.006836 -88.318014,42.007176 -88.316164,42.009356 -88.31497,42.009304 -88.314963,42.009477 -88.31492,42.010026 -88.314896,42.010333 -88.321317,42.010324 -88.321414,42.008824 -88.321333,42.00733 -88.321115,42.006756 -88.321232,42.006757 -88.321425,42.006758 -88.321919,42.006771 -88.326283,42.007259 -88.326305,42.007183 -88.326322,42.005667 -88.326235,42.001183 -88.326284,42.000302 -88.326588,42.000226 -88.327617,42.000112 -88.327503,41.99602 -88.327472,41.995144 -88.327355,41.992438 -88.328885,41.992437 -88.330973,41.992415 -88.33099,41.990577 -88.330992,41.989214 -88.331015,41.987861 -88.331027,41.987379 -88.331024,41.986837 -88.331037,41.986284 -88.331033,41.98585 -88.331035,41.985645 -88.331153,41.985516 -88.331367,41.98535 -88.331415,41.985336 -88.332838,41.986351 -88.333175,41.986619 -88.334487,41.987546 -88.335643,41.988199 -88.336856,41.988836 -88.336982,41.988902 -88.338867,41.989828 -88.340794,41.990763 -88.340785,41.992044 -88.340784,41.992228 -88.340772,41.992282 -88.340731,41.992474 -88.343969,41.992488 -88.349965,41.995288 -88.350537,41.995631 -88.350154,41.995636 -88.350299,41.999701 -88.35161,41.999657 -88.35161,41.998877 -88.352822,41.998815 -88.352753,41.996484 -88.350948,41.995739 -88.351155,41.995623 -88.353077,41.996406 -88.353172,41.999605 -88.354723,41.999569 -88.362075,41.999634 -88.362362,41.999737 -88.370089,42.002519 -88.370303,42.002638 -88.371773,42.003236 -88.372832,42.003593 -88.374017,42.003999 -88.375885,42.00459 -88.378242,42.005169 -88.378528,42.005239 -88.379521,42.005452 -88.380371,42.005686 -88.3813,42.00591 -88.382292,42.006147 -88.38289,42.006333 -88.382909,42.006513 -88.382523,42.006426 -88.380923,42.006456 -88.375982,42.006595 -88.37414,42.006637 -88.370079,42.006732 -88.370074,42.006554 -88.370085,42.003481 -88.364079,42.00254 -88.359962,42.002634 -88.359961,42.002615 -88.356758,42.002815 -88.356758,42.003122 -88.356758,42.00324 -88.356897,42.006557 -88.36039,42.00655 -88.360391,42.006685 -88.360528,42.006683 -88.360567,42.008069 -88.360687,42.011622 -88.36068,42.012587 -88.363691,42.014344 -88.365371,42.015217 -88.36735,42.016204 -88.369942,42.017349 -88.371047,42.017844 -88.370863,42.013518 -88.371316,42.013631 -88.375964,42.014598 -88.375934,42.013006 -88.378716,42.013007 -88.383605,42.012991 -88.38414,42.012984 -88.384165,42.012998 -88.384196,42.013005 -88.38423,42.013005 -88.384284,42.012997 -88.384411,42.012994 -88.384806,42.012991 -88.384806,42.013265 -88.384815,42.013822 -88.382319,42.016202 -88.378343,42.019993 -88.382894,42.021032 -88.382927,42.02104 -88.382826,42.021122 -88.382911,42.021226 -88.378777,42.024587 -88.376333,42.026751 -88.376246,42.026829 -88.375445,42.027549 -88.374677,42.028218 -88.376248,42.029323 -88.377469,42.030181 -88.37625,42.031314 -88.377925,42.032189 -88.381538,42.034127 -88.381753,42.033909 -88.382157,42.033533 -88.384078,42.031749 -88.384527,42.031894 -88.385542,42.030739 -88.389146,42.031344 -88.389231,42.031448 -88.388677,42.031896 -88.383851,42.035182 -88.382341,42.036309 -88.382042,42.036638 -88.381952,42.036542 -88.381778,42.036734 -88.381646,42.037034 -88.381769,42.037088 -88.381613,42.037431 -88.381601,42.037875 -88.381478,42.037821 -88.380014,42.037821 -88.380014,42.039121 -88.381458,42.039121 -88.381593,42.039123 -88.381575,42.040335 -88.38144,42.040333 -88.379515,42.040333 -88.379508,42.041412 -88.37626,42.041418 -88.376261,42.041907 -88.373909,42.041907 -88.373254,42.042766 -88.373209,42.042893 -88.37118,42.042169 -88.370102,42.042852 -88.369158,42.044007 -88.366912,42.043798 -88.36482,42.044783 -88.362698,42.047529 -88.362642,42.047522 -88.362626,42.047641 -88.362958,42.048285 -88.371888,42.048247 -88.371735,42.049212 -88.376119,42.049212 -88.376106,42.048594 -88.376241,42.048593 -88.377022,42.048838 -88.386641,42.051805 -88.386641,42.053012 -88.390494,42.052949 -88.390434,42.047871 -88.390575,42.047782 -88.391258,42.048099 -88.391576,42.04827 -88.391512,42.048388 -88.390922,42.049135 -88.391892,42.049665 -88.392548,42.048967 -88.392615,42.04885 -88.393394,42.049296 -88.394681,42.050033 -88.395593,42.050554 -88.396488,42.051049 -88.396918,42.051233 -88.39782,42.051547 -88.398342,42.051744 -88.398773,42.051953 -88.399191,42.052193 -88.399916,42.052717 -88.399837,42.052826 -88.399184,42.053457 -88.400754,42.05458 -88.401569,42.053992 -88.401619,42.053867 -88.401689,42.053902 -88.402014,42.054033 -88.403844,42.054658 -88.404541,42.054977 -88.40509,42.055277 -88.405168,42.055341 -88.405172,42.055336 -88.405684,42.055704 -88.405597,42.055806 -88.404066,42.056931 -88.40668,42.056959 -88.410949,42.056956 -88.410949,42.053484 -88.410841,42.045857 -88.410858,42.045723 -88.411624,42.045817 -88.416723,42.04647 -88.416706,42.046604 -88.416415,42.047754 -88.418676,42.04806 -88.418918,42.046888 -88.418935,42.046754 -88.42009,42.046903 -88.42032,42.046931 -88.420792,42.046998 -88.420791,42.047132 -88.42099,42.054157 -88.421258,42.054267 -88.421466,42.054359 -88.421522,42.054392 -88.4216,42.054413 -88.421737,42.054465 -88.421845,42.054521 -88.421984,42.054577 -88.422083,42.054626 -88.422514,42.054817 -88.422691,42.054886 -88.423058,42.055045 -88.423574,42.055281 -88.424267,42.055579 -88.425025,42.055952 -88.425152,42.055994 -88.425313,42.056041 -88.425477,42.056073 -88.425626,42.056089 -88.425798,42.056102 -88.426104,42.056086 -88.426476,42.056084 -88.426782,42.056095 -88.42709,42.056087 -88.427704,42.056064 -88.427876,42.056053 -88.428159,42.056053 -88.428234,42.056048 -88.428333,42.056051 -88.428375,42.056062 -88.428418,42.056056 -88.42847,42.056041 -88.428809,42.056037 -88.428945,42.056012 -88.429004,42.056012 -88.42906,42.056019 -88.429098,42.05604 -88.429131,42.056033 -88.429164,42.056021 -88.429206,42.056026 -88.429468,42.056029 -88.429545,42.05604 -88.429581,42.056029 -88.429635,42.056019 -88.429689,42.056024 -88.429919,42.056027 -88.43,42.056017 -88.430305,42.056027 -88.434257,42.056056 -88.440394,42.055924 -88.440403,42.056434 -88.440403,42.057586 -88.444735,42.057549 -88.444725,42.056005 -88.44485,42.056008 -88.449641,42.056029 -88.454895,42.055962 -88.455197,42.055962 -88.455156,42.060507 -88.455113,42.063024</coordinates>
109
+ </LinearRing>
110
+ </outerBoundaryIs>
111
+ <innerBoundaryIs>
112
+ <LinearRing>
113
+ <coordinates>-88.348417,41.995659 -88.345457,41.995698 -88.345372,41.994222 -88.345344,41.993811 -88.344024,41.993067 -88.340572,41.99302 -88.340505,41.993204 -88.340239,41.993728 -88.339888,41.994234 -88.339416,41.99474 -88.338567,41.995376 -88.338473,41.995789 -88.338008,41.995795 -88.335763,41.995831 -88.334925,41.995853 -88.33493,41.996004 -88.334972,42.00001 -88.335997,42.000195 -88.348515,41.99976 -88.348417,41.995659</coordinates>
114
+ </LinearRing>
115
+ </innerBoundaryIs>
116
+ <innerBoundaryIs>
117
+ <LinearRing>
118
+ <coordinates>-88.341559,42.007102 -88.341245,42.007109 -88.339562,42.007145 -88.339481,42.00763 -88.339586,42.008358 -88.341559,42.008355 -88.341559,42.007102</coordinates>
119
+ </LinearRing>
120
+ </innerBoundaryIs>
121
+ <innerBoundaryIs>
122
+ <LinearRing>
123
+ <coordinates>-88.337358,42.011968 -88.33625,42.011983 -88.336273,42.013893 -88.337428,42.013889 -88.337358,42.011968</coordinates>
124
+ </LinearRing>
125
+ </innerBoundaryIs>
126
+ <innerBoundaryIs>
127
+ <LinearRing>
128
+ <coordinates>-88.258238,42.014626 -88.257767,42.01461 -88.257211,42.014999 -88.257164,42.015033 -88.257466,42.015326 -88.257627,42.015326 -88.258111,42.015326 -88.258273,42.015326 -88.258286,42.014847 -88.258292,42.01466 -88.258298,42.014623 -88.258238,42.014626</coordinates>
129
+ </LinearRing>
130
+ </innerBoundaryIs>
131
+ <innerBoundaryIs>
132
+ <LinearRing>
133
+ <coordinates>-88.36381,42.020622 -88.360144,42.020716 -88.352134,42.020921 -88.345852,42.021598 -88.345815,42.022974 -88.344182,42.022994 -88.34425,42.025058 -88.344244,42.025336 -88.344315,42.025549 -88.344544,42.02573 -88.344673,42.026018 -88.344558,42.026221 -88.344387,42.026477 -88.344301,42.026594 -88.344315,42.026679 -88.344344,42.026807 -88.343787,42.027575 -88.343093,42.028479 -88.342444,42.029879 -88.34188,42.031075 -88.341854,42.031173 -88.341854,42.031268 -88.341884,42.031369 -88.341896,42.03139 -88.341661,42.031391 -88.341263,42.032446 -88.342062,42.032807 -88.343199,42.033378 -88.345137,42.029405 -88.348995,42.030312 -88.348255,42.032223 -88.348047,42.032676 -88.347211,42.032795 -88.346087,42.034439 -88.34658,42.0346 -88.348244,42.03512 -88.348794,42.035287 -88.34932,42.035441 -88.350605,42.035804 -88.356425,42.030763 -88.356817,42.03054 -88.362266,42.026743 -88.362927,42.026335 -88.36332,42.026087 -88.363872,42.025738 -88.36381,42.020622</coordinates>
134
+ </LinearRing>
135
+ </innerBoundaryIs>
136
+ <innerBoundaryIs>
137
+ <LinearRing>
138
+ <coordinates>-88.339294,42.021861 -88.336585,42.021856 -88.33631,42.021854 -88.336374,42.023126 -88.33664,42.023127 -88.339367,42.023138 -88.33937,42.023117 -88.339402,42.022615 -88.339318,42.021942 -88.339294,42.021861</coordinates>
139
+ </LinearRing>
140
+ </innerBoundaryIs>
141
+ <innerBoundaryIs>
142
+ <LinearRing>
143
+ <coordinates>-88.336212,42.032202 -88.33619,42.031865 -88.336163,42.031539 -88.335841,42.030933 -88.335243,42.030653 -88.335152,42.028947 -88.335146,42.028915 -88.335118,42.028915 -88.335178,42.028009 -88.335145,42.027214 -88.334079,42.027195 -88.333802,42.027186 -88.333802,42.026758 -88.333795,42.026067 -88.333802,42.02523 -88.333036,42.02524 -88.332972,42.026245 -88.332657,42.026236 -88.33271,42.025244 -88.332455,42.025251 -88.33204,42.025262 -88.331381,42.025263 -88.331379,42.025703 -88.330703,42.025701 -88.330431,42.025702 -88.330431,42.025935 -88.330011,42.025935 -88.330007,42.025712 -88.329327,42.025709 -88.32931,42.025292 -88.328949,42.025297 -88.328562,42.025302 -88.326517,42.025331 -88.32471,42.025356 -88.324372,42.025395 -88.324067,42.025382 -88.321683,42.025415 -88.321054,42.025428 -88.321004,42.025461 -88.320426,42.025441 -88.320402,42.025444 -88.320346,42.025463 -88.320031,42.025478 -88.32,42.025632 -88.320249,42.026039 -88.320462,42.026105 -88.32168,42.026532 -88.32239,42.026781 -88.32251,42.029068 -88.324075,42.029042 -88.325263,42.029028 -88.325232,42.027759 -88.325224,42.027414 -88.326501,42.027855 -88.326728,42.027933 -88.32673,42.028254 -88.326729,42.028784 -88.327594,42.028847 -88.328331,42.029042 -88.328325,42.028906 -88.328314,42.028795 -88.328321,42.028483 -88.328598,42.028583 -88.328932,42.028694 -88.330067,42.02906 -88.33004,42.029197 -88.332031,42.029769 -88.332012,42.030071 -88.332014,42.030201 -88.331803,42.030181 -88.331907,42.032051 -88.331924,42.032215 -88.331362,42.032263 -88.33061,42.03233 -88.330069,42.032285 -88.330076,42.032395 -88.33008,42.032963 -88.329823,42.032957 -88.329826,42.033132 -88.331361,42.03295 -88.33136,42.033273 -88.329776,42.0334 -88.329894,42.034116 -88.331229,42.034239 -88.333792,42.034085 -88.336191,42.034021 -88.336212,42.032202</coordinates>
144
+ </LinearRing>
145
+ </innerBoundaryIs>
146
+ <innerBoundaryIs>
147
+ <LinearRing>
148
+ <coordinates>-88.363179,42.030645 -88.361209,42.034353 -88.364506,42.035293 -88.36641,42.035786 -88.36795,42.033888 -88.368307,42.033491 -88.368737,42.033071 -88.369101,42.032732 -88.369847,42.032073 -88.363179,42.030645</coordinates>
149
+ </LinearRing>
150
+ </innerBoundaryIs>
151
+ <innerBoundaryIs>
152
+ <LinearRing>
153
+ <coordinates>-88.330079,42.031226 -88.329379,42.031326 -88.329379,42.031626 -88.330076,42.031563 -88.330079,42.031226</coordinates>
154
+ </LinearRing>
155
+ </innerBoundaryIs>
156
+ <innerBoundaryIs>
157
+ <LinearRing>
158
+ <coordinates>-88.365716,42.037134 -88.363955,42.03931 -88.364522,42.039511 -88.365038,42.039687 -88.366709,42.037523 -88.365716,42.037134</coordinates>
159
+ </LinearRing>
160
+ </innerBoundaryIs>
161
+ <innerBoundaryIs>
162
+ <LinearRing>
163
+ <coordinates>-88.369555,42.039976 -88.36867,42.041006 -88.369153,42.041187 -88.370078,42.040186 -88.369555,42.039976</coordinates>
164
+ </LinearRing>
165
+ </innerBoundaryIs>
166
+ <innerBoundaryIs>
167
+ <LinearRing>
168
+ <coordinates>-88.320361,42.040955 -88.32003,42.040912 -88.319423,42.041943 -88.318262,42.041806 -88.318362,42.041244 -88.31844,42.040681 -88.316828,42.040449 -88.316849,42.040764 -88.316998,42.040746 -88.317001,42.040817 -88.316992,42.041004 -88.316866,42.041017 -88.316646,42.041015 -88.316636,42.041541 -88.316672,42.041942 -88.316245,42.041942 -88.316149,42.041957 -88.316178,42.042183 -88.316455,42.042183 -88.316471,42.042257 -88.316493,42.042416 -88.316527,42.042682 -88.315788,42.042662 -88.315797,42.042727 -88.315821,42.042922 -88.315713,42.042918 -88.315616,42.042915 -88.315506,42.043624 -88.31452,42.043603 -88.314273,42.043594 -88.314292,42.044186 -88.315868,42.044214 -88.316907,42.044209 -88.317121,42.04422 -88.317225,42.044232 -88.317226,42.043879 -88.317226,42.043594 -88.317241,42.043492 -88.317657,42.043593 -88.318745,42.043882 -88.318745,42.045491 -88.320438,42.045503 -88.320614,42.043552 -88.320602,42.043537 -88.320602,42.043514 -88.320623,42.043447 -88.320625,42.043274 -88.320653,42.042389 -88.320375,42.042343 -88.320372,42.042302 -88.320366,42.042285 -88.320615,42.04178 -88.320877,42.041247 -88.320976,42.041043 -88.320361,42.040955</coordinates>
169
+ </LinearRing>
170
+ </innerBoundaryIs>
171
+ <innerBoundaryIs>
172
+ <LinearRing>
173
+ <coordinates>-88.3298,42.0429 -88.3291,42.043907 -88.332441,42.043785 -88.3298,42.0429</coordinates>
174
+ </LinearRing>
175
+ </innerBoundaryIs>
176
+ <innerBoundaryIs>
177
+ <LinearRing>
178
+ <coordinates>-88.339729,42.066929 -88.339805,42.071036 -88.340504,42.071025 -88.341311,42.071006 -88.341308,42.071416 -88.343805,42.071515 -88.344219,42.071528 -88.344979,42.071542 -88.34672,42.071386 -88.346722,42.070369 -88.347617,42.070796 -88.3478,42.066872 -88.346506,42.070266 -88.346448,42.070409 -88.346191,42.070293 -88.346254,42.070146 -88.345363,42.06972 -88.342963,42.068548 -88.34267,42.068397 -88.342534,42.068331 -88.34005,42.067077 -88.339729,42.066929</coordinates>
179
+ </LinearRing>
180
+ </innerBoundaryIs>
181
+ <innerBoundaryIs>
182
+ <LinearRing>
183
+ <coordinates>-88.404352,42.068183 -88.402076,42.068482 -88.402017,42.068363 -88.401926,42.068182 -88.400534,42.068316 -88.399666,42.068559 -88.400156,42.069105 -88.400256,42.069224 -88.401763,42.071004 -88.40174,42.071085 -88.401685,42.071156 -88.401643,42.071211 -88.401542,42.071287 -88.401443,42.071405 -88.40138,42.071503 -88.401307,42.071694 -88.401248,42.071826 -88.401096,42.072084 -88.400981,42.0723 -88.400254,42.071666 -88.400368,42.071538 -88.399235,42.070788 -88.398974,42.071223 -88.398124,42.07257 -88.400096,42.07254 -88.400152,42.073817 -88.400322,42.077493 -88.404788,42.077493 -88.404691,42.075433 -88.404352,42.068183</coordinates>
184
+ </LinearRing>
185
+ </innerBoundaryIs>
186
+ <innerBoundaryIs>
187
+ <LinearRing>
188
+ <coordinates>-88.337251,42.069546 -88.335527,42.069562 -88.335512,42.070791 -88.33732,42.070798 -88.337251,42.069546</coordinates>
189
+ </LinearRing>
190
+ </innerBoundaryIs>
191
+ <innerBoundaryIs>
192
+ <LinearRing>
193
+ <coordinates>-88.349179,42.069895 -88.349185,42.071547 -88.349696,42.071791 -88.350259,42.072047 -88.350718,42.072244 -88.350777,42.072261 -88.350847,42.069955 -88.349179,42.069895</coordinates>
194
+ </LinearRing>
195
+ </innerBoundaryIs>
196
+ </Polygon>
197
+ </MultiGeometry>
198
+ </Placemark>
199
+ </Folder>
200
+ </Document>
201
+ </kml>
@@ -0,0 +1,100 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <kml xmlns="http://earth.google.com/kml/2.2">
3
+ <Document>
4
+ <name>Multi-Polygon</name>
5
+ <description><![CDATA[]]></description>
6
+ <Style id="style1">
7
+ <LineStyle>
8
+ <color>40000000</color>
9
+ <width>3</width>
10
+ </LineStyle>
11
+ <PolyStyle>
12
+ <color>73FF0000</color>
13
+ <fill>1</fill>
14
+ <outline>1</outline>
15
+ </PolyStyle>
16
+ </Style>
17
+ <Style id="style3">
18
+ <LineStyle>
19
+ <color>40000000</color>
20
+ <width>3</width>
21
+ </LineStyle>
22
+ <PolyStyle>
23
+ <color>73FF0000</color>
24
+ <fill>1</fill>
25
+ <outline>1</outline>
26
+ </PolyStyle>
27
+ </Style>
28
+ <Style id="style2">
29
+ <LineStyle>
30
+ <color>40000000</color>
31
+ <width>3</width>
32
+ </LineStyle>
33
+ <PolyStyle>
34
+ <color>73FF0000</color>
35
+ <fill>1</fill>
36
+ <outline>1</outline>
37
+ </PolyStyle>
38
+ </Style>
39
+ <Placemark>
40
+ <name>Colorado</name>
41
+ <description><![CDATA[]]></description>
42
+ <styleUrl>#style1</styleUrl>
43
+ <Polygon>
44
+ <outerBoundaryIs>
45
+ <LinearRing>
46
+ <tessellate>1</tessellate>
47
+ <coordinates>
48
+ -109.053040,41.002705,0.000000
49
+ -102.046509,41.006847,0.000000
50
+ -102.041016,36.991585,0.000000
51
+ -109.048920,36.997070,0.000000
52
+ -109.053040,41.002705,0.000000
53
+ </coordinates>
54
+ </LinearRing>
55
+ </outerBoundaryIs>
56
+ </Polygon>
57
+ </Placemark>
58
+ <Placemark>
59
+ <name>Paris</name>
60
+ <description><![CDATA[]]></description>
61
+ <styleUrl>#style3</styleUrl>
62
+ <Polygon>
63
+ <outerBoundaryIs>
64
+ <LinearRing>
65
+ <tessellate>1</tessellate>
66
+ <coordinates>
67
+ 1.593018,49.109837,0.000000
68
+ 1.571045,48.257599,0.000000
69
+ 3.186035,48.275883,0.000000
70
+ 3.186035,49.167339,0.000000
71
+ 1.593018,49.109837,0.000000
72
+ </coordinates>
73
+ </LinearRing>
74
+ </outerBoundaryIs>
75
+ </Polygon>
76
+ </Placemark>
77
+ <Placemark>
78
+ <name>Australia</name>
79
+ <description><![CDATA[]]></description>
80
+ <styleUrl>#style2</styleUrl>
81
+ <Polygon>
82
+ <outerBoundaryIs>
83
+ <LinearRing>
84
+ <tessellate>1</tessellate>
85
+ <coordinates>
86
+ 120.673828,-14.179186,0.000000
87
+ 107.534180,-25.918526,0.000000
88
+ 111.840820,-37.544579,0.000000
89
+ 148.183594,-44.559162,0.000000
90
+ 157.543945,-30.789038,0.000000
91
+ 148.051758,-10.617418,0.000000
92
+ 135.131836,-9.188870,0.000000
93
+ 120.673828,-14.179186,0.000000
94
+ </coordinates>
95
+ </LinearRing>
96
+ </outerBoundaryIs>
97
+ </Polygon>
98
+ </Placemark>
99
+ </Document>
100
+ </kml>
metadata ADDED
@@ -0,0 +1,128 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: border_patrol-sgonyea
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Zach Brock
9
+ - Matt Wilson
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+ date: 2011-07-06 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: nokogiri
17
+ requirement: !ruby/object:Gem::Requirement
18
+ none: false
19
+ requirements:
20
+ - - ! '>='
21
+ - !ruby/object:Gem::Version
22
+ version: 1.4.3.1
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ none: false
27
+ requirements:
28
+ - - ! '>='
29
+ - !ruby/object:Gem::Version
30
+ version: 1.4.3.1
31
+ - !ruby/object:Gem::Dependency
32
+ name: rake
33
+ requirement: !ruby/object:Gem::Requirement
34
+ none: false
35
+ requirements:
36
+ - - ! '>='
37
+ - !ruby/object:Gem::Version
38
+ version: '0'
39
+ type: :development
40
+ prerelease: false
41
+ version_requirements: !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - ! '>='
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ - !ruby/object:Gem::Dependency
48
+ name: rspec
49
+ requirement: !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: 2.6.0
55
+ type: :development
56
+ prerelease: false
57
+ version_requirements: !ruby/object:Gem::Requirement
58
+ none: false
59
+ requirements:
60
+ - - ~>
61
+ - !ruby/object:Gem::Version
62
+ version: 2.6.0
63
+ description: Lets you import a KML file and then check if points are inside or outside
64
+ region polygons defined by the file.
65
+ email: eng@squareup.com
66
+ executables: []
67
+ extensions: []
68
+ extra_rdoc_files: []
69
+ files:
70
+ - .gitignore
71
+ - .rspec
72
+ - Gemfile
73
+ - LICENSE.txt
74
+ - README.markdown
75
+ - Rakefile
76
+ - border_patrol.gemspec
77
+ - lib/border_patrol-sgonyea.rb
78
+ - lib/border_patrol.rb
79
+ - lib/border_patrol/polygon.rb
80
+ - lib/border_patrol/region.rb
81
+ - lib/border_patrol/version.rb
82
+ - script/benchmark.rb
83
+ - script/ci
84
+ - spec/lib/border_patrol/polygon_spec.rb
85
+ - spec/lib/border_patrol/region_spec.rb
86
+ - spec/lib/border_patrol_spec.rb
87
+ - spec/spec_helper.rb
88
+ - spec/support/colorado-test.kml
89
+ - spec/support/elgin-opengis-ns-test.kml
90
+ - spec/support/multi-polygon-test.kml
91
+ homepage: http://github.com/square/border_patrol
92
+ licenses: []
93
+ post_install_message:
94
+ rdoc_options: []
95
+ require_paths:
96
+ - lib
97
+ required_ruby_version: !ruby/object:Gem::Requirement
98
+ none: false
99
+ requirements:
100
+ - - ! '>='
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
103
+ segments:
104
+ - 0
105
+ hash: -4130164510189016464
106
+ required_rubygems_version: !ruby/object:Gem::Requirement
107
+ none: false
108
+ requirements:
109
+ - - ! '>='
110
+ - !ruby/object:Gem::Version
111
+ version: '0'
112
+ segments:
113
+ - 0
114
+ hash: -4130164510189016464
115
+ requirements: []
116
+ rubyforge_project:
117
+ rubygems_version: 1.8.23
118
+ signing_key:
119
+ specification_version: 3
120
+ summary: Import and query KML regions
121
+ test_files:
122
+ - spec/lib/border_patrol/polygon_spec.rb
123
+ - spec/lib/border_patrol/region_spec.rb
124
+ - spec/lib/border_patrol_spec.rb
125
+ - spec/spec_helper.rb
126
+ - spec/support/colorado-test.kml
127
+ - spec/support/elgin-opengis-ns-test.kml
128
+ - spec/support/multi-polygon-test.kml