It is time go back to the basis. Extract data within a geographical area.
We assume that we have geolocalized data-points. We want to fetch all data-points within an area.
First, define an area, either in WKT or in GeoJSON.
You can use Wicket for WKT and GeoJSON.io for GeoJSON.
In this post, we will use a simple GeoJSON:
{
"type": "Polygon",
"coordinates": [
[
[
130.94261169433594,
-12.162184641327928
],
[
131.1822509765625,
-12.162184641327928
],
[
131.1822509765625,
-11.982905071887549
],
[
130.94261169433594,
-11.982905071887549
],
[
130.94261169433594,
-12.162184641327928
]
]
]
}Filter with MAP
We will use the MAP framework and its mapper.geo.within function:
<'
{
'type': 'Polygon',
'coordinates': [
[
[ 130.94261169433594, -12.162184641327928 ],
[ 131.1822509765625, -12.162184641327928 ],
[ 131.1822509765625, -11.982905071887549 ],
[ 130.94261169433594, -11.982905071887549 ],
[ 130.94261169433594, -12.162184641327928 ]
]
]
}
'>
'geoJson' STORE
$geoJson 0.01 false GEO.JSON 'geoshape' STORE
[ 'READ TOKEN' 'my.dataset' {} NOW 1 h ] FETCH 'gts' STORE
[
$gts // GTS list
$geoshape // from GEO.JSON
mapper.geo.within // keep inner points
0 // pre
0 // post
0 // occurrence
]
MAP
NONEMPTY // exclude empty GTSGoing further
Discover the power of FETCH here and the MAP framework here.
GEO.JSON parameters define the precision you want.
| Discover the easiest way to detect motion and to split a Geo Time Series accordingly. |
Going further
In the previous chapter, we fetch all data-points, and then we keep only those which are in our area. But we can improve this.
If our data-points are not moving, we can use another technique. A better alternative is to fetch only data points in the geographical area. To do so, we first need to compute an HHCODE from the location of the last known data-point and add it to an attribute. You have to execute this script once:
'READ TOKEN' 'read' STORE
'WRITE TOKEN' 'write' STORE
$read AUTHENTICATE
10000000 MAXOPS // yes it could be huge
[ $read 'my.dataset' { } NOW -1 ] FETCH // fetch the last known data point
<%
// Remove list index
DROP
'gts' STORE
[
$gts
<%
// Extract lat + lon
[ 4 5 ] SUBLIST FLATTEN LIST-> DROP
// Convert to HHCode
->HHCODE 'hhcode' STORE
// Set HHCode as attribute 'loc'
$gts { 'loc' $hhcode } SETATTRIBUTES
// Return NO VALUE
0 NaN NaN NaN NULL // fake data for the macro mapper
%> MACROMAPPER
0 0 0
]
MAP
// Discard mapped GTS as we do not need it
DROP
%> LMAP
$write METAAnd then, you can fetch using this HHCODE to only retrieve series which have data-points located in this area.
[...]
$geoJson 0.01 false GEO.JSON 'geoshape' STORE
'~(' $geoshape GEO.REGEXP + ')' + 'regexp' STORE
[ $token 'my.dataset' { 'loc' $regexp } NOW 1 h ] FETCH 'gts' STORE
[...]Going further
We used GEO.REGEXP, META, MAXOPS, SETATTRIBUTES and MACROMAPPER
But what if my data-points are moving? You can optimize your computation by using the spacio-temporal indexing technique.
Read more
Santa asset tracking and delivery service
The COVID-19 Pandemic and the art of Geo Time Series
An AIS data set for the 2022 Ocean Hackathon

Senior Software Engineer