border_patrol-sgonyea 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
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