Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support non-constant polygon for pointInPolygon #9002

Closed
JacobHayes opened this issue Feb 5, 2020 · 1 comment
Closed

Support non-constant polygon for pointInPolygon #9002

JacobHayes opened this issue Feb 5, 2020 · 1 comment

Comments

@JacobHayes
Copy link
Contributor

JacobHayes commented Feb 5, 2020

Use case

Support geospatial joins to a table of stored polygons.

We're investigating clickhouse (which has been awesome!) for a geo heavy product where we'd like to be able to aggregate a collection of rows with (lng,lat) points to a number of selected/filtered polygons. Since pointInPoly only works for polygon constants, I've seen some folks either chaining checks with ORs or UNION ALLs with different polygon constants. We have too many polygons for this to work well, and sometimes may want to "group" on other polygon metadata (ex: internal id), which would require the UNION ALL approach, with additional hard coded "select" columns. For our use case, we'd like to join to a geo table with stored polygons. For example:

create table points (lng Float64, lat Float64) engine = MergeTree() order by (lng, lat);
insert into points (lng, lat)
values
    (1, 1),
    (2.5, 2.5),
    (7.5, 7.5),
    (10, 10)
;

-- Specifying Array(Tuple(Float64, Float64)) will automatically get decomposed into two separate array columns (geom.0
-- and geom.1), so instead give better names. This decomposition does not happen for 3d+ arrays.
create table geoms (id text, geom_lng Array(Float64), geom_lat Array(Float64)) engine = MergeTree() order by (geom_lng, geom_lat);
insert into geoms (id, geom_lng, geom_lat)
values ('test shape', array(0, 5, 5, 0, 0), array(0, 0, 5, 5, 0));

select id, arrayZip(geom_lng, geom_lat) from geoms;
-- ┌─id─────────┬─arrayZip(geom_lng, geom_lat)────┐
-- │ test shape │ [(0,0),(5,0),(5,5),(0,5),(0,0)] │
-- └────────────┴─────────────────────────────────┘

-- Note that the polygon matches the arrayZip output above (but added type functions calls)
select lng, lat from points where pointInPolygon(tuple(lng, lat), array(tuple(0,0), tuple(5, 0), tuple(5, 5), tuple(0, 5), tuple(0, 0)));
-- ┌─lng─┬─lat─┐
-- │   1 │   1 │
-- │ 2.5 │ 2.5 │
-- └─────┴─────┘

-- CH doesn't support non-equality join clauses, so imitate pointInPolygon inner join with cross join + where. In
-- reality, we'd still probably inner join on some containing geo cell index (s2, h3, whatever) with further
-- pointInPolygon filtering below.
select lng, lat
from points
cross join (
    select arrayZip(geom_lng, geom_lat) as geom from geoms where id in ('test shape')
)
where pointInPolygon(tuple(lng, lat), geom);
-- Received exception from server (version 20.1.3):
-- Code: 44. DB::Exception: Received from <ip>:<port>. DB::Exception: Argument 2 for function pointInPolygon must be constant array of tuples..

If this support was added, the current pointInPolygon structure of taking the polygon exterior as the second argument and holes as additional arguments wouldn't be suitable for column storage, as there'd be no way to expand the hole polygons. Instead, a "Polygon" column structure like Array(Array(Tuple(Flaot64, Float64))) would be more flexible and match geojson (geo types appear to be on the extended roadmap). Here's a geojson shape with a hole for example:

{
  "type": "Polygon",
  "coordinates": [
    [[ -120, 60 ], [ 120, 60 ], [ 120, -60 ], [ -120, -60 ], [ -120, 60 ]],
    [[ -60, 30 ], [ 60, 30 ], [ 60, -30 ], [ -60, -30 ], [ -60, 30 ]]
  ]
}

I know we'll generally want to avoid joins and pre-calculate things like this, but that's not feasible because we store upwards of 20 different geometry layers (ex: neighborhoods vs cities vs states, etc) and are starting to supporting custom (created real time) geometry aggregation.

Describe the solution you'd like

Support for pointInPolygon with non-constant values, ideally exact column references (ie: no need for arrayZip(lngs, lats)). Column references would need to support holes, so could be a 3-dimensional array. Supporting non-equality joins (join geo on pointInPolygon(pnt, geom)) is out of scope for this request.

Describe alternatives you've considered

The only current alternatives are manually selecting out all of the geometry shapes we want to query and creating Clickhouse SQL strings for each one to use in pointInPolygon queries, either separated by OR or in multiple UNION ALL queries (if we need to select other geometry metadata). These are not desirable because:

  • we need to fetch the geometries client side (may be quite large to transport)
  • construct SQL representation of these geometries (ugly)
  • build very large/duplicated queries (hit query size/length limits, hard to work with)
Example `OR` queries

1 geom:

select count(*)
from start_locations
where pointInPolygon(
    tuple(longitude, latitude),
    array(
        tuple(-88.822051, 42.276979),
        tuple(-88.822059, 42.27676),
        tuple(-88.822064, 42.27665),
        tuple(-88.822149, 42.275868),
        tuple(-88.822238, 42.27551),
        tuple(-88.822512, 42.274698),
        tuple(-88.822685, 42.274893),
        tuple(-88.823066, 42.27526),
        tuple(-88.823491, 42.275594),
        tuple(-88.823955, 42.275892),
        tuple(-88.824455, 42.276152),
        tuple(-88.824983, 42.276374),
        tuple(-88.825532, 42.276553),
        tuple(-88.826095, 42.276688),
        tuple(-88.826666, 42.276782),
        tuple(-88.827196, 42.276828),
        tuple(-88.830649, 42.277624),
        tuple(-88.831541, 42.277827),
        tuple(-88.831474, 42.277834),
        tuple(-88.830899, 42.277844),
        tuple(-88.830067, 42.277836),
        tuple(-88.829714, 42.2778),
        tuple(-88.82923, 42.277712),
        tuple(-88.828094, 42.277436),
        tuple(-88.826501, 42.277056),
        tuple(-88.825981, 42.276986),
        tuple(-88.825385, 42.276963),
        tuple(-88.823743, 42.276981),
        tuple(-88.822436, 42.276987),
        tuple(-88.822051, 42.276979)
    )
)

100 Chicago census blocks:

select count(*)
from start_locations
where pointInPolygon(tuple(longitude, latitude), array(tuple(-88.831772, 42.272051), tuple(-88.831774, 42.273307), tuple(-88.831775, 42.273733), tuple(-88.831776, 42.274579), tuple(-88.831401, 42.274583), tuple(-88.830939, 42.274526), tuple(-88.830959, 42.274511), tuple(-88.830976, 42.27448), tuple(-88.830998, 42.273925), tuple(-88.830996, 42.273871), tuple(-88.830983, 42.27381), tuple(-88.830965, 42.273784), tuple(-88.830921, 42.273752), tuple(-88.830834, 42.273728), tuple(-88.829421, 42.273741), tuple(-88.827171, 42.273761), tuple(-88.827164, 42.273715), tuple(-88.8271, 42.273509), tuple(-88.826839, 42.273136), tuple(-88.826711, 42.272931), tuple(-88.826657, 42.272726), tuple(-88.82813, 42.272719), tuple(-88.829571, 42.27271), tuple(-88.830195, 42.272711), tuple(-88.830782, 42.272719), tuple(-88.830844, 42.272712), tuple(-88.830879, 42.2727), tuple(-88.830907, 42.272678), tuple(-88.83092, 42.272653), tuple(-88.830935, 42.271389), tuple(-88.830931, 42.270262), tuple(-88.831767, 42.270247), tuple(-88.83177, 42.271008), tuple(-88.831772, 42.272051)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.830939, 42.274526), tuple(-88.830911, 42.274537), tuple(-88.830855, 42.274546), tuple(-88.829668, 42.274552), tuple(-88.829586, 42.274553), tuple(-88.829455, 42.274556), tuple(-88.829021, 42.274563), tuple(-88.828479, 42.274631), tuple(-88.82816, 42.274686), tuple(-88.827867, 42.274722), tuple(-88.827615, 42.274744), tuple(-88.827273, 42.274754), tuple(-88.827186, 42.274753), tuple(-88.827181, 42.274212), tuple(-88.827171, 42.273761), tuple(-88.829421, 42.273741), tuple(-88.830834, 42.273728), tuple(-88.830921, 42.273752), tuple(-88.830965, 42.273784), tuple(-88.830983, 42.27381), tuple(-88.830996, 42.273871), tuple(-88.830998, 42.273925), tuple(-88.830976, 42.27448), tuple(-88.830959, 42.274511), tuple(-88.830939, 42.274526)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.829598, 42.275154), tuple(-88.831776, 42.275164), tuple(-88.831775, 42.276298), tuple(-88.831775, 42.276757), tuple(-88.830733, 42.276781), tuple(-88.829639, 42.276806), tuple(-88.827961, 42.276845), tuple(-88.827957, 42.275637), tuple(-88.827955, 42.275156), tuple(-88.829483, 42.275154), tuple(-88.829598, 42.275154)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.823887, 42.272747), tuple(-88.82407, 42.271275), tuple(-88.824099, 42.270932), tuple(-88.824101, 42.270906), tuple(-88.824109, 42.270447), tuple(-88.82411, 42.270393), tuple(-88.824125, 42.270344), tuple(-88.824146, 42.270316), tuple(-88.824192, 42.270287), tuple(-88.824252, 42.270278), tuple(-88.82536, 42.270287), tuple(-88.825355, 42.271154), tuple(-88.82532, 42.271561), tuple(-88.825288, 42.272098), tuple(-88.825275, 42.272739), tuple(-88.823887, 42.272747)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.828081, 42.268997), tuple(-88.828505, 42.268989), tuple(-88.828626, 42.268996), tuple(-88.828687, 42.269018), tuple(-88.828748, 42.269049), tuple(-88.828783, 42.269082), tuple(-88.828802, 42.269121), tuple(-88.828935, 42.269921), tuple(-88.829074, 42.270275), tuple(-88.827887, 42.270277), tuple(-88.826541, 42.270285), tuple(-88.82656, 42.270211), tuple(-88.826517, 42.269901), tuple(-88.82634, 42.269223), tuple(-88.826308, 42.268998), tuple(-88.827719, 42.269003), tuple(-88.828081, 42.268997)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.82642, 42.268013), tuple(-88.826302, 42.268791), tuple(-88.826308, 42.268998), tuple(-88.824989, 42.269009), tuple(-88.824713, 42.268996), tuple(-88.82464, 42.268981), tuple(-88.824582, 42.268949), tuple(-88.824556, 42.268919), tuple(-88.824537, 42.268865), tuple(-88.824875, 42.266764), tuple(-88.824964, 42.266403), tuple(-88.825054, 42.266199), tuple(-88.825172, 42.266005), tuple(-88.825306, 42.26585), tuple(-88.825362, 42.265808), tuple(-88.825434, 42.265772), tuple(-88.825521, 42.265761), tuple(-88.825548, 42.265762), tuple(-88.825598, 42.265773), tuple(-88.826485, 42.266175), tuple(-88.826755, 42.266326), tuple(-88.826655, 42.266551), tuple(-88.826574, 42.266995), tuple(-88.82642, 42.268013)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.826755, 42.266326), tuple(-88.827082, 42.265964), tuple(-88.82727, 42.265735), tuple(-88.827806, 42.26599), tuple(-88.828224, 42.266196), tuple(-88.828114, 42.266749), tuple(-88.828091, 42.26799), tuple(-88.82642, 42.268013), tuple(-88.826574, 42.266995), tuple(-88.826655, 42.266551), tuple(-88.826755, 42.266326)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.826096, 42.274766), tuple(-88.827186, 42.274753), tuple(-88.827209, 42.27565), tuple(-88.827215, 42.275884), tuple(-88.82721, 42.275935), tuple(-88.827197, 42.275976), tuple(-88.827156, 42.276023), tuple(-88.827125, 42.276037), tuple(-88.82707, 42.27605), tuple(-88.827013, 42.276053), tuple(-88.826728, 42.276045), tuple(-88.826422, 42.276002), tuple(-88.826179, 42.275934), tuple(-88.825915, 42.275826), tuple(-88.825986, 42.275739), tuple(-88.826057, 42.275529), tuple(-88.826095, 42.275315), tuple(-88.826105, 42.27496), tuple(-88.826096, 42.274766)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.839013, 42.275112), tuple(-88.838958, 42.276708), tuple(-88.835704, 42.276743), tuple(-88.832369, 42.27675), tuple(-88.831775, 42.276757), tuple(-88.831775, 42.276298), tuple(-88.831776, 42.275164), tuple(-88.831776, 42.274579), tuple(-88.832539, 42.274579), tuple(-88.83258, 42.276153), tuple(-88.833605, 42.276153), tuple(-88.834548, 42.276153), tuple(-88.835912, 42.276153), tuple(-88.836607, 42.276153), tuple(-88.837134, 42.276153), tuple(-88.837276, 42.276115), tuple(-88.837366, 42.276019), tuple(-88.837379, 42.275791), tuple(-88.83734, 42.274992), tuple(-88.837276, 42.273935), tuple(-88.837233, 42.273658), tuple(-88.837099, 42.272807), tuple(-88.837009, 42.272448), tuple(-88.836851, 42.272155), tuple(-88.836579, 42.271971), tuple(-88.836297, 42.271829), tuple(-88.836193, 42.271752), tuple(-88.836048, 42.271645), tuple(-88.835856, 42.27142), tuple(-88.835669, 42.271125), tuple(-88.83562, 42.271044), tuple(-88.835778, 42.271047), tuple(-88.83609, 42.271412), tuple(-88.837633, 42.27137), tuple(-88.839011, 42.273635), tuple(-88.840436, 42.273641), tuple(-88.838904, 42.270531), tuple(-88.8389, 42.270502), tuple(-88.8389, 42.2705), tuple(-88.838407, 42.26943), tuple(-88.838337, 42.269289), tuple(-88.838243, 42.2691), tuple(-88.838376, 42.269093), tuple(-88.838671, 42.269096), tuple(-88.839309, 42.269092), tuple(-88.840498, 42.269092), tuple(-88.841384, 42.269075), tuple(-88.841476, 42.269058), tuple(-88.841568, 42.269025), tuple(-88.841566, 42.269513), tuple(-88.841538, 42.270389), tuple(-88.841512, 42.273646), tuple(-88.841497, 42.274933), tuple(-88.840063, 42.274937), tuple(-88.83986, 42.274762), tuple(-88.839013, 42.275112)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.835914, 42.273657), tuple(-88.835912, 42.276153), tuple(-88.834548, 42.276153), tuple(-88.834549, 42.27458), tuple(-88.832539, 42.274579), tuple(-88.832515, 42.273678), tuple(-88.835914, 42.273657)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.836607, 42.276153), tuple(-88.835912, 42.276153), tuple(-88.835914, 42.273657), tuple(-88.836581, 42.273658), tuple(-88.836607, 42.276153)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.841521, 42.276681), tuple(-88.838958, 42.276708), tuple(-88.839013, 42.275112), tuple(-88.83986, 42.274762), tuple(-88.840063, 42.274937), tuple(-88.841497, 42.274933), tuple(-88.841521, 42.276681)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.836607, 42.276153), tuple(-88.836581, 42.273658), tuple(-88.837233, 42.273658), tuple(-88.837276, 42.273935), tuple(-88.83734, 42.274992), tuple(-88.837379, 42.275791), tuple(-88.837366, 42.276019), tuple(-88.837276, 42.276115), tuple(-88.837134, 42.276153), tuple(-88.836607, 42.276153)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.835778, 42.271047), tuple(-88.836478, 42.271044), tuple(-88.836484, 42.270132), tuple(-88.835892, 42.270084), tuple(-88.835673, 42.269893), tuple(-88.836505, 42.269803), tuple(-88.837056, 42.269787), tuple(-88.837554, 42.269763), tuple(-88.837629, 42.27), tuple(-88.838482, 42.269831), tuple(-88.838904, 42.270531), tuple(-88.840436, 42.273641), tuple(-88.839011, 42.273635), tuple(-88.837633, 42.27137), tuple(-88.83609, 42.271412), tuple(-88.835778, 42.271047)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.83466, 42.270308), tuple(-88.834551, 42.270246), tuple(-88.834912, 42.270204), tuple(-88.835149, 42.270518), tuple(-88.835156, 42.270516), tuple(-88.835615, 42.271038), tuple(-88.83562, 42.271044), tuple(-88.835669, 42.271125), tuple(-88.835856, 42.27142), tuple(-88.836048, 42.271645), tuple(-88.836193, 42.271752), tuple(-88.836297, 42.271829), tuple(-88.836579, 42.271971), tuple(-88.836851, 42.272155), tuple(-88.837009, 42.272448), tuple(-88.837099, 42.272807), tuple(-88.837233, 42.273658), tuple(-88.836581, 42.273658), tuple(-88.835914, 42.273657), tuple(-88.835914, 42.273634), tuple(-88.835786, 42.272794), tuple(-88.835061, 42.270872), tuple(-88.834852, 42.270596), tuple(-88.834846, 42.270588), tuple(-88.83466, 42.270308)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.832539, 42.274579), tuple(-88.834549, 42.27458), tuple(-88.834548, 42.276153), tuple(-88.833605, 42.276153), tuple(-88.83258, 42.276153), tuple(-88.832539, 42.274579)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.831772, 42.272051), tuple(-88.83177, 42.271008), tuple(-88.831921, 42.270937), tuple(-88.832803, 42.270457), tuple(-88.834046, 42.269769), tuple(-88.834551, 42.270246), tuple(-88.83466, 42.270308), tuple(-88.834846, 42.270588), tuple(-88.834852, 42.270596), tuple(-88.835061, 42.270872), tuple(-88.835786, 42.272794), tuple(-88.835914, 42.273634), tuple(-88.835914, 42.273657), tuple(-88.832515, 42.273678), tuple(-88.832539, 42.274579), tuple(-88.831776, 42.274579), tuple(-88.831775, 42.273733), tuple(-88.831774, 42.273307), tuple(-88.831772, 42.272051)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.838654, 42.267634), tuple(-88.839742, 42.267359), tuple(-88.839815, 42.267501), tuple(-88.840083, 42.26804), tuple(-88.840418, 42.268785), tuple(-88.840479, 42.268961), tuple(-88.840498, 42.269092), tuple(-88.839309, 42.269092), tuple(-88.838654, 42.267634)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.841573, 42.26749), tuple(-88.841573, 42.267752), tuple(-88.841568, 42.269025), tuple(-88.841476, 42.269058), tuple(-88.841384, 42.269075), tuple(-88.840498, 42.269092), tuple(-88.840479, 42.268961), tuple(-88.840418, 42.268785), tuple(-88.840083, 42.26804), tuple(-88.839815, 42.267501), tuple(-88.839986, 42.26751), tuple(-88.841069, 42.267505), tuple(-88.841573, 42.26749)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.841568, 42.269025), tuple(-88.841573, 42.267752), tuple(-88.841654, 42.26775), tuple(-88.841739, 42.267738), tuple(-88.841802, 42.267721), tuple(-88.842052, 42.267583), tuple(-88.842763, 42.268332), tuple(-88.841973, 42.268777), tuple(-88.841568, 42.269025)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.841568, 42.269025), tuple(-88.841973, 42.268777), tuple(-88.842763, 42.268332), tuple(-88.843486, 42.269047), tuple(-88.843847, 42.26944), tuple(-88.843865, 42.269481), tuple(-88.843874, 42.269538), tuple(-88.842498, 42.269514), tuple(-88.841566, 42.269513), tuple(-88.841568, 42.269025)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.841538, 42.270389), tuple(-88.841566, 42.269513), tuple(-88.842498, 42.269514), tuple(-88.843874, 42.269538), tuple(-88.844041, 42.269543), tuple(-88.844054, 42.269743), tuple(-88.84406, 42.270315), tuple(-88.844046, 42.270342), tuple(-88.844, 42.270384), tuple(-88.843971, 42.270398), tuple(-88.843938, 42.270408), tuple(-88.84388, 42.270418), tuple(-88.843643, 42.270418), tuple(-88.842575, 42.270403), tuple(-88.841538, 42.270389)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.832946, 42.266849), tuple(-88.833375, 42.267288), tuple(-88.832917, 42.267541), tuple(-88.832167, 42.267927), tuple(-88.831812, 42.267384), tuple(-88.831919, 42.267382), tuple(-88.832017, 42.267357), tuple(-88.832104, 42.267322), tuple(-88.832506, 42.2671), tuple(-88.832946, 42.266849)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.844656, 42.272599), tuple(-88.850262, 42.272561), tuple(-88.850291, 42.273387), tuple(-88.851313, 42.273414), tuple(-88.851305, 42.275806), tuple(-88.851308, 42.276439), tuple(-88.851306, 42.276521), tuple(-88.845988, 42.276636), tuple(-88.842382, 42.276683), tuple(-88.841952, 42.276682), tuple(-88.841803, 42.275348), tuple(-88.841497, 42.274933), tuple(-88.841512, 42.273646), tuple(-88.841538, 42.270389), tuple(-88.842575, 42.270403), tuple(-88.842585, 42.270736), tuple(-88.844675, 42.270716), tuple(-88.844679, 42.271181), tuple(-88.843869, 42.271162), tuple(-88.843907, 42.272623), tuple(-88.844656, 42.272599)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.841952, 42.276682), tuple(-88.841521, 42.276681), tuple(-88.841497, 42.274933), tuple(-88.841803, 42.275348), tuple(-88.841952, 42.276682)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.851313, 42.273414), tuple(-88.851439, 42.273426), tuple(-88.851429, 42.276438), tuple(-88.851308, 42.276439), tuple(-88.851305, 42.275806), tuple(-88.851313, 42.273414)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.851439, 42.273426), tuple(-88.851441, 42.273179), tuple(-88.852451, 42.273179), tuple(-88.85407, 42.273156), tuple(-88.855446, 42.273099), tuple(-88.855513, 42.27635), tuple(-88.855003, 42.276385), tuple(-88.853532, 42.276407), tuple(-88.853172, 42.276414), tuple(-88.852475, 42.276428), tuple(-88.851603, 42.276437), tuple(-88.851429, 42.276438), tuple(-88.851439, 42.273426)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.851345, 42.270128), tuple(-88.851346, 42.27005), tuple(-88.851355, 42.269172), tuple(-88.851337, 42.267942), tuple(-88.85135, 42.267858), tuple(-88.851381, 42.267764), tuple(-88.851446, 42.267663), tuple(-88.851984, 42.267927), tuple(-88.852971, 42.268401), tuple(-88.854191, 42.268963), tuple(-88.854856, 42.269269), tuple(-88.857008, 42.270268), tuple(-88.856715, 42.270599), tuple(-88.856582, 42.270789), tuple(-88.856512, 42.270997), tuple(-88.85653, 42.27294), tuple(-88.856544, 42.273054), tuple(-88.857104, 42.273046), tuple(-88.857473, 42.273058), tuple(-88.857771, 42.273095), tuple(-88.858053, 42.273152), tuple(-88.858187, 42.273197), tuple(-88.858407, 42.273278), tuple(-88.858686, 42.27341), tuple(-88.859196, 42.273686), tuple(-88.859646, 42.273947), tuple(-88.859097, 42.274666), tuple(-88.858748, 42.275013), tuple(-88.858361, 42.275322), tuple(-88.857893, 42.275619), tuple(-88.85759, 42.275776), tuple(-88.857109, 42.275979), tuple(-88.856572, 42.276151), tuple(-88.856074, 42.276267), tuple(-88.855878, 42.276297), tuple(-88.855546, 42.276348), tuple(-88.855513, 42.27635), tuple(-88.855446, 42.273099), tuple(-88.855413, 42.271495), tuple(-88.855423, 42.270551), tuple(-88.855759, 42.270779), tuple(-88.855683, 42.27007), tuple(-88.855139, 42.269795), tuple(-88.854971, 42.270014), tuple(-88.855008, 42.270579), tuple(-88.854106, 42.270588), tuple(-88.854116, 42.269735), tuple(-88.854462, 42.269393), tuple(-88.85422, 42.26926), tuple(-88.853575, 42.27), tuple(-88.853229, 42.269848), tuple(-88.853428, 42.269559), tuple(-88.852124, 42.269516), tuple(-88.852148, 42.269683), tuple(-88.852404, 42.269687), tuple(-88.852404, 42.270128), tuple(-88.851345, 42.270128)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.859508, 42.271424), tuple(-88.859181, 42.271789), tuple(-88.858417, 42.272679), tuple(-88.85808, 42.273125), tuple(-88.858053, 42.273152), tuple(-88.857771, 42.273095), tuple(-88.857473, 42.273058), tuple(-88.857104, 42.273046), tuple(-88.856544, 42.273054), tuple(-88.85653, 42.27294), tuple(-88.856512, 42.270997), tuple(-88.856582, 42.270789), tuple(-88.856715, 42.270599), tuple(-88.857008, 42.270268), tuple(-88.859508, 42.271424)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.856525, 42.276332), tuple(-88.855878, 42.276297), tuple(-88.856074, 42.276267), tuple(-88.856572, 42.276151), tuple(-88.857109, 42.275979), tuple(-88.85759, 42.275776), tuple(-88.857893, 42.275619), tuple(-88.858361, 42.275322), tuple(-88.858748, 42.275013), tuple(-88.859097, 42.274666), tuple(-88.859646, 42.273947), tuple(-88.859823, 42.274036), tuple(-88.859459, 42.274509), tuple(-88.859151, 42.274854), tuple(-88.858842, 42.275187), tuple(-88.858413, 42.275508), tuple(-88.85795, 42.275785), tuple(-88.857464, 42.276018), tuple(-88.857129, 42.276148), tuple(-88.85655, 42.276326), tuple(-88.856525, 42.276332)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.856525, 42.276332), tuple(-88.85655, 42.276326), tuple(-88.857129, 42.276148), tuple(-88.857464, 42.276018), tuple(-88.85795, 42.275785), tuple(-88.858413, 42.275508), tuple(-88.858842, 42.275187), tuple(-88.859151, 42.274854), tuple(-88.859459, 42.274509), tuple(-88.859823, 42.274036), tuple(-88.860105, 42.274191), tuple(-88.860408, 42.274383), tuple(-88.86063, 42.274573), tuple(-88.860854, 42.274793), tuple(-88.860941, 42.274915), tuple(-88.861051, 42.275136), tuple(-88.861111, 42.275369), tuple(-88.861111, 42.276204), tuple(-88.861108, 42.276579), tuple(-88.856525, 42.276332)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.844734, 42.269483), tuple(-88.844684, 42.269496), tuple(-88.844555, 42.26953), tuple(-88.844433, 42.269539), tuple(-88.844259, 42.269551), tuple(-88.844041, 42.269543), tuple(-88.843874, 42.269538), tuple(-88.843865, 42.269481), tuple(-88.843847, 42.26944), tuple(-88.843486, 42.269047), tuple(-88.84449, 42.268526), tuple(-88.845197, 42.269275), tuple(-88.844949, 42.269404), tuple(-88.844809, 42.269463), tuple(-88.844734, 42.269483)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.851327, 42.271862), tuple(-88.850276, 42.271849), tuple(-88.850262, 42.272561), tuple(-88.844656, 42.272599), tuple(-88.843907, 42.272623), tuple(-88.843869, 42.271162), tuple(-88.844679, 42.271181), tuple(-88.844675, 42.270716), tuple(-88.842585, 42.270736), tuple(-88.842575, 42.270403), tuple(-88.843643, 42.270418), tuple(-88.84388, 42.270418), tuple(-88.843938, 42.270408), tuple(-88.843971, 42.270398), tuple(-88.844457, 42.270413), tuple(-88.844424, 42.269649), tuple(-88.844433, 42.269539), tuple(-88.844555, 42.26953), tuple(-88.844684, 42.269496), tuple(-88.844734, 42.269483), tuple(-88.844938, 42.269474), tuple(-88.84842, 42.26945), tuple(-88.84842, 42.269636), tuple(-88.848724, 42.269492), tuple(-88.848831, 42.269448), tuple(-88.849999, 42.269412), tuple(-88.850018, 42.270058), tuple(-88.851346, 42.27005), tuple(-88.851345, 42.270128), tuple(-88.851327, 42.271862)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.844433, 42.269539), tuple(-88.844424, 42.269649), tuple(-88.844457, 42.270413), tuple(-88.843971, 42.270398), tuple(-88.844, 42.270384), tuple(-88.844046, 42.270342), tuple(-88.84406, 42.270315), tuple(-88.844054, 42.269743), tuple(-88.844041, 42.269543), tuple(-88.844259, 42.269551), tuple(-88.844433, 42.269539)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.84842, 42.26945), tuple(-88.848831, 42.269448), tuple(-88.848724, 42.269492), tuple(-88.84842, 42.269636), tuple(-88.84842, 42.26945)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.851327, 42.271862), tuple(-88.85132, 42.272577), tuple(-88.851314, 42.27318), tuple(-88.851313, 42.273414), tuple(-88.850291, 42.273387), tuple(-88.850262, 42.272561), tuple(-88.850276, 42.271849), tuple(-88.851327, 42.271862)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.851327, 42.271862), tuple(-88.851448, 42.271864), tuple(-88.851448, 42.27258), tuple(-88.851441, 42.273179), tuple(-88.851314, 42.27318), tuple(-88.85132, 42.272577), tuple(-88.851327, 42.271862)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.851441, 42.273179), tuple(-88.851448, 42.27258), tuple(-88.851448, 42.271864), tuple(-88.851327, 42.271862), tuple(-88.851345, 42.270128), tuple(-88.852404, 42.270128), tuple(-88.852404, 42.269687), tuple(-88.852148, 42.269683), tuple(-88.852124, 42.269516), tuple(-88.853428, 42.269559), tuple(-88.853229, 42.269848), tuple(-88.853575, 42.27), tuple(-88.85422, 42.26926), tuple(-88.854462, 42.269393), tuple(-88.854116, 42.269735), tuple(-88.854106, 42.270588), tuple(-88.855008, 42.270579), tuple(-88.854971, 42.270014), tuple(-88.855139, 42.269795), tuple(-88.855683, 42.27007), tuple(-88.855759, 42.270779), tuple(-88.855423, 42.270551), tuple(-88.855413, 42.271495), tuple(-88.855446, 42.273099), tuple(-88.85407, 42.273156), tuple(-88.852451, 42.273179), tuple(-88.851441, 42.273179)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.841573, 42.26749), tuple(-88.841575, 42.267136), tuple(-88.841661, 42.267163), tuple(-88.841768, 42.267286), tuple(-88.842052, 42.267583), tuple(-88.841802, 42.267721), tuple(-88.841739, 42.267738), tuple(-88.841654, 42.26775), tuple(-88.841573, 42.267752), tuple(-88.841573, 42.26749)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.839564, 42.266621), tuple(-88.839551, 42.266559), tuple(-88.839548, 42.266549), tuple(-88.839557, 42.266544), tuple(-88.83958, 42.266532), tuple(-88.839602, 42.266521), tuple(-88.839616, 42.266514), tuple(-88.840022, 42.266309), tuple(-88.840164, 42.266242), tuple(-88.841135, 42.26573), tuple(-88.841548, 42.266195), tuple(-88.841588, 42.26631), tuple(-88.84159, 42.266412), tuple(-88.841581, 42.266568), tuple(-88.841573, 42.266891), tuple(-88.841575, 42.267136), tuple(-88.841573, 42.26749), tuple(-88.841069, 42.267505), tuple(-88.839986, 42.26751), tuple(-88.839815, 42.267501), tuple(-88.839742, 42.267359), tuple(-88.839727, 42.267283), tuple(-88.839691, 42.267214), tuple(-88.839564, 42.266621)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.837974, 42.266263), tuple(-88.838934, 42.265759), tuple(-88.839548, 42.266549), tuple(-88.839551, 42.266559), tuple(-88.839564, 42.266621), tuple(-88.839691, 42.267214), tuple(-88.839727, 42.267283), tuple(-88.839742, 42.267359), tuple(-88.838654, 42.267634), tuple(-88.838433, 42.267179), tuple(-88.838187, 42.266633), tuple(-88.838146, 42.266556), tuple(-88.837974, 42.266263)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.836848, 42.26684), tuple(-88.837974, 42.266263), tuple(-88.838146, 42.266556), tuple(-88.838187, 42.266633), tuple(-88.838433, 42.267179), tuple(-88.838654, 42.267634), tuple(-88.839309, 42.269092), tuple(-88.838671, 42.269096), tuple(-88.838376, 42.269093), tuple(-88.838243, 42.2691), tuple(-88.838337, 42.269289), tuple(-88.838407, 42.26943), tuple(-88.8389, 42.2705), tuple(-88.8389, 42.270502), tuple(-88.838904, 42.270531), tuple(-88.838482, 42.269831), tuple(-88.837629, 42.27), tuple(-88.837554, 42.269763), tuple(-88.837393, 42.269258), tuple(-88.837101, 42.268239), tuple(-88.83666, 42.26694), tuple(-88.836848, 42.26684)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.841581, 42.266568), tuple(-88.841673, 42.266559), tuple(-88.841727, 42.266548), tuple(-88.841778, 42.266525), tuple(-88.842284, 42.266257), tuple(-88.843052, 42.267033), tuple(-88.842052, 42.267583), tuple(-88.841768, 42.267286), tuple(-88.841661, 42.267163), tuple(-88.841575, 42.267136), tuple(-88.841573, 42.266891), tuple(-88.841581, 42.266568)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.842052, 42.267583), tuple(-88.843052, 42.267033), tuple(-88.843784, 42.267795), tuple(-88.842763, 42.268332), tuple(-88.842052, 42.267583)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.843784, 42.267795), tuple(-88.844101, 42.268133), tuple(-88.84449, 42.268526), tuple(-88.843486, 42.269047), tuple(-88.842763, 42.268332), tuple(-88.843784, 42.267795)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.843784, 42.267795), tuple(-88.844776, 42.26726), tuple(-88.845464, 42.267986), tuple(-88.84449, 42.268526), tuple(-88.844101, 42.268133), tuple(-88.843784, 42.267795)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.84449, 42.268526), tuple(-88.845464, 42.267986), tuple(-88.845963, 42.26847), tuple(-88.846224, 42.268717), tuple(-88.845197, 42.269275), tuple(-88.84449, 42.268526)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.847905, 42.268872), tuple(-88.848307, 42.269217), tuple(-88.84842, 42.269348), tuple(-88.84842, 42.26945), tuple(-88.844938, 42.269474), tuple(-88.844734, 42.269483), tuple(-88.844809, 42.269463), tuple(-88.844949, 42.269404), tuple(-88.845197, 42.269275), tuple(-88.846224, 42.268717), tuple(-88.847178, 42.268211), tuple(-88.847679, 42.268716), tuple(-88.84783, 42.268841), tuple(-88.847874, 42.268866), tuple(-88.847905, 42.268872)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.846451, 42.26746), tuple(-88.847178, 42.268211), tuple(-88.846224, 42.268717), tuple(-88.845963, 42.26847), tuple(-88.845464, 42.267986), tuple(-88.846451, 42.26746)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.844776, 42.26726), tuple(-88.84575, 42.266749), tuple(-88.846451, 42.26746), tuple(-88.845464, 42.267986), tuple(-88.844776, 42.26726)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.844043, 42.266504), tuple(-88.845005, 42.265989), tuple(-88.84575, 42.266749), tuple(-88.844776, 42.26726), tuple(-88.844043, 42.266504)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.843052, 42.267033), tuple(-88.844043, 42.266504), tuple(-88.844776, 42.26726), tuple(-88.843784, 42.267795), tuple(-88.843052, 42.267033)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.842284, 42.266257), tuple(-88.843277, 42.265741), tuple(-88.844043, 42.266504), tuple(-88.843052, 42.267033), tuple(-88.842284, 42.266257)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.838126, 42.263949), tuple(-88.838817, 42.264634), tuple(-88.838869, 42.26467), tuple(-88.838547, 42.264848), tuple(-88.838379, 42.264942), tuple(-88.836714, 42.26581), tuple(-88.836598, 42.265881), tuple(-88.836571, 42.265911), tuple(-88.836572, 42.265959), tuple(-88.836604, 42.266091), tuple(-88.836848, 42.26684), tuple(-88.83666, 42.26694), tuple(-88.836575, 42.266554), tuple(-88.836416, 42.265983), tuple(-88.836299, 42.265514), tuple(-88.83612, 42.265065), tuple(-88.836392, 42.264911), tuple(-88.836708, 42.264748), tuple(-88.838126, 42.263949)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.835475, 42.267572), tuple(-88.834526, 42.266638), tuple(-88.834096, 42.266211), tuple(-88.83612, 42.265065), tuple(-88.836299, 42.265514), tuple(-88.836416, 42.265983), tuple(-88.836575, 42.266554), tuple(-88.83666, 42.26694), tuple(-88.835475, 42.267572)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.83562, 42.271044), tuple(-88.835615, 42.271038), tuple(-88.835156, 42.270516), tuple(-88.835149, 42.270518), tuple(-88.834912, 42.270204), tuple(-88.834551, 42.270246), tuple(-88.834046, 42.269769), tuple(-88.835108, 42.26919), tuple(-88.835139, 42.26917), tuple(-88.835168, 42.269135), tuple(-88.835174, 42.269111), tuple(-88.835169, 42.269073), tuple(-88.8351, 42.268983), tuple(-88.834793, 42.268669), tuple(-88.834348, 42.268237), tuple(-88.835475, 42.267572), tuple(-88.83666, 42.26694), tuple(-88.837101, 42.268239), tuple(-88.837393, 42.269258), tuple(-88.837554, 42.269763), tuple(-88.837056, 42.269787), tuple(-88.836505, 42.269803), tuple(-88.835673, 42.269893), tuple(-88.835892, 42.270084), tuple(-88.836484, 42.270132), tuple(-88.836478, 42.271044), tuple(-88.835778, 42.271047), tuple(-88.83562, 42.271044)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.8336, 42.26933), tuple(-88.8346, 42.268789), tuple(-88.834793, 42.268669), tuple(-88.8351, 42.268983), tuple(-88.835169, 42.269073), tuple(-88.835174, 42.269111), tuple(-88.835168, 42.269135), tuple(-88.835139, 42.26917), tuple(-88.835108, 42.26919), tuple(-88.834046, 42.269769), tuple(-88.8336, 42.26933)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.83177, 42.271008), tuple(-88.831767, 42.270247), tuple(-88.831862, 42.270251), tuple(-88.831917, 42.270242), tuple(-88.832244, 42.270077), tuple(-88.8336, 42.26933), tuple(-88.834046, 42.269769), tuple(-88.832803, 42.270457), tuple(-88.831921, 42.270937), tuple(-88.83177, 42.271008)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.831767, 42.270247), tuple(-88.831774, 42.269615), tuple(-88.831956, 42.269533), tuple(-88.833159, 42.268893), tuple(-88.833541, 42.269267), tuple(-88.8336, 42.26933), tuple(-88.832244, 42.270077), tuple(-88.831917, 42.270242), tuple(-88.831862, 42.270251), tuple(-88.831767, 42.270247)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.831776, 42.269131), tuple(-88.831774, 42.269615), tuple(-88.831767, 42.270247), tuple(-88.830931, 42.270262), tuple(-88.829074, 42.270275), tuple(-88.828935, 42.269921), tuple(-88.828802, 42.269121), tuple(-88.828783, 42.269082), tuple(-88.828748, 42.269049), tuple(-88.828687, 42.269018), tuple(-88.828626, 42.268996), tuple(-88.828505, 42.268989), tuple(-88.828081, 42.268997), tuple(-88.827719, 42.269003), tuple(-88.826308, 42.268998), tuple(-88.826302, 42.268791), tuple(-88.82642, 42.268013), tuple(-88.828091, 42.26799), tuple(-88.828114, 42.266749), tuple(-88.828224, 42.266196), tuple(-88.828509, 42.266337), tuple(-88.829394, 42.266763), tuple(-88.829594, 42.266844), tuple(-88.829802, 42.266915), tuple(-88.830924, 42.2672), tuple(-88.831071, 42.267228), tuple(-88.831249, 42.267256), tuple(-88.831812, 42.267384), tuple(-88.831795, 42.26745), tuple(-88.831772, 42.267749), tuple(-88.831777, 42.269047), tuple(-88.830597, 42.269057), tuple(-88.830205, 42.269073), tuple(-88.830171, 42.269074), tuple(-88.830121, 42.269089), tuple(-88.830094, 42.269116), tuple(-88.83007, 42.269137), tuple(-88.830073, 42.269167), tuple(-88.830079, 42.269191), tuple(-88.830112, 42.269197), tuple(-88.83018, 42.269197), tuple(-88.83024, 42.269194), tuple(-88.830282, 42.269184), tuple(-88.830348, 42.269188), tuple(-88.830413, 42.26918), tuple(-88.830474, 42.269156), tuple(-88.830533, 42.26913), tuple(-88.830604, 42.269129), tuple(-88.830675, 42.269132), tuple(-88.830739, 42.269134), tuple(-88.830809, 42.269133), tuple(-88.830876, 42.269134), tuple(-88.830943, 42.269134), tuple(-88.831007, 42.269138), tuple(-88.83108, 42.269135), tuple(-88.831141, 42.269133), tuple(-88.831212, 42.269134), tuple(-88.831285, 42.269133), tuple(-88.831353, 42.269135), tuple(-88.831426, 42.269133), tuple(-88.831495, 42.269132), tuple(-88.831569, 42.269133), tuple(-88.831661, 42.269134), tuple(-88.831776, 42.269131)), array(tuple(-88.829347, 42.267206), tuple(-88.829028, 42.267601), tuple(-88.828966, 42.267684), tuple(-88.828949, 42.267778), tuple(-88.828964, 42.267832), tuple(-88.828983, 42.267873), tuple(-88.829013, 42.267913), tuple(-88.829054, 42.26795), tuple(-88.829103, 42.267983), tuple(-88.82916, 42.26801), tuple(-88.829229, 42.26803), tuple(-88.829484, 42.26806), tuple(-88.829534, 42.26806), tuple(-88.829606, 42.268051), tuple(-88.829673, 42.268032), tuple(-88.829731, 42.268003), tuple(-88.829779, 42.267967), tuple(-88.82982, 42.267926), tuple(-88.829853, 42.26788), tuple(-88.829938, 42.267686), tuple(-88.829969, 42.267503), tuple(-88.829962, 42.267467), tuple(-88.829935, 42.267416), tuple(-88.829888, 42.267375), tuple(-88.829826, 42.267347), tuple(-88.829579, 42.26728), tuple(-88.829347, 42.267206)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.829347, 42.267206), tuple(-88.829579, 42.26728), tuple(-88.829826, 42.267347), tuple(-88.829888, 42.267375), tuple(-88.829935, 42.267416), tuple(-88.829962, 42.267467), tuple(-88.829969, 42.267503), tuple(-88.829938, 42.267686), tuple(-88.829853, 42.26788), tuple(-88.82982, 42.267926), tuple(-88.829779, 42.267967), tuple(-88.829731, 42.268003), tuple(-88.829673, 42.268032), tuple(-88.829606, 42.268051), tuple(-88.829534, 42.26806), tuple(-88.829484, 42.26806), tuple(-88.829229, 42.26803), tuple(-88.82916, 42.26801), tuple(-88.829103, 42.267983), tuple(-88.829054, 42.26795), tuple(-88.829013, 42.267913), tuple(-88.828983, 42.267873), tuple(-88.828964, 42.267832), tuple(-88.828949, 42.267778), tuple(-88.828966, 42.267684), tuple(-88.829028, 42.267601), tuple(-88.829347, 42.267206)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.831777, 42.269047), tuple(-88.831776, 42.269131), tuple(-88.831661, 42.269134), tuple(-88.831569, 42.269133), tuple(-88.831495, 42.269132), tuple(-88.831426, 42.269133), tuple(-88.831353, 42.269135), tuple(-88.831285, 42.269133), tuple(-88.831212, 42.269134), tuple(-88.831141, 42.269133), tuple(-88.83108, 42.269135), tuple(-88.831007, 42.269138), tuple(-88.830943, 42.269134), tuple(-88.830876, 42.269134), tuple(-88.830809, 42.269133), tuple(-88.830739, 42.269134), tuple(-88.830675, 42.269132), tuple(-88.830604, 42.269129), tuple(-88.830533, 42.26913), tuple(-88.830474, 42.269156), tuple(-88.830413, 42.26918), tuple(-88.830348, 42.269188), tuple(-88.830282, 42.269184), tuple(-88.83024, 42.269194), tuple(-88.83018, 42.269197), tuple(-88.830112, 42.269197), tuple(-88.830079, 42.269191), tuple(-88.830073, 42.269167), tuple(-88.83007, 42.269137), tuple(-88.830094, 42.269116), tuple(-88.830121, 42.269089), tuple(-88.830171, 42.269074), tuple(-88.830205, 42.269073), tuple(-88.830597, 42.269057), tuple(-88.831777, 42.269047)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.830879, 42.2727), tuple(-88.830844, 42.272712), tuple(-88.830782, 42.272719), tuple(-88.830195, 42.272711), tuple(-88.829571, 42.27271), tuple(-88.829579, 42.272015), tuple(-88.829564, 42.271611), tuple(-88.829494, 42.271212), tuple(-88.829379, 42.270858), tuple(-88.829277, 42.270639), tuple(-88.829074, 42.270275), tuple(-88.830931, 42.270262), tuple(-88.830935, 42.271389), tuple(-88.83092, 42.272653), tuple(-88.830907, 42.272678), tuple(-88.830879, 42.2727)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.829571, 42.27271), tuple(-88.82813, 42.272719), tuple(-88.828123, 42.272093), tuple(-88.828086, 42.2718), tuple(-88.827879, 42.270754), tuple(-88.827877, 42.27036), tuple(-88.827887, 42.270277), tuple(-88.829074, 42.270275), tuple(-88.829277, 42.270639), tuple(-88.829379, 42.270858), tuple(-88.829494, 42.271212), tuple(-88.829564, 42.271611), tuple(-88.829579, 42.272015), tuple(-88.829571, 42.27271)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.82813, 42.272719), tuple(-88.826657, 42.272726), tuple(-88.826541, 42.270285), tuple(-88.827887, 42.270277), tuple(-88.827877, 42.27036), tuple(-88.827879, 42.270754), tuple(-88.828086, 42.2718), tuple(-88.828123, 42.272093), tuple(-88.82813, 42.272719)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.82643, 42.265362), tuple(-88.825975, 42.265154), tuple(-88.825231, 42.264756), tuple(-88.825465, 42.26462), tuple(-88.827208, 42.263663), tuple(-88.827699, 42.263393), tuple(-88.827887, 42.263288), tuple(-88.828079, 42.26344), tuple(-88.828271, 42.263676), tuple(-88.828707, 42.264329), tuple(-88.828929, 42.264823), tuple(-88.829121, 42.265328), tuple(-88.829698, 42.26614), tuple(-88.829779, 42.2663), tuple(-88.829484, 42.266371), tuple(-88.829262, 42.266206), tuple(-88.828988, 42.265976), tuple(-88.828826, 42.265817), tuple(-88.8287, 42.265641), tuple(-88.828574, 42.265608), tuple(-88.828471, 42.265822), tuple(-88.828575, 42.265987), tuple(-88.828774, 42.266152), tuple(-88.829048, 42.266311), tuple(-88.829683, 42.266629), tuple(-88.829957, 42.266706), tuple(-88.830178, 42.266744), tuple(-88.830622, 42.266755), tuple(-88.831073, 42.26681), tuple(-88.831294, 42.266799), tuple(-88.831516, 42.266738), tuple(-88.83173, 42.26664), tuple(-88.83183, 42.266566), tuple(-88.831822, 42.266854), tuple(-88.831812, 42.267384), tuple(-88.831249, 42.267256), tuple(-88.831071, 42.267228), tuple(-88.830924, 42.2672), tuple(-88.829802, 42.266915), tuple(-88.829594, 42.266844), tuple(-88.829394, 42.266763), tuple(-88.828509, 42.266337), tuple(-88.828224, 42.266196), tuple(-88.827806, 42.26599), tuple(-88.82727, 42.265735), tuple(-88.82643, 42.265362)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.83183, 42.266566), tuple(-88.831952, 42.266475), tuple(-88.832166, 42.266266), tuple(-88.832713, 42.265909), tuple(-88.833134, 42.265569), tuple(-88.833976, 42.26474), tuple(-88.834456, 42.263895), tuple(-88.834729, 42.263565), tuple(-88.834862, 42.263497), tuple(-88.835316, 42.263935), tuple(-88.835685, 42.264426), tuple(-88.835954, 42.264786), tuple(-88.83612, 42.265065), tuple(-88.834096, 42.266211), tuple(-88.832946, 42.266849), tuple(-88.832506, 42.2671), tuple(-88.832104, 42.267322), tuple(-88.832017, 42.267357), tuple(-88.831919, 42.267382), tuple(-88.831812, 42.267384), tuple(-88.831822, 42.266854), tuple(-88.83183, 42.266566)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.831746, 42.266414), tuple(-88.831732, 42.266388), tuple(-88.831906, 42.26626), tuple(-88.832081, 42.266133), tuple(-88.832153, 42.266088), tuple(-88.832211, 42.266018), tuple(-88.8325, 42.265716), tuple(-88.83306, 42.265188), tuple(-88.833636, 42.264468), tuple(-88.833924, 42.263956), tuple(-88.834308, 42.263508), tuple(-88.834631, 42.263263), tuple(-88.83469, 42.263323), tuple(-88.834862, 42.263497), tuple(-88.834729, 42.263565), tuple(-88.834456, 42.263895), tuple(-88.833976, 42.26474), tuple(-88.833134, 42.265569), tuple(-88.832713, 42.265909), tuple(-88.832166, 42.266266), tuple(-88.831952, 42.266475), tuple(-88.83183, 42.266566), tuple(-88.831746, 42.266414)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.834348, 42.268237), tuple(-88.833447, 42.267364), tuple(-88.833375, 42.267288), tuple(-88.834329, 42.266762), tuple(-88.834526, 42.266638), tuple(-88.835475, 42.267572), tuple(-88.834348, 42.268237)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.83469, 42.263323), tuple(-88.834631, 42.263263), tuple(-88.835462, 42.262867), tuple(-88.836071, 42.262642), tuple(-88.836742, 42.262506), tuple(-88.837572, 42.262151), tuple(-88.83846, 42.261743), tuple(-88.839117, 42.261423), tuple(-88.839647, 42.261134), tuple(-88.840336, 42.260685), tuple(-88.840978, 42.260204), tuple(-88.841034, 42.260263), tuple(-88.841191, 42.260429), tuple(-88.841105, 42.260479), tuple(-88.840484, 42.260951), tuple(-88.839827, 42.261391), tuple(-88.839613, 42.261512), tuple(-88.838482, 42.262017), tuple(-88.837411, 42.262582), tuple(-88.836975, 42.262763), tuple(-88.835638, 42.263137), tuple(-88.835519, 42.26318), tuple(-88.835394, 42.263225), tuple(-88.834862, 42.263497), tuple(-88.83469, 42.263323)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.835519, 42.26318), tuple(-88.835638, 42.263137), tuple(-88.836975, 42.262763), tuple(-88.837411, 42.262582), tuple(-88.838482, 42.262017), tuple(-88.839613, 42.261512), tuple(-88.839827, 42.261391), tuple(-88.840484, 42.260951), tuple(-88.841105, 42.260479), tuple(-88.841191, 42.260429), tuple(-88.841459, 42.260714), tuple(-88.842279, 42.261608), tuple(-88.841304, 42.262151), tuple(-88.840316, 42.262711), tuple(-88.838126, 42.263949), tuple(-88.836708, 42.264748), tuple(-88.836392, 42.264911), tuple(-88.83612, 42.265065), tuple(-88.835954, 42.264786), tuple(-88.835685, 42.264426), tuple(-88.835316, 42.263935), tuple(-88.834862, 42.263497), tuple(-88.835394, 42.263225), tuple(-88.835519, 42.26318)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.840316, 42.262711), tuple(-88.841304, 42.262151), tuple(-88.842081, 42.262952), tuple(-88.841077, 42.263485), tuple(-88.840394, 42.262784), tuple(-88.840316, 42.262711)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.838126, 42.263949), tuple(-88.840316, 42.262711), tuple(-88.840394, 42.262784), tuple(-88.841077, 42.263485), tuple(-88.840365, 42.263878), tuple(-88.838869, 42.26467), tuple(-88.838817, 42.264634), tuple(-88.838126, 42.263949)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.827208, 42.263663), tuple(-88.825465, 42.26462), tuple(-88.825231, 42.264756), tuple(-88.824834, 42.264579), tuple(-88.822491, 42.263557), tuple(-88.821939, 42.263339), tuple(-88.821993, 42.261147), tuple(-88.822023, 42.260597), tuple(-88.822559, 42.260801), tuple(-88.823327, 42.261048), tuple(-88.823785, 42.26124), tuple(-88.82414, 42.261426), tuple(-88.82445, 42.261536), tuple(-88.825352, 42.261717), tuple(-88.825588, 42.261816), tuple(-88.826253, 42.262178), tuple(-88.826933, 42.262584), tuple(-88.827391, 42.262963), tuple(-88.82785, 42.263259), tuple(-88.827887, 42.263288), tuple(-88.827699, 42.263393), tuple(-88.827208, 42.263663)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.821849, 42.269725), tuple(-88.821775, 42.267287), tuple(-88.821853, 42.265129), tuple(-88.821939, 42.263339), tuple(-88.822491, 42.263557), tuple(-88.824834, 42.264579), tuple(-88.825231, 42.264756), tuple(-88.825091, 42.264864), tuple(-88.824899, 42.265028), tuple(-88.824669, 42.265236), tuple(-88.824469, 42.265445), tuple(-88.824302, 42.265668), tuple(-88.824167, 42.265902), tuple(-88.824061, 42.266141), tuple(-88.823983, 42.266385), tuple(-88.823894, 42.266832), tuple(-88.823342, 42.27026), tuple(-88.823326, 42.270357), tuple(-88.823324, 42.270373), tuple(-88.823259, 42.270929), tuple(-88.823069, 42.272542), tuple(-88.822994, 42.273045), tuple(-88.822886, 42.273526), tuple(-88.822512, 42.274698), tuple(-88.822304, 42.274427), tuple(-88.82204, 42.274003), tuple(-88.822003, 42.273924), tuple(-88.821991, 42.2733), tuple(-88.821849, 42.269725)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.823259, 42.270929), tuple(-88.823324, 42.270373), tuple(-88.823927, 42.270366), tuple(-88.823896, 42.270925), tuple(-88.823854, 42.270923), tuple(-88.823259, 42.270929)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.822059, 42.27676), tuple(-88.822003, 42.273924), tuple(-88.82204, 42.274003), tuple(-88.822304, 42.274427), tuple(-88.822512, 42.274698), tuple(-88.822238, 42.27551), tuple(-88.822149, 42.275868), tuple(-88.822064, 42.27665), tuple(-88.822059, 42.27676)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.841077, 42.263485), tuple(-88.841796, 42.264232), tuple(-88.841178, 42.26455), tuple(-88.840396, 42.264983), tuple(-88.839358, 42.265535), tuple(-88.839308, 42.265564), tuple(-88.839093, 42.265689), tuple(-88.839029, 42.265726), tuple(-88.838934, 42.265759), tuple(-88.838547, 42.264848), tuple(-88.838869, 42.26467), tuple(-88.840365, 42.263878), tuple(-88.841077, 42.263485)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.839358, 42.265535), tuple(-88.840396, 42.264983), tuple(-88.841135, 42.26573), tuple(-88.840164, 42.266242), tuple(-88.840022, 42.266309), tuple(-88.839616, 42.266514), tuple(-88.839602, 42.266521), tuple(-88.83958, 42.266532), tuple(-88.839557, 42.266544), tuple(-88.839548, 42.266549), tuple(-88.838934, 42.265759), tuple(-88.839029, 42.265726), tuple(-88.839093, 42.265689), tuple(-88.839308, 42.265564), tuple(-88.839358, 42.265535)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.841796, 42.264232), tuple(-88.842519, 42.264976), tuple(-88.841135, 42.26573), tuple(-88.840396, 42.264983), tuple(-88.841178, 42.26455), tuple(-88.841796, 42.264232)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.841135, 42.26573), tuple(-88.842519, 42.264976), tuple(-88.842758, 42.265224), tuple(-88.843277, 42.265741), tuple(-88.842284, 42.266257), tuple(-88.841778, 42.266525), tuple(-88.841727, 42.266548), tuple(-88.841673, 42.266559), tuple(-88.841581, 42.266568), tuple(-88.84159, 42.266412), tuple(-88.841588, 42.26631), tuple(-88.841548, 42.266195), tuple(-88.841135, 42.26573)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.843519, 42.264454), tuple(-88.843701, 42.264637), tuple(-88.844148, 42.2651), tuple(-88.844258, 42.265223), tuple(-88.844128, 42.265299), tuple(-88.843894, 42.265427), tuple(-88.843277, 42.265741), tuple(-88.842758, 42.265224), tuple(-88.842519, 42.264976), tuple(-88.843519, 42.264454)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.844043, 42.266504), tuple(-88.843277, 42.265741), tuple(-88.843894, 42.265427), tuple(-88.844128, 42.265299), tuple(-88.844258, 42.265223), tuple(-88.845005, 42.265989), tuple(-88.844043, 42.266504)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.831812, 42.267384), tuple(-88.832167, 42.267927), tuple(-88.832102, 42.26786), tuple(-88.831995, 42.267765), tuple(-88.831961, 42.267749), tuple(-88.831926, 42.267744), tuple(-88.831772, 42.267749), tuple(-88.831795, 42.26745), tuple(-88.831812, 42.267384)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.831774, 42.269615), tuple(-88.831776, 42.269131), tuple(-88.831777, 42.269047), tuple(-88.831772, 42.267749), tuple(-88.831926, 42.267744), tuple(-88.831961, 42.267749), tuple(-88.831995, 42.267765), tuple(-88.832102, 42.26786), tuple(-88.832167, 42.267927), tuple(-88.832737, 42.268483), tuple(-88.833081, 42.268826), tuple(-88.833159, 42.268893), tuple(-88.831956, 42.269533), tuple(-88.831774, 42.269615)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.841796, 42.264232), tuple(-88.842782, 42.263689), tuple(-88.843418, 42.264354), tuple(-88.843519, 42.264454), tuple(-88.842519, 42.264976), tuple(-88.841796, 42.264232)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.842081, 42.262952), tuple(-88.842782, 42.263689), tuple(-88.841796, 42.264232), tuple(-88.841077, 42.263485), tuple(-88.842081, 42.262952)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-87.755676, 41.74158), tuple(-87.755669, 41.741397), tuple(-87.755649, 41.740849), tuple(-87.755643, 41.740667), tuple(-87.756129, 41.740658), tuple(-87.75759, 41.740632), tuple(-87.758077, 41.740624), tuple(-87.758083, 41.740806), tuple(-87.758101, 41.741354), tuple(-87.758107, 41.741537), tuple(-87.757844, 41.741541), tuple(-87.757056, 41.741555), tuple(-87.756794, 41.74156), tuple(-87.75657, 41.741563), tuple(-87.755899, 41.741575), tuple(-87.755676, 41.74158)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.827887, 42.263288), tuple(-88.828141, 42.263141), tuple(-88.828193, 42.263113), tuple(-88.828267, 42.263257), tuple(-88.828395, 42.263508), tuple(-88.828677, 42.264003), tuple(-88.829055, 42.264697), tuple(-88.829435, 42.265398), tuple(-88.829796, 42.265987), tuple(-88.830142, 42.266304), tuple(-88.830196, 42.266354), tuple(-88.83104, 42.266556), tuple(-88.831732, 42.266388), tuple(-88.831746, 42.266414), tuple(-88.83183, 42.266566), tuple(-88.83173, 42.26664), tuple(-88.831516, 42.266738), tuple(-88.831294, 42.266799), tuple(-88.831073, 42.26681), tuple(-88.830622, 42.266755), tuple(-88.830178, 42.266744), tuple(-88.829957, 42.266706), tuple(-88.829683, 42.266629), tuple(-88.829048, 42.266311), tuple(-88.828774, 42.266152), tuple(-88.828575, 42.265987), tuple(-88.828471, 42.265822), tuple(-88.828574, 42.265608), tuple(-88.8287, 42.265641), tuple(-88.828826, 42.265817), tuple(-88.828988, 42.265976), tuple(-88.829262, 42.266206), tuple(-88.829484, 42.266371), tuple(-88.829779, 42.2663), tuple(-88.829698, 42.26614), tuple(-88.829121, 42.265328), tuple(-88.828929, 42.264823), tuple(-88.828707, 42.264329), tuple(-88.828271, 42.263676), tuple(-88.828079, 42.26344), tuple(-88.827887, 42.263288)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.822035, 42.260361), tuple(-88.822037, 42.260325), tuple(-88.822478, 42.260543), tuple(-88.822942, 42.260691), tuple(-88.823436, 42.260917), tuple(-88.823652, 42.261015), tuple(-88.824005, 42.261099), tuple(-88.824466, 42.261208), tuple(-88.824789, 42.261289), tuple(-88.825259, 42.261475), tuple(-88.825522, 42.261579), tuple(-88.827587, 42.262769), tuple(-88.827641, 42.262796), tuple(-88.828193, 42.263113), tuple(-88.828141, 42.263141), tuple(-88.827887, 42.263288), tuple(-88.82785, 42.263259), tuple(-88.827391, 42.262963), tuple(-88.826933, 42.262584), tuple(-88.826253, 42.262178), tuple(-88.825588, 42.261816), tuple(-88.825352, 42.261717), tuple(-88.82445, 42.261536), tuple(-88.82414, 42.261426), tuple(-88.823785, 42.26124), tuple(-88.823327, 42.261048), tuple(-88.822559, 42.260801), tuple(-88.822023, 42.260597), tuple(-88.822035, 42.260361)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.851355, 42.269172), tuple(-88.851346, 42.27005), tuple(-88.850018, 42.270058), tuple(-88.849999, 42.269412), tuple(-88.848831, 42.269448), tuple(-88.848996, 42.26938), tuple(-88.849316, 42.269268), tuple(-88.849524, 42.2693), tuple(-88.849668, 42.269204), tuple(-88.84971, 42.269044), tuple(-88.849755, 42.269039), tuple(-88.849809, 42.269021), tuple(-88.850145, 42.268831), tuple(-88.8507, 42.268543), tuple(-88.851355, 42.269172)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.861024, 42.272127), tuple(-88.860946, 42.272236), tuple(-88.859646, 42.273947), tuple(-88.859196, 42.273686), tuple(-88.858686, 42.27341), tuple(-88.858407, 42.273278), tuple(-88.858187, 42.273197), tuple(-88.858053, 42.273152), tuple(-88.85808, 42.273125), tuple(-88.858417, 42.272679), tuple(-88.859181, 42.271789), tuple(-88.859508, 42.271424), tuple(-88.861024, 42.272127)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.836848, 42.26684), tuple(-88.836604, 42.266091), tuple(-88.836572, 42.265959), tuple(-88.836571, 42.265911), tuple(-88.836598, 42.265881), tuple(-88.836714, 42.26581), tuple(-88.838379, 42.264942), tuple(-88.838547, 42.264848), tuple(-88.838934, 42.265759), tuple(-88.837974, 42.266263), tuple(-88.836848, 42.26684)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.827171, 42.273761), tuple(-88.827181, 42.274212), tuple(-88.827186, 42.274753), tuple(-88.826096, 42.274766), tuple(-88.826085, 42.273758), tuple(-88.827171, 42.273761)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.860854, 42.274793), tuple(-88.860934, 42.274762), tuple(-88.861111, 42.274714), tuple(-88.861253, 42.274695), tuple(-88.861512, 42.274692), tuple(-88.861843, 42.274725), tuple(-88.862088, 42.274773), tuple(-88.862349, 42.274844), tuple(-88.862643, 42.274955), tuple(-88.862959, 42.275102), tuple(-88.863624, 42.274271), tuple(-88.863859, 42.273978), tuple(-88.864032, 42.273753), tuple(-88.864178, 42.273578), tuple(-88.864762, 42.273833), tuple(-88.865343, 42.274088), tuple(-88.866257, 42.27451), tuple(-88.865788, 42.275161), tuple(-88.864817, 42.276454), tuple(-88.862983, 42.276434), tuple(-88.863013, 42.276692), tuple(-88.861108, 42.276579), tuple(-88.861111, 42.276204), tuple(-88.861111, 42.275369), tuple(-88.861051, 42.275136), tuple(-88.860941, 42.274915), tuple(-88.860854, 42.274793)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.863013, 42.276692), tuple(-88.862983, 42.276434), tuple(-88.864817, 42.276454), tuple(-88.865788, 42.275161), tuple(-88.866257, 42.27451), tuple(-88.866762, 42.274743), tuple(-88.865807, 42.276661), tuple(-88.863013, 42.276692)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.867109, 42.276628), tuple(-88.865807, 42.276661), tuple(-88.866762, 42.274743), tuple(-88.866942, 42.274827), tuple(-88.867365, 42.275022), tuple(-88.868674, 42.275648), tuple(-88.868395, 42.275964), tuple(-88.867987, 42.275797), tuple(-88.867109, 42.276628)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.868674, 42.275648), tuple(-88.869117, 42.27586), tuple(-88.869314, 42.275954), tuple(-88.869154, 42.276283), tuple(-88.869, 42.276581), tuple(-88.86857, 42.276592), tuple(-88.867109, 42.276628), tuple(-88.867987, 42.275797), tuple(-88.868395, 42.275964), tuple(-88.868674, 42.275648)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.869314, 42.275954), tuple(-88.86982, 42.27614), tuple(-88.870361, 42.276291), tuple(-88.870931, 42.276405), tuple(-88.871531, 42.276481), tuple(-88.872042, 42.276505), tuple(-88.869, 42.276581), tuple(-88.869154, 42.276283), tuple(-88.869314, 42.275954)))
   or pointInPolygon(tuple(longitude, latitude), array(tuple(-88.875498, 42.276496), tuple(-88.87342, 42.276514), tuple(-88.872243, 42.276514), tuple(-88.872042, 42.276505), tuple(-88.871531, 42.276481), tuple(-88.870931, 42.276405), tuple(-88.870361, 42.276291), tuple(-88.86982, 42.27614), tuple(-88.869314, 42.275954), tuple(-88.869631, 42.275551), tuple(-88.869832, 42.275295), tuple(-88.870044, 42.275025), tuple(-88.870277, 42.274707), tuple(-88.870594, 42.274347), tuple(-88.870798, 42.274103), tuple(-88.871258, 42.27351), tuple(-88.871542, 42.273165), tuple(-88.871743, 42.272965), tuple(-88.8723, 42.271361), tuple(-88.872444, 42.271489), tuple(-88.872683, 42.271538), tuple(-88.872651, 42.271538), tuple(-88.872474, 42.272082), tuple(-88.872617, 42.272482), tuple(-88.872585, 42.272626), tuple(-88.87276, 42.272946), tuple(-88.873094, 42.273778), tuple(-88.873333, 42.274082), tuple(-88.873749, 42.274162), tuple(-88.874276, 42.274098), tuple(-88.875122, 42.274019), tuple(-88.875905, 42.273987), tuple(-88.876268, 42.274002), tuple(-88.876614, 42.27393), tuple(-88.876906, 42.273738), tuple(-88.877068, 42.273521), tuple(-88.87715, 42.273347), tuple(-88.877294, 42.273251), tuple(-88.877357, 42.272947), tuple(-88.88043, 42.27224), tuple(-88.880773, 42.270689), tuple(-88.880602, 42.269496), tuple(-88.87968, 42.269426), tuple(-88.876741, 42.269428), tuple(-88.876722, 42.269329), tuple(-88.88136, 42.269283), tuple(-88.882374, 42.269279), tuple(-88.885361, 42.269269), tuple(-88.885415, 42.269452), tuple(-88.88571, 42.270001), tuple(-88.885577, 42.270056), tuple(-88.885444, 42.270078), tuple(-88.8852, 42.270056), tuple(-88.884882, 42.270072), tuple(-88.884845, 42.270039), tuple(-88.884942, 42.269886), tuple(-88.884853, 42.269803), tuple(-88.884661, 42.269787), tuple(-88.884328, 42.269797), tuple(-88.883951, 42.26983), tuple(-88.883885, 42.269902), tuple(-88.88387, 42.270198), tuple(-88.883796, 42.270291), tuple(-88.883641, 42.270264), tuple(-88.88353, 42.270302), tuple(-88.883478, 42.270368), tuple(-88.883286, 42.270412), tuple(-88.883271, 42.270456), tuple(-88.88333, 42.270752), tuple(-88.883226, 42.270884), tuple(-88.883138, 42.270933), tuple(-88.882783, 42.27101), tuple(-88.882362, 42.27101), tuple(-88.881009, 42.271047), tuple(-88.880884, 42.271113), tuple(-88.880854, 42.27119), tuple(-88.880964, 42.271843), tuple(-88.880964, 42.272293), tuple(-88.880853, 42.272546), tuple(-88.880579, 42.272864), tuple(-88.880557, 42.272979), tuple(-88.880594, 42.273083), tuple(-88.880645, 42.27316), tuple(-88.88066, 42.273243), tuple(-88.880616, 42.273435), tuple(-88.880527, 42.273649), tuple(-88.880526, 42.27383), tuple(-88.880822, 42.274472), tuple(-88.880954, 42.274856), tuple(-88.881043, 42.275279), tuple(-88.881042, 42.275652), tuple(-88.881005, 42.275778), tuple(-88.880916, 42.275877), tuple(-88.880724, 42.276031), tuple(-88.880569, 42.276086), tuple(-88.88034, 42.276129), tuple(-88.879985, 42.276135), tuple(-88.879867, 42.276124), tuple(-88.879734, 42.27608), tuple(-88.879586, 42.275959), tuple(-88.879512, 42.275953), tuple(-88.879216, 42.276025), tuple(-88.879061, 42.27609), tuple(-88.878943, 42.276156), tuple(-88.878699, 42.276348), tuple(-88.878581, 42.276466), tuple(-88.877974, 42.27647), tuple(-88.875498, 42.276496)))

Obviously the geo aspects of our system are a great fit for postgres+postgis, but the nature of our queries is entirerly aggregation based, hence our interest in Clickhouse. 😁 As the majority of our spatial needs can be pre-processed, we primarily need pointInPolygon for the realtime aggreagation. Even so, it might be worth trying to imitate parts of the SQL/MM Spatial standard for easier interop with other databases, like postgis or bigquery - in that scenario this could be something like ST_Covers with limited type support for now (only polygon as first arg, point as second).

@alexey-milovidov
Copy link
Member

It is implemented in a series of pull requests:

#10623
#11144
#11421

And available in master and in version 20.5 (testing).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants