mirror of
https://github.com/mapbox/tippecanoe.git
synced 2025-02-24 02:41:15 +00:00
Merge pull request #462 from mapbox/gl-filters
Add feature attribute filters (as in the GL style spec) to tile-join
This commit is contained in:
commit
7ce882c035
@ -17,7 +17,7 @@ matrix:
|
|||||||
# debug+leak+address-sanitizer build
|
# debug+leak+address-sanitizer build
|
||||||
- os: linux
|
- os: linux
|
||||||
compiler: clang
|
compiler: clang
|
||||||
env: CLANG_VERSION='3.8.0' BUILDTYPE=Debug ASAN_OPTIONS=detect_leaks=1 CC="clang-3.8" CXX="clang++-3.8" CXXFLAGS="-fsanitize=address" CFLAGS="-fsanitize=address" LDFLAGS="-fsanitize=address"
|
env: CLANG_VERSION='3.8.0' BUILDTYPE=Debug ASAN_OPTIONS=detect_leaks=1 CC="clang-3.8" CXX="clang++-3.8" CXXFLAGS="-fsanitize=address" CFLAGS="-fsanitize=address" LDFLAGS="-fsanitize=address" FEWER=true
|
||||||
addons:
|
addons:
|
||||||
apt:
|
apt:
|
||||||
sources: ['ubuntu-toolchain-r-test' ]
|
sources: ['ubuntu-toolchain-r-test' ]
|
||||||
@ -71,7 +71,10 @@ install:
|
|||||||
|
|
||||||
script:
|
script:
|
||||||
- npm install geobuf
|
- npm install geobuf
|
||||||
- BUILDTYPE=${BUILDTYPE} make test geobuf-test
|
- if [ -n "${FEWER}" ]; then
|
||||||
|
BUILDTYPE=${BUILDTYPE} make fewer-tests; else
|
||||||
|
BUILDTYPE=${BUILDTYPE} make test geobuf-test;
|
||||||
|
fi
|
||||||
- if [ -n "${COVERAGE}" ]; then
|
- if [ -n "${COVERAGE}" ]; then
|
||||||
/usr/bin/llvm-cov-3.5 -lp *.o;
|
/usr/bin/llvm-cov-3.5 -lp *.o;
|
||||||
pip install --user cpp-coveralls;
|
pip install --user cpp-coveralls;
|
||||||
|
@ -1,3 +1,7 @@
|
|||||||
|
## 1.24.0
|
||||||
|
|
||||||
|
* Add feature filters using the Mapbox GL Style Specification filter syntax
|
||||||
|
|
||||||
## 1.23.0
|
## 1.23.0
|
||||||
|
|
||||||
* Add input support for Geobuf file format
|
* Add input support for Geobuf file format
|
||||||
|
17
Makefile
17
Makefile
@ -46,7 +46,7 @@ C = $(wildcard *.c) $(wildcard *.cpp)
|
|||||||
INCLUDES = -I/usr/local/include -I.
|
INCLUDES = -I/usr/local/include -I.
|
||||||
LIBS = -L/usr/local/lib
|
LIBS = -L/usr/local/lib
|
||||||
|
|
||||||
tippecanoe: geojson.o jsonpull/jsonpull.o tile.o pool.o mbtiles.o geometry.o projection.o memfile.o mvt.o serial.o main.o text.o dirtiles.o plugin.o read_json.o write_json.o geobuf.o
|
tippecanoe: geojson.o jsonpull/jsonpull.o tile.o pool.o mbtiles.o geometry.o projection.o memfile.o mvt.o serial.o main.o text.o dirtiles.o plugin.o read_json.o write_json.o geobuf.o evaluator.o
|
||||||
$(CXX) $(PG) $(LIBS) $(FINAL_FLAGS) $(CXXFLAGS) -o $@ $^ $(LDFLAGS) -lm -lz -lsqlite3 -lpthread
|
$(CXX) $(PG) $(LIBS) $(FINAL_FLAGS) $(CXXFLAGS) -o $@ $^ $(LDFLAGS) -lm -lz -lsqlite3 -lpthread
|
||||||
|
|
||||||
tippecanoe-enumerate: enumerate.o
|
tippecanoe-enumerate: enumerate.o
|
||||||
@ -55,7 +55,7 @@ tippecanoe-enumerate: enumerate.o
|
|||||||
tippecanoe-decode: decode.o projection.o mvt.o write_json.o text.o
|
tippecanoe-decode: decode.o projection.o mvt.o write_json.o text.o
|
||||||
$(CXX) $(PG) $(LIBS) $(FINAL_FLAGS) $(CXXFLAGS) -o $@ $^ $(LDFLAGS) -lm -lz -lsqlite3
|
$(CXX) $(PG) $(LIBS) $(FINAL_FLAGS) $(CXXFLAGS) -o $@ $^ $(LDFLAGS) -lm -lz -lsqlite3
|
||||||
|
|
||||||
tile-join: tile-join.o projection.o pool.o mbtiles.o mvt.o memfile.o dirtiles.o jsonpull/jsonpull.o text.o
|
tile-join: tile-join.o projection.o pool.o mbtiles.o mvt.o memfile.o dirtiles.o jsonpull/jsonpull.o text.o evaluator.o
|
||||||
$(CXX) $(PG) $(LIBS) $(FINAL_FLAGS) $(CXXFLAGS) -o $@ $^ $(LDFLAGS) -lm -lz -lsqlite3 -lpthread
|
$(CXX) $(PG) $(LIBS) $(FINAL_FLAGS) $(CXXFLAGS) -o $@ $^ $(LDFLAGS) -lm -lz -lsqlite3 -lpthread
|
||||||
|
|
||||||
geojson2nd: geojson2nd.o jsonpull/jsonpull.o
|
geojson2nd: geojson2nd.o jsonpull/jsonpull.o
|
||||||
@ -81,7 +81,7 @@ indent:
|
|||||||
TESTS = $(wildcard tests/*/out/*.json)
|
TESTS = $(wildcard tests/*/out/*.json)
|
||||||
SPACE = $(NULL) $(NULL)
|
SPACE = $(NULL) $(NULL)
|
||||||
|
|
||||||
test: tippecanoe tippecanoe-decode $(addsuffix .check,$(TESTS)) raw-tiles-test parallel-test pbf-test join-test enumerate-test decode-test unit
|
test: tippecanoe tippecanoe-decode $(addsuffix .check,$(TESTS)) raw-tiles-test parallel-test pbf-test join-test enumerate-test decode-test join-filter-test unit
|
||||||
./unit
|
./unit
|
||||||
|
|
||||||
# Work around Makefile and filename punctuation limits: _ for space, @ for :, % for /
|
# Work around Makefile and filename punctuation limits: _ for space, @ for :, % for /
|
||||||
@ -93,6 +93,9 @@ test: tippecanoe tippecanoe-decode $(addsuffix .check,$(TESTS)) raw-tiles-test p
|
|||||||
|
|
||||||
geobuf-test: geojson2nd $(addsuffix .checkbuf,$(TESTS))
|
geobuf-test: geojson2nd $(addsuffix .checkbuf,$(TESTS))
|
||||||
|
|
||||||
|
# For quicker address sanitizer build, hope that regular JSON parsing is tested enough by parallel and join tests
|
||||||
|
fewer-tests: tippecanoe tippecanoe-decode geobuf-test raw-tiles-test parallel-test pbf-test join-test enumerate-test decode-test join-filter-test unit
|
||||||
|
|
||||||
# XXX Use proper makefile rules instead of a for loop
|
# XXX Use proper makefile rules instead of a for loop
|
||||||
%.json.checkbuf:
|
%.json.checkbuf:
|
||||||
for i in $(wildcard $(subst $(SPACE),/,$(wordlist 1,2,$(subst /, ,$@)))/*.json); do ./geojson2nd -w $$i | ./node_modules/geobuf/bin/json2geobuf > $$i.geobuf; done
|
for i in $(wildcard $(subst $(SPACE),/,$(wordlist 1,2,$(subst /, ,$@)))/*.json); do ./geojson2nd -w $$i | ./node_modules/geobuf/bin/json2geobuf > $$i.geobuf; done
|
||||||
@ -212,6 +215,14 @@ join-test:
|
|||||||
rm tests/join-population/tabblock_06001420.mbtiles tests/join-population/joined.mbtiles tests/join-population/joined-i.mbtiles tests/join-population/joined.mbtiles.json.check tests/join-population/joined-i.mbtiles.json.check tests/join-population/macarthur.mbtiles tests/join-population/merged.mbtiles tests/join-population/merged.mbtiles.json.check tests/join-population/merged-folder.mbtiles tests/join-population/macarthur2.mbtiles tests/join-population/windows.mbtiles tests/join-population/windows-merged.mbtiles tests/join-population/windows-merged2.mbtiles tests/join-population/windows.mbtiles.json.check tests/join-population/just-macarthur.mbtiles tests/join-population/no-macarthur.mbtiles tests/join-population/just-macarthur.mbtiles.json.check tests/join-population/no-macarthur.mbtiles.json.check tests/join-population/merged-folder.mbtiles.json.check tests/join-population/windows-merged.mbtiles.json.check tests/join-population/windows-merged2.mbtiles.json.check tests/join-population/macarthur-and-macarthur2-merged.mbtiles tests/join-population/macarthur-and-macarthur2-merged2.mbtiles tests/join-population/macarthur-and-macarthur2-merged.mbtiles.json.check tests/join-population/macarthur-and-macarthur2-merged2.mbtiles.json.check
|
rm tests/join-population/tabblock_06001420.mbtiles tests/join-population/joined.mbtiles tests/join-population/joined-i.mbtiles tests/join-population/joined.mbtiles.json.check tests/join-population/joined-i.mbtiles.json.check tests/join-population/macarthur.mbtiles tests/join-population/merged.mbtiles tests/join-population/merged.mbtiles.json.check tests/join-population/merged-folder.mbtiles tests/join-population/macarthur2.mbtiles tests/join-population/windows.mbtiles tests/join-population/windows-merged.mbtiles tests/join-population/windows-merged2.mbtiles tests/join-population/windows.mbtiles.json.check tests/join-population/just-macarthur.mbtiles tests/join-population/no-macarthur.mbtiles tests/join-population/just-macarthur.mbtiles.json.check tests/join-population/no-macarthur.mbtiles.json.check tests/join-population/merged-folder.mbtiles.json.check tests/join-population/windows-merged.mbtiles.json.check tests/join-population/windows-merged2.mbtiles.json.check tests/join-population/macarthur-and-macarthur2-merged.mbtiles tests/join-population/macarthur-and-macarthur2-merged2.mbtiles tests/join-population/macarthur-and-macarthur2-merged.mbtiles.json.check tests/join-population/macarthur-and-macarthur2-merged2.mbtiles.json.check
|
||||||
rm -rf tests/join-population/raw-merged-folder tests/join-population/tabblock_06001420-folder tests/join-population/macarthur-folder tests/join-population/macarthur2-folder tests/join-population/merged-mbtiles-to-folder tests/join-population/merged-folders-to-folder tests/join-population/windows-merged-folder tests/join-population/macarthur-and-macarthur2-folder
|
rm -rf tests/join-population/raw-merged-folder tests/join-population/tabblock_06001420-folder tests/join-population/macarthur-folder tests/join-population/macarthur2-folder tests/join-population/merged-mbtiles-to-folder tests/join-population/merged-folders-to-folder tests/join-population/windows-merged-folder tests/join-population/macarthur-and-macarthur2-folder
|
||||||
|
|
||||||
|
join-filter-test:
|
||||||
|
# Comes out different from the direct tippecanoe run because null attributes are lost
|
||||||
|
./tippecanoe -z0 -f -o tests/feature-filter/out/all.mbtiles tests/feature-filter/in.json
|
||||||
|
./tile-join -J tests/feature-filter/filter -f -o tests/feature-filter/out/filtered.mbtiles tests/feature-filter/out/all.mbtiles
|
||||||
|
./tippecanoe-decode tests/feature-filter/out/filtered.mbtiles > tests/feature-filter/out/filtered.json.check
|
||||||
|
cmp tests/feature-filter/out/filtered.json.check tests/feature-filter/out/filtered.json.standard
|
||||||
|
rm -f tests/feature-filter/out/filtered.json.check tests/feature-filter/out/filtered.mbtiles tests/feature-filter/out/all.mbtiles
|
||||||
|
|
||||||
# Use this target to regenerate the standards that the tests are compared against
|
# Use this target to regenerate the standards that the tests are compared against
|
||||||
# after making a change that legitimately changes their output
|
# after making a change that legitimately changes their output
|
||||||
|
|
||||||
|
10
README.md
10
README.md
@ -160,6 +160,14 @@ resolution is obtained than by using a smaller _maxzoom_ or _detail_.
|
|||||||
If the type is `bool`, then original attributes of `0` (or, if numeric, `0.0`, etc.), `false`, `null`, or the empty string become `false`, and otherwise become `true`.
|
If the type is `bool`, then original attributes of `0` (or, if numeric, `0.0`, etc.), `false`, `null`, or the empty string become `false`, and otherwise become `true`.
|
||||||
If the type is `float` or `int` and the original attribute was non-numeric, it becomes `0`.
|
If the type is `float` or `int` and the original attribute was non-numeric, it becomes `0`.
|
||||||
If the type is `int` and the original attribute was floating-point, it is rounded to the nearest integer.
|
If the type is `int` and the original attribute was floating-point, it is rounded to the nearest integer.
|
||||||
|
* `-j` *filter* or `--feature-filter`=*filter*: Check features against a per-layer filter (as defined in the [Mapbox GL Style Specification](https://www.mapbox.com/mapbox-gl-js/style-spec/#types-filter)) and only include those that match. Any features in layers that have no filter specified will be passed through. Filters for the layer `"*"` apply to all layers.
|
||||||
|
* `-J` *filter-file* or `--feature-filter-file`=*filter-file*: Like `-j`, but read the filter from a file.
|
||||||
|
|
||||||
|
Example: to find the Natural Earth countries with low `scalerank` but high `LABELRANK`:
|
||||||
|
|
||||||
|
```
|
||||||
|
tile-join -o filtered.mbtiles -j '{ "ne_10m_admin_0_countries": [ "all", [ "<", "scalerank", 3 ], [ ">", "LABELRANK", 5 ] ] }' ne_10m_admin_0_countries.mbtiles
|
||||||
|
```
|
||||||
|
|
||||||
### Dropping a fixed fraction of features by zoom level
|
### Dropping a fixed fraction of features by zoom level
|
||||||
|
|
||||||
@ -483,6 +491,8 @@ The options are:
|
|||||||
|
|
||||||
* `-x` *key* or `--exclude=`*key*: Remove attributes of type *key* from the output. You can use this to remove the field you are matching against if you no longer need it after joining, or to remove any other attributes you don't want.
|
* `-x` *key* or `--exclude=`*key*: Remove attributes of type *key* from the output. You can use this to remove the field you are matching against if you no longer need it after joining, or to remove any other attributes you don't want.
|
||||||
* `-i` or `--if-matched`: Only include features that matched the CSV.
|
* `-i` or `--if-matched`: Only include features that matched the CSV.
|
||||||
|
* `-j` *filter* or `--feature-filter`=*filter*: Check features against a per-layer filter (as defined in the [Mapbox GL Style Specification](https://www.mapbox.com/mapbox-gl-js/style-spec/#types-filter)) and only include those that match. Any features in layers that have no filter specified will be passed through. Filters for the layer `"*"` apply to all layers.
|
||||||
|
* `-J` *filter-file* or `--feature-filter-file`=*filter-file*: Like `-j`, but read the filter from a file.
|
||||||
|
|
||||||
### Setting or disabling tile size limits
|
### Setting or disabling tile size limits
|
||||||
|
|
||||||
|
328
evaluator.cpp
Normal file
328
evaluator.cpp
Normal file
@ -0,0 +1,328 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <map>
|
||||||
|
#include "mvt.hpp"
|
||||||
|
#include "evaluator.hpp"
|
||||||
|
|
||||||
|
int compare(mvt_value one, json_object *two, bool &fail) {
|
||||||
|
if (one.type == mvt_string) {
|
||||||
|
if (two->type != JSON_STRING) {
|
||||||
|
fail = true;
|
||||||
|
return false; // string vs non-string
|
||||||
|
}
|
||||||
|
|
||||||
|
return strcmp(one.string_value.c_str(), two->string);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (one.type == mvt_double || one.type == mvt_float || one.type == mvt_int || one.type == mvt_uint || one.type == mvt_sint) {
|
||||||
|
if (two->type != JSON_NUMBER) {
|
||||||
|
fail = true;
|
||||||
|
return false; // number vs non-number
|
||||||
|
}
|
||||||
|
|
||||||
|
double v;
|
||||||
|
if (one.type == mvt_double) {
|
||||||
|
v = one.numeric_value.double_value;
|
||||||
|
} else if (one.type == mvt_float) {
|
||||||
|
v = one.numeric_value.float_value;
|
||||||
|
} else if (one.type == mvt_int) {
|
||||||
|
v = one.numeric_value.int_value;
|
||||||
|
} else if (one.type == mvt_uint) {
|
||||||
|
v = one.numeric_value.uint_value;
|
||||||
|
} else if (one.type == mvt_sint) {
|
||||||
|
v = one.numeric_value.sint_value;
|
||||||
|
} else {
|
||||||
|
fprintf(stderr, "Internal error: bad mvt type %d\n", one.type);
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (v < two->number) {
|
||||||
|
return -1;
|
||||||
|
} else if (v > two->number) {
|
||||||
|
return 1;
|
||||||
|
} else {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (one.type == mvt_bool) {
|
||||||
|
if (two->type != JSON_TRUE && two->type != JSON_FALSE) {
|
||||||
|
fail = true;
|
||||||
|
return false; // bool vs non-bool
|
||||||
|
}
|
||||||
|
|
||||||
|
bool b = two->type != JSON_FALSE;
|
||||||
|
return one.numeric_value.bool_value > b;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (one.type == mvt_null) {
|
||||||
|
if (two->type != JSON_NULL) {
|
||||||
|
fail = true;
|
||||||
|
return false; // null vs non-null
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0; // null equals null
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(stderr, "Internal error: bad mvt type %d\n", one.type);
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool eval(std::map<std::string, mvt_value> const &feature, json_object *f) {
|
||||||
|
if (f == NULL || f->type != JSON_ARRAY) {
|
||||||
|
fprintf(stderr, "Filter is not an array: %s\n", json_stringify(f));
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (f->length < 1) {
|
||||||
|
fprintf(stderr, "Array too small in filter: %s\n", json_stringify(f));
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (f->array[0]->type != JSON_STRING) {
|
||||||
|
fprintf(stderr, "Filter operation is not a string: %s\n", json_stringify(f));
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strcmp(f->array[0]->string, "has") == 0 ||
|
||||||
|
strcmp(f->array[0]->string, "!has") == 0) {
|
||||||
|
if (f->length != 2) {
|
||||||
|
fprintf(stderr, "Wrong number of array elements in filter: %s\n", json_stringify(f));
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strcmp(f->array[0]->string, "has") == 0) {
|
||||||
|
if (f->array[1]->type != JSON_STRING) {
|
||||||
|
fprintf(stderr, "\"has\" key is not a string: %s\n", json_stringify(f));
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
return feature.count(std::string(f->array[1]->string)) != 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strcmp(f->array[0]->string, "!has") == 0) {
|
||||||
|
if (f->array[1]->type != JSON_STRING) {
|
||||||
|
fprintf(stderr, "\"!has\" key is not a string: %s\n", json_stringify(f));
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
return feature.count(std::string(f->array[1]->string)) == 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strcmp(f->array[0]->string, "==") == 0 ||
|
||||||
|
strcmp(f->array[0]->string, "!=") == 0 ||
|
||||||
|
strcmp(f->array[0]->string, ">") == 0 ||
|
||||||
|
strcmp(f->array[0]->string, ">=") == 0 ||
|
||||||
|
strcmp(f->array[0]->string, "<") == 0 ||
|
||||||
|
strcmp(f->array[0]->string, "<=") == 0) {
|
||||||
|
if (f->length != 3) {
|
||||||
|
fprintf(stderr, "Wrong number of array elements in filter: %s\n", json_stringify(f));
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
if (f->array[1]->type != JSON_STRING) {
|
||||||
|
fprintf(stderr, "\"!has\" key is not a string: %s\n", json_stringify(f));
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
auto ff = feature.find(std::string(f->array[1]->string));
|
||||||
|
if (ff == feature.end()) {
|
||||||
|
static bool warned = false;
|
||||||
|
if (!warned) {
|
||||||
|
const char *s = json_stringify(f);
|
||||||
|
fprintf(stderr, "Warning: attribute not found for comparison: %s\n", s);
|
||||||
|
free((void *) s);
|
||||||
|
warned = true;
|
||||||
|
}
|
||||||
|
if (strcmp(f->array[0]->string, "!=") == 0) {
|
||||||
|
return true; // attributes that aren't found are not equal
|
||||||
|
}
|
||||||
|
return false; // not found: comparison is false
|
||||||
|
}
|
||||||
|
|
||||||
|
bool fail = false;
|
||||||
|
int cmp = compare(ff->second, f->array[2], fail);
|
||||||
|
|
||||||
|
if (fail) {
|
||||||
|
static bool warned = false;
|
||||||
|
if (!warned) {
|
||||||
|
const char *s = json_stringify(f);
|
||||||
|
fprintf(stderr, "Warning: mismatched type in comparison: %s\n", s);
|
||||||
|
free((void *) s);
|
||||||
|
warned = true;
|
||||||
|
}
|
||||||
|
if (strcmp(f->array[0]->string, "!=") == 0) {
|
||||||
|
return true; // mismatched types are not equal
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strcmp(f->array[0]->string, "==") == 0) {
|
||||||
|
return cmp == 0;
|
||||||
|
}
|
||||||
|
if (strcmp(f->array[0]->string, "!=") == 0) {
|
||||||
|
return cmp != 0;
|
||||||
|
}
|
||||||
|
if (strcmp(f->array[0]->string, ">") == 0) {
|
||||||
|
return cmp > 0;
|
||||||
|
}
|
||||||
|
if (strcmp(f->array[0]->string, ">=") == 0) {
|
||||||
|
return cmp >= 0;
|
||||||
|
}
|
||||||
|
if (strcmp(f->array[0]->string, "<") == 0) {
|
||||||
|
return cmp < 0;
|
||||||
|
}
|
||||||
|
if (strcmp(f->array[0]->string, "<=") == 0) {
|
||||||
|
return cmp <= 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(stderr, "Internal error: can't happen: %s\n", json_stringify(f));
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strcmp(f->array[0]->string, "all") == 0 ||
|
||||||
|
strcmp(f->array[0]->string, "any") == 0 ||
|
||||||
|
strcmp(f->array[0]->string, "none") == 0) {
|
||||||
|
bool v;
|
||||||
|
|
||||||
|
if (strcmp(f->array[0]->string, "all") == 0) {
|
||||||
|
v = true;
|
||||||
|
} else {
|
||||||
|
v = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (size_t i = 1; i < f->length; i++) {
|
||||||
|
bool out = eval(feature, f->array[i]);
|
||||||
|
|
||||||
|
if (strcmp(f->array[0]->string, "all") == 0) {
|
||||||
|
v = v && out;
|
||||||
|
if (!v) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
v = v || out;
|
||||||
|
if (v) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strcmp(f->array[0]->string, "none") == 0) {
|
||||||
|
return !v;
|
||||||
|
} else {
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strcmp(f->array[0]->string, "in") == 0 ||
|
||||||
|
strcmp(f->array[0]->string, "!in") == 0) {
|
||||||
|
if (f->length < 2) {
|
||||||
|
fprintf(stderr, "Array too small in filter: %s\n", json_stringify(f));
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (f->array[1]->type != JSON_STRING) {
|
||||||
|
fprintf(stderr, "\"!has\" key is not a string: %s\n", json_stringify(f));
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
auto ff = feature.find(std::string(f->array[1]->string));
|
||||||
|
if (ff == feature.end()) {
|
||||||
|
static bool warned = false;
|
||||||
|
if (!warned) {
|
||||||
|
const char *s = json_stringify(f);
|
||||||
|
fprintf(stderr, "Warning: attribute not found for comparison: %s\n", s);
|
||||||
|
free((void *) s);
|
||||||
|
warned = true;
|
||||||
|
}
|
||||||
|
if (strcmp(f->array[0]->string, "!in") == 0) {
|
||||||
|
return true; // attributes that aren't found are not in
|
||||||
|
}
|
||||||
|
return false; // not found: comparison is false
|
||||||
|
}
|
||||||
|
|
||||||
|
bool found = false;
|
||||||
|
for (size_t i = 2; i < f->length; i++) {
|
||||||
|
bool fail = false;
|
||||||
|
int cmp = compare(ff->second, f->array[i], fail);
|
||||||
|
|
||||||
|
if (fail) {
|
||||||
|
static bool warned = false;
|
||||||
|
if (!warned) {
|
||||||
|
const char *s = json_stringify(f);
|
||||||
|
fprintf(stderr, "Warning: mismatched type in comparison: %s\n", s);
|
||||||
|
free((void *) s);
|
||||||
|
warned = true;
|
||||||
|
}
|
||||||
|
cmp = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cmp == 0) {
|
||||||
|
found = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strcmp(f->array[0]->string, "in") == 0) {
|
||||||
|
return found;
|
||||||
|
} else {
|
||||||
|
return !found;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(stderr, "Unknown filter %s\n", json_stringify(f));
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool evaluate(std::map<std::string, mvt_value> const &feature, std::string const &layer, json_object *filter) {
|
||||||
|
if (filter == NULL || filter->type != JSON_HASH) {
|
||||||
|
fprintf(stderr, "Error: filter is not a hash: %s\n", json_stringify(filter));
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ok = true;
|
||||||
|
json_object *f;
|
||||||
|
|
||||||
|
f = json_hash_get(filter, layer.c_str());
|
||||||
|
if (ok && f != NULL) {
|
||||||
|
ok = eval(feature, f);
|
||||||
|
}
|
||||||
|
|
||||||
|
f = json_hash_get(filter, "*");
|
||||||
|
if (ok && f != NULL) {
|
||||||
|
ok = eval(feature, f);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
json_object *read_filter(const char *fname) {
|
||||||
|
FILE *fp = fopen(fname, "r");
|
||||||
|
if (fp == NULL) {
|
||||||
|
perror(fname);
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
json_pull *jp = json_begin_file(fp);
|
||||||
|
json_object *filter = json_read_tree(jp);
|
||||||
|
if (filter == NULL) {
|
||||||
|
fprintf(stderr, "%s: %s\n", fname, jp->error);
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
json_disconnect(filter);
|
||||||
|
json_end(jp);
|
||||||
|
fclose(fp);
|
||||||
|
return filter;
|
||||||
|
}
|
||||||
|
|
||||||
|
json_object *parse_filter(const char *s) {
|
||||||
|
json_pull *jp = json_begin_string(s);
|
||||||
|
json_object *filter = json_read_tree(jp);
|
||||||
|
if (filter == NULL) {
|
||||||
|
fprintf(stderr, "Could not parse filter %s\n", s);
|
||||||
|
fprintf(stderr, "%s\n", jp->error);
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
json_disconnect(filter);
|
||||||
|
json_end(jp);
|
||||||
|
return filter;
|
||||||
|
}
|
13
evaluator.hpp
Normal file
13
evaluator.hpp
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
#ifndef EVALUATOR_HPP
|
||||||
|
#define EVALUATOR HPP
|
||||||
|
|
||||||
|
#include <map>
|
||||||
|
#include <string>
|
||||||
|
#include "jsonpull/jsonpull.h"
|
||||||
|
#include "mvt.hpp"
|
||||||
|
|
||||||
|
bool evaluate(std::map<std::string, mvt_value> const &feature, std::string const &layer, json_object *filter);
|
||||||
|
json_object *parse_filter(const char *s);
|
||||||
|
json_object *read_filter(const char *fname);
|
||||||
|
|
||||||
|
#endif
|
@ -204,7 +204,7 @@ std::vector<drawvec_type> readGeometry(protozero::pbf_reader &pbf, size_t dim, d
|
|||||||
std::vector<drawvec_type> ret;
|
std::vector<drawvec_type> ret;
|
||||||
std::vector<long long> coords;
|
std::vector<long long> coords;
|
||||||
std::vector<int> lengths;
|
std::vector<int> lengths;
|
||||||
int type;
|
int type = -1;
|
||||||
|
|
||||||
while (pbf.next()) {
|
while (pbf.next()) {
|
||||||
switch (pbf.tag()) {
|
switch (pbf.tag()) {
|
||||||
|
@ -165,6 +165,11 @@ int serialize_geojson_feature(struct serialization_state *sst, json_object *geom
|
|||||||
metatype[m] = type;
|
metatype[m] = type;
|
||||||
metaval[m] = val;
|
metaval[m] = val;
|
||||||
m++;
|
m++;
|
||||||
|
} else {
|
||||||
|
metakey[m] = properties->keys[i]->string;
|
||||||
|
metatype[m] = mvt_null;
|
||||||
|
metaval[m] = "null";
|
||||||
|
m++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -708,6 +708,23 @@ void json_free(json_object *o) {
|
|||||||
free(o);
|
free(o);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void json_disconnect_parser(json_object *o) {
|
||||||
|
if (o->type == JSON_HASH) {
|
||||||
|
size_t i;
|
||||||
|
for (i = 0; i < o->length; i++) {
|
||||||
|
json_disconnect_parser(o->keys[i]);
|
||||||
|
json_disconnect_parser(o->values[i]);
|
||||||
|
}
|
||||||
|
} else if (o->type == JSON_ARRAY) {
|
||||||
|
size_t i;
|
||||||
|
for (i = 0; i < o->length; i++) {
|
||||||
|
json_disconnect_parser(o->array[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
o->parser = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
void json_disconnect(json_object *o) {
|
void json_disconnect(json_object *o) {
|
||||||
// Expunge references to this as an array element
|
// Expunge references to this as an array element
|
||||||
// or a hash key or value.
|
// or a hash key or value.
|
||||||
@ -761,6 +778,7 @@ void json_disconnect(json_object *o) {
|
|||||||
o->parser->root = NULL;
|
o->parser->root = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
json_disconnect_parser(o);
|
||||||
o->parent = NULL;
|
o->parent = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
37
main.cpp
37
main.cpp
@ -56,6 +56,7 @@
|
|||||||
#include "options.hpp"
|
#include "options.hpp"
|
||||||
#include "mvt.hpp"
|
#include "mvt.hpp"
|
||||||
#include "dirtiles.hpp"
|
#include "dirtiles.hpp"
|
||||||
|
#include "evaluator.hpp"
|
||||||
|
|
||||||
static int low_detail = 12;
|
static int low_detail = 12;
|
||||||
static int full_detail = -1;
|
static int full_detail = -1;
|
||||||
@ -349,7 +350,7 @@ void *run_sort(void *v) {
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void do_read_parallel(char *map, long long len, long long initial_offset, const char *reading, struct reader *readers, volatile long long *progress_seq, std::set<std::string> *exclude, std::set<std::string> *include, int exclude_all, char *fname, int basezoom, int source, int nlayers, std::vector<std::map<std::string, layermap_entry> > *layermaps, double droprate, int *initialized, unsigned *initial_x, unsigned *initial_y, int maxzoom, std::string layername, bool uses_gamma, std::map<std::string, int> const *attribute_types, int separator, double *dist_sum, size_t *dist_count, bool want_dist, bool filters) {
|
void do_read_parallel(char *map, long long len, long long initial_offset, const char *reading, struct reader *readers, volatile long long *progress_seq, std::set<std::string> *exclude, std::set<std::string> *include, int exclude_all, json_object *filter, char *fname, int basezoom, int source, int nlayers, std::vector<std::map<std::string, layermap_entry> > *layermaps, double droprate, int *initialized, unsigned *initial_x, unsigned *initial_y, int maxzoom, std::string layername, bool uses_gamma, std::map<std::string, int> const *attribute_types, int separator, double *dist_sum, size_t *dist_count, bool want_dist, bool filters) {
|
||||||
long long segs[CPUS + 1];
|
long long segs[CPUS + 1];
|
||||||
segs[0] = 0;
|
segs[0] = 0;
|
||||||
segs[CPUS] = len;
|
segs[CPUS] = len;
|
||||||
@ -400,6 +401,7 @@ void do_read_parallel(char *map, long long len, long long initial_offset, const
|
|||||||
sst[i].filters = filters;
|
sst[i].filters = filters;
|
||||||
sst[i].layermap = &(*layermaps)[i];
|
sst[i].layermap = &(*layermaps)[i];
|
||||||
sst[i].exclude = exclude;
|
sst[i].exclude = exclude;
|
||||||
|
sst[i].filter = filter;
|
||||||
sst[i].include = include;
|
sst[i].include = include;
|
||||||
sst[i].exclude_all = exclude_all;
|
sst[i].exclude_all = exclude_all;
|
||||||
sst[i].basezoom = basezoom;
|
sst[i].basezoom = basezoom;
|
||||||
@ -445,6 +447,7 @@ struct read_parallel_arg {
|
|||||||
std::set<std::string> *exclude;
|
std::set<std::string> *exclude;
|
||||||
std::set<std::string> *include;
|
std::set<std::string> *include;
|
||||||
int exclude_all;
|
int exclude_all;
|
||||||
|
json_object *filter;
|
||||||
char *fname;
|
char *fname;
|
||||||
int maxzoom;
|
int maxzoom;
|
||||||
int basezoom;
|
int basezoom;
|
||||||
@ -483,7 +486,7 @@ void *run_read_parallel(void *v) {
|
|||||||
}
|
}
|
||||||
madvise(map, rpa->len, MADV_RANDOM); // sequential, but from several pointers at once
|
madvise(map, rpa->len, MADV_RANDOM); // sequential, but from several pointers at once
|
||||||
|
|
||||||
do_read_parallel(map, rpa->len, rpa->offset, rpa->reading, rpa->readers, rpa->progress_seq, rpa->exclude, rpa->include, rpa->exclude_all, rpa->fname, rpa->basezoom, rpa->source, rpa->nlayers, rpa->layermaps, rpa->droprate, rpa->initialized, rpa->initial_x, rpa->initial_y, rpa->maxzoom, rpa->layername, rpa->uses_gamma, rpa->attribute_types, rpa->separator, rpa->dist_sum, rpa->dist_count, rpa->want_dist, rpa->filters);
|
do_read_parallel(map, rpa->len, rpa->offset, rpa->reading, rpa->readers, rpa->progress_seq, rpa->exclude, rpa->include, rpa->exclude_all, rpa->filter, rpa->fname, rpa->basezoom, rpa->source, rpa->nlayers, rpa->layermaps, rpa->droprate, rpa->initialized, rpa->initial_x, rpa->initial_y, rpa->maxzoom, rpa->layername, rpa->uses_gamma, rpa->attribute_types, rpa->separator, rpa->dist_sum, rpa->dist_count, rpa->want_dist, rpa->filters);
|
||||||
|
|
||||||
madvise(map, rpa->len, MADV_DONTNEED);
|
madvise(map, rpa->len, MADV_DONTNEED);
|
||||||
if (munmap(map, rpa->len) != 0) {
|
if (munmap(map, rpa->len) != 0) {
|
||||||
@ -500,7 +503,7 @@ void *run_read_parallel(void *v) {
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void start_parsing(int fd, FILE *fp, long long offset, long long len, volatile int *is_parsing, pthread_t *parallel_parser, bool &parser_created, const char *reading, struct reader *readers, volatile long long *progress_seq, std::set<std::string> *exclude, std::set<std::string> *include, int exclude_all, char *fname, int basezoom, int source, int nlayers, std::vector<std::map<std::string, layermap_entry> > &layermaps, double droprate, int *initialized, unsigned *initial_x, unsigned *initial_y, int maxzoom, std::string layername, bool uses_gamma, std::map<std::string, int> const *attribute_types, int separator, double *dist_sum, size_t *dist_count, bool want_dist, bool filters) {
|
void start_parsing(int fd, FILE *fp, long long offset, long long len, volatile int *is_parsing, pthread_t *parallel_parser, bool &parser_created, const char *reading, struct reader *readers, volatile long long *progress_seq, std::set<std::string> *exclude, std::set<std::string> *include, int exclude_all, json_object *filter, char *fname, int basezoom, int source, int nlayers, std::vector<std::map<std::string, layermap_entry> > &layermaps, double droprate, int *initialized, unsigned *initial_x, unsigned *initial_y, int maxzoom, std::string layername, bool uses_gamma, std::map<std::string, int> const *attribute_types, int separator, double *dist_sum, size_t *dist_count, bool want_dist, bool filters) {
|
||||||
// This has to kick off an intermediate thread to start the parser threads,
|
// This has to kick off an intermediate thread to start the parser threads,
|
||||||
// so the main thread can get back to reading the next input stage while
|
// so the main thread can get back to reading the next input stage while
|
||||||
// the intermediate thread waits for the completion of the parser threads.
|
// the intermediate thread waits for the completion of the parser threads.
|
||||||
@ -526,6 +529,7 @@ void start_parsing(int fd, FILE *fp, long long offset, long long len, volatile i
|
|||||||
rpa->exclude = exclude;
|
rpa->exclude = exclude;
|
||||||
rpa->include = include;
|
rpa->include = include;
|
||||||
rpa->exclude_all = exclude_all;
|
rpa->exclude_all = exclude_all;
|
||||||
|
rpa->filter = filter;
|
||||||
rpa->fname = fname;
|
rpa->fname = fname;
|
||||||
rpa->basezoom = basezoom;
|
rpa->basezoom = basezoom;
|
||||||
rpa->source = source;
|
rpa->source = source;
|
||||||
@ -1001,7 +1005,7 @@ void choose_first_zoom(long long *file_bbox, struct reader *readers, unsigned *i
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int read_input(std::vector<source> &sources, char *fname, int maxzoom, int minzoom, int basezoom, double basezoom_marker_width, sqlite3 *outdb, const char *outdir, std::set<std::string> *exclude, std::set<std::string> *include, int exclude_all, double droprate, int buffer, const char *tmpdir, double gamma, int read_parallel, int forcetable, const char *attribution, bool uses_gamma, long long *file_bbox, const char *prefilter, const char *postfilter, const char *description, bool guess_maxzoom, std::map<std::string, int> const *attribute_types, const char *pgm) {
|
int read_input(std::vector<source> &sources, char *fname, int maxzoom, int minzoom, int basezoom, double basezoom_marker_width, sqlite3 *outdb, const char *outdir, std::set<std::string> *exclude, std::set<std::string> *include, int exclude_all, json_object *filter, double droprate, int buffer, const char *tmpdir, double gamma, int read_parallel, int forcetable, const char *attribution, bool uses_gamma, long long *file_bbox, const char *prefilter, const char *postfilter, const char *description, bool guess_maxzoom, std::map<std::string, int> const *attribute_types, const char *pgm) {
|
||||||
int ret = EXIT_SUCCESS;
|
int ret = EXIT_SUCCESS;
|
||||||
|
|
||||||
struct reader readers[CPUS];
|
struct reader readers[CPUS];
|
||||||
@ -1237,6 +1241,7 @@ int read_input(std::vector<source> &sources, char *fname, int maxzoom, int minzo
|
|||||||
sst[i].exclude = exclude;
|
sst[i].exclude = exclude;
|
||||||
sst[i].include = include;
|
sst[i].include = include;
|
||||||
sst[i].exclude_all = exclude_all;
|
sst[i].exclude_all = exclude_all;
|
||||||
|
sst[i].filter = filter;
|
||||||
sst[i].basezoom = basezoom;
|
sst[i].basezoom = basezoom;
|
||||||
sst[i].attribute_types = attribute_types;
|
sst[i].attribute_types = attribute_types;
|
||||||
}
|
}
|
||||||
@ -1299,7 +1304,7 @@ int read_input(std::vector<source> &sources, char *fname, int maxzoom, int minzo
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (map != NULL && map != MAP_FAILED && read_parallel_this) {
|
if (map != NULL && map != MAP_FAILED && read_parallel_this) {
|
||||||
do_read_parallel(map, st.st_size - off, overall_offset, reading.c_str(), readers, &progress_seq, exclude, include, exclude_all, fname, basezoom, layer, nlayers, &layermaps, droprate, initialized, initial_x, initial_y, maxzoom, sources[layer].layer, uses_gamma, attribute_types, read_parallel_this, &dist_sum, &dist_count, guess_maxzoom, prefilter != NULL || postfilter != NULL);
|
do_read_parallel(map, st.st_size - off, overall_offset, reading.c_str(), readers, &progress_seq, exclude, include, exclude_all, filter, fname, basezoom, layer, nlayers, &layermaps, droprate, initialized, initial_x, initial_y, maxzoom, sources[layer].layer, uses_gamma, attribute_types, read_parallel_this, &dist_sum, &dist_count, guess_maxzoom, prefilter != NULL || postfilter != NULL);
|
||||||
overall_offset += st.st_size - off;
|
overall_offset += st.st_size - off;
|
||||||
checkdisk(readers, CPUS);
|
checkdisk(readers, CPUS);
|
||||||
|
|
||||||
@ -1375,7 +1380,7 @@ int read_input(std::vector<source> &sources, char *fname, int maxzoom, int minzo
|
|||||||
}
|
}
|
||||||
|
|
||||||
fflush(readfp);
|
fflush(readfp);
|
||||||
start_parsing(readfd, readfp, initial_offset, ahead, &is_parsing, ¶llel_parser, parser_created, reading.c_str(), readers, &progress_seq, exclude, include, exclude_all, fname, basezoom, layer, nlayers, layermaps, droprate, initialized, initial_x, initial_y, maxzoom, sources[layer].layer, gamma != 0, attribute_types, read_parallel_this, &dist_sum, &dist_count, guess_maxzoom, prefilter != NULL || postfilter != NULL);
|
start_parsing(readfd, readfp, initial_offset, ahead, &is_parsing, ¶llel_parser, parser_created, reading.c_str(), readers, &progress_seq, exclude, include, exclude_all, filter, fname, basezoom, layer, nlayers, layermaps, droprate, initialized, initial_x, initial_y, maxzoom, sources[layer].layer, gamma != 0, attribute_types, read_parallel_this, &dist_sum, &dist_count, guess_maxzoom, prefilter != NULL || postfilter != NULL);
|
||||||
|
|
||||||
initial_offset += ahead;
|
initial_offset += ahead;
|
||||||
overall_offset += ahead;
|
overall_offset += ahead;
|
||||||
@ -1412,7 +1417,7 @@ int read_input(std::vector<source> &sources, char *fname, int maxzoom, int minzo
|
|||||||
fflush(readfp);
|
fflush(readfp);
|
||||||
|
|
||||||
if (ahead > 0) {
|
if (ahead > 0) {
|
||||||
start_parsing(readfd, readfp, initial_offset, ahead, &is_parsing, ¶llel_parser, parser_created, reading.c_str(), readers, &progress_seq, exclude, include, exclude_all, fname, basezoom, layer, nlayers, layermaps, droprate, initialized, initial_x, initial_y, maxzoom, sources[layer].layer, gamma != 0, attribute_types, read_parallel_this, &dist_sum, &dist_count, guess_maxzoom, prefilter != NULL || postfilter != NULL);
|
start_parsing(readfd, readfp, initial_offset, ahead, &is_parsing, ¶llel_parser, parser_created, reading.c_str(), readers, &progress_seq, exclude, include, exclude_all, filter, fname, basezoom, layer, nlayers, layermaps, droprate, initialized, initial_x, initial_y, maxzoom, sources[layer].layer, gamma != 0, attribute_types, read_parallel_this, &dist_sum, &dist_count, guess_maxzoom, prefilter != NULL || postfilter != NULL);
|
||||||
|
|
||||||
if (parser_created) {
|
if (parser_created) {
|
||||||
if (pthread_join(parallel_parser, NULL) != 0) {
|
if (pthread_join(parallel_parser, NULL) != 0) {
|
||||||
@ -1450,6 +1455,7 @@ int read_input(std::vector<source> &sources, char *fname, int maxzoom, int minzo
|
|||||||
sst.exclude = exclude;
|
sst.exclude = exclude;
|
||||||
sst.include = include;
|
sst.include = include;
|
||||||
sst.exclude_all = exclude_all;
|
sst.exclude_all = exclude_all;
|
||||||
|
sst.filter = filter;
|
||||||
sst.basezoom = basezoom;
|
sst.basezoom = basezoom;
|
||||||
sst.attribute_types = attribute_types;
|
sst.attribute_types = attribute_types;
|
||||||
|
|
||||||
@ -2143,6 +2149,7 @@ int main(int argc, char **argv) {
|
|||||||
int exclude_all = 0;
|
int exclude_all = 0;
|
||||||
int read_parallel = 0;
|
int read_parallel = 0;
|
||||||
int files_open_at_start;
|
int files_open_at_start;
|
||||||
|
json_object *filter = NULL;
|
||||||
|
|
||||||
for (i = 0; i < 256; i++) {
|
for (i = 0; i < 256; i++) {
|
||||||
prevent[i] = 0;
|
prevent[i] = 0;
|
||||||
@ -2186,6 +2193,8 @@ int main(int argc, char **argv) {
|
|||||||
{"include", required_argument, 0, 'y'},
|
{"include", required_argument, 0, 'y'},
|
||||||
{"exclude-all", no_argument, 0, 'X'},
|
{"exclude-all", no_argument, 0, 'X'},
|
||||||
{"attribute-type", required_argument, 0, 'T'},
|
{"attribute-type", required_argument, 0, 'T'},
|
||||||
|
{"feature-filter-file", required_argument, 0, 'J'},
|
||||||
|
{"feature-filter", required_argument, 0, 'j'},
|
||||||
|
|
||||||
{"Dropping a fixed fraction of features by zoom level", 0, 0, 0},
|
{"Dropping a fixed fraction of features by zoom level", 0, 0, 0},
|
||||||
{"drop-rate", required_argument, 0, 'r'},
|
{"drop-rate", required_argument, 0, 'r'},
|
||||||
@ -2415,6 +2424,14 @@ int main(int argc, char **argv) {
|
|||||||
exclude_all = 1;
|
exclude_all = 1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 'J':
|
||||||
|
filter = read_filter(optarg);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'j':
|
||||||
|
filter = parse_filter(optarg);
|
||||||
|
break;
|
||||||
|
|
||||||
case 'r':
|
case 'r':
|
||||||
if (strcmp(optarg, "g") == 0) {
|
if (strcmp(optarg, "g") == 0) {
|
||||||
droprate = -2;
|
droprate = -2;
|
||||||
@ -2663,7 +2680,7 @@ int main(int argc, char **argv) {
|
|||||||
|
|
||||||
long long file_bbox[4] = {UINT_MAX, UINT_MAX, 0, 0};
|
long long file_bbox[4] = {UINT_MAX, UINT_MAX, 0, 0};
|
||||||
|
|
||||||
ret = read_input(sources, name ? name : out_mbtiles ? out_mbtiles : out_dir, maxzoom, minzoom, basezoom, basezoom_marker_width, outdb, out_dir, &exclude, &include, exclude_all, droprate, buffer, tmpdir, gamma, read_parallel, forcetable, attribution, gamma != 0, file_bbox, prefilter, postfilter, description, guess_maxzoom, &attribute_types, argv[0]);
|
ret = read_input(sources, name ? name : out_mbtiles ? out_mbtiles : out_dir, maxzoom, minzoom, basezoom, basezoom_marker_width, outdb, out_dir, &exclude, &include, exclude_all, filter, droprate, buffer, tmpdir, gamma, read_parallel, forcetable, attribution, gamma != 0, file_bbox, prefilter, postfilter, description, guess_maxzoom, &attribute_types, argv[0]);
|
||||||
|
|
||||||
if (outdb != NULL) {
|
if (outdb != NULL) {
|
||||||
mbtiles_close(outdb, argv[0]);
|
mbtiles_close(outdb, argv[0]);
|
||||||
@ -2680,6 +2697,10 @@ int main(int argc, char **argv) {
|
|||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (filter != NULL) {
|
||||||
|
json_free(filter);
|
||||||
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -178,6 +178,18 @@ The \fItype\fP may be \fB\fCstring\fR, \fB\fCfloat\fR, \fB\fCint\fR, or \fB\fCbo
|
|||||||
If the type is \fB\fCbool\fR, then original attributes of \fB\fC0\fR (or, if numeric, \fB\fC0.0\fR, etc.), \fB\fCfalse\fR, \fB\fCnull\fR, or the empty string become \fB\fCfalse\fR, and otherwise become \fB\fCtrue\fR\&.
|
If the type is \fB\fCbool\fR, then original attributes of \fB\fC0\fR (or, if numeric, \fB\fC0.0\fR, etc.), \fB\fCfalse\fR, \fB\fCnull\fR, or the empty string become \fB\fCfalse\fR, and otherwise become \fB\fCtrue\fR\&.
|
||||||
If the type is \fB\fCfloat\fR or \fB\fCint\fR and the original attribute was non\-numeric, it becomes \fB\fC0\fR\&.
|
If the type is \fB\fCfloat\fR or \fB\fCint\fR and the original attribute was non\-numeric, it becomes \fB\fC0\fR\&.
|
||||||
If the type is \fB\fCint\fR and the original attribute was floating\-point, it is rounded to the nearest integer.
|
If the type is \fB\fCint\fR and the original attribute was floating\-point, it is rounded to the nearest integer.
|
||||||
|
.IP \(bu 2
|
||||||
|
\fB\fC\-j\fR \fIfilter\fP or \fB\fC\-\-feature\-filter\fR=\fIfilter\fP: Check features against a per\-layer filter (as defined in the Mapbox GL Style Specification \[la]https://www.mapbox.com/mapbox-gl-js/style-spec/#types-filter\[ra]) and only include those that match. Any features in layers that have no filter specified will be passed through. Filters for the layer \fB\fC"*"\fR apply to all layers.
|
||||||
|
.IP \(bu 2
|
||||||
|
\fB\fC\-J\fR \fIfilter\-file\fP or \fB\fC\-\-feature\-filter\-file\fR=\fIfilter\-file\fP: Like \fB\fC\-j\fR, but read the filter from a file.
|
||||||
|
.RE
|
||||||
|
.PP
|
||||||
|
Example: to find the Natural Earth countries with low \fB\fCscalerank\fR but high \fB\fCLABELRANK\fR:
|
||||||
|
.PP
|
||||||
|
.RS
|
||||||
|
.nf
|
||||||
|
tile\-join \-o filtered.mbtiles \-j '{ "ne_10m_admin_0_countries": [ "all", [ "<", "scalerank", 3 ], [ ">", "LABELRANK", 5 ] ] }' ne_10m_admin_0_countries.mbtiles
|
||||||
|
.fi
|
||||||
.RE
|
.RE
|
||||||
.SS Dropping a fixed fraction of features by zoom level
|
.SS Dropping a fixed fraction of features by zoom level
|
||||||
.RS
|
.RS
|
||||||
@ -568,6 +580,10 @@ The options are:
|
|||||||
\fB\fC\-x\fR \fIkey\fP or \fB\fC\-\-exclude=\fR\fIkey\fP: Remove attributes of type \fIkey\fP from the output. You can use this to remove the field you are matching against if you no longer need it after joining, or to remove any other attributes you don't want.
|
\fB\fC\-x\fR \fIkey\fP or \fB\fC\-\-exclude=\fR\fIkey\fP: Remove attributes of type \fIkey\fP from the output. You can use this to remove the field you are matching against if you no longer need it after joining, or to remove any other attributes you don't want.
|
||||||
.IP \(bu 2
|
.IP \(bu 2
|
||||||
\fB\fC\-i\fR or \fB\fC\-\-if\-matched\fR: Only include features that matched the CSV.
|
\fB\fC\-i\fR or \fB\fC\-\-if\-matched\fR: Only include features that matched the CSV.
|
||||||
|
.IP \(bu 2
|
||||||
|
\fB\fC\-j\fR \fIfilter\fP or \fB\fC\-\-feature\-filter\fR=\fIfilter\fP: Check features against a per\-layer filter (as defined in the Mapbox GL Style Specification \[la]https://www.mapbox.com/mapbox-gl-js/style-spec/#types-filter\[ra]) and only include those that match. Any features in layers that have no filter specified will be passed through. Filters for the layer \fB\fC"*"\fR apply to all layers.
|
||||||
|
.IP \(bu 2
|
||||||
|
\fB\fC\-J\fR \fIfilter\-file\fP or \fB\fC\-\-feature\-filter\-file\fR=\fIfilter\-file\fP: Like \fB\fC\-j\fR, but read the filter from a file.
|
||||||
.RE
|
.RE
|
||||||
.SS Setting or disabling tile size limits
|
.SS Setting or disabling tile size limits
|
||||||
.RS
|
.RS
|
||||||
|
2
mvt.cpp
2
mvt.cpp
@ -530,6 +530,8 @@ mvt_value stringified_to_mvt_value(int type, const char *s) {
|
|||||||
} else if (type == mvt_bool) {
|
} else if (type == mvt_bool) {
|
||||||
tv.type = mvt_bool;
|
tv.type = mvt_bool;
|
||||||
tv.numeric_value.bool_value = (s[0] == 't');
|
tv.numeric_value.bool_value = (s[0] == 't');
|
||||||
|
} else if (type == mvt_null) {
|
||||||
|
tv.type = mvt_null;
|
||||||
} else {
|
} else {
|
||||||
tv.type = mvt_string;
|
tv.type = mvt_string;
|
||||||
tv.string_value = s;
|
tv.string_value = s;
|
||||||
|
48
serial.cpp
48
serial.cpp
@ -18,6 +18,7 @@
|
|||||||
#include "main.hpp"
|
#include "main.hpp"
|
||||||
#include "pool.hpp"
|
#include "pool.hpp"
|
||||||
#include "projection.hpp"
|
#include "projection.hpp"
|
||||||
|
#include "evaluator.hpp"
|
||||||
#include "milo/dtoa_milo.h"
|
#include "milo/dtoa_milo.h"
|
||||||
|
|
||||||
size_t fwrite_check(const void *ptr, size_t size, size_t nitems, FILE *stream, const char *fname) {
|
size_t fwrite_check(const void *ptr, size_t size, size_t nitems, FILE *stream, const char *fname) {
|
||||||
@ -513,19 +514,60 @@ int serialize_feature(struct serialization_state *sst, serial_feature &sf) {
|
|||||||
|
|
||||||
for (size_t i = 0; i < sf.full_keys.size(); i++) {
|
for (size_t i = 0; i < sf.full_keys.size(); i++) {
|
||||||
if (sst->exclude_all) {
|
if (sst->exclude_all) {
|
||||||
if (sst->include->count(sf.full_keys[i]) == 0) {
|
if (sst->include->count(sf.full_keys[i]) == 0 && sf.full_keys[i] != "") {
|
||||||
sf.full_keys[i] = "";
|
sf.full_keys[i] = "";
|
||||||
sf.m--;
|
sf.m--;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
} else if (sst->exclude->count(sf.full_keys[i]) != 0) {
|
} else if (sst->exclude->count(sf.full_keys[i]) != 0 && sf.full_keys[i] != "") {
|
||||||
sf.full_keys[i] = "";
|
sf.full_keys[i] = "";
|
||||||
sf.m--;
|
sf.m--;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
coerce_value(sf.full_keys[i], sf.full_values[i].type, sf.full_values[i].s, sst->attribute_types);
|
coerce_value(sf.full_keys[i], sf.full_values[i].type, sf.full_values[i].s, sst->attribute_types);
|
||||||
if (sf.full_values[i].type == mvt_null) {
|
}
|
||||||
|
|
||||||
|
if (sst->filter != NULL) {
|
||||||
|
std::map<std::string, mvt_value> attributes;
|
||||||
|
|
||||||
|
for (size_t i = 0; i < sf.full_keys.size(); i++) {
|
||||||
|
if (sf.full_keys[i] != "") {
|
||||||
|
std::string key = sf.full_keys[i];
|
||||||
|
mvt_value val = stringified_to_mvt_value(sf.full_values[i].type, sf.full_values[i].s.c_str());
|
||||||
|
|
||||||
|
attributes.insert(std::pair<std::string, mvt_value>(key, val));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sf.has_id) {
|
||||||
|
mvt_value v;
|
||||||
|
v.type = mvt_uint;
|
||||||
|
v.numeric_value.uint_value = sf.id;
|
||||||
|
|
||||||
|
attributes.insert(std::pair<std::string, mvt_value>("$id", v));
|
||||||
|
}
|
||||||
|
|
||||||
|
mvt_value v;
|
||||||
|
v.type = mvt_string;
|
||||||
|
|
||||||
|
if (sf.t == mvt_point) {
|
||||||
|
v.string_value = "Point";
|
||||||
|
} else if (sf.t == mvt_linestring) {
|
||||||
|
v.string_value = "LineString";
|
||||||
|
} else if (sf.t == mvt_polygon) {
|
||||||
|
v.string_value = "Polygon";
|
||||||
|
}
|
||||||
|
|
||||||
|
attributes.insert(std::pair<std::string, mvt_value>("$type", v));
|
||||||
|
|
||||||
|
if (!evaluate(attributes, sf.layername, sst->filter)) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (size_t i = 0; i < sf.full_keys.size(); i++) {
|
||||||
|
if (sf.full_values[i].type == mvt_null && sf.full_keys[i] != "") {
|
||||||
sf.full_keys[i] = "";
|
sf.full_keys[i] = "";
|
||||||
sf.m--;
|
sf.m--;
|
||||||
}
|
}
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include "geometry.hpp"
|
#include "geometry.hpp"
|
||||||
#include "mbtiles.hpp"
|
#include "mbtiles.hpp"
|
||||||
|
#include "jsonpull/jsonpull.h"
|
||||||
|
|
||||||
size_t fwrite_check(const void *ptr, size_t size, size_t nitems, FILE *stream, const char *fname);
|
size_t fwrite_check(const void *ptr, size_t size, size_t nitems, FILE *stream, const char *fname);
|
||||||
|
|
||||||
@ -125,6 +126,7 @@ struct serialization_state {
|
|||||||
std::set<std::string> *exclude;
|
std::set<std::string> *exclude;
|
||||||
std::set<std::string> *include;
|
std::set<std::string> *include;
|
||||||
int exclude_all;
|
int exclude_all;
|
||||||
|
json_object *filter;
|
||||||
};
|
};
|
||||||
|
|
||||||
int serialize_feature(struct serialization_state *sst, serial_feature &sf);
|
int serialize_feature(struct serialization_state *sst, serial_feature &sf);
|
||||||
|
133
tests/feature-filter/filter
Normal file
133
tests/feature-filter/filter
Normal file
@ -0,0 +1,133 @@
|
|||||||
|
{
|
||||||
|
"layer2850085303": ["==", "foo", "bar"],
|
||||||
|
"notlayer2850085303": [ "none", ["==", "foo", "bar"] ]
|
||||||
|
,
|
||||||
|
"layer1948775714": ["==", "foo", 0],
|
||||||
|
"notlayer1948775714": [ "none", ["==", "foo", 0] ]
|
||||||
|
,
|
||||||
|
"layer220442869": ["==", "foo", null],
|
||||||
|
"notlayer220442869": [ "none", ["==", "foo", null] ]
|
||||||
|
,
|
||||||
|
"layer1675768827": ["==", "$type", "LineString"],
|
||||||
|
"notlayer1675768827": [ "none", ["==", "$type", "LineString"] ]
|
||||||
|
,
|
||||||
|
"layer827905613": ["==", "$id", 1234],
|
||||||
|
"notlayer827905613": [ "none", ["==", "$id", 1234] ]
|
||||||
|
,
|
||||||
|
"layer442294443": ["!=", "foo", "bar"],
|
||||||
|
"notlayer442294443": [ "none", ["!=", "foo", "bar"] ]
|
||||||
|
,
|
||||||
|
"layer1479822166": ["!=", "foo", 0],
|
||||||
|
"notlayer1479822166": [ "none", ["!=", "foo", 0] ]
|
||||||
|
,
|
||||||
|
"layer1780490201": ["!=", "foo", null],
|
||||||
|
"notlayer1780490201": [ "none", ["!=", "foo", null] ]
|
||||||
|
,
|
||||||
|
"layer1549998271": ["!=", "$type", "LineString"],
|
||||||
|
"notlayer1549998271": [ "none", ["!=", "$type", "LineString"] ]
|
||||||
|
,
|
||||||
|
"layer2624681884": ["<", "foo", 0],
|
||||||
|
"notlayer2624681884": [ "none", ["<", "foo", 0] ]
|
||||||
|
,
|
||||||
|
"layer2596070344": ["<", "foo", "0"],
|
||||||
|
"notlayer2596070344": [ "none", ["<", "foo", "0"] ]
|
||||||
|
,
|
||||||
|
"layer4079511021": ["<=", "foo", 0],
|
||||||
|
"notlayer4079511021": [ "none", ["<=", "foo", 0] ]
|
||||||
|
,
|
||||||
|
"layer1392333553": ["<=", "foo", "0"],
|
||||||
|
"notlayer1392333553": [ "none", ["<=", "foo", "0"] ]
|
||||||
|
,
|
||||||
|
"layer4018549566": [">", "foo", 0],
|
||||||
|
"notlayer4018549566": [ "none", [">", "foo", 0] ]
|
||||||
|
,
|
||||||
|
"layer3835447578": [">", "foo", "0"],
|
||||||
|
"notlayer3835447578": [ "none", [">", "foo", "0"] ]
|
||||||
|
,
|
||||||
|
"layer4113007703": [">=", "foo", 0],
|
||||||
|
"notlayer4113007703": [ "none", [">=", "foo", 0] ]
|
||||||
|
,
|
||||||
|
"layer4650955": [">=", "foo", "0"],
|
||||||
|
"notlayer4650955": [ "none", [">=", "foo", "0"] ]
|
||||||
|
,
|
||||||
|
"layer1510660139": ["in", "foo"],
|
||||||
|
"notlayer1510660139": [ "none", ["in", "foo"] ]
|
||||||
|
,
|
||||||
|
"layer2681700979": ["in", "foo", "0"],
|
||||||
|
"notlayer2681700979": [ "none", ["in", "foo", "0"] ]
|
||||||
|
,
|
||||||
|
"layer328238911": ["in", "foo", 0],
|
||||||
|
"notlayer328238911": [ "none", ["in", "foo", 0] ]
|
||||||
|
,
|
||||||
|
"layer584721662": ["in", "foo", null],
|
||||||
|
"notlayer584721662": [ "none", ["in", "foo", null] ]
|
||||||
|
,
|
||||||
|
"layer464719784": ["in", "foo", 0, 1],
|
||||||
|
"notlayer464719784": [ "none", ["in", "foo", 0, 1] ]
|
||||||
|
,
|
||||||
|
"layer1359089124": ["in", "$type", "LineString", "Polygon"],
|
||||||
|
"notlayer1359089124": [ "none", ["in", "$type", "LineString", "Polygon"] ]
|
||||||
|
,
|
||||||
|
"layer3115744778": ["in", "$type", "Polygon", "LineString", "Point"],
|
||||||
|
"notlayer3115744778": [ "none", ["in", "$type", "Polygon", "LineString", "Point"] ]
|
||||||
|
,
|
||||||
|
"layer262236988": ["!in", "foo"],
|
||||||
|
"notlayer262236988": [ "none", ["!in", "foo"] ]
|
||||||
|
,
|
||||||
|
"layer3444677016": ["!in", "foo", "0"],
|
||||||
|
"notlayer3444677016": [ "none", ["!in", "foo", "0"] ]
|
||||||
|
,
|
||||||
|
"layer3048837612": ["!in", "foo", 0],
|
||||||
|
"notlayer3048837612": [ "none", ["!in", "foo", 0] ]
|
||||||
|
,
|
||||||
|
"layer3045031255": ["!in", "foo", null],
|
||||||
|
"notlayer3045031255": [ "none", ["!in", "foo", null] ]
|
||||||
|
,
|
||||||
|
"layer2925029377": ["!in", "foo", 0, 1],
|
||||||
|
"notlayer2925029377": [ "none", ["!in", "foo", 0, 1] ]
|
||||||
|
,
|
||||||
|
"layer2275670193": ["!in", "$type", "LineString", "Polygon"],
|
||||||
|
"notlayer2275670193": [ "none", ["!in", "$type", "LineString", "Polygon"] ]
|
||||||
|
,
|
||||||
|
"layer4098096220": ["any"],
|
||||||
|
"notlayer4098096220": [ "none", ["any"] ]
|
||||||
|
,
|
||||||
|
"layer3603116915": ["any", ["==", "foo", 1]],
|
||||||
|
"notlayer3603116915": [ "none", ["any", ["==", "foo", 1]] ]
|
||||||
|
,
|
||||||
|
"layer3603115546": ["any", ["==", "foo", 0]],
|
||||||
|
"notlayer3603115546": [ "none", ["any", ["==", "foo", 0]] ]
|
||||||
|
,
|
||||||
|
"layer4070554881": ["any", ["==", "foo", 0], ["==", "foo", 1]],
|
||||||
|
"notlayer4070554881": [ "none", ["any", ["==", "foo", 0], ["==", "foo", 1]] ]
|
||||||
|
,
|
||||||
|
"layer4097977117": ["all"],
|
||||||
|
"notlayer4097977117": [ "none", ["all"] ]
|
||||||
|
,
|
||||||
|
"layer2333216076": ["all", ["==", "foo", 1]],
|
||||||
|
"notlayer2333216076": [ "none", ["all", ["==", "foo", 1]] ]
|
||||||
|
,
|
||||||
|
"layer2333214707": ["all", ["==", "foo", 0]],
|
||||||
|
"notlayer2333214707": [ "none", ["all", ["==", "foo", 0]] ]
|
||||||
|
,
|
||||||
|
"layer1619469362": ["all", ["==", "foo", 0], ["==", "foo", 1]],
|
||||||
|
"notlayer1619469362": [ "none", ["all", ["==", "foo", 0], ["==", "foo", 1]] ]
|
||||||
|
,
|
||||||
|
"layer2208582832": ["none"],
|
||||||
|
"notlayer2208582832": [ "none", ["none"] ]
|
||||||
|
,
|
||||||
|
"layer3425959847": ["none", ["==", "foo", 1]],
|
||||||
|
"notlayer3425959847": [ "none", ["none", ["==", "foo", 1]] ]
|
||||||
|
,
|
||||||
|
"layer3425958478": ["none", ["==", "foo", 0]],
|
||||||
|
"notlayer3425958478": [ "none", ["none", ["==", "foo", 0]] ]
|
||||||
|
,
|
||||||
|
"layer253198869": ["none", ["==", "foo", 0], ["==", "foo", 1]],
|
||||||
|
"notlayer253198869": [ "none", ["none", ["==", "foo", 0], ["==", "foo", 1]] ]
|
||||||
|
,
|
||||||
|
"layer938200568": ["has", "foo"],
|
||||||
|
"notlayer938200568": [ "none", ["has", "foo"] ]
|
||||||
|
,
|
||||||
|
"layer1991184237": ["!has", "foo"],
|
||||||
|
"notlayer1991184237": [ "none", ["!has", "foo"] ]
|
||||||
|
}
|
368
tests/feature-filter/in.json
Normal file
368
tests/feature-filter/in.json
Normal file
@ -0,0 +1,368 @@
|
|||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer2850085303" }, "properties": {"foo": "bar", "rule": "\"properties\": {\"foo\": \"bar\"}, [\"==\", \"foo\", \"bar\"]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer2850085303" }, "properties": {"foo": "bar", "rule": "\"properties\": {\"foo\": \"bar\"}, [\"==\", \"foo\", \"bar\"]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer2850085303" }, "properties": {"foo": "baz", "rule": "not \"properties\": {\"foo\": \"baz\"}, [\"==\", \"foo\", \"bar\"]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer2850085303" }, "properties": {"foo": "baz", "rule": "not \"properties\": {\"foo\": \"baz\"}, [\"==\", \"foo\", \"bar\"]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer1948775714" }, "properties": {"foo": 0, "rule": "\"properties\": {\"foo\": 0}, [\"==\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer1948775714" }, "properties": {"foo": 0, "rule": "\"properties\": {\"foo\": 0}, [\"==\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer1948775714" }, "properties": {"foo": 1, "rule": "not \"properties\": {\"foo\": 1}, [\"==\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer1948775714" }, "properties": {"foo": 1, "rule": "not \"properties\": {\"foo\": 1}, [\"==\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer1948775714" }, "properties": {"foo": "0", "rule": "not \"properties\": {\"foo\": \"0\"}, [\"==\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer1948775714" }, "properties": {"foo": "0", "rule": "not \"properties\": {\"foo\": \"0\"}, [\"==\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer1948775714" }, "properties": {"foo": true, "rule": "not \"properties\": {\"foo\": true}, [\"==\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer1948775714" }, "properties": {"foo": true, "rule": "not \"properties\": {\"foo\": true}, [\"==\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer1948775714" }, "properties": {"foo": false, "rule": "not \"properties\": {\"foo\": false}, [\"==\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer1948775714" }, "properties": {"foo": false, "rule": "not \"properties\": {\"foo\": false}, [\"==\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer1948775714" }, "properties": {"foo": null, "rule": "not \"properties\": {\"foo\": null}, [\"==\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer1948775714" }, "properties": {"foo": null, "rule": "not \"properties\": {\"foo\": null}, [\"==\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer1948775714" }, "properties": { "rule": "not \"properties\": {}, [\"==\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer1948775714" }, "properties": { "rule": "not \"properties\": {}, [\"==\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer220442869" }, "properties": {"foo": 0, "rule": "not \"properties\": {\"foo\": 0}, [\"==\", \"foo\", null]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer220442869" }, "properties": {"foo": 0, "rule": "not \"properties\": {\"foo\": 0}, [\"==\", \"foo\", null]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer220442869" }, "properties": {"foo": 1, "rule": "not \"properties\": {\"foo\": 1}, [\"==\", \"foo\", null]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer220442869" }, "properties": {"foo": 1, "rule": "not \"properties\": {\"foo\": 1}, [\"==\", \"foo\", null]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer220442869" }, "properties": {"foo": "0", "rule": "not \"properties\": {\"foo\": \"0\"}, [\"==\", \"foo\", null]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer220442869" }, "properties": {"foo": "0", "rule": "not \"properties\": {\"foo\": \"0\"}, [\"==\", \"foo\", null]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer220442869" }, "properties": {"foo": true, "rule": "not \"properties\": {\"foo\": true}, [\"==\", \"foo\", null]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer220442869" }, "properties": {"foo": true, "rule": "not \"properties\": {\"foo\": true}, [\"==\", \"foo\", null]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer220442869" }, "properties": {"foo": false, "rule": "not \"properties\": {\"foo\": false}, [\"==\", \"foo\", null]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer220442869" }, "properties": {"foo": false, "rule": "not \"properties\": {\"foo\": false}, [\"==\", \"foo\", null]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer220442869" }, "properties": {"foo": null, "rule": "\"properties\": {\"foo\": null}, [\"==\", \"foo\", null]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer220442869" }, "properties": {"foo": null, "rule": "\"properties\": {\"foo\": null}, [\"==\", \"foo\", null]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer220442869" }, "properties": { "rule": "not \"properties\": {}, [\"==\", \"foo\", null]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer220442869" }, "properties": { "rule": "not \"properties\": {}, [\"==\", \"foo\", null]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer1675768827" }, "properties": { "rule": "not type: 1, [\"==\", \"$type\", \"LineString\"]" }, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer1675768827" }, "properties": { "rule": "not type: 1, [\"==\", \"$type\", \"LineString\"]" }, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer1675768827" }, "properties": { "rule": "type: 2, [\"==\", \"$type\", \"LineString\"]" }, "geometry": { "type": "LineString", "coordinates": [ [ 0, 0 ], [ 1, 1 ] ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer1675768827" }, "properties": { "rule": "type: 2, [\"==\", \"$type\", \"LineString\"]" }, "geometry": { "type": "LineString", "coordinates": [ [ -100, 0 ], [ -101, 1 ] ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer827905613" }, "id": 1234, "properties": { "rule": "\"id\": 1234, [\"==\", \"$id\", 1234]" }, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer827905613" }, "id": 1234, "properties": { "rule": "\"id\": 1234, [\"==\", \"$id\", 1234]" }, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer827905613" }, "id": "1234", "properties": { "rule": "not \"id\": \"1234\", [\"==\", \"$id\", 1234]" }, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer827905613" }, "id": "1234", "properties": { "rule": "not \"id\": \"1234\", [\"==\", \"$id\", 1234]" }, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer827905613" }, "properties": {"id": 1234, "rule": "not \"properties\": {\"id\": 1234}, [\"==\", \"$id\", 1234]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer827905613" }, "properties": {"id": 1234, "rule": "not \"properties\": {\"id\": 1234}, [\"==\", \"$id\", 1234]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer442294443" }, "properties": {"foo": "bar", "rule": "not \"properties\": {\"foo\": \"bar\"}, [\"!=\", \"foo\", \"bar\"]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer442294443" }, "properties": {"foo": "bar", "rule": "not \"properties\": {\"foo\": \"bar\"}, [\"!=\", \"foo\", \"bar\"]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer442294443" }, "properties": {"foo": "baz", "rule": "\"properties\": {\"foo\": \"baz\"}, [\"!=\", \"foo\", \"bar\"]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer442294443" }, "properties": {"foo": "baz", "rule": "\"properties\": {\"foo\": \"baz\"}, [\"!=\", \"foo\", \"bar\"]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer1479822166" }, "properties": {"foo": 0, "rule": "not \"properties\": {\"foo\": 0}, [\"!=\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer1479822166" }, "properties": {"foo": 0, "rule": "not \"properties\": {\"foo\": 0}, [\"!=\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer1479822166" }, "properties": {"foo": 1, "rule": "\"properties\": {\"foo\": 1}, [\"!=\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer1479822166" }, "properties": {"foo": 1, "rule": "\"properties\": {\"foo\": 1}, [\"!=\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer1479822166" }, "properties": {"foo": "0", "rule": "\"properties\": {\"foo\": \"0\"}, [\"!=\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer1479822166" }, "properties": {"foo": "0", "rule": "\"properties\": {\"foo\": \"0\"}, [\"!=\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer1479822166" }, "properties": {"foo": true, "rule": "\"properties\": {\"foo\": true}, [\"!=\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer1479822166" }, "properties": {"foo": true, "rule": "\"properties\": {\"foo\": true}, [\"!=\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer1479822166" }, "properties": {"foo": false, "rule": "\"properties\": {\"foo\": false}, [\"!=\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer1479822166" }, "properties": {"foo": false, "rule": "\"properties\": {\"foo\": false}, [\"!=\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer1479822166" }, "properties": {"foo": null, "rule": "\"properties\": {\"foo\": null}, [\"!=\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer1479822166" }, "properties": {"foo": null, "rule": "\"properties\": {\"foo\": null}, [\"!=\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer1479822166" }, "properties": { "rule": "\"properties\": {}, [\"!=\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer1479822166" }, "properties": { "rule": "\"properties\": {}, [\"!=\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer1780490201" }, "properties": {"foo": 0, "rule": "\"properties\": {\"foo\": 0}, [\"!=\", \"foo\", null]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer1780490201" }, "properties": {"foo": 0, "rule": "\"properties\": {\"foo\": 0}, [\"!=\", \"foo\", null]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer1780490201" }, "properties": {"foo": 1, "rule": "\"properties\": {\"foo\": 1}, [\"!=\", \"foo\", null]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer1780490201" }, "properties": {"foo": 1, "rule": "\"properties\": {\"foo\": 1}, [\"!=\", \"foo\", null]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer1780490201" }, "properties": {"foo": "0", "rule": "\"properties\": {\"foo\": \"0\"}, [\"!=\", \"foo\", null]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer1780490201" }, "properties": {"foo": "0", "rule": "\"properties\": {\"foo\": \"0\"}, [\"!=\", \"foo\", null]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer1780490201" }, "properties": {"foo": true, "rule": "\"properties\": {\"foo\": true}, [\"!=\", \"foo\", null]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer1780490201" }, "properties": {"foo": true, "rule": "\"properties\": {\"foo\": true}, [\"!=\", \"foo\", null]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer1780490201" }, "properties": {"foo": false, "rule": "\"properties\": {\"foo\": false}, [\"!=\", \"foo\", null]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer1780490201" }, "properties": {"foo": false, "rule": "\"properties\": {\"foo\": false}, [\"!=\", \"foo\", null]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer1780490201" }, "properties": {"foo": null, "rule": "not \"properties\": {\"foo\": null}, [\"!=\", \"foo\", null]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer1780490201" }, "properties": {"foo": null, "rule": "not \"properties\": {\"foo\": null}, [\"!=\", \"foo\", null]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer1780490201" }, "properties": { "rule": "\"properties\": {}, [\"!=\", \"foo\", null]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer1780490201" }, "properties": { "rule": "\"properties\": {}, [\"!=\", \"foo\", null]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer1549998271" }, "properties": { "rule": "type: 1, [\"!=\", \"$type\", \"LineString\"]" }, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer1549998271" }, "properties": { "rule": "type: 1, [\"!=\", \"$type\", \"LineString\"]" }, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer1549998271" }, "properties": { "rule": "not type: 2, [\"!=\", \"$type\", \"LineString\"]" }, "geometry": { "type": "LineString", "coordinates": [ [ 0, 0 ], [ 1, 1 ] ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer1549998271" }, "properties": { "rule": "not type: 2, [\"!=\", \"$type\", \"LineString\"]" }, "geometry": { "type": "LineString", "coordinates": [ [ -100, 0 ], [ -101, 1 ] ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer2624681884" }, "properties": {"foo": 1, "rule": "not \"properties\": {\"foo\": 1}, [\"<\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer2624681884" }, "properties": {"foo": 1, "rule": "not \"properties\": {\"foo\": 1}, [\"<\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer2624681884" }, "properties": {"foo": 0, "rule": "not \"properties\": {\"foo\": 0}, [\"<\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer2624681884" }, "properties": {"foo": 0, "rule": "not \"properties\": {\"foo\": 0}, [\"<\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer2624681884" }, "properties": {"foo": -1, "rule": "\"properties\": {\"foo\": -1}, [\"<\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer2624681884" }, "properties": {"foo": -1, "rule": "\"properties\": {\"foo\": -1}, [\"<\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer2624681884" }, "properties": {"foo": "1", "rule": "not \"properties\": {\"foo\": \"1\"}, [\"<\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer2624681884" }, "properties": {"foo": "1", "rule": "not \"properties\": {\"foo\": \"1\"}, [\"<\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer2624681884" }, "properties": {"foo": "0", "rule": "not \"properties\": {\"foo\": \"0\"}, [\"<\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer2624681884" }, "properties": {"foo": "0", "rule": "not \"properties\": {\"foo\": \"0\"}, [\"<\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer2624681884" }, "properties": {"foo": "-1", "rule": "not \"properties\": {\"foo\": \"-1\"}, [\"<\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer2624681884" }, "properties": {"foo": "-1", "rule": "not \"properties\": {\"foo\": \"-1\"}, [\"<\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer2624681884" }, "properties": {"foo": true, "rule": "not \"properties\": {\"foo\": true}, [\"<\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer2624681884" }, "properties": {"foo": true, "rule": "not \"properties\": {\"foo\": true}, [\"<\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer2624681884" }, "properties": {"foo": false, "rule": "not \"properties\": {\"foo\": false}, [\"<\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer2624681884" }, "properties": {"foo": false, "rule": "not \"properties\": {\"foo\": false}, [\"<\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer2624681884" }, "properties": {"foo": null, "rule": "not \"properties\": {\"foo\": null}, [\"<\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer2624681884" }, "properties": {"foo": null, "rule": "not \"properties\": {\"foo\": null}, [\"<\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer2624681884" }, "properties": { "rule": "not \"properties\": {}, [\"<\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer2624681884" }, "properties": { "rule": "not \"properties\": {}, [\"<\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer2596070344" }, "properties": {"foo": -1, "rule": "not \"properties\": {\"foo\": -1}, [\"<\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer2596070344" }, "properties": {"foo": -1, "rule": "not \"properties\": {\"foo\": -1}, [\"<\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer2596070344" }, "properties": {"foo": 0, "rule": "not \"properties\": {\"foo\": 0}, [\"<\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer2596070344" }, "properties": {"foo": 0, "rule": "not \"properties\": {\"foo\": 0}, [\"<\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer2596070344" }, "properties": {"foo": 1, "rule": "not \"properties\": {\"foo\": 1}, [\"<\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer2596070344" }, "properties": {"foo": 1, "rule": "not \"properties\": {\"foo\": 1}, [\"<\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer2596070344" }, "properties": {"foo": "1", "rule": "not \"properties\": {\"foo\": \"1\"}, [\"<\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer2596070344" }, "properties": {"foo": "1", "rule": "not \"properties\": {\"foo\": \"1\"}, [\"<\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer2596070344" }, "properties": {"foo": "0", "rule": "not \"properties\": {\"foo\": \"0\"}, [\"<\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer2596070344" }, "properties": {"foo": "0", "rule": "not \"properties\": {\"foo\": \"0\"}, [\"<\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer2596070344" }, "properties": {"foo": "-1", "rule": "\"properties\": {\"foo\": \"-1\"}, [\"<\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer2596070344" }, "properties": {"foo": "-1", "rule": "\"properties\": {\"foo\": \"-1\"}, [\"<\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer2596070344" }, "properties": {"foo": true, "rule": "not \"properties\": {\"foo\": true}, [\"<\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer2596070344" }, "properties": {"foo": true, "rule": "not \"properties\": {\"foo\": true}, [\"<\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer2596070344" }, "properties": {"foo": false, "rule": "not \"properties\": {\"foo\": false}, [\"<\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer2596070344" }, "properties": {"foo": false, "rule": "not \"properties\": {\"foo\": false}, [\"<\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer2596070344" }, "properties": {"foo": null, "rule": "not \"properties\": {\"foo\": null}, [\"<\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer2596070344" }, "properties": {"foo": null, "rule": "not \"properties\": {\"foo\": null}, [\"<\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer4079511021" }, "properties": {"foo": 1, "rule": "not \"properties\": {\"foo\": 1}, [\"<=\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer4079511021" }, "properties": {"foo": 1, "rule": "not \"properties\": {\"foo\": 1}, [\"<=\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer4079511021" }, "properties": {"foo": 0, "rule": "\"properties\": {\"foo\": 0}, [\"<=\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer4079511021" }, "properties": {"foo": 0, "rule": "\"properties\": {\"foo\": 0}, [\"<=\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer4079511021" }, "properties": {"foo": -1, "rule": "\"properties\": {\"foo\": -1}, [\"<=\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer4079511021" }, "properties": {"foo": -1, "rule": "\"properties\": {\"foo\": -1}, [\"<=\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer4079511021" }, "properties": {"foo": "1", "rule": "not \"properties\": {\"foo\": \"1\"}, [\"<=\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer4079511021" }, "properties": {"foo": "1", "rule": "not \"properties\": {\"foo\": \"1\"}, [\"<=\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer4079511021" }, "properties": {"foo": "0", "rule": "not \"properties\": {\"foo\": \"0\"}, [\"<=\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer4079511021" }, "properties": {"foo": "0", "rule": "not \"properties\": {\"foo\": \"0\"}, [\"<=\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer4079511021" }, "properties": {"foo": "-1", "rule": "not \"properties\": {\"foo\": \"-1\"}, [\"<=\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer4079511021" }, "properties": {"foo": "-1", "rule": "not \"properties\": {\"foo\": \"-1\"}, [\"<=\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer4079511021" }, "properties": {"foo": true, "rule": "not \"properties\": {\"foo\": true}, [\"<=\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer4079511021" }, "properties": {"foo": true, "rule": "not \"properties\": {\"foo\": true}, [\"<=\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer4079511021" }, "properties": {"foo": false, "rule": "not \"properties\": {\"foo\": false}, [\"<=\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer4079511021" }, "properties": {"foo": false, "rule": "not \"properties\": {\"foo\": false}, [\"<=\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer4079511021" }, "properties": {"foo": null, "rule": "not \"properties\": {\"foo\": null}, [\"<=\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer4079511021" }, "properties": {"foo": null, "rule": "not \"properties\": {\"foo\": null}, [\"<=\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer4079511021" }, "properties": { "rule": "not \"properties\": {}, [\"<=\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer4079511021" }, "properties": { "rule": "not \"properties\": {}, [\"<=\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer1392333553" }, "properties": {"foo": -1, "rule": "not \"properties\": {\"foo\": -1}, [\"<=\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer1392333553" }, "properties": {"foo": -1, "rule": "not \"properties\": {\"foo\": -1}, [\"<=\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer1392333553" }, "properties": {"foo": 0, "rule": "not \"properties\": {\"foo\": 0}, [\"<=\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer1392333553" }, "properties": {"foo": 0, "rule": "not \"properties\": {\"foo\": 0}, [\"<=\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer1392333553" }, "properties": {"foo": 1, "rule": "not \"properties\": {\"foo\": 1}, [\"<=\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer1392333553" }, "properties": {"foo": 1, "rule": "not \"properties\": {\"foo\": 1}, [\"<=\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer1392333553" }, "properties": {"foo": "1", "rule": "not \"properties\": {\"foo\": \"1\"}, [\"<=\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer1392333553" }, "properties": {"foo": "1", "rule": "not \"properties\": {\"foo\": \"1\"}, [\"<=\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer1392333553" }, "properties": {"foo": "0", "rule": "\"properties\": {\"foo\": \"0\"}, [\"<=\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer1392333553" }, "properties": {"foo": "0", "rule": "\"properties\": {\"foo\": \"0\"}, [\"<=\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer1392333553" }, "properties": {"foo": "-1", "rule": "\"properties\": {\"foo\": \"-1\"}, [\"<=\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer1392333553" }, "properties": {"foo": "-1", "rule": "\"properties\": {\"foo\": \"-1\"}, [\"<=\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer1392333553" }, "properties": {"foo": true, "rule": "not \"properties\": {\"foo\": true}, [\"<=\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer1392333553" }, "properties": {"foo": true, "rule": "not \"properties\": {\"foo\": true}, [\"<=\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer1392333553" }, "properties": {"foo": false, "rule": "not \"properties\": {\"foo\": false}, [\"<=\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer1392333553" }, "properties": {"foo": false, "rule": "not \"properties\": {\"foo\": false}, [\"<=\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer1392333553" }, "properties": {"foo": null, "rule": "not \"properties\": {\"foo\": null}, [\"<=\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer1392333553" }, "properties": {"foo": null, "rule": "not \"properties\": {\"foo\": null}, [\"<=\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer4018549566" }, "properties": {"foo": 1, "rule": "\"properties\": {\"foo\": 1}, [\">\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer4018549566" }, "properties": {"foo": 1, "rule": "\"properties\": {\"foo\": 1}, [\">\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer4018549566" }, "properties": {"foo": 0, "rule": "not \"properties\": {\"foo\": 0}, [\">\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer4018549566" }, "properties": {"foo": 0, "rule": "not \"properties\": {\"foo\": 0}, [\">\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer4018549566" }, "properties": {"foo": -1, "rule": "not \"properties\": {\"foo\": -1}, [\">\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer4018549566" }, "properties": {"foo": -1, "rule": "not \"properties\": {\"foo\": -1}, [\">\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer4018549566" }, "properties": {"foo": "1", "rule": "not \"properties\": {\"foo\": \"1\"}, [\">\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer4018549566" }, "properties": {"foo": "1", "rule": "not \"properties\": {\"foo\": \"1\"}, [\">\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer4018549566" }, "properties": {"foo": "0", "rule": "not \"properties\": {\"foo\": \"0\"}, [\">\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer4018549566" }, "properties": {"foo": "0", "rule": "not \"properties\": {\"foo\": \"0\"}, [\">\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer4018549566" }, "properties": {"foo": "-1", "rule": "not \"properties\": {\"foo\": \"-1\"}, [\">\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer4018549566" }, "properties": {"foo": "-1", "rule": "not \"properties\": {\"foo\": \"-1\"}, [\">\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer4018549566" }, "properties": {"foo": true, "rule": "not \"properties\": {\"foo\": true}, [\">\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer4018549566" }, "properties": {"foo": true, "rule": "not \"properties\": {\"foo\": true}, [\">\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer4018549566" }, "properties": {"foo": false, "rule": "not \"properties\": {\"foo\": false}, [\">\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer4018549566" }, "properties": {"foo": false, "rule": "not \"properties\": {\"foo\": false}, [\">\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer4018549566" }, "properties": {"foo": null, "rule": "not \"properties\": {\"foo\": null}, [\">\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer4018549566" }, "properties": {"foo": null, "rule": "not \"properties\": {\"foo\": null}, [\">\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer4018549566" }, "properties": { "rule": "not \"properties\": {}, [\">\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer4018549566" }, "properties": { "rule": "not \"properties\": {}, [\">\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer3835447578" }, "properties": {"foo": -1, "rule": "not \"properties\": {\"foo\": -1}, [\">\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer3835447578" }, "properties": {"foo": -1, "rule": "not \"properties\": {\"foo\": -1}, [\">\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer3835447578" }, "properties": {"foo": 0, "rule": "not \"properties\": {\"foo\": 0}, [\">\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer3835447578" }, "properties": {"foo": 0, "rule": "not \"properties\": {\"foo\": 0}, [\">\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer3835447578" }, "properties": {"foo": 1, "rule": "not \"properties\": {\"foo\": 1}, [\">\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer3835447578" }, "properties": {"foo": 1, "rule": "not \"properties\": {\"foo\": 1}, [\">\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer3835447578" }, "properties": {"foo": "1", "rule": "\"properties\": {\"foo\": \"1\"}, [\">\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer3835447578" }, "properties": {"foo": "1", "rule": "\"properties\": {\"foo\": \"1\"}, [\">\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer3835447578" }, "properties": {"foo": "0", "rule": "not \"properties\": {\"foo\": \"0\"}, [\">\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer3835447578" }, "properties": {"foo": "0", "rule": "not \"properties\": {\"foo\": \"0\"}, [\">\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer3835447578" }, "properties": {"foo": "-1", "rule": "not \"properties\": {\"foo\": \"-1\"}, [\">\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer3835447578" }, "properties": {"foo": "-1", "rule": "not \"properties\": {\"foo\": \"-1\"}, [\">\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer3835447578" }, "properties": {"foo": true, "rule": "not \"properties\": {\"foo\": true}, [\">\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer3835447578" }, "properties": {"foo": true, "rule": "not \"properties\": {\"foo\": true}, [\">\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer3835447578" }, "properties": {"foo": false, "rule": "not \"properties\": {\"foo\": false}, [\">\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer3835447578" }, "properties": {"foo": false, "rule": "not \"properties\": {\"foo\": false}, [\">\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer3835447578" }, "properties": {"foo": null, "rule": "not \"properties\": {\"foo\": null}, [\">\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer3835447578" }, "properties": {"foo": null, "rule": "not \"properties\": {\"foo\": null}, [\">\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer4113007703" }, "properties": {"foo": 1, "rule": "\"properties\": {\"foo\": 1}, [\">=\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer4113007703" }, "properties": {"foo": 1, "rule": "\"properties\": {\"foo\": 1}, [\">=\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer4113007703" }, "properties": {"foo": 0, "rule": "\"properties\": {\"foo\": 0}, [\">=\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer4113007703" }, "properties": {"foo": 0, "rule": "\"properties\": {\"foo\": 0}, [\">=\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer4113007703" }, "properties": {"foo": -1, "rule": "not \"properties\": {\"foo\": -1}, [\">=\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer4113007703" }, "properties": {"foo": -1, "rule": "not \"properties\": {\"foo\": -1}, [\">=\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer4113007703" }, "properties": {"foo": "1", "rule": "not \"properties\": {\"foo\": \"1\"}, [\">=\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer4113007703" }, "properties": {"foo": "1", "rule": "not \"properties\": {\"foo\": \"1\"}, [\">=\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer4113007703" }, "properties": {"foo": "0", "rule": "not \"properties\": {\"foo\": \"0\"}, [\">=\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer4113007703" }, "properties": {"foo": "0", "rule": "not \"properties\": {\"foo\": \"0\"}, [\">=\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer4113007703" }, "properties": {"foo": "-1", "rule": "not \"properties\": {\"foo\": \"-1\"}, [\">=\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer4113007703" }, "properties": {"foo": "-1", "rule": "not \"properties\": {\"foo\": \"-1\"}, [\">=\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer4113007703" }, "properties": {"foo": true, "rule": "not \"properties\": {\"foo\": true}, [\">=\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer4113007703" }, "properties": {"foo": true, "rule": "not \"properties\": {\"foo\": true}, [\">=\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer4113007703" }, "properties": {"foo": false, "rule": "not \"properties\": {\"foo\": false}, [\">=\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer4113007703" }, "properties": {"foo": false, "rule": "not \"properties\": {\"foo\": false}, [\">=\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer4113007703" }, "properties": {"foo": null, "rule": "not \"properties\": {\"foo\": null}, [\">=\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer4113007703" }, "properties": {"foo": null, "rule": "not \"properties\": {\"foo\": null}, [\">=\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer4113007703" }, "properties": { "rule": "not \"properties\": {}, [\">=\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer4113007703" }, "properties": { "rule": "not \"properties\": {}, [\">=\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer4650955" }, "properties": {"foo": -1, "rule": "not \"properties\": {\"foo\": -1}, [\">=\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer4650955" }, "properties": {"foo": -1, "rule": "not \"properties\": {\"foo\": -1}, [\">=\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer4650955" }, "properties": {"foo": 0, "rule": "not \"properties\": {\"foo\": 0}, [\">=\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer4650955" }, "properties": {"foo": 0, "rule": "not \"properties\": {\"foo\": 0}, [\">=\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer4650955" }, "properties": {"foo": 1, "rule": "not \"properties\": {\"foo\": 1}, [\">=\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer4650955" }, "properties": {"foo": 1, "rule": "not \"properties\": {\"foo\": 1}, [\">=\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer4650955" }, "properties": {"foo": "1", "rule": "\"properties\": {\"foo\": \"1\"}, [\">=\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer4650955" }, "properties": {"foo": "1", "rule": "\"properties\": {\"foo\": \"1\"}, [\">=\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer4650955" }, "properties": {"foo": "0", "rule": "\"properties\": {\"foo\": \"0\"}, [\">=\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer4650955" }, "properties": {"foo": "0", "rule": "\"properties\": {\"foo\": \"0\"}, [\">=\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer4650955" }, "properties": {"foo": "-1", "rule": "not \"properties\": {\"foo\": \"-1\"}, [\">=\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer4650955" }, "properties": {"foo": "-1", "rule": "not \"properties\": {\"foo\": \"-1\"}, [\">=\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer4650955" }, "properties": {"foo": true, "rule": "not \"properties\": {\"foo\": true}, [\">=\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer4650955" }, "properties": {"foo": true, "rule": "not \"properties\": {\"foo\": true}, [\">=\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer4650955" }, "properties": {"foo": false, "rule": "not \"properties\": {\"foo\": false}, [\">=\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer4650955" }, "properties": {"foo": false, "rule": "not \"properties\": {\"foo\": false}, [\">=\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer4650955" }, "properties": {"foo": null, "rule": "not \"properties\": {\"foo\": null}, [\">=\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer4650955" }, "properties": {"foo": null, "rule": "not \"properties\": {\"foo\": null}, [\">=\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer1510660139" }, "properties": {"foo": 1, "rule": "not \"properties\": {\"foo\": 1}, [\"in\", \"foo\"]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer1510660139" }, "properties": {"foo": 1, "rule": "not \"properties\": {\"foo\": 1}, [\"in\", \"foo\"]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer2681700979" }, "properties": {"foo": 0, "rule": "not \"properties\": {\"foo\": 0}, [\"in\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer2681700979" }, "properties": {"foo": 0, "rule": "not \"properties\": {\"foo\": 0}, [\"in\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer2681700979" }, "properties": {"foo": "0", "rule": "\"properties\": {\"foo\": \"0\"}, [\"in\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer2681700979" }, "properties": {"foo": "0", "rule": "\"properties\": {\"foo\": \"0\"}, [\"in\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer2681700979" }, "properties": {"foo": true, "rule": "not \"properties\": {\"foo\": true}, [\"in\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer2681700979" }, "properties": {"foo": true, "rule": "not \"properties\": {\"foo\": true}, [\"in\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer2681700979" }, "properties": {"foo": false, "rule": "not \"properties\": {\"foo\": false}, [\"in\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer2681700979" }, "properties": {"foo": false, "rule": "not \"properties\": {\"foo\": false}, [\"in\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer2681700979" }, "properties": {"foo": null, "rule": "not \"properties\": {\"foo\": null}, [\"in\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer2681700979" }, "properties": {"foo": null, "rule": "not \"properties\": {\"foo\": null}, [\"in\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer2681700979" }, "properties": { "rule": "not \"properties\": {}, [\"in\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer2681700979" }, "properties": { "rule": "not \"properties\": {}, [\"in\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer328238911" }, "properties": {"foo": 0, "rule": "\"properties\": {\"foo\": 0}, [\"in\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer328238911" }, "properties": {"foo": 0, "rule": "\"properties\": {\"foo\": 0}, [\"in\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer328238911" }, "properties": {"foo": "0", "rule": "not \"properties\": {\"foo\": \"0\"}, [\"in\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer328238911" }, "properties": {"foo": "0", "rule": "not \"properties\": {\"foo\": \"0\"}, [\"in\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer328238911" }, "properties": {"foo": true, "rule": "not \"properties\": {\"foo\": true}, [\"in\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer328238911" }, "properties": {"foo": true, "rule": "not \"properties\": {\"foo\": true}, [\"in\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer328238911" }, "properties": {"foo": false, "rule": "not \"properties\": {\"foo\": false}, [\"in\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer328238911" }, "properties": {"foo": false, "rule": "not \"properties\": {\"foo\": false}, [\"in\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer328238911" }, "properties": {"foo": null, "rule": "not \"properties\": {\"foo\": null}, [\"in\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer328238911" }, "properties": {"foo": null, "rule": "not \"properties\": {\"foo\": null}, [\"in\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer584721662" }, "properties": {"foo": 0, "rule": "not \"properties\": {\"foo\": 0}, [\"in\", \"foo\", null]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer584721662" }, "properties": {"foo": 0, "rule": "not \"properties\": {\"foo\": 0}, [\"in\", \"foo\", null]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer584721662" }, "properties": {"foo": "0", "rule": "not \"properties\": {\"foo\": \"0\"}, [\"in\", \"foo\", null]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer584721662" }, "properties": {"foo": "0", "rule": "not \"properties\": {\"foo\": \"0\"}, [\"in\", \"foo\", null]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer584721662" }, "properties": {"foo": true, "rule": "not \"properties\": {\"foo\": true}, [\"in\", \"foo\", null]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer584721662" }, "properties": {"foo": true, "rule": "not \"properties\": {\"foo\": true}, [\"in\", \"foo\", null]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer584721662" }, "properties": {"foo": false, "rule": "not \"properties\": {\"foo\": false}, [\"in\", \"foo\", null]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer584721662" }, "properties": {"foo": false, "rule": "not \"properties\": {\"foo\": false}, [\"in\", \"foo\", null]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer584721662" }, "properties": {"foo": null, "rule": "\"properties\": {\"foo\": null}, [\"in\", \"foo\", null]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer584721662" }, "properties": {"foo": null, "rule": "\"properties\": {\"foo\": null}, [\"in\", \"foo\", null]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer464719784" }, "properties": {"foo": 0, "rule": "\"properties\": {\"foo\": 0}, [\"in\", \"foo\", 0, 1]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer464719784" }, "properties": {"foo": 0, "rule": "\"properties\": {\"foo\": 0}, [\"in\", \"foo\", 0, 1]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer464719784" }, "properties": {"foo": 1, "rule": "\"properties\": {\"foo\": 1}, [\"in\", \"foo\", 0, 1]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer464719784" }, "properties": {"foo": 1, "rule": "\"properties\": {\"foo\": 1}, [\"in\", \"foo\", 0, 1]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer464719784" }, "properties": {"foo": 3, "rule": "not \"properties\": {\"foo\": 3}, [\"in\", \"foo\", 0, 1]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer464719784" }, "properties": {"foo": 3, "rule": "not \"properties\": {\"foo\": 3}, [\"in\", \"foo\", 0, 1]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer1359089124" }, "properties": { "rule": "not type: 1, [\"in\", \"$type\", \"LineString\", \"Polygon\"]" }, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer1359089124" }, "properties": { "rule": "not type: 1, [\"in\", \"$type\", \"LineString\", \"Polygon\"]" }, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer1359089124" }, "properties": { "rule": "type: 2, [\"in\", \"$type\", \"LineString\", \"Polygon\"]" }, "geometry": { "type": "LineString", "coordinates": [ [ 0, 0 ], [ 1, 1 ] ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer1359089124" }, "properties": { "rule": "type: 2, [\"in\", \"$type\", \"LineString\", \"Polygon\"]" }, "geometry": { "type": "LineString", "coordinates": [ [ -100, 0 ], [ -101, 1 ] ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer1359089124" }, "properties": { "rule": "type: 3, [\"in\", \"$type\", \"LineString\", \"Polygon\"]" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 0, 0 ], [ 1, 1 ], [ 1, 0 ], [ 0, 0 ] ] ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer1359089124" }, "properties": { "rule": "type: 3, [\"in\", \"$type\", \"LineString\", \"Polygon\"]" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -100, 0 ], [ -101, 1 ], [ -101, 0 ], [-100, 0 ] ] ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer3115744778" }, "properties": { "rule": "type: 1, [\"in\", \"$type\", \"Polygon\", \"LineString\", \"Point\"]" }, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer3115744778" }, "properties": { "rule": "type: 1, [\"in\", \"$type\", \"Polygon\", \"LineString\", \"Point\"]" }, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer3115744778" }, "properties": { "rule": "type: 2, [\"in\", \"$type\", \"Polygon\", \"LineString\", \"Point\"]" }, "geometry": { "type": "LineString", "coordinates": [ [ 0, 0 ], [ 1, 1 ] ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer3115744778" }, "properties": { "rule": "type: 2, [\"in\", \"$type\", \"Polygon\", \"LineString\", \"Point\"]" }, "geometry": { "type": "LineString", "coordinates": [ [ -100, 0 ], [ -101, 1 ] ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer3115744778" }, "properties": { "rule": "type: 3, [\"in\", \"$type\", \"Polygon\", \"LineString\", \"Point\"]" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 0, 0 ], [ 1, 1 ], [ 1, 0 ], [ 0, 0 ] ] ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer3115744778" }, "properties": { "rule": "type: 3, [\"in\", \"$type\", \"Polygon\", \"LineString\", \"Point\"]" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -100, 0 ], [ -101, 1 ], [ -101, 0 ], [-100, 0 ] ] ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer262236988" }, "properties": {"foo": 1, "rule": "\"properties\": {\"foo\": 1}, [\"!in\", \"foo\"]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer262236988" }, "properties": {"foo": 1, "rule": "\"properties\": {\"foo\": 1}, [\"!in\", \"foo\"]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer3444677016" }, "properties": {"foo": 0, "rule": "\"properties\": {\"foo\": 0}, [\"!in\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer3444677016" }, "properties": {"foo": 0, "rule": "\"properties\": {\"foo\": 0}, [\"!in\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer3444677016" }, "properties": {"foo": "0", "rule": "not \"properties\": {\"foo\": \"0\"}, [\"!in\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer3444677016" }, "properties": {"foo": "0", "rule": "not \"properties\": {\"foo\": \"0\"}, [\"!in\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer3444677016" }, "properties": {"foo": null, "rule": "\"properties\": {\"foo\": null}, [\"!in\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer3444677016" }, "properties": {"foo": null, "rule": "\"properties\": {\"foo\": null}, [\"!in\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer3444677016" }, "properties": { "rule": "\"properties\": {}, [\"!in\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer3444677016" }, "properties": { "rule": "\"properties\": {}, [\"!in\", \"foo\", \"0\"]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer3048837612" }, "properties": {"foo": 0, "rule": "not \"properties\": {\"foo\": 0}, [\"!in\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer3048837612" }, "properties": {"foo": 0, "rule": "not \"properties\": {\"foo\": 0}, [\"!in\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer3048837612" }, "properties": {"foo": "0", "rule": "\"properties\": {\"foo\": \"0\"}, [\"!in\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer3048837612" }, "properties": {"foo": "0", "rule": "\"properties\": {\"foo\": \"0\"}, [\"!in\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer3048837612" }, "properties": {"foo": null, "rule": "\"properties\": {\"foo\": null}, [\"!in\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer3048837612" }, "properties": {"foo": null, "rule": "\"properties\": {\"foo\": null}, [\"!in\", \"foo\", 0]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer3045031255" }, "properties": {"foo": 0, "rule": "\"properties\": {\"foo\": 0}, [\"!in\", \"foo\", null]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer3045031255" }, "properties": {"foo": 0, "rule": "\"properties\": {\"foo\": 0}, [\"!in\", \"foo\", null]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer3045031255" }, "properties": {"foo": "0", "rule": "\"properties\": {\"foo\": \"0\"}, [\"!in\", \"foo\", null]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer3045031255" }, "properties": {"foo": "0", "rule": "\"properties\": {\"foo\": \"0\"}, [\"!in\", \"foo\", null]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer3045031255" }, "properties": {"foo": null, "rule": "not \"properties\": {\"foo\": null}, [\"!in\", \"foo\", null]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer3045031255" }, "properties": {"foo": null, "rule": "not \"properties\": {\"foo\": null}, [\"!in\", \"foo\", null]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer2925029377" }, "properties": {"foo": 0, "rule": "not \"properties\": {\"foo\": 0}, [\"!in\", \"foo\", 0, 1]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer2925029377" }, "properties": {"foo": 0, "rule": "not \"properties\": {\"foo\": 0}, [\"!in\", \"foo\", 0, 1]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer2925029377" }, "properties": {"foo": 1, "rule": "not \"properties\": {\"foo\": 1}, [\"!in\", \"foo\", 0, 1]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer2925029377" }, "properties": {"foo": 1, "rule": "not \"properties\": {\"foo\": 1}, [\"!in\", \"foo\", 0, 1]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer2925029377" }, "properties": {"foo": 3, "rule": "\"properties\": {\"foo\": 3}, [\"!in\", \"foo\", 0, 1]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer2925029377" }, "properties": {"foo": 3, "rule": "\"properties\": {\"foo\": 3}, [\"!in\", \"foo\", 0, 1]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer2275670193" }, "properties": { "rule": "type: 1, [\"!in\", \"$type\", \"LineString\", \"Polygon\"]" }, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer2275670193" }, "properties": { "rule": "type: 1, [\"!in\", \"$type\", \"LineString\", \"Polygon\"]" }, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer2275670193" }, "properties": { "rule": "not type: 2, [\"!in\", \"$type\", \"LineString\", \"Polygon\"]" }, "geometry": { "type": "LineString", "coordinates": [ [ 0, 0 ], [ 1, 1 ] ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer2275670193" }, "properties": { "rule": "not type: 2, [\"!in\", \"$type\", \"LineString\", \"Polygon\"]" }, "geometry": { "type": "LineString", "coordinates": [ [ -100, 0 ], [ -101, 1 ] ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer2275670193" }, "properties": { "rule": "not type: 3, [\"!in\", \"$type\", \"LineString\", \"Polygon\"]" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 0, 0 ], [ 1, 1 ], [ 1, 0 ], [ 0, 0 ] ] ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer2275670193" }, "properties": { "rule": "not type: 3, [\"!in\", \"$type\", \"LineString\", \"Polygon\"]" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -100, 0 ], [ -101, 1 ], [ -101, 0 ], [-100, 0 ] ] ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer4098096220" }, "properties": {"foo": 1, "rule": "not \"properties\": {\"foo\": 1}, [\"any\"]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer4098096220" }, "properties": {"foo": 1, "rule": "not \"properties\": {\"foo\": 1}, [\"any\"]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer3603116915" }, "properties": {"foo": 1, "rule": "\"properties\": {\"foo\": 1}, [\"any\", [\"==\", \"foo\", 1]]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer3603116915" }, "properties": {"foo": 1, "rule": "\"properties\": {\"foo\": 1}, [\"any\", [\"==\", \"foo\", 1]]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer3603115546" }, "properties": {"foo": 1, "rule": "not \"properties\": {\"foo\": 1}, [\"any\", [\"==\", \"foo\", 0]]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer3603115546" }, "properties": {"foo": 1, "rule": "not \"properties\": {\"foo\": 1}, [\"any\", [\"==\", \"foo\", 0]]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer4070554881" }, "properties": {"foo": 1, "rule": "\"properties\": {\"foo\": 1}, [\"any\", [\"==\", \"foo\", 0], [\"==\", \"foo\", 1]]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer4070554881" }, "properties": {"foo": 1, "rule": "\"properties\": {\"foo\": 1}, [\"any\", [\"==\", \"foo\", 0], [\"==\", \"foo\", 1]]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer4097977117" }, "properties": {"foo": 1, "rule": "\"properties\": {\"foo\": 1}, [\"all\"]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer4097977117" }, "properties": {"foo": 1, "rule": "\"properties\": {\"foo\": 1}, [\"all\"]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer2333216076" }, "properties": {"foo": 1, "rule": "\"properties\": {\"foo\": 1}, [\"all\", [\"==\", \"foo\", 1]]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer2333216076" }, "properties": {"foo": 1, "rule": "\"properties\": {\"foo\": 1}, [\"all\", [\"==\", \"foo\", 1]]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer2333214707" }, "properties": {"foo": 1, "rule": "not \"properties\": {\"foo\": 1}, [\"all\", [\"==\", \"foo\", 0]]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer2333214707" }, "properties": {"foo": 1, "rule": "not \"properties\": {\"foo\": 1}, [\"all\", [\"==\", \"foo\", 0]]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer1619469362" }, "properties": {"foo": 1, "rule": "not \"properties\": {\"foo\": 1}, [\"all\", [\"==\", \"foo\", 0], [\"==\", \"foo\", 1]]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer1619469362" }, "properties": {"foo": 1, "rule": "not \"properties\": {\"foo\": 1}, [\"all\", [\"==\", \"foo\", 0], [\"==\", \"foo\", 1]]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer2208582832" }, "properties": {"foo": 1, "rule": "\"properties\": {\"foo\": 1}, [\"none\"]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer2208582832" }, "properties": {"foo": 1, "rule": "\"properties\": {\"foo\": 1}, [\"none\"]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer3425959847" }, "properties": {"foo": 1, "rule": "not \"properties\": {\"foo\": 1}, [\"none\", [\"==\", \"foo\", 1]]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer3425959847" }, "properties": {"foo": 1, "rule": "not \"properties\": {\"foo\": 1}, [\"none\", [\"==\", \"foo\", 1]]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer3425958478" }, "properties": {"foo": 1, "rule": "\"properties\": {\"foo\": 1}, [\"none\", [\"==\", \"foo\", 0]]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer3425958478" }, "properties": {"foo": 1, "rule": "\"properties\": {\"foo\": 1}, [\"none\", [\"==\", \"foo\", 0]]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer253198869" }, "properties": {"foo": 1, "rule": "not \"properties\": {\"foo\": 1}, [\"none\", [\"==\", \"foo\", 0], [\"==\", \"foo\", 1]]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer253198869" }, "properties": {"foo": 1, "rule": "not \"properties\": {\"foo\": 1}, [\"none\", [\"==\", \"foo\", 0], [\"==\", \"foo\", 1]]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer938200568" }, "properties": {"foo": 0, "rule": "\"properties\": {\"foo\": 0}, [\"has\", \"foo\"]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer938200568" }, "properties": {"foo": 0, "rule": "\"properties\": {\"foo\": 0}, [\"has\", \"foo\"]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer938200568" }, "properties": {"foo": 1, "rule": "\"properties\": {\"foo\": 1}, [\"has\", \"foo\"]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer938200568" }, "properties": {"foo": 1, "rule": "\"properties\": {\"foo\": 1}, [\"has\", \"foo\"]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer938200568" }, "properties": {"foo": "0", "rule": "\"properties\": {\"foo\": \"0\"}, [\"has\", \"foo\"]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer938200568" }, "properties": {"foo": "0", "rule": "\"properties\": {\"foo\": \"0\"}, [\"has\", \"foo\"]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer938200568" }, "properties": {"foo": true, "rule": "\"properties\": {\"foo\": true}, [\"has\", \"foo\"]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer938200568" }, "properties": {"foo": true, "rule": "\"properties\": {\"foo\": true}, [\"has\", \"foo\"]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer938200568" }, "properties": {"foo": false, "rule": "\"properties\": {\"foo\": false}, [\"has\", \"foo\"]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer938200568" }, "properties": {"foo": false, "rule": "\"properties\": {\"foo\": false}, [\"has\", \"foo\"]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer938200568" }, "properties": {"foo": null, "rule": "\"properties\": {\"foo\": null}, [\"has\", \"foo\"]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer938200568" }, "properties": {"foo": null, "rule": "\"properties\": {\"foo\": null}, [\"has\", \"foo\"]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer938200568" }, "properties": { "rule": "not \"properties\": {}, [\"has\", \"foo\"]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer938200568" }, "properties": { "rule": "not \"properties\": {}, [\"has\", \"foo\"]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer1991184237" }, "properties": {"foo": 0, "rule": "not \"properties\": {\"foo\": 0}, [\"!has\", \"foo\"]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer1991184237" }, "properties": {"foo": 0, "rule": "not \"properties\": {\"foo\": 0}, [\"!has\", \"foo\"]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer1991184237" }, "properties": {"foo": 1, "rule": "not \"properties\": {\"foo\": 1}, [\"!has\", \"foo\"]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer1991184237" }, "properties": {"foo": 1, "rule": "not \"properties\": {\"foo\": 1}, [\"!has\", \"foo\"]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer1991184237" }, "properties": {"foo": "0", "rule": "not \"properties\": {\"foo\": \"0\"}, [\"!has\", \"foo\"]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer1991184237" }, "properties": {"foo": "0", "rule": "not \"properties\": {\"foo\": \"0\"}, [\"!has\", \"foo\"]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer1991184237" }, "properties": {"foo": false, "rule": "not \"properties\": {\"foo\": false}, [\"!has\", \"foo\"]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer1991184237" }, "properties": {"foo": false, "rule": "not \"properties\": {\"foo\": false}, [\"!has\", \"foo\"]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer1991184237" }, "properties": {"foo": false, "rule": "not \"properties\": {\"foo\": false}, [\"!has\", \"foo\"]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer1991184237" }, "properties": {"foo": false, "rule": "not \"properties\": {\"foo\": false}, [\"!has\", \"foo\"]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer1991184237" }, "properties": {"foo": null, "rule": "not \"properties\": {\"foo\": null}, [\"!has\", \"foo\"]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer1991184237" }, "properties": {"foo": null, "rule": "not \"properties\": {\"foo\": null}, [\"!has\", \"foo\"]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "layer1991184237" }, "properties": { "rule": "\"properties\": {}, [\"!has\", \"foo\"]"}, "geometry": { "type": "Point", "coordinates": [ 0, 0 ] } }
|
||||||
|
{ "type": "Feature", "tippecanoe": { "layer": "notlayer1991184237" }, "properties": { "rule": "\"properties\": {}, [\"!has\", \"foo\"]"}, "geometry": { "type": "Point", "coordinates": [ -100, 0 ] } }
|
528
tests/feature-filter/out/-z0_-Jtests%feature-filter%filter.json
Normal file
528
tests/feature-filter/out/-z0_-Jtests%feature-filter%filter.json
Normal file
File diff suppressed because one or more lines are too long
520
tests/feature-filter/out/filtered.json.standard
Normal file
520
tests/feature-filter/out/filtered.json.standard
Normal file
File diff suppressed because one or more lines are too long
134
tests/make-filter-test
Executable file
134
tests/make-filter-test
Executable file
@ -0,0 +1,134 @@
|
|||||||
|
#!/usr/bin/perl
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
|
||||||
|
open(GEOJSON, ">feature-filter/in.json");
|
||||||
|
open(FILTER, ">feature-filter/filter");
|
||||||
|
|
||||||
|
sub calchash {
|
||||||
|
my $h = 0;
|
||||||
|
my $s = $_[0];
|
||||||
|
while ($s =~ s/^(.)//) {
|
||||||
|
$h = ($h * 37 + ord($1)) & ((1 << 32) - 1);
|
||||||
|
}
|
||||||
|
return $h;
|
||||||
|
}
|
||||||
|
|
||||||
|
my $filter = "";
|
||||||
|
my $hash = 0;
|
||||||
|
|
||||||
|
print FILTER "{\n";
|
||||||
|
my $first = 1;
|
||||||
|
|
||||||
|
open(IN, "../../mapbox-gl-js/test/unit/style-spec/feature_filter.test.js");
|
||||||
|
while (<IN>) {
|
||||||
|
if (/const f[0-9]* = filter\((.*)\);/) {
|
||||||
|
$filter = $1;
|
||||||
|
$filter =~ s/'/"/g;
|
||||||
|
$hash = "layer" . calchash($filter);
|
||||||
|
|
||||||
|
unless ($filter =~ /apply/) {
|
||||||
|
if ($first) {
|
||||||
|
$first = 0;
|
||||||
|
} else {
|
||||||
|
print FILTER ",\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
print FILTER "\"$hash\": $filter,\n";
|
||||||
|
print FILTER "\"not$hash\": [ \"none\", $filter ]\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (/t.equal\(f[0-9]*\({(.*)}\), ([a-z]+)\);/) {
|
||||||
|
unless ($filter =~ /apply/) {
|
||||||
|
my $prop = $1;
|
||||||
|
my $matched = $2;
|
||||||
|
|
||||||
|
if ($prop =~ /properties/) {
|
||||||
|
next if $prop =~ /undefined/;
|
||||||
|
|
||||||
|
$prop =~ s/properties/"properties"/g;
|
||||||
|
$prop =~ s/foo/"foo"/g;
|
||||||
|
$prop =~ s/id/"id"/g;
|
||||||
|
$prop =~ s/undefined/null/g;
|
||||||
|
$prop =~ s/'/"/g;
|
||||||
|
|
||||||
|
my $qprop = "$prop, $filter";
|
||||||
|
$qprop =~ s/"/\\"/g;
|
||||||
|
|
||||||
|
if ($matched eq "true") {
|
||||||
|
$prop =~ s/}/, \"rule\": \"$qprop\"}/;
|
||||||
|
$prop =~ s/^"properties": {,/"properties": {/;
|
||||||
|
|
||||||
|
print GEOJSON "{ \"type\": \"Feature\", \"tippecanoe\": { \"layer\": \"$hash\" }, $prop, \"geometry\": { \"type\": \"Point\", \"coordinates\": [ 0, 0 ] } }\n";
|
||||||
|
print GEOJSON "{ \"type\": \"Feature\", \"tippecanoe\": { \"layer\": \"not$hash\" }, $prop, \"geometry\": { \"type\": \"Point\", \"coordinates\": [ -100, 0 ] } }\n";
|
||||||
|
} else {
|
||||||
|
$prop =~ s/}/, \"rule\": \"not $qprop\"}/;
|
||||||
|
$prop =~ s/^"properties": {,/"properties": {/;
|
||||||
|
|
||||||
|
print GEOJSON "{ \"type\": \"Feature\", \"tippecanoe\": { \"layer\": \"not$hash\" }, $prop, \"geometry\": { \"type\": \"Point\", \"coordinates\": [ 0, 0 ] } }\n";
|
||||||
|
print GEOJSON "{ \"type\": \"Feature\", \"tippecanoe\": { \"layer\": \"$hash\" }, $prop, \"geometry\": { \"type\": \"Point\", \"coordinates\": [ -100, 0 ] } }\n";
|
||||||
|
}
|
||||||
|
} elsif ($prop =~ /id/) {
|
||||||
|
$prop =~ s/id/"id"/g;
|
||||||
|
$prop =~ s/'/"/g;
|
||||||
|
|
||||||
|
my $qprop = "$prop, $filter";
|
||||||
|
$qprop =~ s/"/\\"/g;
|
||||||
|
|
||||||
|
if ($matched eq "true") {
|
||||||
|
$qprop = "\"properties\": { \"rule\": \"$qprop\" }";
|
||||||
|
|
||||||
|
print GEOJSON "{ \"type\": \"Feature\", \"tippecanoe\": { \"layer\": \"$hash\" }, $prop, $qprop, \"geometry\": { \"type\": \"Point\", \"coordinates\": [ 0, 0 ] } }\n";
|
||||||
|
print GEOJSON "{ \"type\": \"Feature\", \"tippecanoe\": { \"layer\": \"not$hash\" }, $prop, $qprop, \"geometry\": { \"type\": \"Point\", \"coordinates\": [ -100, 0 ] } }\n";
|
||||||
|
} else {
|
||||||
|
$qprop = "\"properties\": { \"rule\": \"not $qprop\" }";
|
||||||
|
|
||||||
|
print GEOJSON "{ \"type\": \"Feature\", \"tippecanoe\": { \"layer\": \"not$hash\" }, $prop, $qprop, \"geometry\": { \"type\": \"Point\", \"coordinates\": [ 0, 0 ] } }\n";
|
||||||
|
print GEOJSON "{ \"type\": \"Feature\", \"tippecanoe\": { \"layer\": \"$hash\" }, $prop, $qprop, \"geometry\": { \"type\": \"Point\", \"coordinates\": [ -100, 0 ] } }\n";
|
||||||
|
}
|
||||||
|
} elsif ($prop =~ /type: (.)/) {
|
||||||
|
my $type = $1;
|
||||||
|
|
||||||
|
my $qprop = "$prop, $filter";
|
||||||
|
$qprop =~ s/"/\\"/g;
|
||||||
|
|
||||||
|
if ($matched eq "true") {
|
||||||
|
$qprop = "\"properties\": { \"rule\": \"$qprop\" }";
|
||||||
|
} else {
|
||||||
|
$qprop = "\"properties\": { \"rule\": \"not $qprop\" }";
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($type == 1) {
|
||||||
|
if ($matched eq "true") {
|
||||||
|
print GEOJSON "{ \"type\": \"Feature\", \"tippecanoe\": { \"layer\": \"$hash\" }, $qprop, \"geometry\": { \"type\": \"Point\", \"coordinates\": [ 0, 0 ] } }\n";
|
||||||
|
print GEOJSON "{ \"type\": \"Feature\", \"tippecanoe\": { \"layer\": \"not$hash\" }, $qprop, \"geometry\": { \"type\": \"Point\", \"coordinates\": [ -100, 0 ] } }\n";
|
||||||
|
} else {
|
||||||
|
print GEOJSON "{ \"type\": \"Feature\", \"tippecanoe\": { \"layer\": \"not$hash\" }, $qprop, \"geometry\": { \"type\": \"Point\", \"coordinates\": [ 0, 0 ] } }\n";
|
||||||
|
print GEOJSON "{ \"type\": \"Feature\", \"tippecanoe\": { \"layer\": \"$hash\" }, $qprop, \"geometry\": { \"type\": \"Point\", \"coordinates\": [ -100, 0 ] } }\n";
|
||||||
|
}
|
||||||
|
} elsif ($type == 2) {
|
||||||
|
if ($matched eq "true") {
|
||||||
|
print GEOJSON "{ \"type\": \"Feature\", \"tippecanoe\": { \"layer\": \"$hash\" }, $qprop, \"geometry\": { \"type\": \"LineString\", \"coordinates\": [ [ 0, 0 ], [ 1, 1 ] ] } }\n";
|
||||||
|
print GEOJSON "{ \"type\": \"Feature\", \"tippecanoe\": { \"layer\": \"not$hash\" }, $qprop, \"geometry\": { \"type\": \"LineString\", \"coordinates\": [ [ -100, 0 ], [ -101, 1 ] ] } }\n";
|
||||||
|
} else {
|
||||||
|
print GEOJSON "{ \"type\": \"Feature\", \"tippecanoe\": { \"layer\": \"not$hash\" }, $qprop, \"geometry\": { \"type\": \"LineString\", \"coordinates\": [ [ 0, 0 ], [ 1, 1 ] ] } }\n";
|
||||||
|
print GEOJSON "{ \"type\": \"Feature\", \"tippecanoe\": { \"layer\": \"$hash\" }, $qprop, \"geometry\": { \"type\": \"LineString\", \"coordinates\": [ [ -100, 0 ], [ -101, 1 ] ] } }\n";
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if ($matched eq "true") {
|
||||||
|
print GEOJSON "{ \"type\": \"Feature\", \"tippecanoe\": { \"layer\": \"$hash\" }, $qprop, \"geometry\": { \"type\": \"Polygon\", \"coordinates\": [ [ [ 0, 0 ], [ 1, 1 ], [ 1, 0 ], [ 0, 0 ] ] ] } }\n";
|
||||||
|
print GEOJSON "{ \"type\": \"Feature\", \"tippecanoe\": { \"layer\": \"not$hash\" }, $qprop, \"geometry\": { \"type\": \"Polygon\", \"coordinates\": [ [ [ -100, 0 ], [ -101, 1 ], [ -101, 0 ], [-100, 0 ] ] ] } }\n";
|
||||||
|
} else {
|
||||||
|
print GEOJSON "{ \"type\": \"Feature\", \"tippecanoe\": { \"layer\": \"not$hash\" }, $qprop, \"geometry\": { \"type\": \"Polygon\", \"coordinates\": [ [ [ 0, 0 ], [ 1, 1 ], [ 1, 0 ], [ 0, 0 ] ] ] } }\n";
|
||||||
|
print GEOJSON "{ \"type\": \"Feature\", \"tippecanoe\": { \"layer\": \"$hash\" }, $qprop, \"geometry\": { \"type\": \"Polygon\", \"coordinates\": [ [ [ -100, 0 ], [ -101, 1 ], [ -101, 0 ], [-100, 0 ] ] ] } }\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
print "$prop\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
print FILTER "}\n";
|
@ -22,6 +22,7 @@
|
|||||||
#include "mbtiles.hpp"
|
#include "mbtiles.hpp"
|
||||||
#include "geometry.hpp"
|
#include "geometry.hpp"
|
||||||
#include "dirtiles.hpp"
|
#include "dirtiles.hpp"
|
||||||
|
#include "evaluator.hpp"
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
@ -46,7 +47,7 @@ struct stats {
|
|||||||
double minlat, minlon, maxlat, maxlon;
|
double minlat, minlon, maxlat, maxlon;
|
||||||
};
|
};
|
||||||
|
|
||||||
void handle(std::string message, int z, unsigned x, unsigned y, std::map<std::string, layermap_entry> &layermap, std::vector<std::string> &header, std::map<std::string, std::vector<std::string>> &mapping, std::set<std::string> &exclude, std::set<std::string> &keep_layers, std::set<std::string> &remove_layers, int ifmatched, mvt_tile &outtile) {
|
void handle(std::string message, int z, unsigned x, unsigned y, std::map<std::string, layermap_entry> &layermap, std::vector<std::string> &header, std::map<std::string, std::vector<std::string>> &mapping, std::set<std::string> &exclude, std::set<std::string> &keep_layers, std::set<std::string> &remove_layers, int ifmatched, mvt_tile &outtile, json_object *filter) {
|
||||||
mvt_tile tile;
|
mvt_tile tile;
|
||||||
int features_added = 0;
|
int features_added = 0;
|
||||||
bool was_compressed;
|
bool was_compressed;
|
||||||
@ -100,6 +101,43 @@ void handle(std::string message, int z, unsigned x, unsigned y, std::map<std::st
|
|||||||
|
|
||||||
for (size_t f = 0; f < layer.features.size(); f++) {
|
for (size_t f = 0; f < layer.features.size(); f++) {
|
||||||
mvt_feature feat = layer.features[f];
|
mvt_feature feat = layer.features[f];
|
||||||
|
|
||||||
|
if (filter != NULL) {
|
||||||
|
std::map<std::string, mvt_value> attributes;
|
||||||
|
|
||||||
|
for (size_t t = 0; t + 1 < feat.tags.size(); t += 2) {
|
||||||
|
std::string key = layer.keys[feat.tags[t]];
|
||||||
|
mvt_value &val = layer.values[feat.tags[t + 1]];
|
||||||
|
|
||||||
|
attributes.insert(std::pair<std::string, mvt_value>(key, val));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (feat.has_id) {
|
||||||
|
mvt_value v;
|
||||||
|
v.type = mvt_uint;
|
||||||
|
v.numeric_value.uint_value = feat.id;
|
||||||
|
|
||||||
|
attributes.insert(std::pair<std::string, mvt_value>("$id", v));
|
||||||
|
}
|
||||||
|
|
||||||
|
mvt_value v;
|
||||||
|
v.type = mvt_string;
|
||||||
|
|
||||||
|
if (feat.type == mvt_point) {
|
||||||
|
v.string_value = "Point";
|
||||||
|
} else if (feat.type == mvt_linestring) {
|
||||||
|
v.string_value = "LineString";
|
||||||
|
} else if (feat.type == mvt_polygon) {
|
||||||
|
v.string_value = "Polygon";
|
||||||
|
}
|
||||||
|
|
||||||
|
attributes.insert(std::pair<std::string, mvt_value>("$type", v));
|
||||||
|
|
||||||
|
if (!evaluate(attributes, layer.name, filter)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
mvt_feature outfeature;
|
mvt_feature outfeature;
|
||||||
int matched = 0;
|
int matched = 0;
|
||||||
|
|
||||||
@ -564,6 +602,7 @@ struct arg {
|
|||||||
std::set<std::string> *keep_layers;
|
std::set<std::string> *keep_layers;
|
||||||
std::set<std::string> *remove_layers;
|
std::set<std::string> *remove_layers;
|
||||||
int ifmatched;
|
int ifmatched;
|
||||||
|
json_object *filter;
|
||||||
};
|
};
|
||||||
|
|
||||||
void *join_worker(void *v) {
|
void *join_worker(void *v) {
|
||||||
@ -573,21 +612,22 @@ void *join_worker(void *v) {
|
|||||||
mvt_tile tile;
|
mvt_tile tile;
|
||||||
|
|
||||||
for (size_t i = 0; i < ai->second.size(); i++) {
|
for (size_t i = 0; i < ai->second.size(); i++) {
|
||||||
handle(ai->second[i], ai->first.z, ai->first.x, ai->first.y, *(a->layermap), *(a->header), *(a->mapping), *(a->exclude), *(a->keep_layers), *(a->remove_layers), a->ifmatched, tile);
|
handle(ai->second[i], ai->first.z, ai->first.x, ai->first.y, *(a->layermap), *(a->header), *(a->mapping), *(a->exclude), *(a->keep_layers), *(a->remove_layers), a->ifmatched, tile, a->filter);
|
||||||
}
|
}
|
||||||
|
|
||||||
ai->second.clear();
|
ai->second.clear();
|
||||||
|
|
||||||
bool anything = false;
|
bool anything = false;
|
||||||
|
mvt_tile outtile;
|
||||||
for (size_t i = 0; i < tile.layers.size(); i++) {
|
for (size_t i = 0; i < tile.layers.size(); i++) {
|
||||||
if (tile.layers[i].features.size() > 0) {
|
if (tile.layers[i].features.size() > 0) {
|
||||||
|
outtile.layers.push_back(tile.layers[i]);
|
||||||
anything = true;
|
anything = true;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (anything) {
|
if (anything) {
|
||||||
std::string pbf = tile.encode();
|
std::string pbf = outtile.encode();
|
||||||
std::string compressed;
|
std::string compressed;
|
||||||
|
|
||||||
if (!pC) {
|
if (!pC) {
|
||||||
@ -607,7 +647,7 @@ void *join_worker(void *v) {
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void handle_tasks(std::map<zxy, std::vector<std::string>> &tasks, std::vector<std::map<std::string, layermap_entry>> &layermaps, sqlite3 *outdb, const char *outdir, std::vector<std::string> &header, std::map<std::string, std::vector<std::string>> &mapping, std::set<std::string> &exclude, int ifmatched, std::set<std::string> &keep_layers, std::set<std::string> &remove_layers) {
|
void handle_tasks(std::map<zxy, std::vector<std::string>> &tasks, std::vector<std::map<std::string, layermap_entry>> &layermaps, sqlite3 *outdb, const char *outdir, std::vector<std::string> &header, std::map<std::string, std::vector<std::string>> &mapping, std::set<std::string> &exclude, int ifmatched, std::set<std::string> &keep_layers, std::set<std::string> &remove_layers, json_object *filter) {
|
||||||
pthread_t pthreads[CPUS];
|
pthread_t pthreads[CPUS];
|
||||||
std::vector<arg> args;
|
std::vector<arg> args;
|
||||||
|
|
||||||
@ -621,6 +661,7 @@ void handle_tasks(std::map<zxy, std::vector<std::string>> &tasks, std::vector<st
|
|||||||
args[i].keep_layers = &keep_layers;
|
args[i].keep_layers = &keep_layers;
|
||||||
args[i].remove_layers = &remove_layers;
|
args[i].remove_layers = &remove_layers;
|
||||||
args[i].ifmatched = ifmatched;
|
args[i].ifmatched = ifmatched;
|
||||||
|
args[i].filter = filter;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t count = 0;
|
size_t count = 0;
|
||||||
@ -662,7 +703,7 @@ void handle_tasks(std::map<zxy, std::vector<std::string>> &tasks, std::vector<st
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void decode(struct reader *readers, char *map, std::map<std::string, layermap_entry> &layermap, sqlite3 *outdb, const char *outdir, struct stats *st, std::vector<std::string> &header, std::map<std::string, std::vector<std::string>> &mapping, std::set<std::string> &exclude, int ifmatched, std::string &attribution, std::string &description, std::set<std::string> &keep_layers, std::set<std::string> &remove_layers, std::string &name) {
|
void decode(struct reader *readers, char *map, std::map<std::string, layermap_entry> &layermap, sqlite3 *outdb, const char *outdir, struct stats *st, std::vector<std::string> &header, std::map<std::string, std::vector<std::string>> &mapping, std::set<std::string> &exclude, int ifmatched, std::string &attribution, std::string &description, std::set<std::string> &keep_layers, std::set<std::string> &remove_layers, std::string &name, json_object *filter) {
|
||||||
std::vector<std::map<std::string, layermap_entry>> layermaps;
|
std::vector<std::map<std::string, layermap_entry>> layermaps;
|
||||||
for (size_t i = 0; i < CPUS; i++) {
|
for (size_t i = 0; i < CPUS; i++) {
|
||||||
layermaps.push_back(std::map<std::string, layermap_entry>());
|
layermaps.push_back(std::map<std::string, layermap_entry>());
|
||||||
@ -707,7 +748,7 @@ void decode(struct reader *readers, char *map, std::map<std::string, layermap_en
|
|||||||
|
|
||||||
if (readers == NULL || readers->zoom != r->zoom || readers->x != r->x || readers->y != r->y) {
|
if (readers == NULL || readers->zoom != r->zoom || readers->x != r->x || readers->y != r->y) {
|
||||||
if (tasks.size() > 100 * CPUS) {
|
if (tasks.size() > 100 * CPUS) {
|
||||||
handle_tasks(tasks, layermaps, outdb, outdir, header, mapping, exclude, ifmatched, keep_layers, remove_layers);
|
handle_tasks(tasks, layermaps, outdb, outdir, header, mapping, exclude, ifmatched, keep_layers, remove_layers, filter);
|
||||||
tasks.clear();
|
tasks.clear();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -760,7 +801,7 @@ void decode(struct reader *readers, char *map, std::map<std::string, layermap_en
|
|||||||
st->minlat = min(minlat, st->minlat);
|
st->minlat = min(minlat, st->minlat);
|
||||||
st->maxlat = max(maxlat, st->maxlat);
|
st->maxlat = max(maxlat, st->maxlat);
|
||||||
|
|
||||||
handle_tasks(tasks, layermaps, outdb, outdir, header, mapping, exclude, ifmatched, keep_layers, remove_layers);
|
handle_tasks(tasks, layermaps, outdb, outdir, header, mapping, exclude, ifmatched, keep_layers, remove_layers, filter);
|
||||||
layermap = merge_layermaps(layermaps);
|
layermap = merge_layermaps(layermaps);
|
||||||
|
|
||||||
struct reader *next;
|
struct reader *next;
|
||||||
@ -1004,6 +1045,7 @@ int main(int argc, char **argv) {
|
|||||||
char *csv = NULL;
|
char *csv = NULL;
|
||||||
int force = 0;
|
int force = 0;
|
||||||
int ifmatched = 0;
|
int ifmatched = 0;
|
||||||
|
json_object *filter = NULL;
|
||||||
|
|
||||||
CPUS = sysconf(_SC_NPROCESSORS_ONLN);
|
CPUS = sysconf(_SC_NPROCESSORS_ONLN);
|
||||||
|
|
||||||
@ -1040,6 +1082,8 @@ int main(int argc, char **argv) {
|
|||||||
{"quiet", no_argument, 0, 'q'},
|
{"quiet", no_argument, 0, 'q'},
|
||||||
{"maximum-zoom", required_argument, 0, 'z'},
|
{"maximum-zoom", required_argument, 0, 'z'},
|
||||||
{"minimum-zoom", required_argument, 0, 'Z'},
|
{"minimum-zoom", required_argument, 0, 'Z'},
|
||||||
|
{"feature-filter-file", required_argument, 0, 'J'},
|
||||||
|
{"feature-filter", required_argument, 0, 'j'},
|
||||||
|
|
||||||
{"no-tile-size-limit", no_argument, &pk, 1},
|
{"no-tile-size-limit", no_argument, &pk, 1},
|
||||||
{"no-tile-compression", no_argument, &pC, 1},
|
{"no-tile-compression", no_argument, &pC, 1},
|
||||||
@ -1104,6 +1148,14 @@ int main(int argc, char **argv) {
|
|||||||
minzoom = atoi(optarg);
|
minzoom = atoi(optarg);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 'J':
|
||||||
|
filter = read_filter(optarg);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'j':
|
||||||
|
filter = parse_filter(optarg);
|
||||||
|
break;
|
||||||
|
|
||||||
case 'p':
|
case 'p':
|
||||||
if (strcmp(optarg, "k") == 0) {
|
if (strcmp(optarg, "k") == 0) {
|
||||||
pk = true;
|
pk = true;
|
||||||
@ -1201,7 +1253,7 @@ int main(int argc, char **argv) {
|
|||||||
*rr = r;
|
*rr = r;
|
||||||
}
|
}
|
||||||
|
|
||||||
decode(readers, csv, layermap, outdb, out_dir, &st, header, mapping, exclude, ifmatched, attribution, description, keep_layers, remove_layers, name);
|
decode(readers, csv, layermap, outdb, out_dir, &st, header, mapping, exclude, ifmatched, attribution, description, keep_layers, remove_layers, name, filter);
|
||||||
|
|
||||||
if (set_attribution.size() != 0) {
|
if (set_attribution.size() != 0) {
|
||||||
attribution = set_attribution;
|
attribution = set_attribution;
|
||||||
@ -1219,5 +1271,9 @@ int main(int argc, char **argv) {
|
|||||||
mbtiles_close(outdb, argv[0]);
|
mbtiles_close(outdb, argv[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (filter != NULL) {
|
||||||
|
json_free(filter);
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
#ifndef VERSION_HPP
|
#ifndef VERSION_HPP
|
||||||
#define VERSION_HPP
|
#define VERSION_HPP
|
||||||
|
|
||||||
#define VERSION "tippecanoe v1.23.0\n"
|
#define VERSION "tippecanoe v1.24.0\n"
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user