Skip to content
This repository was archived by the owner on Sep 22, 2025. It is now read-only.

Commit d487020

Browse files
authored
Merge pull request #86 from StratoDem/85-custom-polygon-queries
Update IntersectsFilter to support weighted aggregations
2 parents 7c9f8d8 + 7a2913c commit d487020

8 files changed

Lines changed: 229 additions & 5 deletions

File tree

CHANGELOG.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,15 @@
22

33
All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/).
44

5+
## [3.4.0] - 2019-11-06
6+
### Adds
7+
- Adds new `detailed_type` option to `IntersectsFilter`. It now supports:
8+
- `'intersects'` (simple intersection filtering)
9+
- `'intersects_weighted'` (ability to create weighted polygon results)
10+
11+
## Related issues
12+
- [85](https://github.com/StratoDem/strato-query/issues/85)
13+
514
## [3.3.0] - 2019-09-18
615
### Adds
716
- Adds new buffer types to the `DrivetimeFilter`. It now supports:

docs/index.html

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,9 @@
258258
<li>
259259
<a href="#geocoder-queries" class="toc-h2 toc-link" data-title="Geocoder queries">Geocoder queries</a>
260260
</li>
261+
<li>
262+
<a href="#custom-polygon-queries" class="toc-h2 toc-link" data-title="Custom polygon queries">Custom polygon queries</a>
263+
</li>
261264
<li>
262265
<a href="#advanced-queries" class="toc-h2 toc-link" data-title="Advanced queries">Advanced queries</a>
263266
</li>
@@ -854,6 +857,66 @@ <h2 id='geocoder-queries'>Geocoder queries</h2>
854857
<td>Boston, MA</td>
855858
</tr>
856859
</tbody></table>
860+
<h2 id='custom-polygon-queries'>Custom polygon queries</h2>
861+
<blockquote>
862+
<p>This query returns the population contained within the custom polygon by year</p>
863+
</blockquote>
864+
<pre class="highlight python tab-python"><code><span class="kn">from</span> <span class="nn">strato_query</span> <span class="kn">import</span> <span class="n">SDAPIQuery</span><span class="p">,</span> <span class="n">APIQueryParams</span>
865+
<span class="kn">from</span> <span class="nn">strato_query.filters</span> <span class="kn">import</span> <span class="n">IntersectsFilter</span><span class="p">,</span> <span class="n">BetweenFilter</span>
866+
<span class="kn">from</span> <span class="nn">strato_query.aggregations</span> <span class="kn">import</span> <span class="n">SumAggregation</span>
867+
868+
<span class="n">df</span> <span class="o">=</span> <span class="n">SDAPIQuery</span><span class="o">.</span><span class="n">query_api_df</span><span class="p">(</span>
869+
<span class="n">APIQueryParams</span><span class="p">(</span>
870+
<span class="n">table</span><span class="o">=</span><span class="s">'populationforecast_tract_annual_population'</span><span class="p">,</span>
871+
<span class="n">data_filters</span><span class="o">=</span><span class="p">(</span>
872+
<span class="n">IntersectsFilter</span><span class="p">(</span>
873+
<span class="n">detailed_type</span><span class="o">=</span><span class="s">'intersects_weighted'</span><span class="p">,</span>
874+
<span class="n">var</span><span class="o">=</span><span class="s">'geoid11'</span><span class="p">,</span>
875+
<span class="n">val</span><span class="o">=</span><span class="p">{</span><span class="s">"type"</span><span class="p">:</span> <span class="s">"Polygon"</span><span class="p">,</span>
876+
<span class="s">"coordinates"</span><span class="p">:</span> <span class="p">[</span>
877+
<span class="p">[[</span><span class="o">-</span><span class="mf">71.17801666259767</span><span class="p">,</span> <span class="mf">42.43321295705304</span><span class="p">],</span>
878+
<span class="p">[</span><span class="o">-</span><span class="mf">71.0145950317383</span><span class="p">,</span> <span class="mf">42.43321295705304</span><span class="p">],</span>
879+
<span class="p">[</span><span class="o">-</span><span class="mf">71.0145950317383</span><span class="p">,</span> <span class="mf">42.3145122534915</span><span class="p">],</span>
880+
<span class="p">[</span><span class="o">-</span><span class="mf">71.17801666259767</span><span class="p">,</span> <span class="mf">42.3145122534915</span><span class="p">],</span>
881+
<span class="p">[</span><span class="o">-</span><span class="mf">71.17801666259767</span><span class="p">,</span> <span class="mf">42.43321295705304</span><span class="p">]]]})</span><span class="o">.</span><span class="n">to_dict</span><span class="p">(),</span>
882+
<span class="n">BetweenFilter</span><span class="p">(</span><span class="n">var</span><span class="o">=</span><span class="s">'year'</span><span class="p">,</span> <span class="n">val</span><span class="o">=</span><span class="p">[</span><span class="mi">2010</span><span class="p">,</span> <span class="mi">2019</span><span class="p">])</span><span class="o">.</span><span class="n">to_dict</span><span class="p">()),</span>
883+
<span class="n">data_fields</span><span class="o">=</span><span class="p">(</span><span class="s">'year'</span><span class="p">,</span> <span class="s">'population'</span><span class="p">),</span>
884+
<span class="n">groupby</span><span class="o">=</span><span class="p">(</span><span class="s">'year'</span><span class="p">,),</span>
885+
<span class="n">order</span><span class="o">=</span><span class="p">(</span><span class="s">'year'</span><span class="p">,),</span>
886+
<span class="n">aggregations</span><span class="o">=</span><span class="p">(</span><span class="n">SumAggregation</span><span class="p">(</span><span class="s">'population'</span><span class="p">),),</span>
887+
<span class="p">))</span>
888+
</code></pre><pre class="highlight r tab-r"><code><span class="c1"># Not implemented yet
889+
</span></code></pre><pre class="highlight shell tab-shell"><code><span class="gp">$ </span>curl -X POST <span class="s2">"https://api.stratodem.com/api"</span> <span class="se">\</span>
890+
-H <span class="s2">"accept: application/json"</span> <span class="se">\</span>
891+
-H <span class="s2">"Content-Type: application/json"</span> <span class="se">\</span>
892+
-d <span class="s2">"{ </span><span class="se">\"</span><span class="s2">token</span><span class="se">\"</span><span class="s2">: </span><span class="se">\"</span><span class="s2">my-api-token</span><span class="se">\"</span><span class="s2">, </span><span class="se">\"</span><span class="s2">query</span><span class="se">\"</span><span class="s2">: {</span><span class="se">\"</span><span class="s2">query_type</span><span class="se">\"</span><span class="s2">: </span><span class="se">\"</span><span class="s2">COUNT</span><span class="se">\"</span><span class="s2">, </span><span class="se">\"</span><span class="s2">data_fields</span><span class="se">\"</span><span class="s2">: [</span><span class="se">\"</span><span class="s2">year</span><span class="se">\"</span><span class="s2">, </span><span class="se">\"</span><span class="s2">population</span><span class="se">\"</span><span class="s2">], </span><span class="se">\"</span><span class="s2">table</span><span class="se">\"</span><span class="s2">: </span><span class="se">\"</span><span class="s2">populationforecast_tract_annual_population</span><span class="se">\"</span><span class="s2">, </span><span class="se">\"</span><span class="s2">groupby</span><span class="se">\"</span><span class="s2">: [</span><span class="se">\"</span><span class="s2">year</span><span class="se">\"</span><span class="s2">], </span><span class="se">\"</span><span class="s2">data_filters</span><span class="se">\"</span><span class="s2">: [{</span><span class="se">\"</span><span class="s2">filter_type</span><span class="se">\"</span><span class="s2">: </span><span class="se">\"</span><span class="s2">intersects_weighted</span><span class="se">\"</span><span class="s2">, </span><span class="se">\"</span><span class="s2">filter_value</span><span class="se">\"</span><span class="s2">: {</span><span class="se">\"</span><span class="s2">type</span><span class="se">\"</span><span class="s2">: </span><span class="se">\"</span><span class="s2">Polygon</span><span class="se">\"</span><span class="s2">, </span><span class="se">\"</span><span class="s2">coordinates</span><span class="se">\"</span><span class="s2">: [[[-71.17801666259767, 42.43321295705304], [-71.0145950317383, 42.43321295705304], [-71.0145950317383, 42.3145122534915], [-71.17801666259767, 42.3145122534915], [-71.17801666259767, 42.43321295705304]]]}, </span><span class="se">\"</span><span class="s2">filter_variable</span><span class="se">\"</span><span class="s2">: </span><span class="se">\"</span><span class="s2">geoid11</span><span class="se">\"</span><span class="s2">}, {</span><span class="se">\"</span><span class="s2">filter_type</span><span class="se">\"</span><span class="s2">: </span><span class="se">\"</span><span class="s2">between</span><span class="se">\"</span><span class="s2">, </span><span class="se">\"</span><span class="s2">filter_value</span><span class="se">\"</span><span class="s2">: [2010, 2019], </span><span class="se">\"</span><span class="s2">filter_variable</span><span class="se">\"</span><span class="s2">: </span><span class="se">\"</span><span class="s2">year</span><span class="se">\"</span><span class="s2">}], </span><span class="se">\"</span><span class="s2">aggregations</span><span class="se">\"</span><span class="s2">: [{</span><span class="se">\"</span><span class="s2">aggregation_func</span><span class="se">\"</span><span class="s2">: </span><span class="se">\"</span><span class="s2">sum</span><span class="se">\"</span><span class="s2">, </span><span class="se">\"</span><span class="s2">variable_name</span><span class="se">\"</span><span class="s2">: </span><span class="se">\"</span><span class="s2">population</span><span class="se">\"</span><span class="s2">}], </span><span class="se">\"</span><span class="s2">order</span><span class="se">\"</span><span class="s2">: [</span><span class="se">\"</span><span class="s2">year</span><span class="se">\"</span><span class="s2">]}}"</span>
893+
</code></pre><pre class="highlight vb tab-vb"><code><span class="c1">' Not implemented yet</span>
894+
</code></pre>
895+
<p>To use a provided GeoJSON <code>Polygon</code> as a filter, use the <code>IntersectsFilter</code>.</p>
896+
897+
<p>The example to the right returns the population by year for the area covered by the provided <code>Polygon</code></p>
898+
899+
<p><code>{&quot;type&quot;: &quot;Polygon&quot;, &quot;coordinates&quot;: [[[-71.1326, 42.2981],[-70.9943, 42.2981], [-70.9943, 42.3859],[-71.1326, 42.3859], [-71.1326, 42.2981]]]}</code></p>
900+
901+
<table><thead>
902+
<tr>
903+
<th>YEAR</th>
904+
<th>SUM_POPULATION</th>
905+
</tr>
906+
</thead><tbody>
907+
<tr>
908+
<td>2010</td>
909+
<td>852183</td>
910+
</tr>
911+
<tr>
912+
<td>2011</td>
913+
<td>862990</td>
914+
</tr>
915+
<tr>
916+
<td>....</td>
917+
<td>......</td>
918+
</tr>
919+
</tbody></table>
857920
<h2 id='advanced-queries'>Advanced queries</h2>
858921
<blockquote>
859922
<p>This query returns GDP per capita estimates for counties</p>
@@ -1115,6 +1178,25 @@ <h2 id='intersectsfilter'><code>IntersectsFilter</code></h2>
11151178
<span class="p">]]</span>
11161179
<span class="p">}</span>
11171180
<span class="p">})</span>
1181+
1182+
<span class="c"># Use this version to get weighted results</span>
1183+
<span class="n">IntersectsFilter</span><span class="p">(</span>
1184+
<span class="n">var</span><span class="o">=</span><span class="s">'geometry'</span><span class="p">,</span>
1185+
<span class="n">detailed_type</span><span class="o">=</span><span class="s">'intersects_weighted'</span><span class="p">,</span>
1186+
<span class="n">val</span><span class="o">=</span><span class="p">{</span>
1187+
<span class="s">"type"</span><span class="p">:</span> <span class="s">"Feature"</span><span class="p">,</span>
1188+
<span class="s">"properties"</span><span class="p">:</span> <span class="p">{},</span>
1189+
<span class="s">"geometry"</span><span class="p">:</span> <span class="p">{</span>
1190+
<span class="s">"type"</span><span class="p">:</span> <span class="s">"Polygon"</span><span class="p">,</span>
1191+
<span class="s">"coordinates"</span><span class="p">:</span> <span class="p">[[</span>
1192+
<span class="p">[</span><span class="o">-</span><span class="mf">71.13269805908203</span><span class="p">,</span> <span class="mf">42.298135272741206</span><span class="p">],</span>
1193+
<span class="p">[</span><span class="o">-</span><span class="mf">70.99433898925781</span><span class="p">,</span> <span class="mf">42.298135272741206</span><span class="p">],</span>
1194+
<span class="p">[</span><span class="o">-</span><span class="mf">70.99433898925781</span><span class="p">,</span> <span class="mf">42.385937107381125</span><span class="p">],</span>
1195+
<span class="p">[</span><span class="o">-</span><span class="mf">71.13269805908203</span><span class="p">,</span> <span class="mf">42.385937107381125</span><span class="p">],</span>
1196+
<span class="p">[</span><span class="o">-</span><span class="mf">71.13269805908203</span><span class="p">,</span> <span class="mf">42.298135272741206</span><span class="p">]</span>
1197+
<span class="p">]]</span>
1198+
<span class="p">}</span>
1199+
<span class="p">})</span>
11181200
</code></pre><pre class="highlight r tab-r"><code><span class="c1"># Not implemented yet!
11191201
</span></code></pre><pre class="highlight shell tab-shell"><code><span class="o">{</span><span class="s2">"filter_type"</span>: <span class="s2">"intersects"</span>, <span class="s2">"filter_variable"</span>: <span class="s2">"geometry"</span>, <span class="s2">"filter_value"</span>: <span class="o">{</span><span class="s2">"type"</span>: <span class="s2">"Feature"</span>, <span class="s2">"properties"</span>: <span class="o">{}</span>, <span class="s2">"geometry"</span>: <span class="o">{</span><span class="s2">"type"</span>: <span class="s2">"Polygon"</span>, <span class="s2">"coordinates"</span>: <span class="o">[[[</span>-71.13269805908203, 42.298135272741206], <span class="o">[</span>-70.99433898925781, 42.298135272741206], <span class="o">[</span>-70.99433898925781, 42.385937107381125], <span class="o">[</span>-71.13269805908203, 42.385937107381125], <span class="o">[</span>-71.13269805908203, 42.298135272741206]]]<span class="o">}}</span>
11201202
</code></pre><pre class="highlight vb tab-vb"><code><span class="c1">' Not implemented yet!</span>

docs/source/includes/_filters.md

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -348,6 +348,25 @@ IntersectsFilter(
348348
]]
349349
}
350350
})
351+
352+
# Use this version to get weighted results
353+
IntersectsFilter(
354+
var='geometry',
355+
detailed_type='intersects_weighted',
356+
val={
357+
"type": "Feature",
358+
"properties": {},
359+
"geometry": {
360+
"type": "Polygon",
361+
"coordinates": [[
362+
[-71.13269805908203, 42.298135272741206],
363+
[-70.99433898925781, 42.298135272741206],
364+
[-70.99433898925781, 42.385937107381125],
365+
[-71.13269805908203, 42.385937107381125],
366+
[-71.13269805908203, 42.298135272741206]
367+
]]
368+
}
369+
})
351370
```
352371

353372
```r

docs/source/includes/_query-parameters.md

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -490,6 +490,64 @@ The second example returns the metro ID for the latitude-longitude pair:
490490
|----|----|
491491
|14454|Boston, MA|
492492

493+
## Custom polygon queries
494+
495+
> This query returns the population contained within the custom polygon by year
496+
497+
```python
498+
from strato_query import SDAPIQuery, APIQueryParams
499+
from strato_query.filters import IntersectsFilter, BetweenFilter
500+
from strato_query.aggregations import SumAggregation
501+
502+
df = SDAPIQuery.query_api_df(
503+
APIQueryParams(
504+
table='populationforecast_tract_annual_population',
505+
data_filters=(
506+
IntersectsFilter(
507+
detailed_type='intersects_weighted',
508+
var='geoid11',
509+
val={"type": "Polygon",
510+
"coordinates": [
511+
[[-71.17801666259767, 42.43321295705304],
512+
[-71.0145950317383, 42.43321295705304],
513+
[-71.0145950317383, 42.3145122534915],
514+
[-71.17801666259767, 42.3145122534915],
515+
[-71.17801666259767, 42.43321295705304]]]}).to_dict(),
516+
BetweenFilter(var='year', val=[2010, 2019]).to_dict()),
517+
data_fields=('year', 'population'),
518+
groupby=('year',),
519+
order=('year',),
520+
aggregations=(SumAggregation('population'),),
521+
))
522+
```
523+
524+
```r
525+
# Not implemented yet
526+
```
527+
528+
```shell
529+
$ curl -X POST "https://api.stratodem.com/api" \
530+
-H "accept: application/json" \
531+
-H "Content-Type: application/json" \
532+
-d "{ \"token\": \"my-api-token\", \"query\": {\"query_type\": \"COUNT\", \"data_fields\": [\"year\", \"population\"], \"table\": \"populationforecast_tract_annual_population\", \"groupby\": [\"year\"], \"data_filters\": [{\"filter_type\": \"intersects_weighted\", \"filter_value\": {\"type\": \"Polygon\", \"coordinates\": [[[-71.17801666259767, 42.43321295705304], [-71.0145950317383, 42.43321295705304], [-71.0145950317383, 42.3145122534915], [-71.17801666259767, 42.3145122534915], [-71.17801666259767, 42.43321295705304]]]}, \"filter_variable\": \"geoid11\"}, {\"filter_type\": \"between\", \"filter_value\": [2010, 2019], \"filter_variable\": \"year\"}], \"aggregations\": [{\"aggregation_func\": \"sum\", \"variable_name\": \"population\"}], \"order\": [\"year\"]}}"
533+
```
534+
535+
```vb
536+
' Not implemented yet
537+
```
538+
539+
To use a provided GeoJSON `Polygon` as a filter, use the `IntersectsFilter`.
540+
541+
The example to the right returns the population by year for the area covered by the provided `Polygon`
542+
543+
`{"type": "Polygon", "coordinates": [[[-71.1326, 42.2981],[-70.9943, 42.2981], [-70.9943, 42.3859],[-71.1326, 42.3859], [-71.1326, 42.2981]]]}`
544+
545+
|YEAR|SUM_POPULATION|
546+
|-------|----|
547+
|2010|852183|
548+
|2011|862990|
549+
|....|......|
550+
493551
## Advanced queries
494552

495553
> This query returns GDP per capita estimates for counties

requirements.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# Core requirements
2-
Cython==0.29.13
2+
Cython==0.29.14
33
numpy==1.17.3
4-
pandas==0.25.2
4+
pandas==0.25.3
55
requests

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313

1414
setup(
1515
name='strato_query',
16-
version='3.3.0',
16+
version='3.4.0',
1717
author='Michael Clawar, Raaid Arshad, Eric Linden',
1818
author_email='tech@stratodem.com',
1919
packages=[

0 commit comments

Comments
 (0)