mirror of
https://github.com/mapbox/tippecanoe.git
synced 2025-02-23 18:40:17 +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
|
||||
- os: linux
|
||||
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:
|
||||
apt:
|
||||
sources: ['ubuntu-toolchain-r-test' ]
|
||||
@ -71,7 +71,10 @@ install:
|
||||
|
||||
script:
|
||||
- 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
|
||||
/usr/bin/llvm-cov-3.5 -lp *.o;
|
||||
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
|
||||
|
||||
* 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.
|
||||
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
|
||||
|
||||
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
|
||||
$(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
|
||||
|
||||
geojson2nd: geojson2nd.o jsonpull/jsonpull.o
|
||||
@ -81,7 +81,7 @@ indent:
|
||||
TESTS = $(wildcard tests/*/out/*.json)
|
||||
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
|
||||
|
||||
# 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))
|
||||
|
||||
# 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
|
||||
%.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
|
||||
@ -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 -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
|
||||
# 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 `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.
|
||||
* `-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
|
||||
|
||||
@ -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.
|
||||
* `-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
|
||||
|
||||
|
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<long long> coords;
|
||||
std::vector<int> lengths;
|
||||
int type;
|
||||
int type = -1;
|
||||
|
||||
while (pbf.next()) {
|
||||
switch (pbf.tag()) {
|
||||
|
@ -165,6 +165,11 @@ int serialize_geojson_feature(struct serialization_state *sst, json_object *geom
|
||||
metatype[m] = type;
|
||||
metaval[m] = val;
|
||||
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);
|
||||
}
|
||||
|
||||
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) {
|
||||
// Expunge references to this as an array element
|
||||
// or a hash key or value.
|
||||
@ -761,6 +778,7 @@ void json_disconnect(json_object *o) {
|
||||
o->parser->root = NULL;
|
||||
}
|
||||
|
||||
json_disconnect_parser(o);
|
||||
o->parent = NULL;
|
||||
}
|
||||
|
||||
|
37
main.cpp
37
main.cpp
@ -56,6 +56,7 @@
|
||||
#include "options.hpp"
|
||||
#include "mvt.hpp"
|
||||
#include "dirtiles.hpp"
|
||||
#include "evaluator.hpp"
|
||||
|
||||
static int low_detail = 12;
|
||||
static int full_detail = -1;
|
||||
@ -349,7 +350,7 @@ void *run_sort(void *v) {
|
||||
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];
|
||||
segs[0] = 0;
|
||||
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].layermap = &(*layermaps)[i];
|
||||
sst[i].exclude = exclude;
|
||||
sst[i].filter = filter;
|
||||
sst[i].include = include;
|
||||
sst[i].exclude_all = exclude_all;
|
||||
sst[i].basezoom = basezoom;
|
||||
@ -445,6 +447,7 @@ struct read_parallel_arg {
|
||||
std::set<std::string> *exclude;
|
||||
std::set<std::string> *include;
|
||||
int exclude_all;
|
||||
json_object *filter;
|
||||
char *fname;
|
||||
int maxzoom;
|
||||
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
|
||||
|
||||
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);
|
||||
if (munmap(map, rpa->len) != 0) {
|
||||
@ -500,7 +503,7 @@ void *run_read_parallel(void *v) {
|
||||
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,
|
||||
// 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.
|
||||
@ -526,6 +529,7 @@ void start_parsing(int fd, FILE *fp, long long offset, long long len, volatile i
|
||||
rpa->exclude = exclude;
|
||||
rpa->include = include;
|
||||
rpa->exclude_all = exclude_all;
|
||||
rpa->filter = filter;
|
||||
rpa->fname = fname;
|
||||
rpa->basezoom = basezoom;
|
||||
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;
|
||||
|
||||
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].include = include;
|
||||
sst[i].exclude_all = exclude_all;
|
||||
sst[i].filter = filter;
|
||||
sst[i].basezoom = basezoom;
|
||||
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) {
|
||||
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;
|
||||
checkdisk(readers, CPUS);
|
||||
|
||||
@ -1375,7 +1380,7 @@ int read_input(std::vector<source> &sources, char *fname, int maxzoom, int minzo
|
||||
}
|
||||
|
||||
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;
|
||||
overall_offset += ahead;
|
||||
@ -1412,7 +1417,7 @@ int read_input(std::vector<source> &sources, char *fname, int maxzoom, int minzo
|
||||
fflush(readfp);
|
||||
|
||||
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 (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.include = include;
|
||||
sst.exclude_all = exclude_all;
|
||||
sst.filter = filter;
|
||||
sst.basezoom = basezoom;
|
||||
sst.attribute_types = attribute_types;
|
||||
|
||||
@ -2143,6 +2149,7 @@ int main(int argc, char **argv) {
|
||||
int exclude_all = 0;
|
||||
int read_parallel = 0;
|
||||
int files_open_at_start;
|
||||
json_object *filter = NULL;
|
||||
|
||||
for (i = 0; i < 256; i++) {
|
||||
prevent[i] = 0;
|
||||
@ -2186,6 +2193,8 @@ int main(int argc, char **argv) {
|
||||
{"include", required_argument, 0, 'y'},
|
||||
{"exclude-all", no_argument, 0, 'X'},
|
||||
{"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},
|
||||
{"drop-rate", required_argument, 0, 'r'},
|
||||
@ -2415,6 +2424,14 @@ int main(int argc, char **argv) {
|
||||
exclude_all = 1;
|
||||
break;
|
||||
|
||||
case 'J':
|
||||
filter = read_filter(optarg);
|
||||
break;
|
||||
|
||||
case 'j':
|
||||
filter = parse_filter(optarg);
|
||||
break;
|
||||
|
||||
case 'r':
|
||||
if (strcmp(optarg, "g") == 0) {
|
||||
droprate = -2;
|
||||
@ -2663,7 +2680,7 @@ int main(int argc, char **argv) {
|
||||
|
||||
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) {
|
||||
mbtiles_close(outdb, argv[0]);
|
||||
@ -2680,6 +2697,10 @@ int main(int argc, char **argv) {
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
if (filter != NULL) {
|
||||
json_free(filter);
|
||||
}
|
||||
|
||||
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\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.
|
||||
.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
|
||||
.SS Dropping a fixed fraction of features by zoom level
|
||||
.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.
|
||||
.IP \(bu 2
|
||||
\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
|
||||
.SS Setting or disabling tile size limits
|
||||
.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) {
|
||||
tv.type = mvt_bool;
|
||||
tv.numeric_value.bool_value = (s[0] == 't');
|
||||
} else if (type == mvt_null) {
|
||||
tv.type = mvt_null;
|
||||
} else {
|
||||
tv.type = mvt_string;
|
||||
tv.string_value = s;
|
||||
|
48
serial.cpp
48
serial.cpp
@ -18,6 +18,7 @@
|
||||
#include "main.hpp"
|
||||
#include "pool.hpp"
|
||||
#include "projection.hpp"
|
||||
#include "evaluator.hpp"
|
||||
#include "milo/dtoa_milo.h"
|
||||
|
||||
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++) {
|
||||
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.m--;
|
||||
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.m--;
|
||||
continue;
|
||||
}
|
||||
|
||||
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.m--;
|
||||
}
|
||||
|
@ -7,6 +7,7 @@
|
||||
#include <sys/stat.h>
|
||||
#include "geometry.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);
|
||||
|
||||
@ -125,6 +126,7 @@ struct serialization_state {
|
||||
std::set<std::string> *exclude;
|
||||
std::set<std::string> *include;
|
||||
int exclude_all;
|
||||
json_object *filter;
|
||||
};
|
||||
|
||||
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 "geometry.hpp"
|
||||
#include "dirtiles.hpp"
|
||||
#include "evaluator.hpp"
|
||||
#include <fstream>
|
||||
#include <sstream>
|
||||
#include <algorithm>
|
||||
@ -46,7 +47,7 @@ struct stats {
|
||||
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;
|
||||
int features_added = 0;
|
||||
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++) {
|
||||
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;
|
||||
int matched = 0;
|
||||
|
||||
@ -564,6 +602,7 @@ struct arg {
|
||||
std::set<std::string> *keep_layers;
|
||||
std::set<std::string> *remove_layers;
|
||||
int ifmatched;
|
||||
json_object *filter;
|
||||
};
|
||||
|
||||
void *join_worker(void *v) {
|
||||
@ -573,21 +612,22 @@ void *join_worker(void *v) {
|
||||
mvt_tile tile;
|
||||
|
||||
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();
|
||||
|
||||
bool anything = false;
|
||||
mvt_tile outtile;
|
||||
for (size_t i = 0; i < tile.layers.size(); i++) {
|
||||
if (tile.layers[i].features.size() > 0) {
|
||||
outtile.layers.push_back(tile.layers[i]);
|
||||
anything = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (anything) {
|
||||
std::string pbf = tile.encode();
|
||||
std::string pbf = outtile.encode();
|
||||
std::string compressed;
|
||||
|
||||
if (!pC) {
|
||||
@ -607,7 +647,7 @@ void *join_worker(void *v) {
|
||||
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];
|
||||
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].remove_layers = &remove_layers;
|
||||
args[i].ifmatched = ifmatched;
|
||||
args[i].filter = filter;
|
||||
}
|
||||
|
||||
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;
|
||||
for (size_t i = 0; i < CPUS; i++) {
|
||||
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 (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();
|
||||
}
|
||||
}
|
||||
@ -760,7 +801,7 @@ void decode(struct reader *readers, char *map, std::map<std::string, layermap_en
|
||||
st->minlat = min(minlat, st->minlat);
|
||||
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);
|
||||
|
||||
struct reader *next;
|
||||
@ -1004,6 +1045,7 @@ int main(int argc, char **argv) {
|
||||
char *csv = NULL;
|
||||
int force = 0;
|
||||
int ifmatched = 0;
|
||||
json_object *filter = NULL;
|
||||
|
||||
CPUS = sysconf(_SC_NPROCESSORS_ONLN);
|
||||
|
||||
@ -1040,6 +1082,8 @@ int main(int argc, char **argv) {
|
||||
{"quiet", no_argument, 0, 'q'},
|
||||
{"maximum-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-compression", no_argument, &pC, 1},
|
||||
@ -1104,6 +1148,14 @@ int main(int argc, char **argv) {
|
||||
minzoom = atoi(optarg);
|
||||
break;
|
||||
|
||||
case 'J':
|
||||
filter = read_filter(optarg);
|
||||
break;
|
||||
|
||||
case 'j':
|
||||
filter = parse_filter(optarg);
|
||||
break;
|
||||
|
||||
case 'p':
|
||||
if (strcmp(optarg, "k") == 0) {
|
||||
pk = true;
|
||||
@ -1201,7 +1253,7 @@ int main(int argc, char **argv) {
|
||||
*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) {
|
||||
attribution = set_attribution;
|
||||
@ -1219,5 +1271,9 @@ int main(int argc, char **argv) {
|
||||
mbtiles_close(outdb, argv[0]);
|
||||
}
|
||||
|
||||
if (filter != NULL) {
|
||||
json_free(filter);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -1,6 +1,6 @@
|
||||
#ifndef VERSION_HPP
|
||||
#define VERSION_HPP
|
||||
|
||||
#define VERSION "tippecanoe v1.23.0\n"
|
||||
#define VERSION "tippecanoe v1.24.0\n"
|
||||
|
||||
#endif
|
||||
|
Loading…
x
Reference in New Issue
Block a user