diff --git a/lib/border_patrol.rb b/lib/border_patrol.rb
index d139a63..3668b76 100644
--- a/lib/border_patrol.rb
+++ b/lib/border_patrol.rb
@@ -43,12 +43,26 @@ def self.central_point(box)
def self.parse_kml_polygon_data(string, name = nil)
doc = Nokogiri::XML(string)
- coordinates = doc.xpath('//coordinates').text.strip.split(/\s+/)
- points = coordinates.map do |coord|
+ # "A Polygon is defined by an outer boundary and 0 or more inner boundaries."
+ outerboundary = doc.xpath('//outerBoundaryIs')
+ innerboundaries = doc.xpath('//innerBoundaryIs')
+ coordinates = outerboundary.xpath('.//coordinates').text.strip.split(/\s+/)
+ points = points_from_coordinates(coordinates)
+ if innerboundaries
+ inner_boundary_polygons = innerboundaries.map do |i|
+ BorderPatrol::Polygon.new(points_from_coordinates(i.xpath('.//coordinates').text.strip.split(/\s+/)))
+ end
+ BorderPatrol::Polygon.new(points).with_placemark_name(name).with_inner_boundaries(inner_boundary_polygons)
+ else
+ BorderPatrol::Polygon.new(points).with_placemark_name(name)
+ end
+ end
+
+ def self.points_from_coordinates c
+ c.map do |coord|
x, y, _ = coord.strip.split(',')
BorderPatrol::Point.new(x.to_f, y.to_f)
end
- BorderPatrol::Polygon.new(points).with_placemark_name(name)
end
def self.placemark_name_for_polygon(p)
diff --git a/lib/border_patrol/polygon.rb b/lib/border_patrol/polygon.rb
index afbc8b8..1f1fff5 100644
--- a/lib/border_patrol/polygon.rb
+++ b/lib/border_patrol/polygon.rb
@@ -1,16 +1,26 @@
module BorderPatrol
class Polygon
- attr_reader :placemark_name
+ attr_reader :placemark_name, :inner_boundaries
extend Forwardable
+
+ # Note @points is the outer boundary.
+ # A polygon may also have 1 or more inner boundaries. In order to not change the ctor signature,
+ # the inner boundaries are not settable at construction.
def initialize(*args)
args.flatten!
args.uniq!
fail InsufficientPointsToActuallyFormAPolygonError unless args.size > 2
+ @inner_boundaries = []
@points = Array.new(args)
end
def_delegators :@points, :size, :each, :first, :include?, :[], :index
+ def with_inner_boundaries(polygons)
+ @inner_boundaries = [polygons].flatten
+ self
+ end
+
def with_placemark_name(placemark)
@placemark_name ||= placemark
self
@@ -32,7 +42,8 @@ def ==(other)
index += direction
index = 0 if index == size
end
- true
+ return true if @inner_boundaries.empty?
+ @inner_boundaries == other.inner_boundaries
end
# Quick and dirty hash function
@@ -54,6 +65,11 @@ def contains_point?(point)
end
j = i
end
+ return c if c == false
+ # Check if excluded by any of the inner boundaries
+ @inner_boundaries.each do |inner_boundary|
+ return false if inner_boundary.contains_point?(point)
+ end
c
end
diff --git a/spec/lib/border_patrol/polygon_spec.rb b/spec/lib/border_patrol/polygon_spec.rb
index 5c9a636..b3bd534 100644
--- a/spec/lib/border_patrol/polygon_spec.rb
+++ b/spec/lib/border_patrol/polygon_spec.rb
@@ -39,6 +39,22 @@
expect(poly2).not_to eq(poly1)
expect(poly1).not_to eq(poly2)
end
+
+ it 'is true if polygons and their inner boundaries are congruent' do
+ poly1 = BorderPatrol::Polygon.new(BorderPatrol::Point.new(0, 0), BorderPatrol::Point.new(3, 0), BorderPatrol::Point.new(3,3), BorderPatrol::Point.new(0,3))
+ poly1.with_inner_boundaries(BorderPatrol::Polygon.new(BorderPatrol::Point.new(1,1), BorderPatrol::Point.new(2, 1), BorderPatrol::Point.new(2, 2), BorderPatrol::Point.new(1,2)))
+ poly2 = BorderPatrol::Polygon.new(BorderPatrol::Point.new(0, 0), BorderPatrol::Point.new(3, 0), BorderPatrol::Point.new(3,3), BorderPatrol::Point.new(0,3))
+ poly2.with_inner_boundaries(BorderPatrol::Polygon.new(BorderPatrol::Point.new(1,1), BorderPatrol::Point.new(2, 1), BorderPatrol::Point.new(2, 2), BorderPatrol::Point.new(1,2)))
+ expect(poly1).to eq(poly2)
+ end
+
+ it 'is false if polygons inner boundaries are not congruent' do
+ poly1 = BorderPatrol::Polygon.new(BorderPatrol::Point.new(0, 0), BorderPatrol::Point.new(3, 0), BorderPatrol::Point.new(3,3), BorderPatrol::Point.new(0,3))
+ poly1.with_inner_boundaries(BorderPatrol::Polygon.new(BorderPatrol::Point.new(1,1), BorderPatrol::Point.new(2, 1), BorderPatrol::Point.new(2, 2), BorderPatrol::Point.new(1,2)))
+ poly2 = BorderPatrol::Polygon.new(BorderPatrol::Point.new(0, 0), BorderPatrol::Point.new(3, 0), BorderPatrol::Point.new(3,3), BorderPatrol::Point.new(0,3))
+ poly2.with_inner_boundaries(BorderPatrol::Polygon.new(BorderPatrol::Point.new(1.1,1.1), BorderPatrol::Point.new(2.1, 1.1), BorderPatrol::Point.new(2.1, 2.1), BorderPatrol::Point.new(1.1,2.1)))
+ expect(poly1).not_to eq(poly2)
+ end
end
describe '#initialize' do
@@ -86,33 +102,59 @@
end
describe '#contains_point?' do
- before do
- points = [BorderPatrol::Point.new(-10, 0), BorderPatrol::Point.new(10, 0), BorderPatrol::Point.new(0, 10)]
- @polygon = BorderPatrol::Polygon.new(points)
- end
+ context 'when there is no inner boundary' do
+ before do
+ points = [BorderPatrol::Point.new(-10, 0), BorderPatrol::Point.new(10, 0), BorderPatrol::Point.new(0, 10)]
+ @polygon = BorderPatrol::Polygon.new(points)
+ end
- it 'is true if the point is in the polygon' do
- expect(@polygon.contains_point?(BorderPatrol::Point.new(0.5, 0.5))).to be true
- expect(@polygon.contains_point?(BorderPatrol::Point.new(0, 5))).to be true
- expect(@polygon.contains_point?(BorderPatrol::Point.new(-1, 3))).to be true
- end
+ it 'is true if the point is in the polygon' do
+ expect(@polygon.contains_point?(BorderPatrol::Point.new(0.5, 0.5))).to be true
+ expect(@polygon.contains_point?(BorderPatrol::Point.new(0, 5))).to be true
+ expect(@polygon.contains_point?(BorderPatrol::Point.new(-1, 3))).to be true
+ end
- it 'does not include points on the lines with slopes between vertices' do
- expect(@polygon.contains_point?(BorderPatrol::Point.new(5.0, 5.0))).to be false
- expect(@polygon.contains_point?(BorderPatrol::Point.new(4.999999, 4.9999999))).to be true
- expect(@polygon.contains_point?(BorderPatrol::Point.new(0, 0))).to be true
- expect(@polygon.contains_point?(BorderPatrol::Point.new(0.000001, 0.000001))).to be true
- end
+ it 'does not include points on the lines with slopes between vertices' do
+ expect(@polygon.contains_point?(BorderPatrol::Point.new(5.0, 5.0))).to be false
+ expect(@polygon.contains_point?(BorderPatrol::Point.new(4.999999, 4.9999999))).to be true
+ expect(@polygon.contains_point?(BorderPatrol::Point.new(0, 0))).to be true
+ expect(@polygon.contains_point?(BorderPatrol::Point.new(0.000001, 0.000001))).to be true
+ end
+
+ it 'includes points at the vertices' do
+ expect(@polygon.contains_point?(BorderPatrol::Point.new(-10, 0))).to be true
+ end
- it 'includes points at the vertices' do
- expect(@polygon.contains_point?(BorderPatrol::Point.new(-10, 0))).to be true
+ it 'is false if the point is outside of the polygon' do
+ expect(@polygon.contains_point?(BorderPatrol::Point.new(9, 5))).to be false
+ expect(@polygon.contains_point?(BorderPatrol::Point.new(-5, 8))).to be false
+ expect(@polygon.contains_point?(BorderPatrol::Point.new(-10, -1))).to be false
+ expect(@polygon.contains_point?(BorderPatrol::Point.new(-20, -20))).to be false
+ end
end
- it 'is false if the point is outside of the polygon' do
- expect(@polygon.contains_point?(BorderPatrol::Point.new(9, 5))).to be false
- expect(@polygon.contains_point?(BorderPatrol::Point.new(-5, 8))).to be false
- expect(@polygon.contains_point?(BorderPatrol::Point.new(-10, -1))).to be false
- expect(@polygon.contains_point?(BorderPatrol::Point.new(-20, -20))).to be false
+ context 'when there is an inner boundary' do
+ before do
+ @polygon = BorderPatrol::Polygon.new(BorderPatrol::Point.new(0, 0), BorderPatrol::Point.new(3, 0), BorderPatrol::Point.new(3,3), BorderPatrol::Point.new(0,3))
+ @polygon.with_inner_boundaries(BorderPatrol::Polygon.new(BorderPatrol::Point.new(1,1), BorderPatrol::Point.new(2, 1), BorderPatrol::Point.new(2, 2), BorderPatrol::Point.new(1,2)))
+ end
+
+ it 'is true if the point is in the polygon but not in the inner boundary' do
+ expect(@polygon.contains_point?(BorderPatrol::Point.new(0.5, 1.5))).to be true
+ expect(@polygon.contains_point?(BorderPatrol::Point.new(0.5, 0.5))).to be true
+ expect(@polygon.contains_point?(BorderPatrol::Point.new(1.5, 0.5))).to be true
+ end
+
+ it 'is false if the point is outside the polygon' do
+ expect(@polygon.contains_point?(BorderPatrol::Point.new(4, 0.5))).to be false
+ expect(@polygon.contains_point?(BorderPatrol::Point.new(2.5, 4))).to be false
+ expect(@polygon.contains_point?(BorderPatrol::Point.new(-1, 1.5))).to be false
+ end
+
+ it 'is false if the point is inside the inner boundary' do
+ expect(@polygon.contains_point?(BorderPatrol::Point.new(1.5, 1.5))).to be false
+ end
+
end
end
diff --git a/spec/lib/border_patrol_spec.rb b/spec/lib/border_patrol_spec.rb
index 0c2b067..675ff75 100644
--- a/spec/lib/border_patrol_spec.rb
+++ b/spec/lib/border_patrol_spec.rb
@@ -145,4 +145,69 @@
end
end
end
+
+
+ describe "KMLs with with holes" do
+ before(:each) do
+ @outside = [
+ BorderPatrol::Point.new(-74.0063, 40.72368),
+ BorderPatrol::Point.new(-74.00678, 40.71912),
+ BorderPatrol::Point.new(-74.00686, 40.71571),
+ BorderPatrol::Point.new(-74.00201, 40.71554),
+ BorderPatrol::Point.new(-73.99695, 40.71558),
+ ]
+
+ @in_the_polygon = [
+ BorderPatrol::Point.new(-74.00193, 40.72299),
+ BorderPatrol::Point.new(-74.00188, 40.71951),
+ BorderPatrol::Point.new(-73.99669, 40.71942),
+ ]
+
+ @in_the_hole = [
+ BorderPatrol::Point.new(-73.99618, 40.72338)
+ ]
+ end
+
+ it 'correctly identifies points inside and outside polygon which has 1 hole' do
+ region = BorderPatrol.parse_kml(File.read('spec/support/polygon-with-hole-test1.kml'))
+ @outside.each do |p|
+ expect(region.contains_point?(p)).to be false
+ end
+ @in_the_polygon.each do |p|
+ expect(region.contains_point?(p)).to be true
+ end
+ @in_the_hole.each do |p|
+ expect(region.contains_point?(p)).to be false
+ end
+ end
+
+ it 'correctly identifies points inside and outside polygon which has 2 holes' do
+ region = BorderPatrol.parse_kml(File.read('spec/support/polygon-with-2-holes.kml'))
+ @outside.each do |p|
+ expect(region.contains_point?(p)).to be false
+ end
+ @in_the_polygon.each do |p|
+ expect(region.contains_point?(p)).to be true
+ end
+ @in_the_hole.each do |p|
+ expect(region.contains_point?(p)).to be false
+ end
+ end
+
+ it 'correctly identifies points inside and outside polygon with real-world polygon' do
+ region = BorderPatrol.parse_kml(File.read('spec/support/45.kml'))
+ in1 = BorderPatrol::Point.new(-73.80001, 40.87513)
+ in_hole1 = BorderPatrol::Point.new(-73.79593, 40.87487)
+ outside1 = BorderPatrol::Point.new(-73.77881, 40.87393)
+ way_out1 = BorderPatrol::Point.new(-73.76242, 40.88194)
+ in_another_polygon = BorderPatrol::Point.new(-73.77134, 40.8712)
+ expect(region.contains_point?(in1)).to be true
+ expect(region.contains_point?(in_hole1)).to be false
+ expect(region.contains_point?(outside1)).to be false
+ expect(region.contains_point?(way_out1)).to be false
+ expect(region.contains_point?(in_another_polygon)).to be true
+ end
+
+ end
+
end
diff --git a/spec/support/45.kml b/spec/support/45.kml
new file mode 100644
index 0000000..9f2fe7f
--- /dev/null
+++ b/spec/support/45.kml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+by_precinct_Precinct__45
+
+
+
+ 45
+ PBBX
+ 1200.00000000000
+ 90000.00000000000
+ 82759
+
+ -73.786331201787135,40.836261048018265 -73.786328557274445,40.837084458691692 -73.786325912696299,40.837907869249875 -73.786323268052698,40.838731279692631 -73.786320623343613,40.839554690019668 -73.78740482533027,40.839556693505045 -73.788489027381914,40.839558686798981 -73.788486409446151,40.840382097059155 -73.788483791445586,40.841205507203377 -73.788481173380205,40.842028917231438 -73.789565415755845,40.842030900406719 -73.789562811046039,40.842854310342673 -73.790647066906701,40.842856283350265 -73.790644475553165,40.84367969319392 -73.790641884135468,40.844503102920967 -73.790639292653609,40.845326512531109 -73.79172358884145,40.845328475418803 -73.791721010717168,40.846151884935992 -73.792805320390499,40.846153837655237 -73.79280275562445,40.846977247079224 -73.792800190794907,40.847800656385822 -73.791715854277115,40.847798703618778 -73.791713275961342,40.848622112783943 -73.791710697581735,40.849445521831505 -73.791708119138292,40.850268930761175 -73.791705540631028,40.851092339572808 -73.792789930841707,40.851094292435427 -73.793874321116178,40.851096235104833 -73.793871769393178,40.851919643845974 -73.793869217606996,40.852743052468817 -73.793866665757619,40.853566460973042 -73.792782235209984,40.853564518232311 -73.792779669872374,40.854387926594114 -73.792777104471256,40.855211334837108 -73.792774539006615,40.856034742961015 -73.793859009830413,40.856036685773041 -73.794943480717137,40.856038618391125 -73.796027951666986,40.856040540815265 -73.796030476854455,40.855217132620417 -73.797114934440842,40.85521904482718 -73.79711744614039,40.854395636489876 -73.798201890363615,40.854397538479532 -73.798204388575925,40.853574130000119 -73.797119957777767,40.85357222803372 -73.797122469352956,40.852748819458924 -73.797124980865945,40.851925410765539 -73.797127492316775,40.851102001953841 -73.797130003705405,40.850278593023965 -73.798214380806641,40.850280494897277 -73.798216878709709,40.84945708582611 -73.79930124244953,40.849458977483195 -73.799303726867677,40.848635568270979 -73.799306211224319,40.847812158941181 -73.800390548179678,40.84781404035926 -73.801474885196214,40.847815911584625 -73.801472427685056,40.848639320960345 -73.802556778185348,40.848641182015783 -73.802554334036429,40.849464591296666 -73.802551889827001,40.85028800045967 -73.802549445557062,40.851111409504647 -73.803633836387931,40.85111326043517 -73.803631405481553,40.851936669384614 -73.80471580979669,40.851938510144464 -73.804713392254527,40.852761918998141 -73.804710974652522,40.853585327733221 -73.804708556990647,40.854408736349654 -73.804706139268916,40.85523214484725 -73.804703721487314,40.856055553225779 -73.804701303645842,40.85687896148508 -73.804698885744514,40.857702369625031 -73.804696467783316,40.85852577764549 -73.804694049762247,40.859349185546165 -73.80469163168128,40.860172593326986 -73.804689213540456,40.860996000987804 -73.805773765602467,40.860997831800702 -73.805776170315553,40.860174424117467 -73.805778574969096,40.859351016314228 -73.806863100235347,40.859352836887879 -73.806865491402249,40.858529428942539 -73.806867882509977,40.857706020877394 -73.807952380981547,40.857707831212259 -73.80795000330059,40.858531239299559 -73.809034515258048,40.85853303946223 -73.809032150945285,40.859356447451745 -73.810116676388105,40.859358237441974 -73.810114325444204,40.860181645333569 -73.810111974442094,40.861005053105139 -73.811196526798554,40.861006832944462 -73.811194189166329,40.86183024061755 -73.812278755008549,40.861832010283806 -73.812276430746834,40.862655417858107 -73.813361010074985,40.862657177351068 -73.814445589460618,40.86265892664904 -73.81444788686548,40.861835519031793 -73.814450184213456,40.861012111294144 -73.813365631684334,40.861010362038968 -73.81336794240319,40.86018695420244 -73.812283403359302,40.860185194774076 -73.812285727448355,40.859361786839052 -73.812288051479868,40.858538378784218 -73.812290375453841,40.857714970609578 -73.812292699370246,40.85689156231544 -73.812295023229126,40.856068153901973 -73.812297347030466,40.855244745369284 -73.812299670774266,40.854421336717493 -73.812301994460526,40.853597927946893 -73.81338642609434,40.853599687203037 -73.814470857785622,40.853601436265599 -73.815555289533521,40.853603175134573 -73.816639721337978,40.853604903809931 -73.816641991267645,40.852781494835348 -73.816644261141121,40.85195808574214 -73.816646530958394,40.851134676530634 -73.815562139427229,40.851132947918714 -73.815564422612084,40.850309538610205 -73.815566705740395,40.849486129183667 -73.81448234111302,40.849484390421068 -73.814484637607919,40.848660980897904 -73.814486934045973,40.847837571257173 -73.813402596321069,40.847835822344415 -73.813404906124688,40.847012412607533 -73.812320581879675,40.847010653523576 -73.81123625769213,40.847008884247032 -73.811238594282784,40.846185474435934 -73.811240930815586,40.845362064507732 -73.81124326729055,40.844538654462582 -73.812327551212803,40.844540423674175 -73.8123298742088,40.843717013490469 -73.812332197147327,40.842893603190142 -73.813416454285132,40.842895362166473 -73.814500711480392,40.842897110950851 -73.814503007520514,40.842073700491163 -73.814505303503793,40.841250289915116 -73.814507599430229,40.840426879222925 -73.813423382495301,40.840425130502744 -73.813425691784374,40.839601719715986 -73.813428001016263,40.838778308813474 -73.814512191112627,40.838780057490858 -73.814514486868575,40.837956646451225 -73.815598663602685,40.837958384915964 -73.815600945883361,40.837134973739637 -73.815603228107534,40.836311562448081 -73.814519078209983,40.836309824025882 -73.814521373795444,40.835486412640414 -73.814523669324103,40.834663001139965 -73.815607792386402,40.834664739519617 -73.815610074441111,40.83384132788315 -73.815612356439331,40.8330179161321 -73.814528260210935,40.833016177794995 -73.814530555569135,40.832192765950694 -73.814532850870535,40.831369353992159 -73.813448781531264,40.831367605507367 -73.813451090191634,40.830544193456184 -73.813453398794863,40.829720781291016 -73.812369356344263,40.829719022659035 -73.812371678305496,40.828895610401574 -73.811287649327454,40.828893841601264 -73.81020362040698,40.828892062611096 -73.809119591544928,40.828890273431071 -73.809121953693051,40.8280668611254 -73.809124315782711,40.827243448706305 -73.810208317815537,40.827245237842519 -73.811292319906727,40.827247016789151 -73.812376322055528,40.827248785546168 -73.812378643844355,40.826425372948435 -73.812380965575699,40.825601960237677 -73.811296990254846,40.825600191523947 -73.810213014991561,40.825598412620856 -73.810210666432596,40.8264218252882 -73.809126677813921,40.826420036173865 -73.808042689253426,40.826418236870055 -73.806958700751991,40.826416427376778 -73.806961089552317,40.825593014775478 -73.805877114523739,40.825591195114988 -73.805879516678417,40.824767782423066 -73.805881918773622,40.823944369618424 -73.805884320809383,40.823120956701054 -73.805886722785715,40.822297543671425 -73.804802801468242,40.822295713911153 -73.804805216797263,40.821472300791619 -73.805889124702588,40.821474130529502 -73.805891526560032,40.820650717275477 -73.804807632066485,40.82064888755999 -73.80481004727595,40.819825474216493 -73.803726166253782,40.819823634334938 -73.803728594814615,40.819000220902275 -73.802644727263683,40.818998370854864 -73.801560859773033,40.818996510619115 -73.800476992343292,40.818994640195001 -73.800479461076392,40.818171226719009 -73.799395607118541,40.818169346129579 -73.799398089200992,40.817345932565225 -73.79831424871486,40.817344041810699 -73.797230408290631,40.817342140868085 -73.797232917131907,40.816518727238986 -73.797235425911111,40.815695313498779 -73.797237934628228,40.814871899647642 -73.798321734823105,40.814873800520466 -73.79940553507987,40.814875691205579 -73.799408016916672,40.814052277197383 -73.799410498692055,40.813228863078692 -73.800494272192154,40.813230743530042 -73.80049674049765,40.812407329277882 -73.800499208742096,40.811583914915552 -73.801582955486666,40.811585785133644 -73.801580500650374,40.812409199518875 -73.802664260863992,40.812411059572504 -73.802666702292157,40.811587645164529 -73.802669143659898,40.810764230646583 -73.80158541026222,40.810762370638464 -73.80050167692545,40.810760500443259 -73.800504145047739,40.80993708586103 -73.799420425179491,40.809935205501745 -73.798336705372506,40.809933314955458 -73.797252985627409,40.809931414222213 -73.797255493910029,40.809107999599689 -73.796171787634179,40.809106088702855 -73.795088081420445,40.809104167619175 -73.795090616454601,40.808280752934088 -73.794006923710654,40.808278821687196 -73.792923231029505,40.80827688025358 -73.792925792813861,40.807453465506526 -73.791842113602812,40.80745151391006 -73.791839538411992,40.808274928633253 -73.790755845858172,40.808272966826181 -73.790758434455427,40.807449552127032 -73.789674755371934,40.80744758015738 -73.789677357311277,40.806624165373108 -73.789679959186245,40.805800750479861 -73.789682560996837,40.804977335477837 -73.789685162743083,40.804153920367135 -73.790768788204076,40.804155892240225 -73.790771376481132,40.803332476996765 -73.791854988601216,40.803334438659761 -73.79293860078495,40.803336390136771 -73.792936039317482,40.804159805428142 -73.794019664969653,40.80416174674297 -73.795103290684608,40.804163677871699 -73.795100755964029,40.804987093101815 -73.796184395147094,40.804989014067942 -73.796181873769285,40.805812429212907 -73.797265526419935,40.805814340016205 -73.798349179132686,40.805816240633142 -73.798346684504097,40.806639655715962 -73.79943035068456,40.806641546169708 -73.799427869400375,40.807464961166673 -73.800511549048196,40.807466841456943 -73.80159522875708,40.807468711560603 -73.801592774224474,40.808292126494251 -73.802676467400715,40.80829398643408 -73.803760160637196,40.80829583618717 -73.804843853933761,40.808297675753543 -73.80484143956086,40.809121090645732 -73.805925146324128,40.809122920047756 -73.807008853146655,40.80912473926292 -73.807006465528303,40.809948154090314 -73.808090185816994,40.80994996314076 -73.808087811547054,40.810773377880579 -73.808085437218367,40.811596792510493 -73.809169184381375,40.81159859141799 -73.809166823402094,40.81242200595991 -73.810250584031408,40.812423794702077 -73.811334344719086,40.812425573256867 -73.812418105464303,40.812427341624328 -73.813501866266904,40.812429099804405 -73.814585627126846,40.812430847797131 -73.815669388043304,40.812432585602494 -73.815667107456534,40.813256000163761 -73.816750881837947,40.813257727802899 -73.81783465627565,40.813259445254552 -73.818918430768946,40.813261152518734 -73.818920671130215,40.812437737894406 -73.820004432270451,40.812439434950335 -73.820006659168115,40.811616020195082 -73.821090406955449,40.811617707042984 -73.822174154797381,40.81161938370365 -73.823257902693754,40.811621050177074 -73.824341650644385,40.811622706463247 -73.824343823855585,40.810799291516204 -73.825427558451992,40.810800937594991 -73.826511293101774,40.810802573486662 -73.827595027804932,40.810804199191224 -73.828678762560614,40.810805814708651 -73.829762497369003,40.810807420038969 -73.829764603488798,40.809984004882523 -73.830848324941513,40.8099856000062 -73.830850417602008,40.809162184720527 -73.830852510210732,40.808338769325402 -73.831936204901211,40.808340354223276 -73.831938284051603,40.807516938699386 -73.830854602767687,40.807515353820918 -73.830856695272843,40.806691938207194 -73.830858787726243,40.805868522484495 -73.830860880127872,40.805045106653012 -73.830862972477732,40.804221690712872 -73.831946600138849,40.80422327551377 -73.833030227851623,40.804224850128541 -73.834113855615229,40.804226414557185 -73.834111803480994,40.805049830555134 -73.835195444700631,40.805051384816664 -73.836279085970872,40.805052928891961 -73.83736272729108,40.80505446278098 -73.837360715322703,40.805877878726974 -73.838444370098216,40.805879402448383 -73.838442371485968,40.806702818304238 -73.838440372824266,40.807526234051117 -73.838438374113096,40.808349649688779 -73.839522069156871,40.808351163279376 -73.839520083803137,40.809174578826209 -73.839518098400276,40.809997994263554 -73.840601820307114,40.809999497704212 -73.84059984826267,40.810822913050245 -73.84059787616944,40.811646328286393 -73.840595904027396,40.812469743412557 -73.840593931836565,40.813293158428586 -73.840591959596921,40.814116573334125 -73.840589987308491,40.814939988129183 -73.840588014971246,40.815763402813594 -73.840586042585187,40.816586817387105 -73.840584070150328,40.8174102318495 -73.840582097666655,40.818233646200738 -73.840580125134181,40.819057060440613 -73.839496255726104,40.819055556797558 -73.839494269733592,40.819878970907425 -73.839492283691968,40.820702384905601 -73.839490297601174,40.821525798791917 -73.839488311461224,40.822349212566152 -73.839486325272134,40.823172626228093 -73.840570261739501,40.823174129963171 -73.840568288914113,40.823997543531235 -73.840566316039883,40.824820956986613 -73.840564343116839,40.825644370329258 -73.84164831987259,40.825645863930184 -73.841646360314556,40.826469277178205 -73.841644400708034,40.827292690313222 -73.842728404340505,40.827294173761054 -73.842726458099989,40.828117586800914 -73.842724511811312,40.82894099972733 -73.84272256547446,40.829764412540221 -73.842720619089448,40.830587825239313 -73.841636561796918,40.830586341718863 -73.841634601947874,40.831409754285822 -73.841632642050328,40.832233166738746 -73.840548557974458,40.832231672991611 -73.840546584611886,40.833055085312012 -73.839462487168348,40.833053581356104 -73.839460500340095,40.833876993543576 -73.839458513462674,40.834700405616495 -73.839456526536054,40.835523817574661 -73.840540664231085,40.835525321585777 -73.841624801974987,40.835526815406027 -73.842708939767562,40.83552829903541 -73.843793077608154,40.835529772473926 -73.843795010864753,40.834706360442901 -73.844879135335859,40.834707823672645 -73.845963259854315,40.834709276711621 -73.847047384419909,40.834710719559865 -73.84813150903264,40.834712152217364 -73.849215633691628,40.834713574684102 -73.850299758396844,40.834714986960087 -73.850301611102495,40.833891574708737 -73.851385722436547,40.833892976776831 -73.851383883148088,40.834716389045326 -73.852468007944708,40.834717780939812 -73.852466182028238,40.835541193110608 -73.852464356066577,40.836364605166416 -73.852462530059711,40.837188017107053 -73.852460704007655,40.838011428932461 -73.852458877910379,40.838834840642456 -73.852457051767914,40.839658252236717 -73.852455225580243,40.840481663715245 -73.853539444351682,40.84048304553734 -73.853537631538657,40.841306456916818 -73.85353581868074,40.842129868180166 -73.85245157306926,40.842128486324242 -73.852449746745961,40.84295189745432 -73.851365487759182,40.842950505389489 -73.850281228817806,40.842949103132668 -73.849196969922431,40.84294769068385 -73.848112711073355,40.84294626804305 -73.848110831021472,40.843769678987805 -73.847026558797808,40.843768246137451 -73.847024665278227,40.844591656948062 -73.845940379680542,40.844590213887948 -73.84593847269258,40.845413624563982 -73.844854173720549,40.845412171293844 -73.844856094130009,40.844588760635567 -73.843771808626869,40.844587297190969 -73.843773742409951,40.843763886433699 -73.842689470376001,40.843762412814876 -73.842691417532052,40.842939001959039 -73.842693364639885,40.842115590986765 -73.841609119495303,40.84211410721214 -73.84161107997511,40.841290696141662 -73.841613040406386,40.840467284955025 -73.840528822150489,40.840465791025089 -73.839444603943448,40.840464286903526 -73.83836038578545,40.840462772590371 -73.838358385094693,40.841286183721792 -73.838356384354398,40.842109594737046 -73.838354383564592,40.842933005635942 -73.837270125195801,40.842931481075183 -73.837268110935639,40.843754891839012 -73.837266096625612,40.844578302486205 -73.837264082265705,40.845401713016507 -73.837262067855946,40.846225123429846 -73.83617775585175,40.846223588602001 -73.836175727969959,40.847046998879463 -73.836173700037975,40.847870409039551 -73.836171672055784,40.848693819082108 -73.836169644023371,40.849517229007063 -73.836167615940738,40.850340638814139 -73.836165587807912,40.8511640485032 -73.836163559624865,40.851987458074085 -73.83616153139161,40.852810867526678 -73.835077112050982,40.852809322355093 -73.835075070342697,40.853632731670181 -73.835073028583864,40.854456140866638 -73.833988582444007,40.854454585463486 -73.833986527209163,40.855277994522083 -73.832902067694775,40.855276428906059 -73.832899998983223,40.85609983782642 -73.831815526094005,40.856098261997253 -73.831813443905105,40.856921670779116 -73.831811361664663,40.857745079441642 -73.830726861974625,40.857743493379672 -73.830724766255813,40.858566901903302 -73.829640253190945,40.858565305627579 -73.829638143993108,40.859388714011878 -73.829636034743061,40.860212122276351 -73.828551494875569,40.860210515766958 -73.828549372145503,40.861033923891767 -73.82854724936287,40.861857331896317 -73.828545126527672,40.862680739780437 -73.829629706679526,40.862682346348798 -73.829627597220551,40.863505754132071 -73.830712190853149,40.863507350524984 -73.83071009477105,40.864330758207096 -73.830707998637038,40.865154165768217 -73.830705902451129,40.86597757320834 -73.831790536424037,40.865979159464374 -73.83178845361634,40.866802566802683 -73.831786370757044,40.86762597401956 -73.832871031642313,40.867627550118684 -73.832868962162237,40.868450957233215 -73.832866892630889,40.869274364226094 -73.832864823048297,40.870097771097015 -73.833949524277926,40.87009933705788 -73.833947468075863,40.87092274382583 -73.833945411822867,40.871746150471566 -73.833943355518954,40.872569556994925 -73.83394129916411,40.873392963395609 -73.833939242758333,40.874216369673555 -73.833937186301625,40.875039775828611 -73.833935129793986,40.875863181860524 -73.833933073235414,40.876686587769115 -73.833931016625911,40.877509993554305 -73.833928959965448,40.878333399215926 -73.832844124403024,40.878331833063463 -73.832842054256517,40.879155238582065 -73.832839984058737,40.879978643976749 -73.831755121676764,40.879977067588349 -73.83175303799193,40.880800472839674 -73.830668162226019,40.88079888623426 -73.830666065053464,40.881622291341834 -73.829581175903428,40.881620694519178 -73.829579065242498,40.882444099482719 -73.828494162708054,40.882442492442536 -73.828492038558068,40.883265897261801 -73.827407122639727,40.883264280003885 -73.826322206774094,40.883262652547863 -73.826320055697281,40.88408605720268 -73.825235126448106,40.884084419528534 -73.824150197252479,40.884082771656168 -73.824148019247531,40.884906176145734 -73.823063076668276,40.884904518054867 -73.821978134143464,40.884902849765659 -73.82089319167325,40.884901171278102 -73.820890973301104,40.885724575581335 -73.819806017447959,40.885722886874774 -73.818721061650251,40.885721187969772 -73.81763610590815,40.885719478866285 -73.817633847166803,40.886542882981892 -73.81654887804244,40.886541163658912 -73.815463908974493,40.886539434137354 -73.814378939963248,40.886537694417221 -73.813293971008676,40.886535944498469 -73.812209002111643,40.886534184381169 -73.811124033272208,40.886532414065265 -73.810039064490482,40.886530633550784 -73.808954095767305,40.886528842837706 -73.808956462013214,40.885705438893858 -73.807871506786455,40.885703638004252 -73.806786551618913,40.885701826916183 -73.805701596510602,40.885700005629651 -73.805699189950531,40.886523409507035 -73.804614221463609,40.88652157799963 -73.804616641461735,40.885698174144679 -73.803531686472979,40.885696332461229 -73.802446731544492,40.885694480579339 -73.802449178358117,40.884871076644288 -73.801364236927796,40.884869214586729 -73.800279295558582,40.88486734233085 -73.800281769186341,40.884043938316374 -73.799196841315776,40.884042055885189 -73.798111913506673,40.884040163255818 -73.797026985759658,40.88403826042822 -73.797029499637276,40.883214856358144 -73.79594458538962,40.88321294335578 -73.794859671204293,40.883211020155322 -73.79377475708219,40.883209086756814 -73.793777311207634,40.88238568263256 -73.792692410585204,40.88238373905974 -73.792694978083745,40.881560334834639 -73.793779865269798,40.881562278383676 -73.793782419268709,40.880738874010319 -73.793784973204367,40.879915469512582 -73.792700112890032,40.879913526011109 -73.792697545518692,40.880736930485064 -73.791612671832524,40.880734976762099 -73.790527798210235,40.880733012841453 -73.790525203903229,40.88155641714313 -73.789440316909008,40.881554443000631 -73.788355429979546,40.881552458660316 -73.788358051158596,40.880729054407091 -73.787273177730086,40.880727059893353 -73.787270543115014,40.881550464122199 -73.786185656315595,40.881548459386259 -73.785100769581902,40.881546444452503 -73.78510343106899,40.880723040272834 -73.785106092490167,40.879899635968826 -73.786190952352143,40.879901650853277 -73.786193600272043,40.879078246400518 -73.785108753845407,40.879076231540722 -73.784023907484695,40.879074206483466 -73.784026582209037,40.878250801956227 -73.784029256867129,40.877427397305105 -73.784031931458983,40.876603992530406 -73.784034605984573,40.875780587632271 -73.78511939860725,40.875782612590427 -73.785122059632926,40.874959207544229 -73.785124720592705,40.874135802374845 -73.78403995483707,40.874133777466248 -73.782955189147515,40.874131742360959 -73.782957876907403,40.87330833711836 -73.782960564600756,40.872484931753021 -73.782963252227518,40.871661526265008 -73.782965939787729,40.870838120654604 -73.782968627281392,40.870014714921979 -73.784053325809197,40.870016749902781 -73.784055999804934,40.869193344023117 -73.785140684967473,40.869195368783082 -73.785143345465968,40.868371962756662 -73.785146005898582,40.867548556608618 -73.78623066426529,40.867550571123353 -73.786228017263355,40.868373977296059 -73.786225370195879,40.869197383347107 -73.787310055489996,40.869199387715177 -73.788394740849199,40.869201381887308 -73.789479426273274,40.869203365863513 -73.789482033047662,40.868379959739251 -73.790566705105434,40.868381933495357 -73.790569298384568,40.867558527225306 -73.790571891599484,40.86673512083361 -73.791656536860245,40.86673708434585 -73.791659116580902,40.865913677808692 -73.791661696237696,40.865090271150322 -73.791664275830584,40.864266864370954 -73.791666855359608,40.863443457470566 -73.79166943482474,40.862620050449486 -73.790584856710851,40.862618087057378 -73.790587449540496,40.861794679939813 -73.790590042305936,40.860971272701832 -73.791674593563414,40.860973236045893 -73.791677172836927,40.860149828663616 -73.792761710730517,40.860151781789071 -73.792764276512784,40.85932837426288 -73.793848801042799,40.859330317170006 -73.793851353334489,40.8585069095002 -73.793853905562997,40.857683501710589 -73.792769407886752,40.857681558851013 -73.792766842231543,40.858504966616842 -73.791682331192391,40.85850301353917 -73.790597820217045,40.858501050267165 -73.790595227644204,40.859324457865277 -73.789510703305851,40.859322484374808 -73.788426179032186,40.85932050068989 -73.787341654823379,40.859318506810503 -73.787339021904216,40.860141914215987 -73.787336388919869,40.860965321501446 -73.786251837921029,40.86096331737857 -73.7851672869879,40.860961303061018 -73.78408273612061,40.860959278548769 -73.784085409388055,40.860135871337242 -73.784088082589307,40.859312464005718 -73.784090755724364,40.858489056554347 -73.785175266309551,40.858491080992295 -73.786259776960605,40.858493095235907 -73.787344287677328,40.858495099285214 -73.788428798459094,40.858497093140201 -73.788431417821158,40.857673685470687 -73.787346920466092,40.857671691640114 -73.787349553189671,40.856848283875514 -73.788434037118378,40.856850277681701 -73.788436656350711,40.856026869773352 -73.787352185848064,40.856024875991558 -73.787354818441273,40.855201467988394 -73.786270361429359,40.855199464037177 -73.786273007382746,40.854376055939426 -73.786275653270636,40.853552647722857 -73.786278299093013,40.852729239387642 -73.785193882421879,40.852727225316542 -73.785196541603113,40.851903816887351 -73.784112138422202,40.851901792647574 -73.783027735307286,40.851899758214465 -73.783030421270766,40.851076349716635 -73.783033107167753,40.850252941100649 -73.78303579299822,40.849429532366635 -73.781951430221085,40.849427487815241 -73.78194873096723,40.850250896524251 -73.780864354833611,40.850248841754784 -73.780867067510826,40.84942543307092 -73.780869780120881,40.848602024269141 -73.780872492663789,40.847778615349803 -73.779788156866132,40.847776550463067 -73.779790882764246,40.846953141451415 -73.779793608594886,40.846129732322389 -73.780877917548111,40.846131797158606 -73.780880629889566,40.845308387887201 -73.779796334358011,40.845306323076258 -73.779799060053691,40.844482913713165 -73.779801785681883,40.843659504233152 -73.779804511242588,40.842836094636525 -73.779807236735834,40.842012684923468 -73.779809962161607,40.841189275094031 -73.780894190589621,40.841191339778639 -73.780896902528227,40.840367929807762 -73.780899614399686,40.839544519720945 -73.780902326204014,40.838721109518382 -73.780905037941238,40.83789769920007 -73.780907749611316,40.837074288766331 -73.781991911010948,40.837076343133553 -73.781994609195863,40.836252932559418 -73.783078757244283,40.83625497671057 -73.784162905359338,40.836257010670749 -73.785247053540331,40.836259034439983 -73.786331201787135,40.836261048018265-73.793784973204367,40.879915469512582 -73.794869833581686,40.879917402816503 -73.794872374018695,40.87909399817103 -73.793787527076759,40.87909206489077 -73.793784973204367,40.879915469512582-73.780880629889566,40.845308387887201 -73.781964925487969,40.845310442505834 -73.781967624340894,40.844487033092321 -73.780883342163847,40.844484978498848 -73.780880629889566,40.845308387887201-73.794877454703993,40.877447188508398 -73.795962274839383,40.877449111544152 -73.795964801653284,40.876625706503802 -73.795967328404586,40.87580230134003 -73.797052121733898,40.87580421413179 -73.79705463498891,40.874980808821292 -73.797057148181693,40.874157403387649 -73.798141914706207,40.874159305935898 -73.799226681292794,40.874161198287453 -73.799229167557215,40.873337792684481 -73.799231653760089,40.872514386958784 -73.798146914039265,40.872512494653535 -73.79814441440368,40.873335900356096 -73.797059661312204,40.873333997831111 -73.795974908283043,40.873332085109567 -73.794890155316168,40.873330162191451 -73.794887615319553,40.87415356770105 -73.794885075260026,40.874976973087762 -73.794882535137603,40.875800378351329 -73.793797741933787,40.875798445165671 -73.793795188314405,40.876621850282284 -73.794879994952254,40.876623783491581 -73.794877454703993,40.877447188508398-73.799231653760089,40.872514386958784 -73.800316393542317,40.872516269067582 -73.800318866251217,40.871692863196166 -73.800321338898883,40.87086945720236 -73.799236625981095,40.870867575139634 -73.799234139901372,40.871690981110397 -73.799231653760089,40.872514386958784-73.800321338898883,40.87086945720236 -73.801406051877919,40.870871329068905 -73.801408511032633,40.870047922929977 -73.802493210641018,40.87004978457756 -73.802495656303421,40.869226378293703 -73.802498101905272,40.86840297188791 -73.803582774711614,40.868404823294085 -73.804667447578169,40.868406664504434 -73.804669866257996,40.867583257931791 -73.803585206822163,40.867581416743988 -73.802500547446542,40.867579565360472 -73.801415888131345,40.867577703781251 -73.801413429159339,40.868401110285916 -73.80141097012644,40.869224516668943 -73.800326284010509,40.869222644848207 -73.800323811485313,40.870046051086355 -73.800321338898883,40.87086945720236-73.788360672272717,40.879905650029499 -73.789445532330475,40.879907634321256 -73.789448139944312,40.879084229795289 -73.788363293321908,40.879082245527805 -73.788360672272717,40.879905650029499-73.789591459307815,40.833796794677291 -73.789588855242698,40.834620205768815 -73.789586251113136,40.835443616745579 -73.788502116088694,40.835441633764425 -73.787417981129053,40.835439640592462 -73.787420612093428,40.834616229664348 -73.788504733635662,40.834618222811933 -73.788507351117843,40.833794811744681 -73.789591459307815,40.833796794677291-73.805833865571358,40.840412604096855 -73.805831462286747,40.841236014614374 -73.806915692234071,40.841237834697992 -73.807999922240498,40.841239644589898 -73.807997545736583,40.842063055035688 -73.806913302310051,40.84206124512162 -73.806910912326856,40.84288465542889 -73.805826655539008,40.842882835300735 -73.80474239881049,40.842881004980605 -73.803658142141941,40.842879164468513 -73.80257388553359,40.842877313764454 -73.802576329198487,40.842053903547018 -73.801492086070866,40.842052042673757 -73.801494543095345,40.841228632362743 -73.801497000059015,40.840405221935548 -73.80258121634678,40.840407082763257 -73.803665432694885,40.840408933399374 -73.80474964910313,40.840410773843914 -73.805833865571358,40.840412604096855-73.770040524140029,40.844463871993348 -73.770037677652155,40.845287281123433 -73.771121972564202,40.845289437665237 -73.771119139427526,40.846112846704756 -73.772203447831544,40.846114993080505 -73.772200628046747,40.846938402029181 -73.772197808192132,40.847761810860469 -73.772194988267714,40.848585219574183 -73.772192168273477,40.849408628170323 -73.772189348209423,40.85023203664857 -73.772186528075551,40.851055445008768 -73.773270917086307,40.851057581348918 -73.773268110306617,40.851880989617086 -73.773265303457435,40.852704397766963 -73.773262496538749,40.853527805798223 -73.773259689550571,40.854351213710828 -73.773256882492902,40.855174621504617 -73.773254075365713,40.855998029179304 -73.772169605805914,40.85599589268233 -73.772166785183217,40.856819300211633 -73.773251268169034,40.856821436734776 -73.773248460902835,40.857644844170871 -73.77324565356713,40.858468251487487 -73.773242846161892,40.859291658684285 -73.773240038687163,40.860115065761271 -73.774324575449796,40.860117192194409 -73.7743217813332,40.86094059917739 -73.775406331592947,40.860942715441844 -73.775403550835179,40.86176612233043 -73.775400770008545,40.862589529098585 -73.774316192892456,40.862587412782325 -73.774318987147424,40.861764006040062 -73.773234423529118,40.861761879554898 -73.772149859980289,40.861759742874924 -73.772152681022078,40.860936336064384 -73.772155501994007,40.860112929133571 -73.771070965370541,40.860110782311317 -73.769986428817418,40.860108625294515 -73.768901892334796,40.860106458083131 -73.768904753518868,40.859283051111483 -73.767820230534269,40.859280873732196 -73.767823105074484,40.858457466667353 -73.767825979543517,40.857634059482699 -73.766741483483898,40.857631871962511 -73.766744371308093,40.856808464685123 -73.765659888746313,40.85680626699763 -73.765662789924988,40.855982859627801 -73.764578320860863,40.855980651773272 -73.764581235393351,40.855157244311208 -73.764584149853675,40.854333836730049 -73.765668592066831,40.854336044530534 -73.766753034351623,40.854338242137345 -73.767837476707925,40.854340429550469 -73.767840350821132,40.853517021769811 -73.767843224863157,40.852693613870493 -73.76892764044112,40.852695791036666 -73.768930500987651,40.851872382992099 -73.767846098834028,40.85187020585257 -73.767848972733745,40.851046797716343 -73.767851846562309,40.850223389461945 -73.767854720319718,40.849399981089512 -73.768939082202351,40.849402158149111 -73.768941942465617,40.848578749632154 -73.768944802658069,40.847755340997573 -73.768947662779709,40.846931932245447 -73.767863341165096,40.846929755265769 -73.767866214637934,40.8461063464229 -73.767869088039646,40.845282937462912 -73.767871961370204,40.844459528385961 -73.768956242719796,40.844461705285745 -73.770040524140029,40.844463871993348-73.784104120406852,40.854372017504936 -73.784101447602723,40.855195425553255 -73.784098774732399,40.856018833482509 -73.784096101795896,40.856842241292519 -73.783011618129805,40.856840206710046 -73.781927134530378,40.856838161933496 -73.78084265099784,40.856836106962902 -73.780845364212439,40.856012699227939 -73.779760894172838,40.856010634088527 -73.779763620745939,40.855187226259609 -73.77976634725151,40.854363818311604 -73.780850790440056,40.854365883400462 -73.781935233695492,40.854367938295667 -73.783019677017847,40.854369982997142 -73.784104120406852,40.854372017504936-73.785164627082281,40.861784710177027 -73.785161967110795,40.862608117172613 -73.785159307073442,40.86343152404767 -73.784074715921093,40.863429499461112 -73.782990124834782,40.863427464679482 -73.781905533815149,40.863425419702779 -73.781908234138569,40.862602012902407 -73.781910934395128,40.861778605981506 -73.78299549855771,40.861780650908166 -73.78408006278697,40.861782685639994 -73.785164627082281,40.861784710177027-73.771053957920131,40.865051221931523 -73.771051123099383,40.865874628112117 -73.769966492545635,40.865872470910574 -73.768881862062429,40.865870303513582 -73.768884723742502,40.865046897385895 -73.769969340796038,40.865049064756363 -73.771053957920131,40.865051221931523-73.7688790003115,40.866693709520057 -73.768876138489702,40.867517115405072 -73.767791481216904,40.867514937759374 -73.766706824015458,40.867512749917999 -73.765622166885564,40.867510551880933 -73.765625068998304,40.86668714607621 -73.766709712697889,40.866689344086367 -73.767794356469011,40.866691531900997 -73.7688790003115,40.866693709520057-73.77212164571992,40.869993804330505 -73.772118823909594,40.870817209807299 -73.773203535188372,40.870819346774866 -73.773200726740129,40.871642752155566 -73.773197918222309,40.872466157413896 -73.772113180079216,40.872464020394055 -73.771028442005857,40.87246187317777 -73.771031277388317,40.871638467971863 -73.769946552817657,40.871636310585544 -73.76994940156186,40.870812905283643 -73.768864690493743,40.870810737727545 -73.768867552599048,40.869987332329941 -73.769952250235519,40.869989499859514 -73.771036947942534,40.86999165719304 -73.77212164571992,40.869993804330505-73.775364612994963,40.873293806051862 -73.775361831204037,40.874117211116683 -73.775359049344203,40.874940616058595 -73.774274270763129,40.874938499353917 -73.773189492251561,40.874936372452446 -73.773192300978039,40.874112967562439 -73.774277066056285,40.874115094437904 -73.774279861280206,40.873291689398975 -73.775364612994963,40.873293806051862-73.782955189147515,40.874131742360959 -73.782952501321049,40.874955147480648 -73.78294981342799,40.8757785524772 -73.781865020938142,40.87577650712516 -73.781867722264877,40.874953102153654 -73.78187042352468,40.874129697058976 -73.782955189147515,40.874131742360959-73.781865020938142,40.87577650712516 -73.781862319544516,40.876599911973365 -73.781859618083999,40.877423316698135 -73.780774798792748,40.877421261098874 -73.780777513687624,40.876597856399258 -73.780780228515269,40.875774451576206 -73.781865020938142,40.87577650712516
+
+
+
diff --git a/spec/support/polygon-with-2-holes.kml b/spec/support/polygon-with-2-holes.kml
new file mode 100644
index 0000000..49da146
--- /dev/null
+++ b/spec/support/polygon-with-2-holes.kml
@@ -0,0 +1,72 @@
+
+
+
+ polygon-with-2-holes
+
+
+ polygon-with-2-holes
+
+ Outer 1
+ #poly-000000-1-77-nodesc
+
+
+
+ 1
+ -74.0041208,40.72948650000001,0.0 -74.00425,40.717924,0.0 -73.983135,40.71818400000001,0.0 -73.983393,40.729763,0.0 -74.0041208,40.72948650000001,0.0
+
+
+
+
+ 1
+ -73.999872,40.726186,0.0 -73.999872,40.721567,0.0 -73.9946795,40.72156710000001,0.0 -73.9947009,40.7262994,0.0 -73.999872,40.726186,0.0
+
+
+
+
+ 1
+ -73.9924049,40.7263481,0.0 -73.9922547,40.721567099999994,0.0 -73.9868259,40.7215671,0.0 -73.9871049,40.72642940000001,0.0 -73.9924049,40.7263481,0.0
+
+
+
+
+
+
+
+
+
+ normal
+ #poly-000000-1-77-nodesc-normal
+
+
+ highlight
+ #poly-000000-1-77-nodesc-highlight
+
+
+
+
\ No newline at end of file
diff --git a/spec/support/polygon-with-hole-test1.kml b/spec/support/polygon-with-hole-test1.kml
new file mode 100644
index 0000000..2e95573
--- /dev/null
+++ b/spec/support/polygon-with-hole-test1.kml
@@ -0,0 +1,66 @@
+
+
+
+ Polygon with hole test 1
+
+
+ Polygon with hole test
+
+ Outer 1
+ #poly-000000-1-77-nodesc
+
+
+
+ 1
+ -74.0039921,40.7295028,0.0 -74.0042496,40.7179242,0.0 -73.9831352,40.7181844,0.0 -73.9833927,40.7297629,0.0 -74.0039921,40.7295028,0.0
+
+
+
+
+ 1
+ -73.9998722,40.7261855,0.0 -73.9998722,40.7215671,0.0 -73.9895725,40.7215671,0.0 -73.9897442,40.7263807,0.0 -73.9998722,40.7261855,0.0
+
+
+
+
+
+
+
+
+
+ normal
+ #poly-000000-1-77-nodesc-normal
+
+
+ highlight
+ #poly-000000-1-77-nodesc-highlight
+
+
+
+
\ No newline at end of file