Compare commits

..

110 Commits

Author SHA1 Message Date
433fc800dd Experiment: exclude geometries that will wrap around when rendered 2017-07-26 17:35:50 -07:00
81e3f09024 Merge pull request #440 from mapbox/no-geoms
Close mbtiles properly when exiting because there are no features
2017-07-18 14:21:11 -07:00
6ac9ca3709 Bump version number 2017-07-18 10:50:25 -07:00
18f9a8dbb7 Close mbtiles properly when exiting because there are no features 2017-07-18 09:54:59 -07:00
24a182772f Merge pull request #433 from mapbox/getopt
Add long options to tippecanoe-decode and tile-join. Add --quiet to to tile-join.
2017-07-07 14:44:28 -07:00
c164a3e69b Add long options to tippecanoe-decode and tile-join. Add --quiet to tile-join. 2017-07-07 12:51:49 -07:00
412be8e6fc Merge pull request #431 from mapbox/protozero-1.5.2
Upgrade protozero to version 1.5.2
2017-06-30 15:37:35 -07:00
3ba45c7277 Upgrade protozero to version 1.5.2 2017-06-30 11:20:26 -07:00
bd845ac57d Merge pull request #429 from mapbox/bom2
Ignore UTF-8 byte order mark if present
2017-06-29 15:25:31 -07:00
dd0a135b01 Ignore UTF-8 byte order mark if present 2017-06-29 14:42:42 -07:00
240ccbd219 Merge pull request #426 from mapbox/extend-zooms
Add an option to increase maxzoom if features are still being dropped
2017-05-31 14:07:57 -07:00
dba24959ba Avoid potential infinite loop from choosing the same min density again 2017-05-31 11:02:02 -07:00
cf3a0800b8 Add an option to increase maxzoom if features are still being dropped 2017-05-31 10:47:34 -07:00
b80a1d7621 Merge pull request #425 from mapbox/better-maxzoom-guessing
Better maxzoom guessing by considering resolution within features
2017-05-30 17:22:40 -07:00
c7d146ea48 Don't do work for guessing maxzoom unless needed. Add a better test. 2017-05-30 16:58:56 -07:00
8776f17980 Bump version number, give better warning message 2017-05-30 16:02:08 -07:00
977effc96d Merge pull request #424 from joykuotw/master
Add tile-join directory support
2017-05-30 15:43:56 -07:00
ab8ecb7e00 Add missing #include 2017-05-30 13:41:24 -07:00
331707f88a Better maxzoom guessing by considering resolution within features 2017-05-30 13:28:25 -07:00
a5db055c50 Change fixed-size buffer to variable-length string 2017-05-30 20:11:13 +01:00
e8e949fac9 Fix memory leak 2017-05-30 18:40:22 +01:00
52ceaaddb6 Add tile-join source to directories of tiles 2017-05-30 14:53:55 +01:00
ef8af63ab4 Add tile-join options to no tile compression and output to directory 2017-05-25 11:25:57 +01:00
9c3fb0f669 Change the function name rawtiles to dirtiles 2017-05-24 16:32:44 +01:00
5db7b504e8 Merge pull request #421 from mapbox/long-attributes
Fix crash with very long (>128K) attribute values
2017-05-18 15:11:42 -07:00
eb8ab1dd58 Fix crash with very long (>128K) attribute values 2017-05-18 14:48:18 -07:00
d0980e29d0 Merge pull request #419 from Burke9077/master
Add basic support for Docker
2017-05-18 11:47:21 -07:00
1bb31882fa Added docker information to the README 2017-05-18 09:48:37 -04:00
4016876670 Added dockerfile 2017-05-17 17:02:26 -04:00
27dadc8ade Merge pull request #418 from mapbox/no-compression-test
There should be a test for the no-compression mbtiles output format
2017-05-12 17:09:41 -07:00
2f7b5d8afd There should be a test for the no-compression mbtiles output format 2017-05-12 16:21:25 -07:00
733092abf6 Merge pull request #417 from mapbox/only-warn-once
Only warn once about invalid polygon encoding in tippecanoe-decode
2017-05-12 11:24:02 -07:00
9632c14551 Only warn once about invalid polygon encoding in tippecanoe-decode 2017-05-12 11:15:27 -07:00
7fe3de9cfa Merge pull request #416 from mapbox/tile-join-compression
Tile-join had not been compressing its tiles.
2017-05-11 12:51:14 -07:00
fb6551c59e Calculate the tileset bounding box in tile-join from the tile boundaries 2017-05-11 12:36:35 -07:00
30d54ff50d Tile-join had not been compressing its tiles. 2017-05-11 12:08:47 -07:00
685e1a4360 Merge pull request #412 from mapbox/polygon-closure
Enforce polygon winding and closure rules in tippecanoe-decode
2017-05-05 11:47:54 -07:00
922bef72c8 Fix array bounds error found by -fsanitize=address 2017-05-05 11:22:40 -07:00
9eb3a7f7ec Enforce polygon winding and closure rules in tippecanoe-decode 2017-05-05 10:56:50 -07:00
eab593fea5 Merge pull request #411 from mapbox/tile-join-name
Add tile-join options to set tileset name, description, attribution
2017-05-04 15:27:40 -07:00
f87a9d1660 Add tile-join options to set tileset name, description, attribution 2017-05-04 15:08:31 -07:00
92deeb58f9 Merge pull request #410 from mapbox/tile-join-name
Preserve the tileset names from the source mbtiles in tile-join
2017-05-04 14:17:52 -07:00
6ec453229c Preserve the tileset names from the source mbtiles in tile-join 2017-05-04 13:31:30 -07:00
ad0eba7ccd Merge pull request #405 from mapbox/too-much-splitting
Fix RFC 8142 support: Don't try to split *all* memory mapped files
2017-05-01 15:40:04 -07:00
acdb5b72db Fix RFC 8142 support: Don't try to split *all* memory mapped files 2017-05-01 15:27:55 -07:00
1669d96510 Merge pull request #404 from mapbox/rfc8142
Support RFC 8142 GeoJSON text sequences
2017-04-28 16:56:40 -07:00
63e0c89c4b Support RFC 8142 GeoJSON text sequences 2017-04-28 16:39:16 -07:00
dc01d33402 Merge pull request #402 from mapbox/gitignore
Put everything normally generated during compilation in .gitignore
2017-04-24 08:29:56 -07:00
0ecc6fa1c5 Put everything normally generated during compilation in .gitignore 2017-04-23 15:31:57 -07:00
6173180cee Merge pull request #401 from mapbox/usage
Organize usage output the same way as in the README
2017-04-21 14:49:26 -07:00
569fd97475 Also generate the string of option letters instead of writing it again 2017-04-21 13:56:40 -07:00
6c7a52147b Organize usage output the same way as in the README 2017-04-21 13:48:39 -07:00
d2a8761483 Merge pull request #399 from mapbox/projection-warning
Try to be clearer in the warning message about projections
2017-04-18 14:02:07 -07:00
d19680e392 Try to be clearer in the warning message about projections 2017-04-18 13:24:16 -07:00
8b5168cb2b Merge pull request #398 from mapbox/attribute-types
Add -T option to coerce the types of feature attributes
2017-04-17 15:46:13 -07:00
178b5d0054 Add -T option to coerce the types of feature attributes 2017-04-17 15:20:03 -07:00
65ee2cf0a5 Merge pull request #397 from mapbox/guess-maxzoom
Add -zg option to automatically choose an appropriate maxzoom
2017-04-17 08:51:48 -07:00
242a657fc1 Fix array bounds error caught by -fsanitize=address 2017-04-13 14:23:43 -07:00
510247c2fb Add -zg option to automatically choose an appropriate maxzoom 2017-04-13 14:17:15 -07:00
e75bb4a16a Merge pull request #395 from mapbox/close-featurecollections
Clean up JSON parsing at the end of each FeatureCollection
2017-04-12 13:19:19 -07:00
198a5a06d4 Clean up JSON parsing at the end of each FeatureCollection 2017-04-12 12:45:35 -07:00
a0831cd71e Merge pull request #391 from mapbox/reformat-readme
Clean up documentation
2017-04-12 12:36:58 -07:00
f4677d5de1 Reorganize input and layer options 2017-04-12 10:16:43 -07:00
a394c9e93d Merge branch 'master' into reformat-readme 2017-04-11 17:31:22 -07:00
79b73e6317 Call out the most useful options at the start 2017-04-11 17:24:15 -07:00
ab300c2080 Forgot to format a few more options 2017-04-11 17:06:17 -07:00
5ec6ce1743 Continue to reorder and clarify options 2017-04-11 17:03:32 -07:00
63ea7bdc4e Try to reorder options into some more readable organization 2017-04-11 16:51:56 -07:00
bb365bde44 Reformatting README 2017-04-11 16:32:32 -07:00
7f918bd79b Merge pull request #390 from mapbox/layer-filter
Add tile-join options to include or exclude layers by name
2017-04-10 16:00:27 -07:00
a7be83381a Add tile-join options to include or exclude layers by name 2017-04-10 15:22:30 -07:00
da92b93b62 Merge pull request #389 from mapbox/joykuotw-master
Add --output-to-directory and --no-tile-compression options
2017-04-07 14:19:10 -07:00
f558b78380 Include tileset metadata when writing either to directory or mbtiles 2017-04-07 13:25:05 -07:00
1c1ae6a8be Update documentation and reduce use of global variables 2017-04-07 12:36:34 -07:00
b66ab10252 Add algorithms library 2017-04-07 17:03:30 +01:00
682a272f91 Add condition to prevent options -o and -e being used together 2017-04-07 16:24:29 +01:00
a320248857 Do make indent, add flag --output-to-directory or -e to write pbf files to a directory, also add flag --no-tile-compression or -pC to get raw protobuf 2017-04-07 13:33:01 +01:00
9fb1208b79 Fix indentation for rawtiles.cpp 2017-04-05 16:05:50 +01:00
29fa3d8541 Update the readme to add the flag 2017-04-05 16:02:57 +01:00
f03b89656c Seperated out to method and added test for --raw-tiles 2017-04-05 15:59:37 +01:00
aee12ac1fe Add flag --raw-tiles or -pC to get raw protobuf 2017-04-05 00:34:54 +01:00
8777bdf5d3 Merge pull request #382 from mapbox/reconcile
Add --description option
2017-03-22 15:42:20 -07:00
1362ac448f Add --description option to set mbtiles description 2017-03-21 11:07:15 -07:00
fa56adc530 Clean up utility functions that are also used in other projects 2017-03-16 15:06:58 -07:00
8c6f6250b1 Merge pull request #381 from mapbox/detect-wraparound
Add --detect-longitude-wraparound option
2017-03-15 16:10:20 -07:00
ea77e3db6f Add --detect-longitude-wraparound option 2017-03-15 13:37:50 -07:00
bbf9716361 Merge pull request #380 from mapbox/short-circuit-maxzoom
Stop processing zooms when a feature reaches its explicit maxzoom tag
2017-03-15 09:51:02 -07:00
9c53268a2b Stop processing zooms when a feature reaches its explicit maxzoom tag 2017-03-14 16:14:54 -07:00
860189a577 Merge pull request #378 from mapbox/no-polygon-splitting
Remove polygon splitting, since polygon cleaning is now fast enough
2017-03-02 15:03:52 -08:00
c46f4cfc75 Remove polygon splitting, since polygon cleaning is now fast enough 2017-03-02 12:08:08 -08:00
cef4d2cd47 Merge pull request #376 from mapbox/decode-layer
Add an option to decode only specified layers
2017-03-02 10:26:21 -08:00
3a1f074c96 Add test and documentation for tippecanoe-decode -l 2017-03-01 16:01:57 -08:00
835fafe30a Add an option to decode only specified layers 2017-02-27 10:10:28 -08:00
30a987d9ba Merge pull request #374 from mapbox/multilayer-crash
Clean up layer name handling to fix layer merging crash
2017-02-20 17:24:24 -08:00
218a2fc75e Clean up layer name handling to fix layer merging crash 2017-02-20 16:19:34 -08:00
638cfef2b6 Merge pull request #368 from mapbox/division-by-0
Fix division by 0 by using more general and robust polygon-checking code
2017-02-20 14:09:42 -08:00
5bdbb8a911 Bump version number 2017-02-20 11:47:01 -08:00
55e7e20a73 Add a check for environmental variable TIPPECANOE_MAX_THREADS 2017-02-17 16:47:21 -08:00
9c1f2b2123 Guard against potentially rounding to 0 when choosing sorting unit 2017-02-17 14:14:55 -08:00
1b68dcdc22 Fix division by 0 by using more general and robust polygon-checking code 2017-02-17 13:25:56 -08:00
1cc65d61ba Merge pull request #363 from mapbox/polygon-placeholder
Fix area of placeholders for degenerate multipolygons
2017-02-08 11:52:27 -08:00
62e1018c87 Fix area of placeholders for degenerate multipolygons 2017-02-06 14:14:34 -08:00
4517bd6e90 Test with faulty replacement of polygons with big squares 2017-02-06 14:10:50 -08:00
a1fe858151 Merge pull request #358 from mapbox/wagyu-030
Upgrade to Wagyu 0.3.0; downgrade C++ requirement to C++ 11
2017-01-26 15:26:20 -08:00
31f254ac99 Upgrade to Wagyu 0.3.0; downgrade C++ requirement to C++ 11 2017-01-26 13:28:17 -08:00
28b8f1c326 Merge pull request #355 from mapbox/decode-zoomlevels
Add minzoom and maxzoom options to tippecanoe-decode
2017-01-25 10:47:06 -08:00
c74a9a8325 Add minzoom and maxzoom options to tippecanoe-decode 2017-01-24 14:15:40 -08:00
c67b5f33bd Merge pull request #352 from mapbox/warn-id
Only warn once about non-numeric/non-integer/negative feature IDs
2017-01-19 10:04:11 -08:00
5a8f9f11c0 Only warn once about non-numeric/non-integer/negative feature IDs 2017-01-18 14:26:17 -08:00
b3847c1da1 Merge pull request #350 from mapbox/c++-readme
Add instructions for upgrading g++ on Linux
2017-01-17 15:06:32 -08:00
117 changed files with 36814 additions and 2300 deletions

4
.dockerignore Normal file
View File

@ -0,0 +1,4 @@
# Don't copy Dockerfile or git items
.gitignore
.git
Dockerfile

14
.gitignore vendored
View File

@ -4,6 +4,9 @@
*.o
*.obj
# Autogenerated dependencies
*.d
# Precompiled Headers
*.gch
*.pch
@ -27,3 +30,14 @@
*.exe
*.out
*.app
tippecanoe
tile-join
tippecanoe-decode
tippecanoe-enumerate
unit
# Vim
*.swp
# Mac
.DS_Store

View File

@ -1,3 +1,128 @@
## 1.20.1
* Close mbtiles file properly when there are no valid features in the input
## 1.20.0
* Add long options to tippecanoe-decode and tile-join. Add --quiet to tile-join.
## 1.19.3
* Upgrade protozero to version 1.5.2
## 1.19.2
* Ignore UTF-8 byte order mark if present
## 1.19.1
* Add an option to increase maxzoom if features are still being dropped
## 1.19.0
* Tile-join can merge and create directories, not only mbtiles
* Maxzoom guessing (-zg) takes into account resolution within each feature
## 1.18.2
* Fix crash with very long (>128K) attribute values
## 1.18.1
* Only warn once about invalid polygons in tippecanoe-decode
## 1.18.0
* Fix compression of tiles in tile-join
* Calculate the tileset bounding box in tile-join from the tile boundaries
## 1.17.7
* Enforce polygon winding and closure rules in tippecanoe-decode
## 1.17.6
* Add tile-join options to set name, attribution, description
## 1.17.5
* Preserve the tileset names from the source mbtiles in tile-join
## 1.17.4
* Fix RFC 8142 support: Don't try to split *all* memory mapped files
## 1.17.3
* Support RFC 8142 GeoJSON text sequences
## 1.17.2
* Organize usage output the same way as in the README
## 1.17.1
* Add -T option to coerce the types of feature attributes
## 1.17.0
* Add -zg option to guess an appropriate maxzoom
## 1.16.17
* Clean up JSON parsing at the end of each FeatureCollection
to avoid running out of memory
## 1.16.16
* Add tile-join options to include or exclude specific layers
## 1.16.15
* Add --output-to-directory and --no-tile-compression options
## 1.16.14
* Add --description option for mbtiles metadata
* Clean up some utility functions
## 1.16.13
* Add --detect-longitude-wraparound option
## 1.16.12
* Stop processing higher zooms when a feature reaches its explicit maxzoom tag
## 1.16.11
* Remove polygon splitting, since polygon cleaning is now fast enough
## 1.16.10
* Add a tippecanoe-decode option to specify layer names
## 1.16.9
* Clean up layer name handling to fix layer merging crash
## 1.16.8
* Fix some code that could sometimes try to divide by zero
* Add check for $TIPPECANOE_MAX_THREADS environmental variable
## 1.16.7
* Fix area of placeholders for degenerate multipolygons
## 1.16.6
* Upgrade Wagyu to 0.3.0; downgrade C++ requirement to C++ 11
## 1.16.5
* Add -z and -Z options to tippecanoe-decode
## 1.16.4
* Use Wagyu's quick_lr_clip() instead of a separate implementation

24
Dockerfile Normal file
View File

@ -0,0 +1,24 @@
# Start from ubuntu
FROM ubuntu:17.04
# Update repos and install dependencies
RUN apt-get update \
&& apt-get -y upgrade \
&& apt-get -y install build-essential libsqlite3-dev zlib1g-dev
# Create a directory and copy in all files
RUN mkdir -p /tmp/tippecanoe-src
WORKDIR /tmp/tippecanoe-src
COPY . /tmp/tippecanoe-src
# Build tippecanoe
RUN make \
&& make install
# Remove the temp directory and unneeded packages
WORKDIR /
RUN rm -rf /tmp/tippecanoe-src \
&& apt-get -y remove --purge build-essential && apt-get -y autoremove
# Run the default command to show usage
CMD tippecanoe --help

View File

@ -7,7 +7,7 @@ SHELL = /bin/bash
CC := $(CC)
CXX := $(CXX)
CFLAGS := $(CFLAGS)
CXXFLAGS := $(CXXFLAGS) -std=c++14
CXXFLAGS := $(CXXFLAGS) -std=c++11
LDFLAGS := $(LDFLAGS)
WARNING_FLAGS := -Wall -Wshadow -Wsign-compare
RELEASE_FLAGS := -O3 -DNDEBUG
@ -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
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
$(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
$(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
tile-join: tile-join.o projection.o pool.o mbtiles.o mvt.o memfile.o dirtiles.o jsonpull/jsonpull.o
$(CXX) $(PG) $(LIBS) $(FINAL_FLAGS) $(CXXFLAGS) -o $@ $^ $(LDFLAGS) -lm -lz -lsqlite3 -lpthread
unit: unit.o text.o
@ -78,7 +78,7 @@ indent:
TESTS = $(wildcard tests/*/out/*.json)
SPACE = $(NULL) $(NULL)
test: tippecanoe tippecanoe-decode $(addsuffix .check,$(TESTS)) parallel-test pbf-test join-test enumerate-test unit
test: tippecanoe tippecanoe-decode $(addsuffix .check,$(TESTS)) raw-tiles-test parallel-test pbf-test join-test enumerate-test decode-test unit
./unit
# Work around Makefile and filename punctuation limits: _ for space, @ for :, % for /
@ -99,23 +99,38 @@ parallel-test:
./tippecanoe -z5 -f -pi -l test -n test -P -o tests/parallel/parallel-file.mbtiles tests/parallel/in[123].json tests/parallel/empty[12].json
cat tests/parallel/in[123].json | ./tippecanoe -z5 -f -pi -l test -n test -o tests/parallel/linear-pipe.mbtiles
cat tests/parallel/in[123].json | ./tippecanoe -z5 -f -pi -l test -n test -P -o tests/parallel/parallel-pipe.mbtiles
cat tests/parallel/in[123].json | sed 's/^/@/' | tr '@' '\036' | ./tippecanoe -z5 -f -pi -l test -n test -o tests/parallel/implicit-pipe.mbtiles
./tippecanoe -z5 -f -pi -l test -n test -P -o tests/parallel/parallel-pipes.mbtiles <(cat tests/parallel/in1.json) <(cat tests/parallel/empty1.json) <(cat tests/parallel/empty2.json) <(cat tests/parallel/in2.json) /dev/null <(cat tests/parallel/in3.json)
./tippecanoe-decode tests/parallel/linear-file.mbtiles > tests/parallel/linear-file.json
./tippecanoe-decode tests/parallel/parallel-file.mbtiles > tests/parallel/parallel-file.json
./tippecanoe-decode tests/parallel/linear-pipe.mbtiles > tests/parallel/linear-pipe.json
./tippecanoe-decode tests/parallel/parallel-pipe.mbtiles > tests/parallel/parallel-pipe.json
./tippecanoe-decode tests/parallel/implicit-pipe.mbtiles > tests/parallel/implicit-pipe.json
./tippecanoe-decode tests/parallel/parallel-pipes.mbtiles > tests/parallel/parallel-pipes.json
cmp tests/parallel/linear-file.json tests/parallel/parallel-file.json
cmp tests/parallel/linear-file.json tests/parallel/linear-pipe.json
cmp tests/parallel/linear-file.json tests/parallel/parallel-pipe.json
cmp tests/parallel/linear-file.json tests/parallel/implicit-pipe.json
cmp tests/parallel/linear-file.json tests/parallel/parallel-pipes.json
rm tests/parallel/*.mbtiles tests/parallel/*.json
raw-tiles-test:
./tippecanoe -e tests/raw-tiles/raw-tiles tests/raw-tiles/hackspots.geojson -pC
diff -x '*.DS_Store' -rq tests/raw-tiles/raw-tiles tests/raw-tiles/compare
rm -rf tests/raw-tiles/raw-tiles
decode-test:
mkdir -p tests/muni/decode
./tippecanoe -z11 -Z11 -f -o tests/muni/decode/multi.mbtiles tests/muni/*.json
./tippecanoe-decode -l subway tests/muni/decode/multi.mbtiles > tests/muni/decode/multi.mbtiles.json.check
cmp tests/muni/decode/multi.mbtiles.json.check tests/muni/decode/multi.mbtiles.json
rm -f tests/muni/decode/multi.mbtiles.json.check tests/muni/decode/multi.mbtiles
pbf-test:
./tippecanoe-decode tests/pbf/11-328-791.vector.pbf 11 328 791 > tests/pbf/11-328-791.vector.pbf.out
cmp tests/pbf/11-328-791.json tests/pbf/11-328-791.vector.pbf.out
rm tests/pbf/11-328-791.vector.pbf.out
./tippecanoe-decode -t EPSG:3857 tests/pbf/11-328-791.vector.pbf 11 328 791 > tests/pbf/11-328-791.3857.vector.pbf.out
./tippecanoe-decode -s EPSG:3857 tests/pbf/11-328-791.vector.pbf 11 328 791 > tests/pbf/11-328-791.3857.vector.pbf.out
cmp tests/pbf/11-328-791.3857.json tests/pbf/11-328-791.3857.vector.pbf.out
rm tests/pbf/11-328-791.3857.vector.pbf.out
@ -130,11 +145,11 @@ join-test:
./tippecanoe -f -z12 -o tests/join-population/tabblock_06001420.mbtiles tests/join-population/tabblock_06001420.json
./tippecanoe -f -Z5 -z10 -o tests/join-population/macarthur.mbtiles -l macarthur tests/join-population/macarthur.json
./tippecanoe -f -d10 -D10 -Z9 -z11 -o tests/join-population/macarthur2.mbtiles -l macarthur tests/join-population/macarthur2.json
./tile-join -f -o tests/join-population/joined.mbtiles -x GEOID10 -c tests/join-population/population.csv tests/join-population/tabblock_06001420.mbtiles
./tile-join --quiet --force -o tests/join-population/joined.mbtiles -x GEOID10 -c tests/join-population/population.csv tests/join-population/tabblock_06001420.mbtiles
./tile-join -f -i -o tests/join-population/joined-i.mbtiles -x GEOID10 -c tests/join-population/population.csv tests/join-population/tabblock_06001420.mbtiles
./tile-join -f -o tests/join-population/merged.mbtiles tests/join-population/tabblock_06001420.mbtiles tests/join-population/macarthur.mbtiles tests/join-population/macarthur2.mbtiles
./tile-join -f -c tests/join-population/windows.csv -o tests/join-population/windows.mbtiles tests/join-population/macarthur.mbtiles
./tippecanoe-decode tests/join-population/joined.mbtiles > tests/join-population/joined.mbtiles.json.check
./tippecanoe-decode --maximum-zoom=11 --minimum-zoom=4 tests/join-population/joined.mbtiles > tests/join-population/joined.mbtiles.json.check
./tippecanoe-decode tests/join-population/joined-i.mbtiles > tests/join-population/joined-i.mbtiles.json.check
./tippecanoe-decode tests/join-population/merged.mbtiles > tests/join-population/merged.mbtiles.json.check
./tippecanoe-decode tests/join-population/windows.mbtiles > tests/join-population/windows.mbtiles.json.check
@ -142,7 +157,37 @@ join-test:
cmp tests/join-population/joined-i.mbtiles.json.check tests/join-population/joined-i.mbtiles.json
cmp tests/join-population/merged.mbtiles.json.check tests/join-population/merged.mbtiles.json
cmp tests/join-population/windows.mbtiles.json.check tests/join-population/windows.mbtiles.json
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/macarthur2.mbtiles tests/join-population/windows.mbtiles tests/join-population/windows.mbtiles.json.check
./tile-join -f -l macarthur -n "macarthur name" -N "macarthur description" -A "macarthur attribution" -o tests/join-population/just-macarthur.mbtiles tests/join-population/merged.mbtiles
./tile-join -f -L macarthur -o tests/join-population/no-macarthur.mbtiles tests/join-population/merged.mbtiles
./tippecanoe-decode tests/join-population/just-macarthur.mbtiles > tests/join-population/just-macarthur.mbtiles.json.check
./tippecanoe-decode tests/join-population/no-macarthur.mbtiles > tests/join-population/no-macarthur.mbtiles.json.check
cmp tests/join-population/just-macarthur.mbtiles.json.check tests/join-population/just-macarthur.mbtiles.json
cmp tests/join-population/no-macarthur.mbtiles.json.check tests/join-population/no-macarthur.mbtiles.json
./tile-join --no-tile-compression -e tests/join-population/raw-merged-folder tests/join-population/tabblock_06001420.mbtiles tests/join-population/macarthur.mbtiles tests/join-population/macarthur2.mbtiles
diff -x '*.DS_Store' -rq tests/join-population/raw-merged-folder tests/join-population/raw-merged-folder-compare
./tippecanoe -z12 -e tests/join-population/tabblock_06001420-folder tests/join-population/tabblock_06001420.json
./tippecanoe -Z5 -z10 -e tests/join-population/macarthur-folder -l macarthur tests/join-population/macarthur.json
./tippecanoe -d10 -D10 -Z9 -z11 -e tests/join-population/macarthur2-folder -l macarthur tests/join-population/macarthur2.json
./tile-join -f -o tests/join-population/merged-folder.mbtiles tests/join-population/tabblock_06001420-folder tests/join-population/macarthur-folder tests/join-population/macarthur2-folder
./tippecanoe-decode tests/join-population/merged-folder.mbtiles > tests/join-population/merged-folder.mbtiles.json.check
cmp tests/join-population/merged-folder.mbtiles.json.check tests/join-population/merged-folder.mbtiles.json
./tile-join -n "merged name" -N "merged description" -e tests/join-population/merged-mbtiles-to-folder tests/join-population/tabblock_06001420.mbtiles tests/join-population/macarthur.mbtiles tests/join-population/macarthur2.mbtiles
./tile-join -n "merged name" -N "merged description" -e tests/join-population/merged-folders-to-folder tests/join-population/tabblock_06001420-folder tests/join-population/macarthur-folder tests/join-population/macarthur2-folder
diff -x '*.DS_Store' -rq tests/join-population/merged-mbtiles-to-folder tests/join-population/merged-folders-to-folder
./tile-join -f -c tests/join-population/windows.csv -o tests/join-population/windows-merged.mbtiles tests/join-population/macarthur.mbtiles tests/join-population/macarthur2-folder
./tile-join -c tests/join-population/windows.csv -e tests/join-population/windows-merged-folder tests/join-population/macarthur.mbtiles tests/join-population/macarthur2-folder
./tile-join -f -o tests/join-population/windows-merged2.mbtiles tests/join-population/windows-merged-folder
./tippecanoe-decode tests/join-population/windows-merged.mbtiles > tests/join-population/windows-merged.mbtiles.json.check
./tippecanoe-decode tests/join-population/windows-merged2.mbtiles > tests/join-population/windows-merged2.mbtiles.json.check
cmp tests/join-population/windows-merged.mbtiles.json.check tests/join-population/windows-merged2.mbtiles.json.check
./tile-join -f -o tests/join-population/macarthur-and-macarthur2-merged.mbtiles tests/join-population/macarthur.mbtiles tests/join-population/macarthur2-folder
./tile-join -e tests/join-population/macarthur-and-macarthur2-folder tests/join-population/macarthur.mbtiles tests/join-population/macarthur2-folder
./tile-join -f -o tests/join-population/macarthur-and-macarthur2-merged2.mbtiles tests/join-population/macarthur-and-macarthur2-folder
./tippecanoe-decode tests/join-population/macarthur-and-macarthur2-merged.mbtiles > tests/join-population/macarthur-and-macarthur2-merged.mbtiles.json.check
./tippecanoe-decode tests/join-population/macarthur-and-macarthur2-merged2.mbtiles > tests/join-population/macarthur-and-macarthur2-merged2.mbtiles.json.check
cmp tests/join-population/macarthur-and-macarthur2-merged.mbtiles.json.check tests/join-population/macarthur-and-macarthur2-merged2.mbtiles.json.check
rm tests/join-population/tabblock_06001420.mbtiles tests/join-population/joined.mbtiles tests/join-population/joined-i.mbtiles tests/join-population/joined.mbtiles.json.check tests/join-population/joined-i.mbtiles.json.check tests/join-population/macarthur.mbtiles tests/join-population/merged.mbtiles tests/join-population/merged.mbtiles.json.check tests/join-population/merged-folder.mbtiles tests/join-population/macarthur2.mbtiles tests/join-population/windows.mbtiles tests/join-population/windows-merged.mbtiles tests/join-population/windows-merged2.mbtiles tests/join-population/windows.mbtiles.json.check tests/join-population/just-macarthur.mbtiles tests/join-population/no-macarthur.mbtiles tests/join-population/just-macarthur.mbtiles.json.check tests/join-population/no-macarthur.mbtiles.json.check tests/join-population/merged-folder.mbtiles.json.check tests/join-population/windows-merged.mbtiles.json.check tests/join-population/windows-merged2.mbtiles.json.check tests/join-population/macarthur-and-macarthur2-merged.mbtiles tests/join-population/macarthur-and-macarthur2-merged2.mbtiles tests/join-population/macarthur-and-macarthur2-merged.mbtiles.json.check tests/join-population/macarthur-and-macarthur2-merged2.mbtiles.json.check
rm -rf tests/join-population/raw-merged-folder tests/join-population/tabblock_06001420-folder tests/join-population/macarthur-folder tests/join-population/macarthur2-folder tests/join-population/merged-mbtiles-to-folder tests/join-population/merged-folders-to-folder tests/join-population/windows-merged-folder tests/join-population/macarthur-and-macarthur2-folder
# Use this target to regenerate the standards that the tests are compared against
# after making a change that legitimately changes their output

273
README.md
View File

@ -52,100 +52,196 @@ You can concatenate multiple GeoJSON features or files together,
and it will parse out the features and ignore whatever other objects
it encounters.
Docker Image
------------
A tippecanoe Docker image can be built from source and executed as a task to
automatically install dependencies and allow tippecanoe to run on any system
supported by Docker.
```docker
$ docker build -t tippecanoe:latest .
$ docker run -it --rm \
-v /tiledata:/data \
tippecanoe:latest \
tippecanoe --output=/data/output.mbtiles /data/example.geojson
```
The commands above will build a Docker image from the source and compile the
latest version. The image supports all tippecanoe flags and options.
Options
-------
### Naming
There are a lot of options. A lot of the time you won't want to use any of them
other than `-o` _output_`.mbtiles` to name the output file, and probably `-f` to
delete the file that already exists with that name.
* -l _name_ or --layer=_name_: Layer name (default "file" if source is file.json or output is file.mbtiles). If there are multiple input files
specified, the files are all merged into the single named layer, even if they try to specify individual names with -L.
* -L _name_:_file.json_ or --named-layer=_name_:_file.json_: Specify layer names for individual files. If your shell supports it, you can use a subshell redirect like -L _name_:<(cat dir/*.json) to specify a layer name for the output of streamed input.
* -n _name_ or --name=_name_: Human-readable name for the tileset (default file.json)
* -A _text_ or --attribution=_text_: Attribution (HTML) to be shown with maps that use data from this tileset.
If you aren't sure what the right maxzoom is for your data, `-zg` will guess one for you
based on the density of features.
### File control
If you are mapping point features, you will often want to use `-Bg` to automatically choose
a base zoom level for dot dropping. If that doesn't work out for you, try
`-r1 --drop-fraction-as-needed` to turn off the normal dot dropping and instead
only drop features if the tiles get too big.
* -o _file_.mbtiles or --output=_file_.mbtiles: Name the output file.
* -f or --force: Delete the mbtiles file if it already exists instead of giving an error
* -F or --allow-existing: Proceed (without deleting existing data) if the metadata or tiles table already exists
or if metadata fields can't be set
* -t _directory_ or --temporary-directory=_directory_: Put the temporary files in _directory_.
If you don't specify, it will use `/tmp`.
* -P or --read-parallel: Use multiple threads to read different parts of each input file at once.
If you are mapping points or polygons, you will often want to use `--drop-densest-as-needed`
to drop some of them if necessary to make the low zoom levels work.
If your features have a lot of attributes, use `-y` to keep only the ones you really need.
If your input is formatted as newline-delimited GeoJSON, use `-P` to make input parsing a lot faster.
### Output tileset
* `-o` _file_`.mbtiles` or `--output=`_file_`.mbtiles`: Name the output file.
* `-e` _directory_ or `--output-to-directory`=_directory_: Write tiles to the specified *directory* instead of to an mbtiles file.
* `-f` or `--force`: Delete the mbtiles file if it already exists instead of giving an error
* `-F` or `--allow-existing`: Proceed (without deleting existing data) if the metadata or tiles table already exists
or if metadata fields can't be set. You probably don't want to use this.
### Tileset description and attribution
* `-n` _name_ or `--name=`_name_: Human-readable name for the tileset (default file.json)
* `-A` _text_ or `--attribution=`_text_: Attribution (HTML) to be shown with maps that use data from this tileset.
* `-N` _description_ or `--description=`_description_: Description for the tileset (default file.mbtiles)
### Input files and layer names
* _name_`.json` or _name_`.geojson`: Read the named GeoJSON input file into a layer called _name_.
* `-l` _name_ or `--layer=`_name_: Use the specified layer name instead of deriving a name from the input filename or output tileset. If there are multiple input files
specified, the files are all merged into the single named layer, even if they try to specify individual names with `-L`.
* `-L` _name_`:`_file.json_ or `--named-layer=`_name_`:`_file.json_: Specify layer names for individual files. If your shell supports it, you can use a subshell redirect like `-L` _name_`:<(cat dir/*.json)` to specify a layer name for the output of streamed input.
### Parallel processing of input
* `-P` or `--read-parallel`: Use multiple threads to read different parts of each input file at once.
This will only work if the input is line-delimited JSON with each Feature on its
own line, because it knows nothing of the top-level structure around the Features. Spurious "EOF" error
messages may result otherwise.
Performance will be better if the input is a named file that can be mapped into memory
rather than a stream that can only be read sequentially.
### Zoom levels and resolution
If the input file begins with the [RFC 8142](https://tools.ietf.org/html/rfc8142) record separator,
parallel processing of input will be invoked automatically, splitting at record separators rather
than at all newlines.
* -z _zoom_ or --maximum-zoom=_zoom_: Maxzoom: the highest zoom level for which tiles are generated (default 14)
* -Z _zoom_ or --minimum-zoom=_zoom_: Minzoom: the lowest zoom level for which tiles are generated (default 0)
* -B _zoom_ or --base-zoom=_zoom_: Base zoom, the level at and above which all points are included in the tiles (default maxzoom).
If you use -Bg, it will guess a zoom level that will keep at most 50,000 features in the densest tile.
You can also specify a marker-width with -Bg*width* to allow fewer features in the densest tile to
compensate for the larger marker, or -Bf*number* to allow at most *number* features in the densest tile.
* -d _detail_ or --full-detail=_detail_: Detail at max zoom level (default 12, for tile resolution of 4096)
* -D _detail_ or --low-detail=_detail_: Detail at lower zoom levels (default 12, for tile resolution of 4096)
* -m _detail_ or --minimum-detail=_detail_: Minimum detail that it will try if tiles are too big at regular detail (default 7)
* -b _pixels_ or --buffer=_pixels_: Buffer size where features are duplicated from adjacent tiles. Units are "screen pixels"--1/256th of the tile width or height. (default 5)
* -s _projection_ or --projection=_projection_: Specify the projection of the input data. Currently supported are EPSG:4326 (WGS84, the default) and EPSG:3857 (Web Mercator).
* -M _bytes_ or --maximum-tile-bytes=_bytes_: Use the specified number of _bytes_ as the maximum compressed tile size instead of 500K.
### Projection of input
* `-s` _projection_ or `--projection=`_projection_: Specify the projection of the input data. Currently supported are `EPSG:4326` (WGS84, the default) and `EPSG:3857` (Web Mercator). In general you should use WGS84 for your input files if at all possible.
### Zoom levels
* `-z` _zoom_ or `--maximum-zoom=`_zoom_: Maxzoom: the highest zoom level for which tiles are generated (default 14)
* `-zg` or `--maximum-zoom=g`: Guess what is probably a reasonable maxzoom based on the spacing of features.
* `-Z` _zoom_ or `--minimum-zoom=`_zoom_: Minzoom: the lowest zoom level for which tiles are generated (default 0)
* `-ae` or `--extend-zooms-if-still-dropping`: Increase the maxzoom if features are still being dropped at that zoom level.
The detail and simplification options that ordinarily apply only to the maximum zoom level will apply both to the originally
specified maximum zoom and to any levels added beyond that.
### Tile resolution
* `-d` _detail_ or `--full-detail=`_detail_: Detail at max zoom level (default 12, for tile resolution of 4096)
* `-D` _detail_ or `--low-detail=`_detail_: Detail at lower zoom levels (default 12, for tile resolution of 4096)
* `-m` _detail_ or `--minimum-detail=`_detail_: Minimum detail that it will try if tiles are too big at regular detail (default 7)
All internal math is done in terms of a 32-bit tile coordinate system, so 1/(2^32) of the size of Earth,
or about 1cm, is the smallest distinguishable distance. If _maxzoom_ + _detail_ > 32, no additional
resolution is obtained than by using a smaller _maxzoom_ or _detail_.
### Properties
### Filtering feature attributes
* -x _name_ or --exclude=_name_: Exclude the named properties from all features
* -y _name_ or --include=_name_: Include the named properties in all features, excluding all those not explicitly named
* -X or --exclude-all: Exclude all properties and encode only geometries
* `-x` _name_ or `--exclude=`_name_: Exclude the named properties from all features
* `-y` _name_ or `--include=`_name_: Include the named properties in all features, excluding all those not explicitly named
* `-X` or `--exclude-all`: Exclude all properties and encode only geometries
* `-T`_attribute_`:`_type_ or `--attribute-type=`_attribute_`:`_type_: Coerce the named feature _attribute_ to be of the specified _type_.
The _type_ may be `string`, `float`, `int`, or `bool`.
If the type is `bool`, then original attributes of `0`, `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.
### Point simplification
### Dropping a fixed fraction of features by zoom level
* -r _rate_ or --drop-rate=_rate_: Rate at which dots are dropped at zoom levels below basezoom (default 2.5).
If you use -rg, it will guess a drop rate that will keep at most 50,000 features in the densest tile.
You can also specify a marker-width with -rg*width* to allow fewer features in the densest tile to
compensate for the larger marker, or -rf*number* to allow at most *number* features in the densest tile.
* -g _gamma_ or --gamma=_gamma_: Rate at which especially dense dots are dropped (default 0, for no effect). A gamma of 2 reduces the number of dots less than a pixel apart to the square root of their original number.
* `-r` _rate_ or `--drop-rate=`_rate_: Rate at which dots are dropped at zoom levels below basezoom (default 2.5).
If you use `-rg`, it will guess a drop rate that will keep at most 50,000 features in the densest tile.
You can also specify a marker-width with `-rg`*width* to allow fewer features in the densest tile to
compensate for the larger marker, or `-rf`*number* to allow at most *number* features in the densest tile.
* `-B` _zoom_ or `--base-zoom=`_zoom_: Base zoom, the level at and above which all points are included in the tiles (default maxzoom).
If you use `-Bg`, it will guess a zoom level that will keep at most 50,000 features in the densest tile.
You can also specify a marker-width with `-Bg`*width* to allow fewer features in the densest tile to
compensate for the larger marker, or `-Bf`*number* to allow at most *number* features in the densest tile.
* `-al` or `--drop-lines`: Let "dot" dropping at lower zooms apply to lines too
* `-ap` or `--drop-polygons`: Let "dot" dropping at lower zooms apply to polygons too
### Dropping a fraction of features to keep under tile size limits
* `-as` or `--drop-densest-as-needed`: If a tile is too large, try to reduce it to under 500K by increasing the minimum spacing between features. The discovered spacing applies to the entire zoom level.
* `-ad` or `--drop-fraction-as-needed`: Dynamically drop some fraction of features from each zoom level to keep large tiles under the 500K size limit. (This is like `-pd` but applies to the entire zoom level, not to each tile.)
* `-an` or `--drop-smallest-as-needed`: Dynamically drop the smallest features (physically smallest: the shortest lines or the smallest polygons) from each zoom level to keep large tiles under the 500K size limit. This option will not work for point features.
* `-pd` or `--force-feature-limit`: Dynamically drop some fraction of features from large tiles to keep them under the 500K size limit. It will probably look ugly at the tile boundaries. (This is like `-ad` but applies to each tile individually, not to the entire zoom level.) You probably don't want to use this.
### Dropping tightly overlapping features
* `-g` _gamma_ or `--gamma=_gamma`_: Rate at which especially dense dots are dropped (default 0, for no effect). A gamma of 2 reduces the number of dots less than a pixel apart to the square root of their original number.
* `-aG` or `--increase-gamma-as-needed`: If a tile is too large, try to reduce it to under 500K by increasing the `-g` gamma. The discovered gamma applies to the entire zoom level. You probably want to use `--drop-densest-as-needed` instead.
### Line and polygon simplification
* -S _scale_ or --simplification=_scale_: Multiply the tolerance for line and polygon simplification by _scale_. The standard tolerance tries to keep
* `-S` _scale_ or `--simplification=`_scale_: Multiply the tolerance for line and polygon simplification by _scale_. The standard tolerance tries to keep
the line or polygon within one tile unit of its proper location. You can probably go up to about 10 without too much visible difference.
* `-ps` or `--no-line-simplification`: Don't simplify lines and polygons
* `-pS` or `--simplify-only-low-zooms`: Don't simplify lines and polygons at maxzoom (but do simplify at lower zooms)
* `-pt` or `--no-tiny-polygon-reduction`: Don't combine the area of very small polygons into small squares that represent their combined area.
### Doing more
### Attempts to improve shared polygon boundaries
* -ac or --coalesce: Coalesce adjacent line and polygon features that have the same properties.
Note that when overlapping polygons are coalesced, the overlapping region is treated as a hole,
which may not be what you want.
* -ar or --reverse: Try reversing the directions of lines to make them coalesce and compress better
* -ao or --reorder: Reorder features to put ones with the same properties in sequence, to try to get them to coalesce
* -al or --drop-lines: Let "dot" dropping at lower zooms apply to lines too
* -ap or --drop-polygons: Let "dot" dropping at lower zooms apply to polygons too
* -ag or --calculate-feature-density: Add a new attribute, `tippecanoe_feature_density`, to each feature, to record how densely features are spaced in that area of the tile. You can use this attribute in the style to produce a glowing effect where points are densely packed. It can range from 0 in the sparsest areas to 255 in the densest.
* -ab or --detect-shared-borders: In the manner of [TopoJSON](https://github.com/mbostock/topojson/wiki/Introduction), detect borders that are shared between multiple polygons and simplify them identically in each polygon. This takes more time and memory than considering each polygon individually.
* -aG or --increase-gamma-as-needed: If a tile is too large, try to reduce it to under 500K by increasing the `-g` gamma. The discovered gamma applies to the entire zoom level.
* -as or --drop-densest-as-needed: If a tile is too large, try to reduce it to under 500K by increasing the minimum spacing between features. The discovered spacing applies to the entire zoom level.
* -ad or --drop-fraction-as-needed: Dynamically drop some fraction of features from each zoom level to keep large tiles under the 500K size limit. (This is like `-pd` but applies to the entire zoom level, not to each tile.)
* -an or --drop-smallest-as-needed: Dynamically drop the smallest features (physically smallest: the shortest lines or the smallest polygons) from each zoom level to keep large tiles under the 500K size limit. This option will not work for point features.
* -aL or --grid-low-zooms: At all zoom levels below _maxzoom_, snap all lines and polygons to a stairstep grid instead of allowing diagonals. You will also want to specify a tile resolution, probably `-D8`. This option provides a way to display continuous parcel, gridded, or binned data at low zooms without overwhelming the tiles with tiny polygons, since features will either get stretched out to the grid unit or lost entirely, depending on how they happened to be aligned in the original data.
* `-ab` or `--detect-shared-borders`: In the manner of [TopoJSON](https://github.com/mbostock/topojson/wiki/Introduction), detect borders that are shared between multiple polygons and simplify them identically in each polygon. This takes more time and memory than considering each polygon individually.
* `-aL` or `--grid-low-zooms`: At all zoom levels below _maxzoom_, snap all lines and polygons to a stairstep grid instead of allowing diagonals. You will also want to specify a tile resolution, probably `-D8`. This option provides a way to display continuous parcel, gridded, or binned data at low zooms without overwhelming the tiles with tiny polygons, since features will either get stretched out to the grid unit or lost entirely, depending on how they happened to be aligned in the original data. You probably don't want to use this.
### Doing less
### Controlling clipping to tile boundaries
* -ps or --no-line-simplification: Don't simplify lines
* -pS or --simplify-only-low-zooms: Don't simplify lines at maxzoom (but do simplify at lower zooms)
* -pf or --no-feature-limit: Don't limit tiles to 200,000 features
* -pk or --no-tile-size-limit: Don't limit tiles to 500K bytes
* -pd or --force-feature-limit: Dynamically drop some fraction of features from large tiles to keep them under the 500K size limit. It will probably look ugly at the tile boundaries. (This is like `-ad` but applies to each tile individually, not to the entire zoom level.)
* -pi or --preserve-input-order: Preserve the original input order of features as the drawing order instead of ordering geographically. (This is implemented as a restoration of the original order at the end, so that dot-dropping is still geographic, which means it also undoes -ao).
* -pp or --no-polygon-splitting: Don't split complex polygons (over 700 vertices after simplification) into multiple features.
* -pc or --no-clipping: Don't clip features to the size of the tile. If a feature overlaps the tile's bounds or buffer at all, it is included completely. Be careful: this can produce very large tilesets, especially with large polygons.
* -pD or --no-duplication: As with --no-clipping, each feature is included intact instead of cut to tile boundaries. In addition, it is included only in a single tile per zoom level rather than potentially in multiple copies. Clients of the tileset must check adjacent tiles (possibly some distance away) to ensure they have all features.
* -pt or --no-tiny-polygon-reduction: Don't combine the area of very small polygons into small squares that represent their combined area.
* -q or --quiet: Work quietly instead of reporting progress
* `-b` _pixels_ or `--buffer=`_pixels_: Buffer size where features are duplicated from adjacent tiles. Units are "screen pixels"—1/256th of the tile width or height. (default 5)
* `-pc` or `--no-clipping`: Don't clip features to the size of the tile. If a feature overlaps the tile's bounds or buffer at all, it is included completely. Be careful: this can produce very large tilesets, especially with large polygons.
* `-pD` or `--no-duplication`: As with `--no-clipping`, each feature is included intact instead of cut to tile boundaries. In addition, it is included only in a single tile per zoom level rather than potentially in multiple copies. Clients of the tileset must check adjacent tiles (possibly some distance away) to ensure they have all features.
* `-ph` or `--exclude-huge-geometries`: Leave out any `--no-clipping` or `--no-duplication` features whose coordinates are too large to be displayed correctly by Mapbox GL.
### Reordering features within each tile
* `-pi` or `--preserve-input-order`: Preserve the original input order of features as the drawing order instead of ordering geographically. (This is implemented as a restoration of the original order at the end, so that dot-dropping is still geographic, which means it also undoes `-ao`).
* `-ao` or `--reorder`: Reorder features to put ones with the same properties in sequence, to try to get them to coalesce. You probably don't want to use this.
* `-ac` or `--coalesce`: Coalesce adjacent line and polygon features that have the same properties. You probably don't want to use this.
* `-ar` or `--reverse`: Try reversing the directions of lines to make them coalesce and compress better. You probably don't want to use this.
### Adding calculated attributes
* `-ag` or `--calculate-feature-density`: Add a new attribute, `tippecanoe_feature_density`, to each feature, to record how densely features are spaced in that area of the tile. You can use this attribute in the style to produce a glowing effect where points are densely packed. It can range from 0 in the sparsest areas to 255 in the densest.
### Trying to correct bad source geometry
* `-aw` or `--detect-longitude-wraparound`: Detect when adjacent points within a feature jump to the other side of the world, and try to fix the geometry.
### Setting or disabling tile size limits
* `-M` _bytes_ or `--maximum-tile-bytes=`_bytes_: Use the specified number of _bytes_ as the maximum compressed tile size instead of 500K.
* `-pf` or `--no-feature-limit`: Don't limit tiles to 200,000 features
* `-pk` or `--no-tile-size-limit`: Don't limit tiles to 500K bytes
* `-pC` or `--no-tile-compression`: Don't compress the PBF vector tile data.
### Temporary storage
* `-t` _directory_ or `--temporary-directory=`_directory_: Put the temporary files in _directory_.
If you don't specify, it will use `/tmp`.
### Progress indicator
* `-q` or `--quiet`: Work quietly instead of reporting progress
* `-v` or `--version`: Report Tippecanoe's version number
Environment
-----------
Tippecanoe ordinarily uses as many parallel threads as the operating system claims that CPUs are available.
You can override this number by setting the `TIPPECANOE_MAX_THREADS` environmental variable.
Example
-------
@ -251,9 +347,6 @@ have their probability diffused, so that some of them will be drawn as a square
this minimum size and others will not be drawn at all, preserving the total area that
all of them should have had together.
Any polygons that have over 700 vertices after line simplification will be split into
multiple features so they can be rendered efficiently, unless you use -pp to prevent this.
Features in the same tile that share the same type and attributes are coalesced
together into a single geometry if you use `--coalesce`. You are strongly encouraged to use -x to exclude
any unnecessary properties to reduce wasted file size.
@ -279,7 +372,7 @@ and perhaps
make install
Tippecanoe now requires features from the 2014 C++ standard. If your compiler is older than
Tippecanoe now requires features from the 2011 C++ standard. If your compiler is older than
that, you will need to install a newer one. On MacOS, updating to the lastest XCode should
get you a new enough version of `clang++`. On Linux, you should be able to upgrade `g++` with
@ -303,22 +396,34 @@ The name is [a joking reference](http://en.wikipedia.org/wiki/Tippecanoe_and_Tyl
tile-join
=========
Tile-join is a tool for joining new attributes from a CSV file to features that
have already been tiled with tippecanoe. It reads the tiles from an existing .mbtiles
file, matches them against the records of the CSV, and writes out a new tileset.
Tile-join is a tool for joining new attributes from a CSV file to features
that have already been tiled with tippecanoe. It reads the tiles from an
existing .mbtiles file or a directory of tiles, matches them against the
records of the CSV, and writes out a new tileset.
If you specify multiple source mbtiles files, they are all read and their combined
contents are written to the new mbtiles output. If they define the same layers or
the same tiles, the layers or tiles are merged.
If you specify multiple source mbtiles files or source directories of tiles,
all the sources are read and their combined contents are written to the new
mbtiles output. If they define the same layers or the same tiles, the layers
or tiles are merged.
You can use the `-e` flag to output a directory of tiles rather than a
.mbtiles file.
The options are:
* -o *out.mbtiles*: Write the new tiles to the specified .mbtiles file
* -f: Remove *out.mbtiles* if it already exists
* -c *match.csv*: Use *match.csv* as the source for new attributes to join to the features. The first line of the file should be the key names; the other lines are values. The first column is the one to match against the existing features; the other columns are the new data to add.
* -x *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: Only include features that matched the CSV.
* -pk: Don't skip tiles larger than 500K.
* `-o` *out.mbtiles* or `--output=`*out.mbtiles*: Write the new tiles to the specified .mbtiles file.
* `-e` *directory* or `--output-to-directory=`*directory*: Write the new tiles to the specified directory instead of to an mbtiles file.
* `-f` or `--force`: Remove *out.mbtiles* if it already exists.
* `-c` *match*`.csv` or `--csv=`*match*`.csv`: Use *match*`.csv` as the source for new attributes to join to the features. The first line of the file should be the key names; the other lines are values. The first column is the one to match against the existing features; the other columns are the new data to add.
* `-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.
* `-pk` or `--no-tile-size-limit`: Don't skip tiles larger than 500K.
* `-pC` or `--no-tile-compression`: Don't compress the PBF vector tile data.
* `-l` *layer* or `--layer=`*layer*: Include the named layer in the output. You can specify multiple `-l` options to keep multiple layers. If you don't specify, they will all be retained.
* `-L` *layer* or `--exclude-layer=`*layer*: Remove the named layer from the output. You can specify multiple `-L` options to remove multiple layers.
* `-A` *attribution* or `--attribution=`*attribution*: Set the attribution string.
* `-n` *name* or `--name=`*name*: Set the tileset name.
* `-N` *description* or `--description=`*description*: Set the tileset description.
Because tile-join just copies the geometries to the new .mbtiles without processing them
(except to rescale the extents if necessary),
@ -402,4 +507,8 @@ resolutions.
### Options
* -t _projection_: Specify the projection of the output data. Currently supported are EPSG:4326 (WGS84, the default) and EPSG:3857 (Web Mercator).
* `-s` _projection_ or `--projection=`*projection*: Specify the projection of the output data. Currently supported are EPSG:4326 (WGS84, the default) and EPSG:3857 (Web Mercator).
* `-z` _maxzoom_ or `--maximum-zoom=`*maxzoom*: Specify the highest zoom level to decode from the tileset
* `-Z` _minzoom_ or `--minimum-zoom=`*minzoom*: Specify the lowest zoom level to decode from the tileset
* `-l` _layer_ or `--layer=`*layer*: Decode only layers with the specified names. (Multiple `-l` options can be specified.)
* `-f` or `--force`: Decode tiles even if polygon ring order or closure problems are detected

View File

@ -3,9 +3,11 @@
#include <string.h>
#include <unistd.h>
#include <sqlite3.h>
#include <getopt.h>
#include <string>
#include <vector>
#include <map>
#include <set>
#include <zlib.h>
#include <math.h>
#include <fcntl.h>
@ -16,6 +18,10 @@
#include "projection.hpp"
#include "geometry.hpp"
int minzoom = 0;
int maxzoom = 32;
bool force = false;
void printq(const char *s) {
putchar('"');
for (; *s; s++) {
@ -46,12 +52,13 @@ struct lonlat {
}
};
void handle(std::string message, int z, unsigned x, unsigned y, int describe) {
void handle(std::string message, int z, unsigned x, unsigned y, int describe, std::set<std::string> const &to_decode) {
int within = 0;
mvt_tile tile;
bool was_compressed;
try {
if (!tile.decode(message)) {
if (!tile.decode(message, was_compressed)) {
fprintf(stderr, "Couldn't parse tile %d/%u/%u\n", z, x, y);
exit(EXIT_FAILURE);
}
@ -63,7 +70,12 @@ void handle(std::string message, int z, unsigned x, unsigned y, int describe) {
printf("{ \"type\": \"FeatureCollection\"");
if (describe) {
printf(", \"properties\": { \"zoom\": %d, \"x\": %d, \"y\": %d }", z, x, y);
printf(", \"properties\": { \"zoom\": %d, \"x\": %d, \"y\": %d", z, x, y);
if (!was_compressed) {
printf(", \"compressed\": false");
}
printf(" }");
if (projection != projections) {
printf(", \"crs\": { \"type\": \"name\", \"properties\": { \"name\": ");
@ -74,12 +86,17 @@ void handle(std::string message, int z, unsigned x, unsigned y, int describe) {
printf(", \"features\": [\n");
bool first_layer = true;
for (size_t l = 0; l < tile.layers.size(); l++) {
mvt_layer &layer = tile.layers[l];
int extent = layer.extent;
if (to_decode.size() != 0 && !to_decode.count(layer.name)) {
continue;
}
if (describe) {
if (l != 0) {
if (!first_layer) {
printf(",\n");
}
@ -90,6 +107,7 @@ void handle(std::string message, int z, unsigned x, unsigned y, int describe) {
printf(" }");
printf(", \"features\": [\n");
first_layer = false;
within = 0;
}
@ -251,6 +269,21 @@ void handle(std::string message, int z, unsigned x, unsigned y, int describe) {
rings[n].push_back(ops[i]);
}
}
if (i + 1 >= ops.size() || ops[i + 1].op == VT_MOVETO) {
if (ops[i].op != VT_CLOSEPATH) {
static bool warned = false;
if (!warned) {
fprintf(stderr, "Ring does not end with closepath (ends with %d)\n", ops[i].op);
if (!force) {
exit(EXIT_FAILURE);
}
warned = true;
}
}
}
}
int outer = 0;
@ -280,6 +313,19 @@ void handle(std::string message, int z, unsigned x, unsigned y, int describe) {
int state = 0;
for (size_t i = 0; i < rings.size(); i++) {
if (i == 0 && areas[i] < 0) {
static bool warned = false;
if (!warned) {
fprintf(stderr, "Polygon begins with an inner ring\n");
if (!force) {
exit(EXIT_FAILURE);
}
warned = true;
}
}
if (areas[i] >= 0) {
if (state != 0) {
// new multipolygon
@ -330,7 +376,7 @@ void handle(std::string message, int z, unsigned x, unsigned y, int describe) {
printf("] }\n");
}
void decode(char *fname, int z, unsigned x, unsigned y) {
void decode(char *fname, int z, unsigned x, unsigned y, std::set<std::string> const &to_decode) {
sqlite3 *db;
int oz = z;
unsigned ox = x, oy = y;
@ -345,7 +391,7 @@ void decode(char *fname, int z, unsigned x, unsigned y) {
if (strcmp(map, "SQLite format 3") != 0) {
if (z >= 0) {
std::string s = std::string(map, st.st_size);
handle(s, z, x, y, 1);
handle(s, z, x, y, 1, to_decode);
munmap(map, st.st_size);
return;
} else {
@ -396,13 +442,16 @@ void decode(char *fname, int z, unsigned x, unsigned y) {
sqlite3_finalize(stmt2);
const char *sql = "SELECT tile_data, zoom_level, tile_column, tile_row from tiles order by zoom_level, tile_column, tile_row;";
const char *sql = "SELECT tile_data, zoom_level, tile_column, tile_row from tiles where zoom_level between ? and ? order by zoom_level, tile_column, tile_row;";
sqlite3_stmt *stmt;
if (sqlite3_prepare_v2(db, sql, -1, &stmt, NULL) != SQLITE_OK) {
fprintf(stderr, "%s: select failed: %s\n", fname, sqlite3_errmsg(db));
exit(EXIT_FAILURE);
}
sqlite3_bind_int(stmt, 1, minzoom);
sqlite3_bind_int(stmt, 2, maxzoom);
printf("\n}, \"features\": [\n");
within = 0;
@ -419,7 +468,7 @@ void decode(char *fname, int z, unsigned x, unsigned y) {
ty = (1LL << tz) - 1 - ty;
const char *s = (const char *) sqlite3_column_blob(stmt, 0);
handle(std::string(s, len), tz, tx, ty, 1);
handle(std::string(s, len), tz, tx, ty, 1, to_decode);
}
printf("] }\n");
@ -447,7 +496,7 @@ void decode(char *fname, int z, unsigned x, unsigned y) {
fprintf(stderr, "%s: Warning: using tile %d/%u/%u instead of %d/%u/%u\n", fname, z, x, y, oz, ox, oy);
}
handle(std::string(s, len), z, x, y, 0);
handle(std::string(s, len), z, x, y, 0, to_decode);
handled = 1;
}
@ -466,7 +515,7 @@ void decode(char *fname, int z, unsigned x, unsigned y) {
}
void usage(char **argv) {
fprintf(stderr, "Usage: %s [-t projection] file.mbtiles zoom x y\n", argv[0]);
fprintf(stderr, "Usage: %s [-t projection] [-Z minzoom] [-z maxzoom] [-l layer ...] file.mbtiles [zoom x y]\n", argv[0]);
exit(EXIT_FAILURE);
}
@ -474,22 +523,62 @@ int main(int argc, char **argv) {
extern int optind;
extern char *optarg;
int i;
std::set<std::string> to_decode;
while ((i = getopt(argc, argv, "t:")) != -1) {
struct option long_options[] = {
{"projection", required_argument, 0, 's'},
{"maximum-zoom", required_argument, 0, 'z'},
{"minimum-zoom", required_argument, 0, 'Z'},
{"layer", required_argument, 0, 'l'},
{"force", no_argument, 0, 'f'},
{0, 0, 0, 0},
};
std::string getopt_str;
for (size_t lo = 0; long_options[lo].name != NULL; lo++) {
if (long_options[lo].val > ' ') {
getopt_str.push_back(long_options[lo].val);
if (long_options[lo].has_arg == required_argument) {
getopt_str.push_back(':');
}
}
}
while ((i = getopt_long(argc, argv, getopt_str.c_str(), long_options, NULL)) != -1) {
switch (i) {
case 't':
case 0:
break;
case 's':
set_projection_or_exit(optarg);
break;
case 'z':
maxzoom = atoi(optarg);
break;
case 'Z':
minzoom = atoi(optarg);
break;
case 'l':
to_decode.insert(optarg);
break;
case 'f':
force = true;
break;
default:
usage(argv);
}
}
if (argc == optind + 4) {
decode(argv[optind], atoi(argv[optind + 1]), atoi(argv[optind + 2]), atoi(argv[optind + 3]));
decode(argv[optind], atoi(argv[optind + 1]), atoi(argv[optind + 2]), atoi(argv[optind + 3]), to_decode);
} else if (argc == optind + 1) {
decode(argv[optind], -1, -1, -1);
decode(argv[optind], -1, -1, -1, to_decode);
} else {
usage(argv);
}

30
dirtiles.cpp Normal file
View File

@ -0,0 +1,30 @@
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <sys/stat.h>
#include "dirtiles.hpp"
std::string dir_read_tile(std::string pbfPath) {
std::ifstream pbfFile(pbfPath, std::ios::in | std::ios::binary);
std::ostringstream contents;
contents << pbfFile.rdbuf();
pbfFile.close();
return (contents.str());
}
void dir_write_tile(const char *outdir, int z, int tx, int ty, std::string const &pbf) {
mkdir(outdir, S_IRWXU | S_IRWXG | S_IRWXO);
std::string curdir(outdir);
std::string slash("/");
std::string newdir = curdir + slash + std::to_string(z);
mkdir(newdir.c_str(), S_IRWXU | S_IRWXG | S_IRWXO);
newdir = newdir + "/" + std::to_string(tx);
mkdir(newdir.c_str(), S_IRWXU | S_IRWXG | S_IRWXO);
newdir = newdir + "/" + std::to_string(ty) + ".pbf";
std::ofstream pbfFile(newdir, std::ios::out | std::ios::binary);
pbfFile.write(pbf.data(), pbf.size());
pbfFile.close();
}

3
dirtiles.hpp Normal file
View File

@ -0,0 +1,3 @@
std::string dir_read_tile(std::string pbfPath);
void dir_write_tile(const char *outdir, int z, int tx, int ty, std::string const &pbf);

View File

@ -20,6 +20,7 @@
#include <sys/resource.h>
#include <pthread.h>
#include <vector>
#include <algorithm>
#include <set>
#include <map>
#include <string>
@ -38,6 +39,7 @@ extern "C" {
#include "options.hpp"
#include "serial.hpp"
#include "text.hpp"
#include "mvt.hpp"
#define GEOM_POINT 0 /* array of positions */
#define GEOM_MULTIPOINT 1 /* array of arrays of positions */
@ -75,7 +77,7 @@ void json_context(json_object *j) {
free(s); // stringify
}
long long parse_geometry(int t, json_object *j, long long *bbox, drawvec &out, int op, const char *fname, int line, int *initialized, unsigned *initial_x, unsigned *initial_y, json_object *feature) {
long long parse_geometry(int t, json_object *j, long long *bbox, drawvec &out, int op, const char *fname, int line, int *initialized, unsigned *initial_x, unsigned *initial_y, json_object *feature, long long &prev, long long &offset, bool &has_prev) {
long long g = 0;
if (j == NULL || j->type != JSON_ARRAY) {
@ -96,7 +98,7 @@ long long parse_geometry(int t, json_object *j, long long *bbox, drawvec &out, i
}
}
g += parse_geometry(within, j->array[i], bbox, out, op, fname, line, initialized, initial_x, initial_y, feature);
g += parse_geometry(within, j->array[i], bbox, out, op, fname, line, initialized, initial_x, initial_y, feature, prev, offset, has_prev);
}
} else {
if (j->length >= 2 && j->array[0]->type == JSON_NUMBER && j->array[1]->type == JSON_NUMBER) {
@ -116,6 +118,22 @@ long long parse_geometry(int t, json_object *j, long long *bbox, drawvec &out, i
}
}
if (additional[A_DETECT_WRAPAROUND]) {
x += offset;
if (has_prev) {
if (x - prev > (1LL << 31)) {
offset -= 1LL << 32;
x -= 1LL << 32;
} else if (prev - x > (1LL << 31)) {
offset += 1LL << 32;
x += 1LL << 32;
}
}
has_prev = true;
prev = x;
}
if (x < bbox[0]) {
bbox[0] = x;
}
@ -167,7 +185,7 @@ long long parse_geometry(int t, json_object *j, long long *bbox, drawvec &out, i
return g;
}
int serialize_geometry(json_object *geometry, json_object *properties, json_object *id, const char *reading, int line, volatile long long *layer_seq, volatile long long *progress_seq, long long *metapos, long long *geompos, long long *indexpos, std::set<std::string> *exclude, std::set<std::string> *include, int exclude_all, FILE *metafile, FILE *geomfile, FILE *indexfile, struct memfile *poolfile, struct memfile *treefile, const char *fname, int basezoom, int layer, double droprate, long long *file_bbox, json_object *tippecanoe, int segment, int *initialized, unsigned *initial_x, unsigned *initial_y, struct reader *readers, int maxzoom, json_object *feature, std::map<std::string, layermap_entry> *layermap, std::string layername, bool uses_gamma) {
int serialize_geometry(json_object *geometry, json_object *properties, json_object *id, const char *reading, int line, volatile long long *layer_seq, volatile long long *progress_seq, long long *metapos, long long *geompos, long long *indexpos, std::set<std::string> *exclude, std::set<std::string> *include, int exclude_all, FILE *metafile, FILE *geomfile, FILE *indexfile, struct memfile *poolfile, struct memfile *treefile, const char *fname, int basezoom, int layer, double droprate, long long *file_bbox, json_object *tippecanoe, int segment, int *initialized, unsigned *initial_x, unsigned *initial_y, struct reader *readers, int maxzoom, json_object *feature, std::map<std::string, layermap_entry> *layermap, std::string layername, bool uses_gamma, std::map<std::string, int> const *attribute_types, double *dist_sum, size_t *dist_count, bool want_dist) {
json_object *geometry_type = json_hash_get(geometry, "type");
if (geometry_type == NULL) {
static int warned = 0;
@ -241,17 +259,32 @@ int serialize_geometry(json_object *geometry, json_object *properties, json_obje
id_value = strtoull(id->string, &err, 10);
if (err != NULL && *err != '\0') {
fprintf(stderr, "Warning: Can't represent non-integer feature ID %s\n", id->string);
static bool warned_frac = false;
if (!warned_frac) {
fprintf(stderr, "Warning: Can't represent non-integer feature ID %s\n", id->string);
warned_frac = true;
}
} else {
has_id = true;
}
} else {
fprintf(stderr, "Warning: Can't represent negative feature ID %s\n", id->string);
static bool warned_neg = false;
if (!warned_neg) {
fprintf(stderr, "Warning: Can't represent negative feature ID %s\n", id->string);
warned_neg = true;
}
}
} else {
char *s = json_stringify(id);
fprintf(stderr, "Warning: Can't represent non-numeric feature ID %s\n", s);
free(s); // stringify
static bool warned_nan = false;
if (!warned_nan) {
char *s = json_stringify(id);
fprintf(stderr, "Warning: Can't represent non-numeric feature ID %s\n", s);
free(s); // stringify
warned_nan = true;
}
}
}
@ -301,32 +334,79 @@ int serialize_geometry(json_object *geometry, json_object *properties, json_obje
metakey[m] = properties->keys[i]->string;
if (properties->values[i] != NULL && properties->values[i]->type == JSON_STRING) {
tas.type = metatype[m] = VT_STRING;
metaval[m] = std::string(properties->values[i]->string);
std::string err = check_utf8(metaval[m]);
if (err != "") {
fprintf(stderr, "%s:%d: %s\n", reading, line, err.c_str());
json_context(feature);
exit(EXIT_FAILURE);
if (properties->values[i] != NULL) {
int vt = properties->values[i]->type;
std::string val;
if (vt == JSON_STRING || vt == JSON_NUMBER) {
val = properties->values[i]->string;
} else if (vt == JSON_TRUE) {
val = "true";
} else if (vt == JSON_FALSE) {
val = "false";
} else if (vt == JSON_NULL) {
val = "null";
} else {
const char *v = json_stringify(properties->values[i]);
val = std::string(v);
free((void *) v); // stringify
}
auto a = (*attribute_types).find(properties->keys[i]->string);
if (a != attribute_types->end()) {
if (a->second == mvt_string) {
vt = JSON_STRING;
} else if (a->second == mvt_float) {
vt = JSON_NUMBER;
} else if (a->second == mvt_int) {
vt = JSON_NUMBER;
for (size_t ii = 0; ii < val.size(); ii++) {
char c = val[ii];
if (c < '0' || c > '9') {
val = std::to_string(round(atof(val.c_str())));
break;
}
}
} else if (a->second == mvt_bool) {
if (val == "false" || val == "0" || val == "null" || val.size() == 0) {
vt = JSON_FALSE;
val = "false";
} else {
vt = JSON_TRUE;
val = "true";
}
} else {
fprintf(stderr, "Can't happen: attribute type %d\n", a->second);
exit(EXIT_FAILURE);
}
}
if (vt == JSON_STRING) {
tas.type = metatype[m] = mvt_string;
metaval[m] = val;
std::string err = check_utf8(metaval[m]);
if (err != "") {
fprintf(stderr, "%s:%d: %s\n", reading, line, err.c_str());
json_context(feature);
exit(EXIT_FAILURE);
}
m++;
} else if (vt == JSON_NUMBER) {
tas.type = metatype[m] = mvt_double;
metaval[m] = val;
m++;
} else if (vt == JSON_TRUE || vt == JSON_FALSE) {
tas.type = metatype[m] = mvt_bool;
metaval[m] = val;
m++;
} else if (vt == JSON_NULL) {
;
} else {
tas.type = metatype[m] = mvt_string;
metaval[m] = val;
m++;
}
m++;
} else if (properties->values[i] != NULL && properties->values[i]->type == JSON_NUMBER) {
tas.type = metatype[m] = VT_NUMBER;
metaval[m] = std::string(properties->values[i]->string);
m++;
} else if (properties->values[i] != NULL && (properties->values[i]->type == JSON_TRUE || properties->values[i]->type == JSON_FALSE)) {
tas.type = metatype[m] = VT_BOOLEAN;
metaval[m] = std::string(properties->values[i]->type == JSON_TRUE ? "true" : "false");
m++;
} else if (properties->values[i] != NULL && (properties->values[i]->type == JSON_NULL)) {
;
} else {
tas.type = metatype[m] = VT_STRING;
const char *v = json_stringify(properties->values[i]);
metaval[m] = std::string(v);
free((void *) v); // stringify
m++;
}
if (tas.type >= 0) {
@ -336,12 +416,43 @@ int serialize_geometry(json_object *geometry, json_object *properties, json_obje
}
}
bool has_prev = false;
long long prev = 0;
long long offset = 0;
drawvec dv;
long long g = parse_geometry(t, coordinates, bbox, dv, VT_MOVETO, fname, line, initialized, initial_x, initial_y, feature);
long long g = parse_geometry(t, coordinates, bbox, dv, VT_MOVETO, fname, line, initialized, initial_x, initial_y, feature, prev, offset, has_prev);
if (mb_geometry[t] == VT_POLYGON) {
dv = fix_polygon(dv);
}
if (want_dist) {
std::vector<unsigned long long> locs;
for (size_t i = 0; i < dv.size(); i++) {
if (dv[i].op == VT_MOVETO || dv[i].op == VT_LINETO) {
locs.push_back(encode(dv[i].x << geometry_scale, dv[i].y << geometry_scale));
}
}
std::sort(locs.begin(), locs.end());
size_t n = 0;
double sum = 0;
for (size_t i = 1; i < locs.size(); i++) {
if (locs[i - 1] != locs[i]) {
sum += log(locs[i] - locs[i - 1]);
n++;
}
}
if (n > 0) {
double avg = exp(sum / n);
// Convert approximately from tile units to feet
double dist_ft = sqrt(avg) / 33;
*dist_sum += log(dist_ft) * n;
*dist_count += n;
}
locs.clear();
}
bool inline_meta = true;
// Don't inline metadata for features that will span several tiles at maxzoom
if (g > 0 && (bbox[2] < bbox[0] || bbox[3] < bbox[1])) {
@ -429,13 +540,13 @@ int serialize_geometry(json_object *geometry, json_object *properties, json_obje
if (inline_meta) {
sf.metapos = -1;
for (size_t i = 0; i < m; i++) {
sf.keys.push_back(addpool(poolfile, treefile, metakey[i], VT_STRING));
sf.keys.push_back(addpool(poolfile, treefile, metakey[i], mvt_string));
sf.values.push_back(addpool(poolfile, treefile, metaval[i].c_str(), metatype[i]));
}
} else {
sf.metapos = *metapos;
for (size_t i = 0; i < m; i++) {
serialize_long_long(metafile, addpool(poolfile, treefile, metakey[i], VT_STRING), metapos, fname);
serialize_long_long(metafile, addpool(poolfile, treefile, metakey[i], mvt_string), metapos, fname);
serialize_long_long(metafile, addpool(poolfile, treefile, metaval[i].c_str(), metatype[i]), metapos, fname);
}
}
@ -484,14 +595,15 @@ void check_crs(json_object *j, const char *reading) {
json_object *name = json_hash_get(properties, "name");
if (name->type == JSON_STRING) {
if (strcmp(name->string, projection->alias) != 0) {
fprintf(stderr, "%s: Warning: GeoJSON specified projection \"%s\", not \"%s\".\n", reading, name->string, projection->alias);
fprintf(stderr, "%s: Warning: GeoJSON specified projection \"%s\", not the expected \"%s\".\n", reading, name->string, projection->alias);
fprintf(stderr, "%s: If \"%s\" is not the expected projection, use -s to specify the right one.\n", reading, projection->alias);
}
}
}
}
}
void parse_json(json_pull *jp, const char *reading, volatile long long *layer_seq, volatile long long *progress_seq, long long *metapos, long long *geompos, long long *indexpos, std::set<std::string> *exclude, std::set<std::string> *include, int exclude_all, FILE *metafile, FILE *geomfile, FILE *indexfile, struct memfile *poolfile, struct memfile *treefile, char *fname, int basezoom, int layer, double droprate, long long *file_bbox, int segment, int *initialized, unsigned *initial_x, unsigned *initial_y, struct reader *readers, int maxzoom, std::map<std::string, layermap_entry> *layermap, std::string layername, bool uses_gamma) {
void parse_json(json_pull *jp, const char *reading, volatile long long *layer_seq, volatile long long *progress_seq, long long *metapos, long long *geompos, long long *indexpos, std::set<std::string> *exclude, std::set<std::string> *include, int exclude_all, FILE *metafile, FILE *geomfile, FILE *indexfile, struct memfile *poolfile, struct memfile *treefile, char *fname, int basezoom, int layer, double droprate, long long *file_bbox, int segment, int *initialized, unsigned *initial_x, unsigned *initial_y, struct reader *readers, int maxzoom, std::map<std::string, layermap_entry> *layermap, std::string layername, bool uses_gamma, std::map<std::string, int> const *attribute_types, double *dist_sum, size_t *dist_count, bool want_dist) {
long long found_hashes = 0;
long long found_features = 0;
long long found_geometries = 0;
@ -559,7 +671,7 @@ void parse_json(json_pull *jp, const char *reading, volatile long long *layer_se
}
found_geometries++;
serialize_geometry(j, NULL, NULL, reading, jp->line, layer_seq, progress_seq, metapos, geompos, indexpos, exclude, include, exclude_all, metafile, geomfile, indexfile, poolfile, treefile, fname, basezoom, layer, droprate, file_bbox, NULL, segment, initialized, initial_x, initial_y, readers, maxzoom, j, layermap, layername, uses_gamma);
serialize_geometry(j, NULL, NULL, reading, jp->line, layer_seq, progress_seq, metapos, geompos, indexpos, exclude, include, exclude_all, metafile, geomfile, indexfile, poolfile, treefile, fname, basezoom, layer, droprate, file_bbox, NULL, segment, initialized, initial_x, initial_y, readers, maxzoom, j, layermap, layername, uses_gamma, attribute_types, dist_sum, dist_count, want_dist);
json_free(j);
continue;
}
@ -568,6 +680,7 @@ void parse_json(json_pull *jp, const char *reading, volatile long long *layer_se
if (strcmp(type->string, "Feature") != 0) {
if (strcmp(type->string, "FeatureCollection") == 0) {
check_crs(j, reading);
json_free(j);
}
continue;
@ -601,10 +714,10 @@ void parse_json(json_pull *jp, const char *reading, volatile long long *layer_se
if (geometries != NULL) {
size_t g;
for (g = 0; g < geometries->length; g++) {
serialize_geometry(geometries->array[g], properties, id, reading, jp->line, layer_seq, progress_seq, metapos, geompos, indexpos, exclude, include, exclude_all, metafile, geomfile, indexfile, poolfile, treefile, fname, basezoom, layer, droprate, file_bbox, tippecanoe, segment, initialized, initial_x, initial_y, readers, maxzoom, j, layermap, layername, uses_gamma);
serialize_geometry(geometries->array[g], properties, id, reading, jp->line, layer_seq, progress_seq, metapos, geompos, indexpos, exclude, include, exclude_all, metafile, geomfile, indexfile, poolfile, treefile, fname, basezoom, layer, droprate, file_bbox, tippecanoe, segment, initialized, initial_x, initial_y, readers, maxzoom, j, layermap, layername, uses_gamma, attribute_types, dist_sum, dist_count, want_dist);
}
} else {
serialize_geometry(geometry, properties, id, reading, jp->line, layer_seq, progress_seq, metapos, geompos, indexpos, exclude, include, exclude_all, metafile, geomfile, indexfile, poolfile, treefile, fname, basezoom, layer, droprate, file_bbox, tippecanoe, segment, initialized, initial_x, initial_y, readers, maxzoom, j, layermap, layername, uses_gamma);
serialize_geometry(geometry, properties, id, reading, jp->line, layer_seq, progress_seq, metapos, geompos, indexpos, exclude, include, exclude_all, metafile, geomfile, indexfile, poolfile, treefile, fname, basezoom, layer, droprate, file_bbox, tippecanoe, segment, initialized, initial_x, initial_y, readers, maxzoom, j, layermap, layername, uses_gamma, attribute_types, dist_sum, dist_count, want_dist);
}
json_free(j);
@ -616,7 +729,7 @@ void parse_json(json_pull *jp, const char *reading, volatile long long *layer_se
void *run_parse_json(void *v) {
struct parse_json_args *pja = (struct parse_json_args *) v;
parse_json(pja->jp, pja->reading, pja->layer_seq, pja->progress_seq, pja->metapos, pja->geompos, pja->indexpos, pja->exclude, pja->include, pja->exclude_all, pja->metafile, pja->geomfile, pja->indexfile, pja->poolfile, pja->treefile, pja->fname, pja->basezoom, pja->layer, pja->droprate, pja->file_bbox, pja->segment, pja->initialized, pja->initial_x, pja->initial_y, pja->readers, pja->maxzoom, pja->layermap, *pja->layername, pja->uses_gamma);
parse_json(pja->jp, pja->reading, pja->layer_seq, pja->progress_seq, pja->metapos, pja->geompos, pja->indexpos, pja->exclude, pja->include, pja->exclude_all, pja->metafile, pja->geomfile, pja->indexfile, pja->poolfile, pja->treefile, pja->fname, pja->basezoom, pja->layer, pja->droprate, pja->file_bbox, pja->segment, pja->initialized, pja->initial_x, pja->initial_y, pja->readers, pja->maxzoom, pja->layermap, *pja->layername, pja->uses_gamma, pja->attribute_types, pja->dist_sum, pja->dist_count, pja->want_dist);
return NULL;
}

View File

@ -28,10 +28,14 @@ struct parse_json_args {
std::map<std::string, layermap_entry> *layermap;
std::string *layername;
bool uses_gamma;
std::map<std::string, int> const *attribute_types;
double *dist_sum;
size_t *dist_count;
bool want_dist;
};
struct json_pull *json_begin_map(char *map, long long len);
void json_end_map(struct json_pull *jp);
void parse_json(json_pull *jp, const char *reading, volatile long long *layer_seq, volatile long long *progress_seq, long long *metapos, long long *geompos, long long *indexpos, std::set<std::string> *exclude, std::set<std::string> *include, int exclude_all, FILE *metafile, FILE *geomfile, FILE *indexfile, struct memfile *poolfile, struct memfile *treefile, char *fname, int basezoom, int layer, double droprate, long long *file_bbox, int segment, int *initialized, unsigned *initial_x, unsigned *initial_y, struct reader *readers, int maxzoom, std::map<std::string, layermap_entry> *layermap, std::string layername, bool uses_gamma);
void parse_json(json_pull *jp, const char *reading, volatile long long *layer_seq, volatile long long *progress_seq, long long *metapos, long long *geompos, long long *indexpos, std::set<std::string> *exclude, std::set<std::string> *include, int exclude_all, FILE *metafile, FILE *geomfile, FILE *indexfile, struct memfile *poolfile, struct memfile *treefile, char *fname, int basezoom, int layer, double droprate, long long *file_bbox, int segment, int *initialized, unsigned *initial_x, unsigned *initial_y, struct reader *readers, int maxzoom, std::map<std::string, layermap_entry> *layermap, std::string layername, bool uses_gamma, std::map<std::string, int> const *attribute_types, double *dist_sum, size_t *dist_count, bool want_dist);
void *run_parse_json(void *v);

View File

@ -9,9 +9,11 @@
#include <cmath>
#include <limits.h>
#include <sqlite3.h>
#include <mapbox/geometry.hpp>
#include <mapbox/geometry/point.hpp>
#include <mapbox/geometry/multi_polygon.hpp>
#include <mapbox/geometry/wagyu/wagyu.hpp>
#include <mapbox/geometry/wagyu/quick_clip.hpp>
#include <mapbox/geometry/snap_rounding.hpp>
#include "geometry.hpp"
#include "projection.hpp"
#include "serial.hpp"
@ -165,6 +167,27 @@ double get_area(drawvec &geom, size_t i, size_t j) {
return area;
}
double get_mp_area(drawvec &geom) {
double ret = 0;
for (size_t i = 0; i < geom.size(); i++) {
if (geom[i].op == VT_MOVETO) {
size_t j;
for (j = i + 1; j < geom.size(); j++) {
if (geom[j].op != VT_LINETO) {
break;
}
}
ret += get_area(geom, i, j);
i = j - 1;
}
}
return ret;
}
static void decode_clipped(mapbox::geometry::multi_polygon<long long> &t, drawvec &out) {
out.clear();
@ -322,29 +345,41 @@ static int pnpoly(drawvec &vert, size_t start, size_t nvert, long long testx, lo
}
void check_polygon(drawvec &geom, drawvec &before) {
for (size_t i = 0; i + 1 < geom.size(); i++) {
for (size_t j = i + 1; j + 1 < geom.size(); j++) {
if (geom[i + 1].op == VT_LINETO && geom[j + 1].op == VT_LINETO) {
double s1_x = geom[i + 1].x - geom[i + 0].x;
double s1_y = geom[i + 1].y - geom[i + 0].y;
double s2_x = geom[j + 1].x - geom[j + 0].x;
double s2_y = geom[j + 1].y - geom[j + 0].y;
geom = remove_noop(geom, VT_POLYGON, 0);
double s, t;
s = (-s1_y * (geom[i + 0].x - geom[j + 0].x) + s1_x * (geom[i + 0].y - geom[j + 0].y)) / (-s2_x * s1_y + s1_x * s2_y);
t = (s2_x * (geom[i + 0].y - geom[j + 0].y) - s2_y * (geom[i + 0].x - geom[j + 0].x)) / (-s2_x * s1_y + s1_x * s2_y);
if (t > 0 && t < 1 && s > 0 && s < 1) {
printf("Internal error: self-intersecting polygon. %lld,%lld to %lld,%lld intersects %lld,%lld to %lld,%lld\n",
geom[i + 0].x, geom[i + 0].y,
geom[i + 1].x, geom[i + 1].y,
geom[j + 0].x, geom[j + 0].y,
geom[j + 1].x, geom[j + 1].y);
mapbox::geometry::multi_polygon<long long> mp;
for (size_t i = 0; i < geom.size(); i++) {
if (geom[i].op == VT_MOVETO) {
size_t j;
for (j = i + 1; j < geom.size(); j++) {
if (geom[j].op != VT_LINETO) {
break;
}
}
if (j >= i + 4) {
mapbox::geometry::linear_ring<long long> lr;
for (size_t k = i; k < j; k++) {
lr.push_back(mapbox::geometry::point<long long>(geom[k].x, geom[k].y));
}
if (lr.size() >= 3) {
mapbox::geometry::polygon<long long> p;
p.push_back(lr);
mp.push_back(p);
}
}
i = j - 1;
}
}
mapbox::geometry::multi_polygon<long long> mp2 = mapbox::geometry::snap_round(mp, true, true);
if (mp != mp2) {
fprintf(stderr, "Internal error: self-intersecting polygon\n");
}
size_t outer_start = -1;
size_t outer_len = 0;
@ -445,19 +480,19 @@ drawvec simple_clip_poly(drawvec &geom, long long minx, long long miny, long lon
ring.push_back(mapbox::geometry::point<long long>(geom[k].x, geom[k].y));
}
optional_linear_ring<long long> lr = mapbox::geometry::wagyu::quick_clip::quick_lr_clip(ring, bbox);
mapbox::geometry::linear_ring<long long> lr = mapbox::geometry::wagyu::quick_clip::quick_lr_clip(ring, bbox);
if (lr) {
for (size_t k = 0; k < lr->size(); k++) {
if (lr.size() > 0) {
for (size_t k = 0; k < lr.size(); k++) {
if (k == 0) {
out.push_back(draw(VT_MOVETO, (*lr)[k].x, (*lr)[k].y));
out.push_back(draw(VT_MOVETO, lr[k].x, lr[k].y));
} else {
out.push_back(draw(VT_LINETO, (*lr)[k].x, (*lr)[k].y));
out.push_back(draw(VT_LINETO, lr[k].x, lr[k].y));
}
}
if (lr->size() > 0 && (*lr)[0] != (*lr)[lr->size() - 1]) {
out.push_back(draw(VT_LINETO, (*lr)[0].x, (*lr)[0].y));
if (lr.size() > 0 && lr[0] != lr[lr.size() - 1]) {
out.push_back(draw(VT_LINETO, lr[0].x, lr[0].y));
}
}

View File

@ -7,10 +7,6 @@
#define VT_LINETO 2
#define VT_CLOSEPATH 7
#define VT_STRING 1
#define VT_NUMBER 2
#define VT_BOOLEAN 7
// The bitfield is to make sizeof(draw) be 16 instead of 24
// at the cost, apparently, of a 0.7% increase in running time
// for packing and unpacking.
@ -71,3 +67,4 @@ drawvec fix_polygon(drawvec &geom);
std::vector<drawvec> chop_polygon(std::vector<drawvec> &geoms);
void check_polygon(drawvec &geom, drawvec &before);
double get_area(drawvec &geom, size_t i, size_t j);
double get_mp_area(drawvec &geom);

View File

@ -36,14 +36,14 @@ json_pull *json_begin(ssize_t (*read)(struct json_pull *, char *buffer, size_t n
static inline int peek(json_pull *j) {
if (j->buffer_head < j->buffer_tail) {
return j->buffer[j->buffer_head];
return (unsigned char) j->buffer[j->buffer_head];
} else {
j->buffer_head = 0;
j->buffer_tail = j->read(j, j->buffer, BUFFER);
if (j->buffer_head >= j->buffer_tail) {
return EOF;
}
return j->buffer[j->buffer_head];
return (unsigned char) j->buffer[j->buffer_head];
}
}
@ -295,7 +295,23 @@ again:
return NULL;
}
} while (c == ' ' || c == '\t' || c == '\r' || c == '\n');
// Byte-order mark
if (c == 0xEF) {
int c2 = peek(j);
if (c2 == 0xBB) {
c2 = read_wrap(j);
c2 = peek(j);
if (c2 == 0xBF) {
c2 = read_wrap(j);
c = ' ';
continue;
}
}
j->error = "Corrupt byte-order mark found";
return NULL;
}
} while (c == ' ' || c == '\t' || c == '\r' || c == '\n' || c == 0x1E);
/////////////////////////// Arrays

528
main.cpp
View File

@ -20,6 +20,7 @@
#include <sys/resource.h>
#include <pthread.h>
#include <getopt.h>
#include <algorithm>
#include <vector>
#include <string>
#include <set>
@ -50,6 +51,7 @@ extern "C" {
#include "geometry.hpp"
#include "serial.hpp"
#include "options.hpp"
#include "mvt.hpp"
static int low_detail = 12;
static int full_detail = -1;
@ -73,8 +75,6 @@ size_t TEMP_FILES;
long long MAX_FILES;
static long long diskfree;
#define MAX_ZOOM 24
struct reader {
int metafd;
int poolfd;
@ -117,7 +117,14 @@ void checkdisk(struct reader *r, int nreader) {
};
void init_cpus() {
CPUS = sysconf(_SC_NPROCESSORS_ONLN);
const char *TIPPECANOE_MAX_THREADS = getenv("TIPPECANOE_MAX_THREADS");
if (TIPPECANOE_MAX_THREADS != NULL) {
CPUS = atoi(TIPPECANOE_MAX_THREADS);
} else {
CPUS = sysconf(_SC_NPROCESSORS_ONLN);
}
if (CPUS < 1) {
CPUS = 1;
}
@ -363,7 +370,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 *reader, 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) {
void do_read_parallel(char *map, long long len, long long initial_offset, const char *reading, struct reader *reader, 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) {
long long segs[CPUS + 1];
segs[0] = 0;
segs[CPUS] = len;
@ -371,16 +378,20 @@ void do_read_parallel(char *map, long long len, long long initial_offset, const
for (size_t i = 1; i < CPUS; i++) {
segs[i] = len * i / CPUS;
while (segs[i] < len && map[segs[i]] != '\n') {
while (segs[i] < len && map[segs[i]] != separator) {
segs[i]++;
}
}
double dist_sums[CPUS];
size_t dist_counts[CPUS];
volatile long long layer_seq[CPUS];
for (size_t i = 0; i < CPUS; i++) {
// To preserve feature ordering, unique id for each segment
// begins with that segment's offset into the input
layer_seq[i] = segs[i] + initial_offset;
dist_sums[i] = dist_counts[i] = 0;
}
struct parse_json_args pja[CPUS];
@ -409,7 +420,7 @@ void do_read_parallel(char *map, long long len, long long initial_offset, const
pja[i].treefile = reader[i].treefile;
pja[i].fname = fname;
pja[i].basezoom = basezoom;
pja[i].layer = source < nlayers ? source : 0;
pja[i].layer = source;
pja[i].droprate = droprate;
pja[i].file_bbox = reader[i].file_bbox;
pja[i].segment = i;
@ -421,6 +432,10 @@ void do_read_parallel(char *map, long long len, long long initial_offset, const
pja[i].layermap = &(*layermaps)[i];
pja[i].layername = &layername;
pja[i].uses_gamma = uses_gamma;
pja[i].attribute_types = attribute_types;
pja[i].dist_sum = &(dist_sums[i]);
pja[i].dist_count = &(dist_counts[i]);
pja[i].want_dist = want_dist;
if (pthread_create(&pthreads[i], NULL, run_parse_json, &pja[i]) != 0) {
perror("pthread_create");
@ -435,6 +450,9 @@ void do_read_parallel(char *map, long long len, long long initial_offset, const
perror("pthread_join 370");
}
*dist_sum += dist_sums[i];
*dist_count += dist_counts[i];
json_end_map(pja[i].jp);
}
}
@ -445,6 +463,7 @@ struct read_parallel_arg {
long long offset;
long long len;
volatile int *is_parsing;
int separator;
const char *reading;
struct reader *reader;
@ -464,6 +483,10 @@ struct read_parallel_arg {
unsigned *initial_y;
std::string layername;
bool uses_gamma;
std::map<std::string, int> const *attribute_types;
double *dist_sum;
size_t *dist_count;
bool want_dist;
};
void *run_read_parallel(void *v) {
@ -485,7 +508,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->reader, 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);
do_read_parallel(map, rpa->len, rpa->offset, rpa->reading, rpa->reader, 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);
madvise(map, rpa->len, MADV_DONTNEED);
if (munmap(map, rpa->len) != 0) {
@ -502,7 +525,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 *reader, 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) {
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 *reader, 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) {
// 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.
@ -520,6 +543,7 @@ void start_parsing(int fd, FILE *fp, long long offset, long long len, volatile i
rpa->offset = offset;
rpa->len = len;
rpa->is_parsing = is_parsing;
rpa->separator = separator;
rpa->reading = reading;
rpa->reader = reader;
@ -539,6 +563,10 @@ void start_parsing(int fd, FILE *fp, long long offset, long long len, volatile i
rpa->maxzoom = maxzoom;
rpa->layername = layername;
rpa->uses_gamma = uses_gamma;
rpa->attribute_types = attribute_types;
rpa->dist_sum = dist_sum;
rpa->dist_count = dist_count;
rpa->want_dist = want_dist;
if (pthread_create(parallel_parser, NULL, run_read_parallel, rpa) != 0) {
perror("pthread_create");
@ -708,6 +736,9 @@ void radix1(int *geomfds_in, int *indexfds_in, int inputs, int prefix, int split
unit = max_unit;
}
unit = ((unit + page - 1) / page) * page;
if (unit < page) {
unit = page;
}
size_t nmerges = (indexpos + unit - 1) / unit;
struct mergelist merges[nmerges];
@ -994,7 +1025,7 @@ void choose_first_zoom(long long *file_bbox, struct reader *reader, unsigned *iz
}
}
int read_input(std::vector<source> &sources, char *fname, const char *layername, int maxzoom, int minzoom, int basezoom, double basezoom_marker_width, sqlite3 *outdb, 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) {
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 *description, bool guess_maxzoom, std::map<std::string, int> const *attribute_types, const char *pgm) {
int ret = EXIT_SUCCESS;
struct reader reader[CPUS];
@ -1101,26 +1132,12 @@ int read_input(std::vector<source> &sources, char *fname, const char *layername,
initialized[i] = initial_x[i] = initial_y[i] = 0;
}
size_t nlayers;
if (layername != NULL) {
nlayers = 1;
} else {
nlayers = sources.size();
if (nlayers == 0) {
nlayers = 1;
}
}
std::vector<std::string> layernames;
size_t nlayers = sources.size();
for (size_t l = 0; l < nlayers; l++) {
if (layername != NULL) {
layernames.push_back(std::string(layername));
} else {
if (sources[l].layer.size() == 0) {
const char *src;
if (sources.size() < 1) {
if (sources[l].file.size() == 0) {
src = fname;
} else if (sources[l].layer.size() != 0) {
src = sources[l].layer.c_str();
} else {
src = sources[l].file.c_str();
}
@ -1152,7 +1169,7 @@ int read_input(std::vector<source> &sources, char *fname, const char *layername,
out.append(trunc, p, 1);
}
}
layernames.push_back(out);
sources[l].layer = out;
if (!quiet) {
fprintf(stderr, "For layer %d, using name \"%s\"\n", (int) l, out.c_str());
@ -1162,25 +1179,23 @@ int read_input(std::vector<source> &sources, char *fname, const char *layername,
std::map<std::string, layermap_entry> layermap;
for (size_t l = 0; l < nlayers; l++) {
layermap.insert(std::pair<std::string, layermap_entry>(layernames[l], layermap_entry(l)));
layermap.insert(std::pair<std::string, layermap_entry>(sources[l].layer, layermap_entry(l)));
}
std::vector<std::map<std::string, layermap_entry> > layermaps;
for (size_t l = 0; l < CPUS; l++) {
layermaps.push_back(layermap);
}
size_t nsources = sources.size();
if (nsources == 0) {
nsources = 1;
}
long overall_offset = 0;
double dist_sum = 0;
size_t dist_count = 0;
size_t nsources = sources.size();
for (size_t source = 0; source < nsources; source++) {
std::string reading;
int fd;
if (source >= sources.size()) {
if (sources[source].file.size() == 0) {
reading = "standard input";
fd = 0;
} else {
@ -1192,11 +1207,20 @@ int read_input(std::vector<source> &sources, char *fname, const char *layername,
}
}
auto a = layermap.find(sources[source].layer);
if (a == layermap.end()) {
fprintf(stderr, "Internal error: couldn't find layer %s", sources[source].layer.c_str());
exit(EXIT_FAILURE);
}
size_t layer = a->second.id;
struct stat st;
char *map = NULL;
off_t off = 0;
if (read_parallel) {
int read_parallel_this = read_parallel ? '\n' : 0;
if (1) {
if (fstat(fd, &st) == 0) {
off = lseek(fd, 0, SEEK_CUR);
if (off >= 0) {
@ -1209,19 +1233,36 @@ int read_input(std::vector<source> &sources, char *fname, const char *layername,
}
}
if (map != NULL && map != MAP_FAILED) {
do_read_parallel(map, st.st_size - off, overall_offset, reading.c_str(), reader, &progress_seq, exclude, include, exclude_all, fname, basezoom, source, nlayers, &layermaps, droprate, initialized, initial_x, initial_y, maxzoom, layernames[source < nlayers ? source : 0], uses_gamma);
if (map != NULL && map != MAP_FAILED && st.st_size - off > 0) {
if (map[0] == 0x1E) {
read_parallel_this = 0x1E;
}
if (!read_parallel_this) {
// Not a GeoJSON text sequence, so unmap and read serially
if (munmap(map, st.st_size - off) != 0) {
perror("munmap source file");
exit(EXIT_FAILURE);
}
map = NULL;
}
}
if (map != NULL && map != MAP_FAILED && read_parallel_this) {
do_read_parallel(map, st.st_size - off, overall_offset, reading.c_str(), reader, &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);
overall_offset += st.st_size - off;
checkdisk(reader, CPUS);
if (munmap(map, st.st_size - off) != 0) {
madvise(map, st.st_size, MADV_DONTNEED);
perror("munmap source file");
exit(EXIT_FAILURE);
}
} else {
FILE *fp = fdopen(fd, "r");
if (fp == NULL) {
perror(sources[source].file.c_str());
perror(sources[layer].file.c_str());
if (close(fd) != 0) {
perror("close source file");
exit(EXIT_FAILURE);
@ -1229,7 +1270,15 @@ int read_input(std::vector<source> &sources, char *fname, const char *layername,
continue;
}
if (read_parallel) {
int c = getc(fp);
if (c != EOF) {
ungetc(c, fp);
}
if (c == 0x1E) {
read_parallel_this = 0x1E;
}
if (read_parallel_this) {
// Serial reading of chunks that are then parsed in parallel
char readname[strlen(tmpdir) + strlen("/read.XXXXXXXX") + 1];
@ -1263,7 +1312,7 @@ int read_input(std::vector<source> &sources, char *fname, const char *layername,
fwrite_check(buf, sizeof(char), n, readfp, reading.c_str());
ahead += n;
if (buf[n - 1] == '\n' && ahead > PARSE_MIN) {
if (buf[n - 1] == read_parallel_this && ahead > PARSE_MIN) {
// Don't let the streaming reader get too far ahead of the parsers.
// If the buffered input gets huge, even if the parsers are still running,
// wait for the parser thread instead of continuing to stream input.
@ -1278,7 +1327,7 @@ int read_input(std::vector<source> &sources, char *fname, const char *layername,
}
fflush(readfp);
start_parsing(readfd, readfp, initial_offset, ahead, &is_parsing, &parallel_parser, parser_created, reading.c_str(), reader, &progress_seq, exclude, include, exclude_all, fname, basezoom, source, nlayers, layermaps, droprate, initialized, initial_x, initial_y, maxzoom, layernames[source < nlayers ? source : 0], gamma != 0);
start_parsing(readfd, readfp, initial_offset, ahead, &is_parsing, &parallel_parser, parser_created, reading.c_str(), reader, &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);
initial_offset += ahead;
overall_offset += ahead;
@ -1315,7 +1364,7 @@ int read_input(std::vector<source> &sources, char *fname, const char *layername,
fflush(readfp);
if (ahead > 0) {
start_parsing(readfd, readfp, initial_offset, ahead, &is_parsing, &parallel_parser, parser_created, reading.c_str(), reader, &progress_seq, exclude, include, exclude_all, fname, basezoom, source, nlayers, layermaps, droprate, initialized, initial_x, initial_y, maxzoom, layernames[source < nlayers ? source : 0], gamma != 0);
start_parsing(readfd, readfp, initial_offset, ahead, &is_parsing, &parallel_parser, parser_created, reading.c_str(), reader, &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);
if (parser_created) {
if (pthread_join(parallel_parser, NULL) != 0) {
@ -1332,7 +1381,7 @@ int read_input(std::vector<source> &sources, char *fname, const char *layername,
long long layer_seq = overall_offset;
json_pull *jp = json_begin_file(fp);
parse_json(jp, reading.c_str(), &layer_seq, &progress_seq, &reader[0].metapos, &reader[0].geompos, &reader[0].indexpos, exclude, include, exclude_all, reader[0].metafile, reader[0].geomfile, reader[0].indexfile, reader[0].poolfile, reader[0].treefile, fname, basezoom, source < nlayers ? source : 0, droprate, reader[0].file_bbox, 0, &initialized[0], &initial_x[0], &initial_y[0], reader, maxzoom, &layermaps[0], layernames[source < nlayers ? source : 0], uses_gamma);
parse_json(jp, reading.c_str(), &layer_seq, &progress_seq, &reader[0].metapos, &reader[0].geompos, &reader[0].indexpos, exclude, include, exclude_all, reader[0].metafile, reader[0].geomfile, reader[0].indexfile, reader[0].poolfile, reader[0].treefile, fname, basezoom, layer, droprate, reader[0].file_bbox, 0, &initialized[0], &initial_x[0], &initial_y[0], reader, maxzoom, &layermaps[0], sources[layer].layer, uses_gamma, attribute_types, &dist_sum, &dist_count, guess_maxzoom);
json_end(jp);
overall_offset = layer_seq;
checkdisk(reader, CPUS);
@ -1551,18 +1600,106 @@ int read_input(std::vector<source> &sources, char *fname, const char *layername,
if (indexpos == 0) {
fprintf(stderr, "Did not read any valid geometries\n");
if (outdb != NULL) {
mbtiles_close(outdb, pgm);
}
exit(EXIT_FAILURE);
}
if (basezoom < 0 || droprate < 0) {
struct index *map = (struct index *) mmap(NULL, indexpos, PROT_READ, MAP_PRIVATE, indexfd, 0);
if (map == MAP_FAILED) {
perror("mmap index for basezoom");
struct index *map = (struct index *) mmap(NULL, indexpos, PROT_READ, MAP_PRIVATE, indexfd, 0);
if (map == MAP_FAILED) {
perror("mmap index for basezoom");
exit(EXIT_FAILURE);
}
madvise(map, indexpos, MADV_SEQUENTIAL);
madvise(map, indexpos, MADV_WILLNEED);
long long indices = indexpos / sizeof(struct index);
bool fix_dropping = false;
if (guess_maxzoom) {
double sum = 0;
size_t count = 0;
long long progress = -1;
long long ip;
for (ip = 1; ip < indices; ip++) {
if (map[ip].index != map[ip - 1].index) {
count++;
sum += log(map[ip].index - map[ip - 1].index);
}
long long nprogress = 100 * ip / indices;
if (nprogress != progress) {
progress = nprogress;
if (!quiet) {
fprintf(stderr, "Maxzoom: %lld%% \r", progress);
}
}
}
if (count == 0 && dist_count == 0) {
fprintf(stderr, "Can't guess maxzoom (-zg) without at least two distinct feature locations\n");
if (outdb != NULL) {
mbtiles_close(outdb, pgm);
}
exit(EXIT_FAILURE);
}
madvise(map, indexpos, MADV_SEQUENTIAL);
madvise(map, indexpos, MADV_WILLNEED);
if (count > 0) {
// Geometric mean is appropriate because distances between features
// are typically lognormally distributed
double avg = exp(sum / count);
// Convert approximately from tile units to feet
double dist_ft = sqrt(avg) / 33;
// Factor of 8 (3 zooms) beyond minimum required to distinguish features
double want = dist_ft / 8;
maxzoom = ceil(log(360 / (.00000274 * want)) / log(2) - full_detail);
if (maxzoom < 0) {
maxzoom = 0;
}
if (maxzoom > MAX_ZOOM) {
maxzoom = MAX_ZOOM;
}
if (!quiet) {
fprintf(stderr, "Choosing a maxzoom of -z%d for features about %d feet apart\n", maxzoom, (int) ceil(dist_ft));
}
}
if (dist_count != 0) {
double want2 = exp(dist_sum / dist_count) / 8;
int mz = ceil(log(360 / (.00000274 * want2)) / log(2) - full_detail);
if (mz < 0) {
mz = 0;
}
if (mz > MAX_ZOOM) {
mz = MAX_ZOOM;
}
if (mz > maxzoom || count <= 0) {
if (!quiet) {
fprintf(stderr, "Choosing a maxzoom of -z%d for resolution of about %d feet within features\n", mz, (int) exp(dist_sum / dist_count));
}
maxzoom = mz;
}
}
if (maxzoom < minzoom) {
fprintf(stderr, "Can't use %d for maxzoom because minzoom is %d\n", maxzoom, minzoom);
maxzoom = minzoom;
}
fix_dropping = true;
if (basezoom == -1) {
basezoom = maxzoom;
}
}
if (basezoom < 0 || droprate < 0) {
struct tile {
unsigned x;
unsigned y;
@ -1582,7 +1719,6 @@ int read_input(std::vector<source> &sources, char *fname, const char *layername,
long long progress = -1;
long long indices = indexpos / sizeof(struct index);
long long ip;
for (ip = 0; ip < indices; ip++) {
unsigned xx, yy;
@ -1723,6 +1859,10 @@ int read_input(std::vector<source> &sources, char *fname, const char *layername,
}
}
fix_dropping = true;
}
if (fix_dropping) {
// Fix up the minzooms for features, now that we really know the base zoom
// and drop rate.
@ -1742,7 +1882,7 @@ int read_input(std::vector<source> &sources, char *fname, const char *layername,
struct drop_state ds[maxzoom + 1];
prep_drop_states(ds, maxzoom, basezoom, droprate);
for (ip = 0; ip < indices; ip++) {
for (long long ip = 0; ip < indices; ip++) {
if (ip > 0 && map[ip].start != map[ip - 1].end) {
fprintf(stderr, "Mismatched index at %lld: %lld vs %lld\n", ip, map[ip].start, map[ip].end);
}
@ -1751,10 +1891,11 @@ int read_input(std::vector<source> &sources, char *fname, const char *layername,
}
munmap(geom, geomst.st_size);
madvise(map, indexpos, MADV_DONTNEED);
munmap(map, indexpos);
}
madvise(map, indexpos, MADV_DONTNEED);
munmap(map, indexpos);
if (close(indexfd) != 0) {
perror("close sorted index");
}
@ -1779,7 +1920,7 @@ int read_input(std::vector<source> &sources, char *fname, const char *layername,
}
unsigned midx = 0, midy = 0;
int written = traverse_zooms(fd, size, meta, stringpool, &midx, &midy, maxzoom, minzoom, basezoom, outdb, droprate, buffer, fname, tmpdir, gamma, full_detail, low_detail, min_detail, meta_off, pool_off, initial_x, initial_y, simplification, layermaps);
int written = traverse_zooms(fd, size, meta, stringpool, &midx, &midy, maxzoom, minzoom, basezoom, outdb, outdir, droprate, buffer, fname, tmpdir, gamma, full_detail, low_detail, min_detail, meta_off, pool_off, initial_x, initial_y, simplification, layermaps);
if (maxzoom != written) {
fprintf(stderr, "\n\n\n*** NOTE TILES ONLY COMPLETE THROUGH ZOOM %d ***\n\n\n", written);
@ -1833,7 +1974,7 @@ int read_input(std::vector<source> &sources, char *fname, const char *layername,
if (additional[A_CALCULATE_FEATURE_DENSITY]) {
for (auto ai = merged_lm.begin(); ai != merged_lm.end(); ++ai) {
type_and_string tas;
tas.type = VT_NUMBER;
tas.type = mvt_double;
tas.string = "tippecanoe_feature_density";
ai->second.file_keys.insert(tas);
}
@ -1843,7 +1984,8 @@ int read_input(std::vector<source> &sources, char *fname, const char *layername,
ai->second.minzoom = minzoom;
ai->second.maxzoom = maxzoom;
}
mbtiles_write_metadata(outdb, fname, minzoom, maxzoom, minlat, minlon, maxlat, maxlon, midlat, midlon, forcetable, attribution, merged_lm);
mbtiles_write_metadata(outdb, outdir, fname, minzoom, maxzoom, minlat, minlon, maxlat, maxlon, midlat, midlon, forcetable, attribution, merged_lm, true, description);
return ret;
}
@ -1858,6 +2000,33 @@ static bool has_name(struct option *long_options, int *pl) {
return false;
}
void set_attribute_type(std::map<std::string, int> &attribute_types, const char *arg) {
const char *s = strchr(arg, ':');
if (s == NULL) {
fprintf(stderr, "-T%s option must be in the form -Tname:type\n", arg);
exit(EXIT_FAILURE);
}
std::string name = std::string(arg, s - arg);
std::string type = std::string(s + 1);
int t = -1;
if (type == "int") {
t = mvt_int;
} else if (type == "float") {
t = mvt_float;
} else if (type == "string") {
t = mvt_string;
} else if (type == "bool") {
t = mvt_bool;
} else {
fprintf(stderr, "Attribute type (%s) must be int, float, string, or bool\n", type.c_str());
exit(EXIT_FAILURE);
}
attribute_types.insert(std::pair<std::string, int>(name, t));
}
int main(int argc, char **argv) {
#ifdef MTRACE
mtrace();
@ -1870,8 +2039,11 @@ int main(int argc, char **argv) {
int i;
char *name = NULL;
char *layer = NULL;
char *outdir = NULL;
char *description = NULL;
char *layername = NULL;
char *out_mbtiles = NULL;
char *out_directory = NULL;
sqlite3 *outdb = NULL;
int maxzoom = 14;
int minzoom = 0;
int basezoom = -1;
@ -1884,8 +2056,10 @@ int main(int argc, char **argv) {
const char *tmpdir = "/tmp";
const char *attribution = NULL;
std::vector<source> sources;
bool guess_maxzoom = false;
std::set<std::string> exclude, include;
std::map<std::string, int> attribute_types;
int exclude_all = 0;
int read_parallel = 0;
int files_open_at_start;
@ -1895,68 +2069,133 @@ int main(int argc, char **argv) {
additional[i] = 0;
}
static struct option long_options[] = {
static struct option long_options_orig[] = {
{"Output tileset", 0, 0, 0},
{"output", required_argument, 0, 'o'},
{"output-to-directory", required_argument, 0, 'e'},
{"force", no_argument, 0, 'f'},
{"allow-existing", no_argument, 0, 'F'},
{"Tileset description and attribution", 0, 0, 0},
{"name", required_argument, 0, 'n'},
{"layer", required_argument, 0, 'l'},
{"attribution", required_argument, 0, 'A'},
{"description", required_argument, 0, 'N'},
{"Input files and layer names", 0, 0, 0},
{"layer", required_argument, 0, 'l'},
{"named-layer", required_argument, 0, 'L'},
{"Parallel processing of input", 0, 0, 0},
{"read-parallel", no_argument, 0, 'P'},
{"Projection of input", 0, 0, 0},
{"projection", required_argument, 0, 's'},
{"Zoom levels", 0, 0, 0},
{"maximum-zoom", required_argument, 0, 'z'},
{"minimum-zoom", required_argument, 0, 'Z'},
{"base-zoom", required_argument, 0, 'B'},
{"extend-zooms-if-still-dropping", no_argument, &additional[A_EXTEND_ZOOMS], 1},
{"Tile resolution", 0, 0, 0},
{"full-detail", required_argument, 0, 'd'},
{"low-detail", required_argument, 0, 'D'},
{"minimum-detail", required_argument, 0, 'm'},
{"Filtering feature attributes", 0, 0, 0},
{"exclude", required_argument, 0, 'x'},
{"include", required_argument, 0, 'y'},
{"drop-rate", required_argument, 0, 'r'},
{"buffer", required_argument, 0, 'b'},
{"temporary-directory", required_argument, 0, 't'},
{"gamma", required_argument, 0, 'g'},
{"prevent", required_argument, 0, 'p'},
{"additional", required_argument, 0, 'a'},
{"projection", required_argument, 0, 's'},
{"simplification", required_argument, 0, 'S'},
{"maximum-tile-bytes", required_argument, 0, 'M'},
{"exclude-all", no_argument, 0, 'X'},
{"force", no_argument, 0, 'f'},
{"allow-existing", no_argument, 0, 'F'},
{"quiet", no_argument, 0, 'q'},
{"version", no_argument, 0, 'v'},
{"read-parallel", no_argument, 0, 'P'},
{"attribute-type", required_argument, 0, 'T'},
{"coalesce", no_argument, &additional[A_COALESCE], 1},
{"reverse", no_argument, &additional[A_REVERSE], 1},
{"reorder", no_argument, &additional[A_REORDER], 1},
{"Dropping a fixed fraction of features by zoom level", 0, 0, 0},
{"drop-rate", required_argument, 0, 'r'},
{"base-zoom", required_argument, 0, 'B'},
{"drop-lines", no_argument, &additional[A_LINE_DROP], 1},
{"check-polygons", no_argument, &additional[A_DEBUG_POLYGON], 1},
{"drop-polygons", no_argument, &additional[A_POLYGON_DROP], 1},
{"prefer-radix-sort", no_argument, &additional[A_PREFER_RADIX_SORT], 1},
{"calculate-feature-density", no_argument, &additional[A_CALCULATE_FEATURE_DENSITY], 1},
{"detect-shared-borders", no_argument, &additional[A_DETECT_SHARED_BORDERS], 1},
{"increase-gamma-as-needed", no_argument, &additional[A_INCREASE_GAMMA_AS_NEEDED], 1},
{"Dropping a fraction of features to keep under tile size limits", 0, 0, 0},
{"drop-densest-as-needed", no_argument, &additional[A_DROP_DENSEST_AS_NEEDED], 1},
{"drop-fraction-as-needed", no_argument, &additional[A_DROP_FRACTION_AS_NEEDED], 1},
{"drop-smallest-as-needed", no_argument, &additional[A_DROP_SMALLEST_AS_NEEDED], 1},
{"grid-low-zooms", no_argument, &additional[A_GRID_LOW_ZOOMS], 1},
{"force-feature-limit", no_argument, &prevent[P_DYNAMIC_DROP], 1},
{"Dropping tightly overlapping features", 0, 0, 0},
{"gamma", required_argument, 0, 'g'},
{"increase-gamma-as-needed", no_argument, &additional[A_INCREASE_GAMMA_AS_NEEDED], 1},
{"Line and polygon simplification", 0, 0, 0},
{"simplification", required_argument, 0, 'S'},
{"no-line-simplification", no_argument, &prevent[P_SIMPLIFY], 1},
{"simplify-only-low-zooms", no_argument, &prevent[P_SIMPLIFY_LOW], 1},
{"no-feature-limit", no_argument, &prevent[P_FEATURE_LIMIT], 1},
{"no-tile-size-limit", no_argument, &prevent[P_KILOBYTE_LIMIT], 1},
{"force-feature-limit", no_argument, &prevent[P_DYNAMIC_DROP], 1},
{"preserve-input-order", no_argument, &prevent[P_INPUT_ORDER], 1},
{"no-polygon-splitting", no_argument, &prevent[P_POLYGON_SPLIT], 1},
{"no-tiny-polygon-reduction", no_argument, &prevent[P_TINY_POLYGON_REDUCTION], 1},
{"Attempts to improve shared polygon boundaries", 0, 0, 0},
{"detect-shared-borders", no_argument, &additional[A_DETECT_SHARED_BORDERS], 1},
{"grid-low-zooms", no_argument, &additional[A_GRID_LOW_ZOOMS], 1},
{"Controlling clipping to tile boundaries", 0, 0, 0},
{"buffer", required_argument, 0, 'b'},
{"no-clipping", no_argument, &prevent[P_CLIPPING], 1},
{"no-duplication", no_argument, &prevent[P_DUPLICATION], 1},
{"no-tiny-polygon-reduction", no_argument, &prevent[P_TINY_POLYGON_REDUCTION], 1},
{"exclude-huge-geometries", no_argument, &prevent[P_EXCLUDE_HUGE_GEOMETRIES], 1},
{"Reordering features within each tile", 0, 0, 0},
{"preserve-input-order", no_argument, &prevent[P_INPUT_ORDER], 1},
{"reorder", no_argument, &additional[A_REORDER], 1},
{"coalesce", no_argument, &additional[A_COALESCE], 1},
{"reverse", no_argument, &additional[A_REVERSE], 1},
{"Adding calculated attributes", 0, 0, 0},
{"calculate-feature-density", no_argument, &additional[A_CALCULATE_FEATURE_DENSITY], 1},
{"Trying to correct bad source geometry", 0, 0, 0},
{"detect-longitude-wraparound", no_argument, &additional[A_DETECT_WRAPAROUND], 1},
{"Setting or disabling tile size limits", 0, 0, 0},
{"maximum-tile-bytes", required_argument, 0, 'M'},
{"no-feature-limit", no_argument, &prevent[P_FEATURE_LIMIT], 1},
{"no-tile-size-limit", no_argument, &prevent[P_KILOBYTE_LIMIT], 1},
{"no-tile-compression", no_argument, &prevent[P_TILE_COMPRESSION], 1},
{"Temporary storage", 0, 0, 0},
{"temporary-directory", required_argument, 0, 't'},
{"Progress indicator", 0, 0, 0},
{"quiet", no_argument, 0, 'q'},
{"version", no_argument, 0, 'v'},
{"", 0, 0, 0},
{"prevent", required_argument, 0, 'p'},
{"additional", required_argument, 0, 'a'},
{"check-polygons", no_argument, &additional[A_DEBUG_POLYGON], 1},
{"no-polygon-splitting", no_argument, &prevent[P_POLYGON_SPLIT], 1},
{"prefer-radix-sort", no_argument, &additional[A_PREFER_RADIX_SORT], 1},
{0, 0, 0, 0},
};
static struct option long_options[sizeof(long_options_orig) / sizeof(long_options_orig[0])];
static char getopt_str[sizeof(long_options_orig) / sizeof(long_options_orig[0]) * 2 + 1];
{
size_t out = 0;
size_t cout = 0;
for (size_t lo = 0; long_options_orig[lo].name != NULL; lo++) {
if (long_options_orig[lo].val != 0) {
long_options[out++] = long_options_orig[lo];
if (long_options_orig[lo].val > ' ') {
getopt_str[cout++] = long_options_orig[lo].val;
if (long_options_orig[lo].has_arg == required_argument) {
getopt_str[cout++] = ':';
}
}
}
}
long_options[out] = {0, 0, 0, 0};
getopt_str[cout] = '\0';
for (size_t lo = 0; long_options[lo].name != NULL; lo++) {
if (long_options[lo].flag != NULL) {
if (*long_options[lo].flag != 0) {
@ -1974,7 +2213,7 @@ int main(int argc, char **argv) {
}
}
while ((i = getopt_long(argc, argv, "n:l:z:Z:B:d:D:m:o:x:y:r:b:t:g:p:a:XfFqvPL:A:s:S:M:", long_options, NULL)) != -1) {
while ((i = getopt_long(argc, argv, getopt_str, long_options, NULL)) != -1) {
switch (i) {
case 0:
break;
@ -1983,8 +2222,12 @@ int main(int argc, char **argv) {
name = optarg;
break;
case 'N':
description = optarg;
break;
case 'l':
layer = optarg;
layername = optarg;
break;
case 'A':
@ -2004,7 +2247,12 @@ int main(int argc, char **argv) {
} break;
case 'z':
maxzoom = atoi(optarg);
if (strcmp(optarg, "g") == 0) {
maxzoom = MAX_ZOOM;
guess_maxzoom = true;
} else {
maxzoom = atoi(optarg);
}
break;
case 'Z':
@ -2047,7 +2295,11 @@ int main(int argc, char **argv) {
break;
case 'o':
outdir = optarg;
out_mbtiles = optarg;
break;
case 'e':
out_directory = optarg;
break;
case 'x':
@ -2157,33 +2409,42 @@ int main(int argc, char **argv) {
max_tile_size = atoll(optarg);
break;
case 'T':
set_attribute_type(attribute_types, optarg);
break;
default: {
int width = 7 + strlen(argv[0]);
fprintf(stderr, "Unknown option -%c\n", i);
fprintf(stderr, "Usage: %s", argv[0]);
for (size_t lo = 0; long_options[lo].name != NULL; lo++) {
if (width + strlen(long_options[lo].name) + 9 >= 80) {
fprintf(stderr, "Usage: %s [options] [file.json ...]", argv[0]);
for (size_t lo = 0; long_options_orig[lo].name != NULL && strlen(long_options_orig[lo].name) > 0; lo++) {
if (long_options_orig[lo].val == 0) {
fprintf(stderr, "\n %s\n ", long_options_orig[lo].name);
width = 8;
continue;
}
if (width + strlen(long_options_orig[lo].name) + 9 >= 80) {
fprintf(stderr, "\n ");
width = 8;
}
width += strlen(long_options[lo].name) + 9;
if (strcmp(long_options[lo].name, "output") == 0) {
fprintf(stderr, " --%s=output.mbtiles", long_options[lo].name);
width += strlen(long_options_orig[lo].name) + 9;
if (strcmp(long_options_orig[lo].name, "output") == 0) {
fprintf(stderr, " --%s=output.mbtiles", long_options_orig[lo].name);
width += 9;
} else if (long_options[lo].has_arg) {
fprintf(stderr, " [--%s=...]", long_options[lo].name);
} else if (long_options_orig[lo].has_arg) {
fprintf(stderr, " [--%s=...]", long_options_orig[lo].name);
} else {
fprintf(stderr, " [--%s]", long_options[lo].name);
fprintf(stderr, " [--%s]", long_options_orig[lo].name);
}
}
if (width + 16 >= 80) {
fprintf(stderr, "\n ");
width = 8;
}
fprintf(stderr, " [file.json ...]\n");
}
fprintf(stderr, "\n");
exit(EXIT_FAILURE);
}
}
}
files_open_at_start = open("/dev/null", O_RDONLY);
@ -2200,9 +2461,11 @@ int main(int argc, char **argv) {
// Need two checks: one for geometry representation, the other for
// index traversal when guessing base zoom and drop rate
if (maxzoom > 32 - full_detail) {
maxzoom = 32 - full_detail;
fprintf(stderr, "Highest supported zoom with detail %d is %d\n", full_detail, maxzoom);
if (!guess_maxzoom) {
if (maxzoom > 32 - full_detail) {
maxzoom = 32 - full_detail;
fprintf(stderr, "Highest supported zoom with detail %d is %d\n", full_detail, maxzoom);
}
}
if (maxzoom > MAX_ZOOM) {
maxzoom = MAX_ZOOM;
@ -2215,13 +2478,17 @@ int main(int argc, char **argv) {
}
if (basezoom == -1) {
basezoom = maxzoom;
if (!guess_maxzoom) {
basezoom = maxzoom;
}
}
geometry_scale = 32 - (full_detail + maxzoom);
if (geometry_scale < 0) {
geometry_scale = 0;
fprintf(stderr, "Full detail + maxzoom > 32, so you are asking for more detail than is available.\n");
if (!guess_maxzoom) {
fprintf(stderr, "Full detail + maxzoom > 32, so you are asking for more detail than is available.\n");
}
}
if ((basezoom < 0 || droprate < 0) && (gamma < 0)) {
@ -2231,16 +2498,24 @@ int main(int argc, char **argv) {
fprintf(stderr, "Forcing -g0 since -B or -r is not known\n");
}
if (outdir == NULL) {
fprintf(stderr, "%s: must specify -o out.mbtiles\n", argv[0]);
if (out_mbtiles == NULL && out_directory == NULL) {
fprintf(stderr, "%s: must specify -o out.mbtiles or -e directory\n", argv[0]);
exit(EXIT_FAILURE);
}
if (force) {
unlink(outdir);
if (out_mbtiles != NULL && out_directory != NULL) {
fprintf(stderr, "%s: Options -o and -e cannot be used together\n", argv[0]);
exit(EXIT_FAILURE);
}
if (out_mbtiles != NULL) {
if (force) {
unlink(out_mbtiles);
}
outdb = mbtiles_open(out_mbtiles, argv, forcetable);
}
sqlite3 *outdb = mbtiles_open(outdir, argv, forcetable);
int ret = EXIT_SUCCESS;
for (i = optind; i < argc; i++) {
@ -2250,11 +2525,26 @@ int main(int argc, char **argv) {
sources.push_back(src);
}
if (sources.size() == 0) {
struct source src;
src.layer = "";
src.file = ""; // standard input
sources.push_back(src);
}
if (layername != NULL) {
for (size_t a = 0; a < sources.size(); a++) {
sources[a].layer = layername;
}
}
long long file_bbox[4] = {UINT_MAX, UINT_MAX, 0, 0};
ret = read_input(sources, name ? name : outdir, layer, maxzoom, minzoom, basezoom, basezoom_marker_width, outdb, &exclude, &include, exclude_all, droprate, buffer, tmpdir, gamma, read_parallel, forcetable, attribution, gamma != 0, file_bbox);
ret = read_input(sources, name ? name : out_mbtiles ? out_mbtiles : out_directory, maxzoom, minzoom, basezoom, basezoom_marker_width, outdb, out_directory, &exclude, &include, exclude_all, droprate, buffer, tmpdir, gamma, read_parallel, forcetable, attribution, gamma != 0, file_bbox, description, guess_maxzoom, &attribute_types, argv[0]);
mbtiles_close(outdb, argv);
if (outdb != NULL) {
mbtiles_close(outdb, argv[0]);
}
#ifdef MTRACE
muntrace();

View File

@ -16,3 +16,5 @@ extern size_t CPUS;
extern size_t TEMP_FILES;
extern size_t max_tile_size;
#define MAX_ZOOM 24

View File

@ -48,146 +48,247 @@ The GeoJSON features need not be wrapped in a FeatureCollection.
You can concatenate multiple GeoJSON features or files together,
and it will parse out the features and ignore whatever other objects
it encounters.
.SH Options
.SS Naming
.SH Docker Image
.PP
A tippecanoe Docker image can be built from source and executed as a task to
automatically install dependencies and allow tippecanoe to run on any system
supported by Docker.
.PP
.RS
.IP \(bu 2
\-l \fIname\fP or \-\-layer=\fIname\fP: Layer name (default "file" if source is file.json or output is file.mbtiles). If there are multiple input files
specified, the files are all merged into the single named layer, even if they try to specify individual names with \-L.
.IP \(bu 2
\-L \fIname\fP:\fIfile.json\fP or \-\-named\-layer=\fIname\fP:\fIfile.json\fP: Specify layer names for individual files. If your shell supports it, you can use a subshell redirect like \-L \fIname\fP:<(cat dir/*.json) to specify a layer name for the output of streamed input.
.IP \(bu 2
\-n \fIname\fP or \-\-name=\fIname\fP: Human\-readable name for the tileset (default file.json)
.IP \(bu 2
\-A \fItext\fP or \-\-attribution=\fItext\fP: Attribution (HTML) to be shown with maps that use data from this tileset.
.nf
$ docker build \-t tippecanoe:latest .
$ docker run \-it \-\-rm \\
\-v /tiledata:/data \\
tippecanoe:latest \\
tippecanoe \-\-output=/data/output.mbtiles /data/example.geojson
.fi
.RE
.SS File control
.PP
The commands above will build a Docker image from the source and compile the
latest version. The image supports all tippecanoe flags and options.
.SH Options
.PP
There are a lot of options. A lot of the time you won't want to use any of them
other than \fB\fC\-o\fR \fIoutput\fP\fB\fC\&.mbtiles\fR to name the output file, and probably \fB\fC\-f\fR to
delete the file that already exists with that name.
.PP
If you aren't sure what the right maxzoom is for your data, \fB\fC\-zg\fR will guess one for you
based on the density of features.
.PP
If you are mapping point features, you will often want to use \fB\fC\-Bg\fR to automatically choose
a base zoom level for dot dropping. If that doesn't work out for you, try
\fB\fC\-r1 \-\-drop\-fraction\-as\-needed\fR to turn off the normal dot dropping and instead
only drop features if the tiles get too big.
.PP
If you are mapping points or polygons, you will often want to use \fB\fC\-\-drop\-densest\-as\-needed\fR
to drop some of them if necessary to make the low zoom levels work.
.PP
If your features have a lot of attributes, use \fB\fC\-y\fR to keep only the ones you really need.
.PP
If your input is formatted as newline\-delimited GeoJSON, use \fB\fC\-P\fR to make input parsing a lot faster.
.SS Output tileset
.RS
.IP \(bu 2
\-o \fIfile\fP\&.mbtiles or \-\-output=\fIfile\fP\&.mbtiles: Name the output file.
\fB\fC\-o\fR \fIfile\fP\fB\fC\&.mbtiles\fR or \fB\fC\-\-output=\fR\fIfile\fP\fB\fC\&.mbtiles\fR: Name the output file.
.IP \(bu 2
\-f or \-\-force: Delete the mbtiles file if it already exists instead of giving an error
\fB\fC\-e\fR \fIdirectory\fP or \fB\fC\-\-output\-to\-directory\fR=\fIdirectory\fP: Write tiles to the specified \fIdirectory\fP instead of to an mbtiles file.
.IP \(bu 2
\-F or \-\-allow\-existing: Proceed (without deleting existing data) if the metadata or tiles table already exists
or if metadata fields can't be set
\fB\fC\-f\fR or \fB\fC\-\-force\fR: Delete the mbtiles file if it already exists instead of giving an error
.IP \(bu 2
\-t \fIdirectory\fP or \-\-temporary\-directory=\fIdirectory\fP: Put the temporary files in \fIdirectory\fP\&.
If you don't specify, it will use \fB\fC/tmp\fR\&.
\fB\fC\-F\fR or \fB\fC\-\-allow\-existing\fR: Proceed (without deleting existing data) if the metadata or tiles table already exists
or if metadata fields can't be set. You probably don't want to use this.
.RE
.SS Tileset description and attribution
.RS
.IP \(bu 2
\-P or \-\-read\-parallel: Use multiple threads to read different parts of each input file at once.
\fB\fC\-n\fR \fIname\fP or \fB\fC\-\-name=\fR\fIname\fP: Human\-readable name for the tileset (default file.json)
.IP \(bu 2
\fB\fC\-A\fR \fItext\fP or \fB\fC\-\-attribution=\fR\fItext\fP: Attribution (HTML) to be shown with maps that use data from this tileset.
.IP \(bu 2
\fB\fC\-N\fR \fIdescription\fP or \fB\fC\-\-description=\fR\fIdescription\fP: Description for the tileset (default file.mbtiles)
.RE
.SS Input files and layer names
.RS
.IP \(bu 2
\fIname\fP\fB\fC\&.json\fR or \fIname\fP\fB\fC\&.geojson\fR: Read the named GeoJSON input file into a layer called \fIname\fP\&.
.IP \(bu 2
\fB\fC\-l\fR \fIname\fP or \fB\fC\-\-layer=\fR\fIname\fP: Use the specified layer name instead of deriving a name from the input filename or output tileset. If there are multiple input files
specified, the files are all merged into the single named layer, even if they try to specify individual names with \fB\fC\-L\fR\&.
.IP \(bu 2
\fB\fC\-L\fR \fIname\fP\fB\fC:\fR\fIfile.json\fP or \fB\fC\-\-named\-layer=\fR\fIname\fP\fB\fC:\fR\fIfile.json\fP: Specify layer names for individual files. If your shell supports it, you can use a subshell redirect like \fB\fC\-L\fR \fIname\fP\fB\fC:<(cat dir/*.json)\fR to specify a layer name for the output of streamed input.
.RE
.SS Parallel processing of input
.RS
.IP \(bu 2
\fB\fC\-P\fR or \fB\fC\-\-read\-parallel\fR: Use multiple threads to read different parts of each input file at once.
This will only work if the input is line\-delimited JSON with each Feature on its
own line, because it knows nothing of the top\-level structure around the Features. Spurious "EOF" error
messages may result otherwise.
Performance will be better if the input is a named file that can be mapped into memory
rather than a stream that can only be read sequentially.
.RE
.SS Zoom levels and resolution
.PP
If the input file begins with the RFC 8142 \[la]https://tools.ietf.org/html/rfc8142\[ra] record separator,
parallel processing of input will be invoked automatically, splitting at record separators rather
than at all newlines.
.SS Projection of input
.RS
.IP \(bu 2
\-z \fIzoom\fP or \-\-maximum\-zoom=\fIzoom\fP: Maxzoom: the highest zoom level for which tiles are generated (default 14)
\fB\fC\-s\fR \fIprojection\fP or \fB\fC\-\-projection=\fR\fIprojection\fP: Specify the projection of the input data. Currently supported are \fB\fCEPSG:4326\fR (WGS84, the default) and \fB\fCEPSG:3857\fR (Web Mercator). In general you should use WGS84 for your input files if at all possible.
.RE
.SS Zoom levels
.RS
.IP \(bu 2
\-Z \fIzoom\fP or \-\-minimum\-zoom=\fIzoom\fP: Minzoom: the lowest zoom level for which tiles are generated (default 0)
\fB\fC\-z\fR \fIzoom\fP or \fB\fC\-\-maximum\-zoom=\fR\fIzoom\fP: Maxzoom: the highest zoom level for which tiles are generated (default 14)
.IP \(bu 2
\-B \fIzoom\fP or \-\-base\-zoom=\fIzoom\fP: Base zoom, the level at and above which all points are included in the tiles (default maxzoom).
If you use \-Bg, it will guess a zoom level that will keep at most 50,000 features in the densest tile.
You can also specify a marker\-width with \-Bg\fIwidth\fP to allow fewer features in the densest tile to
compensate for the larger marker, or \-Bf\fInumber\fP to allow at most \fInumber\fP features in the densest tile.
\fB\fC\-zg\fR or \fB\fC\-\-maximum\-zoom=g\fR: Guess what is probably a reasonable maxzoom based on the spacing of features.
.IP \(bu 2
\-d \fIdetail\fP or \-\-full\-detail=\fIdetail\fP: Detail at max zoom level (default 12, for tile resolution of 4096)
\fB\fC\-Z\fR \fIzoom\fP or \fB\fC\-\-minimum\-zoom=\fR\fIzoom\fP: Minzoom: the lowest zoom level for which tiles are generated (default 0)
.IP \(bu 2
\-D \fIdetail\fP or \-\-low\-detail=\fIdetail\fP: Detail at lower zoom levels (default 12, for tile resolution of 4096)
\fB\fC\-ae\fR or \fB\fC\-\-extend\-zooms\-if\-still\-dropping\fR: Increase the maxzoom if features are still being dropped at that zoom level.
The detail and simplification options that ordinarily apply only to the maximum zoom level will apply both to the originally
specified maximum zoom and to any levels added beyond that.
.RE
.SS Tile resolution
.RS
.IP \(bu 2
\-m \fIdetail\fP or \-\-minimum\-detail=\fIdetail\fP: Minimum detail that it will try if tiles are too big at regular detail (default 7)
\fB\fC\-d\fR \fIdetail\fP or \fB\fC\-\-full\-detail=\fR\fIdetail\fP: Detail at max zoom level (default 12, for tile resolution of 4096)
.IP \(bu 2
\-b \fIpixels\fP or \-\-buffer=\fIpixels\fP: Buffer size where features are duplicated from adjacent tiles. Units are "screen pixels"\-\-1/256th of the tile width or height. (default 5)
\fB\fC\-D\fR \fIdetail\fP or \fB\fC\-\-low\-detail=\fR\fIdetail\fP: Detail at lower zoom levels (default 12, for tile resolution of 4096)
.IP \(bu 2
\-s \fIprojection\fP or \-\-projection=\fIprojection\fP: Specify the projection of the input data. Currently supported are EPSG:4326 (WGS84, the default) and EPSG:3857 (Web Mercator).
.IP \(bu 2
\-M \fIbytes\fP or \-\-maximum\-tile\-bytes=\fIbytes\fP: Use the specified number of \fIbytes\fP as the maximum compressed tile size instead of 500K.
\fB\fC\-m\fR \fIdetail\fP or \fB\fC\-\-minimum\-detail=\fR\fIdetail\fP: Minimum detail that it will try if tiles are too big at regular detail (default 7)
.RE
.PP
All internal math is done in terms of a 32\-bit tile coordinate system, so 1/(2 of the size of Earth,
or about 1cm, is the smallest distinguishable distance. If \fImaxzoom\fP + \fIdetail\fP > 32, no additional
resolution is obtained than by using a smaller \fImaxzoom\fP or \fIdetail\fP\&.
.SS Properties
.SS Filtering feature attributes
.RS
.IP \(bu 2
\-x \fIname\fP or \-\-exclude=\fIname\fP: Exclude the named properties from all features
\fB\fC\-x\fR \fIname\fP or \fB\fC\-\-exclude=\fR\fIname\fP: Exclude the named properties from all features
.IP \(bu 2
\-y \fIname\fP or \-\-include=\fIname\fP: Include the named properties in all features, excluding all those not explicitly named
\fB\fC\-y\fR \fIname\fP or \fB\fC\-\-include=\fR\fIname\fP: Include the named properties in all features, excluding all those not explicitly named
.IP \(bu 2
\-X or \-\-exclude\-all: Exclude all properties and encode only geometries
\fB\fC\-X\fR or \fB\fC\-\-exclude\-all\fR: Exclude all properties and encode only geometries
.IP \(bu 2
\fB\fC\-T\fR\fIattribute\fP\fB\fC:\fR\fItype\fP or \fB\fC\-\-attribute\-type=\fR\fIattribute\fP\fB\fC:\fR\fItype\fP: Coerce the named feature \fIattribute\fP to be of the specified \fItype\fP\&.
The \fItype\fP may be \fB\fCstring\fR, \fB\fCfloat\fR, \fB\fCint\fR, or \fB\fCbool\fR\&.
If the type is \fB\fCbool\fR, then original attributes of \fB\fC0\fR, \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.
.RE
.SS Point simplification
.SS Dropping a fixed fraction of features by zoom level
.RS
.IP \(bu 2
\-r \fIrate\fP or \-\-drop\-rate=\fIrate\fP: Rate at which dots are dropped at zoom levels below basezoom (default 2.5).
If you use \-rg, it will guess a drop rate that will keep at most 50,000 features in the densest tile.
You can also specify a marker\-width with \-rg\fIwidth\fP to allow fewer features in the densest tile to
compensate for the larger marker, or \-rf\fInumber\fP to allow at most \fInumber\fP features in the densest tile.
\fB\fC\-r\fR \fIrate\fP or \fB\fC\-\-drop\-rate=\fR\fIrate\fP: Rate at which dots are dropped at zoom levels below basezoom (default 2.5).
If you use \fB\fC\-rg\fR, it will guess a drop rate that will keep at most 50,000 features in the densest tile.
You can also specify a marker\-width with \fB\fC\-rg\fR\fIwidth\fP to allow fewer features in the densest tile to
compensate for the larger marker, or \fB\fC\-rf\fR\fInumber\fP to allow at most \fInumber\fP features in the densest tile.
.IP \(bu 2
\-g \fIgamma\fP or \-\-gamma=\fIgamma\fP: Rate at which especially dense dots are dropped (default 0, for no effect). A gamma of 2 reduces the number of dots less than a pixel apart to the square root of their original number.
\fB\fC\-B\fR \fIzoom\fP or \fB\fC\-\-base\-zoom=\fR\fIzoom\fP: Base zoom, the level at and above which all points are included in the tiles (default maxzoom).
If you use \fB\fC\-Bg\fR, it will guess a zoom level that will keep at most 50,000 features in the densest tile.
You can also specify a marker\-width with \fB\fC\-Bg\fR\fIwidth\fP to allow fewer features in the densest tile to
compensate for the larger marker, or \fB\fC\-Bf\fR\fInumber\fP to allow at most \fInumber\fP features in the densest tile.
.IP \(bu 2
\fB\fC\-al\fR or \fB\fC\-\-drop\-lines\fR: Let "dot" dropping at lower zooms apply to lines too
.IP \(bu 2
\fB\fC\-ap\fR or \fB\fC\-\-drop\-polygons\fR: Let "dot" dropping at lower zooms apply to polygons too
.RE
.SS Dropping a fraction of features to keep under tile size limits
.RS
.IP \(bu 2
\fB\fC\-as\fR or \fB\fC\-\-drop\-densest\-as\-needed\fR: If a tile is too large, try to reduce it to under 500K by increasing the minimum spacing between features. The discovered spacing applies to the entire zoom level.
.IP \(bu 2
\fB\fC\-ad\fR or \fB\fC\-\-drop\-fraction\-as\-needed\fR: Dynamically drop some fraction of features from each zoom level to keep large tiles under the 500K size limit. (This is like \fB\fC\-pd\fR but applies to the entire zoom level, not to each tile.)
.IP \(bu 2
\fB\fC\-an\fR or \fB\fC\-\-drop\-smallest\-as\-needed\fR: Dynamically drop the smallest features (physically smallest: the shortest lines or the smallest polygons) from each zoom level to keep large tiles under the 500K size limit. This option will not work for point features.
.IP \(bu 2
\fB\fC\-pd\fR or \fB\fC\-\-force\-feature\-limit\fR: Dynamically drop some fraction of features from large tiles to keep them under the 500K size limit. It will probably look ugly at the tile boundaries. (This is like \fB\fC\-ad\fR but applies to each tile individually, not to the entire zoom level.) You probably don't want to use this.
.RE
.SS Dropping tightly overlapping features
.RS
.IP \(bu 2
\fB\fC\-g\fR \fIgamma\fP or \fB\fC\-\-gamma=_gamma\fR_: Rate at which especially dense dots are dropped (default 0, for no effect). A gamma of 2 reduces the number of dots less than a pixel apart to the square root of their original number.
.IP \(bu 2
\fB\fC\-aG\fR or \fB\fC\-\-increase\-gamma\-as\-needed\fR: If a tile is too large, try to reduce it to under 500K by increasing the \fB\fC\-g\fR gamma. The discovered gamma applies to the entire zoom level. You probably want to use \fB\fC\-\-drop\-densest\-as\-needed\fR instead.
.RE
.SS Line and polygon simplification
.RS
.IP \(bu 2
\-S \fIscale\fP or \-\-simplification=\fIscale\fP: Multiply the tolerance for line and polygon simplification by \fIscale\fP\&. The standard tolerance tries to keep
\fB\fC\-S\fR \fIscale\fP or \fB\fC\-\-simplification=\fR\fIscale\fP: Multiply the tolerance for line and polygon simplification by \fIscale\fP\&. The standard tolerance tries to keep
the line or polygon within one tile unit of its proper location. You can probably go up to about 10 without too much visible difference.
.IP \(bu 2
\fB\fC\-ps\fR or \fB\fC\-\-no\-line\-simplification\fR: Don't simplify lines and polygons
.IP \(bu 2
\fB\fC\-pS\fR or \fB\fC\-\-simplify\-only\-low\-zooms\fR: Don't simplify lines and polygons at maxzoom (but do simplify at lower zooms)
.IP \(bu 2
\fB\fC\-pt\fR or \fB\fC\-\-no\-tiny\-polygon\-reduction\fR: Don't combine the area of very small polygons into small squares that represent their combined area.
.RE
.SS Doing more
.SS Attempts to improve shared polygon boundaries
.RS
.IP \(bu 2
\-ac or \-\-coalesce: Coalesce adjacent line and polygon features that have the same properties.
Note that when overlapping polygons are coalesced, the overlapping region is treated as a hole,
which may not be what you want.
\fB\fC\-ab\fR or \fB\fC\-\-detect\-shared\-borders\fR: In the manner of TopoJSON \[la]https://github.com/mbostock/topojson/wiki/Introduction\[ra], detect borders that are shared between multiple polygons and simplify them identically in each polygon. This takes more time and memory than considering each polygon individually.
.IP \(bu 2
\-ar or \-\-reverse: Try reversing the directions of lines to make them coalesce and compress better
.IP \(bu 2
\-ao or \-\-reorder: Reorder features to put ones with the same properties in sequence, to try to get them to coalesce
.IP \(bu 2
\-al or \-\-drop\-lines: Let "dot" dropping at lower zooms apply to lines too
.IP \(bu 2
\-ap or \-\-drop\-polygons: Let "dot" dropping at lower zooms apply to polygons too
.IP \(bu 2
\-ag or \-\-calculate\-feature\-density: Add a new attribute, \fB\fCtippecanoe_feature_density\fR, to each feature, to record how densely features are spaced in that area of the tile. You can use this attribute in the style to produce a glowing effect where points are densely packed. It can range from 0 in the sparsest areas to 255 in the densest.
.IP \(bu 2
\-ab or \-\-detect\-shared\-borders: In the manner of TopoJSON \[la]https://github.com/mbostock/topojson/wiki/Introduction\[ra], detect borders that are shared between multiple polygons and simplify them identically in each polygon. This takes more time and memory than considering each polygon individually.
.IP \(bu 2
\-aG or \-\-increase\-gamma\-as\-needed: If a tile is too large, try to reduce it to under 500K by increasing the \fB\fC\-g\fR gamma. The discovered gamma applies to the entire zoom level.
.IP \(bu 2
\-as or \-\-drop\-densest\-as\-needed: If a tile is too large, try to reduce it to under 500K by increasing the minimum spacing between features. The discovered spacing applies to the entire zoom level.
.IP \(bu 2
\-ad or \-\-drop\-fraction\-as\-needed: Dynamically drop some fraction of features from each zoom level to keep large tiles under the 500K size limit. (This is like \fB\fC\-pd\fR but applies to the entire zoom level, not to each tile.)
.IP \(bu 2
\-an or \-\-drop\-smallest\-as\-needed: Dynamically drop the smallest features (physically smallest: the shortest lines or the smallest polygons) from each zoom level to keep large tiles under the 500K size limit. This option will not work for point features.
.IP \(bu 2
\-aL or \-\-grid\-low\-zooms: At all zoom levels below \fImaxzoom\fP, snap all lines and polygons to a stairstep grid instead of allowing diagonals. You will also want to specify a tile resolution, probably \fB\fC\-D8\fR\&. This option provides a way to display continuous parcel, gridded, or binned data at low zooms without overwhelming the tiles with tiny polygons, since features will either get stretched out to the grid unit or lost entirely, depending on how they happened to be aligned in the original data.
\fB\fC\-aL\fR or \fB\fC\-\-grid\-low\-zooms\fR: At all zoom levels below \fImaxzoom\fP, snap all lines and polygons to a stairstep grid instead of allowing diagonals. You will also want to specify a tile resolution, probably \fB\fC\-D8\fR\&. This option provides a way to display continuous parcel, gridded, or binned data at low zooms without overwhelming the tiles with tiny polygons, since features will either get stretched out to the grid unit or lost entirely, depending on how they happened to be aligned in the original data. You probably don't want to use this.
.RE
.SS Doing less
.SS Controlling clipping to tile boundaries
.RS
.IP \(bu 2
\-ps or \-\-no\-line\-simplification: Don't simplify lines
\fB\fC\-b\fR \fIpixels\fP or \fB\fC\-\-buffer=\fR\fIpixels\fP: Buffer size where features are duplicated from adjacent tiles. Units are "screen pixels"—1/256th of the tile width or height. (default 5)
.IP \(bu 2
\-pS or \-\-simplify\-only\-low\-zooms: Don't simplify lines at maxzoom (but do simplify at lower zooms)
\fB\fC\-pc\fR or \fB\fC\-\-no\-clipping\fR: Don't clip features to the size of the tile. If a feature overlaps the tile's bounds or buffer at all, it is included completely. Be careful: this can produce very large tilesets, especially with large polygons.
.IP \(bu 2
\-pf or \-\-no\-feature\-limit: Don't limit tiles to 200,000 features
.IP \(bu 2
\-pk or \-\-no\-tile\-size\-limit: Don't limit tiles to 500K bytes
.IP \(bu 2
\-pd or \-\-force\-feature\-limit: Dynamically drop some fraction of features from large tiles to keep them under the 500K size limit. It will probably look ugly at the tile boundaries. (This is like \fB\fC\-ad\fR but applies to each tile individually, not to the entire zoom level.)
.IP \(bu 2
\-pi or \-\-preserve\-input\-order: Preserve the original input order of features as the drawing order instead of ordering geographically. (This is implemented as a restoration of the original order at the end, so that dot\-dropping is still geographic, which means it also undoes \-ao).
.IP \(bu 2
\-pp or \-\-no\-polygon\-splitting: Don't split complex polygons (over 700 vertices after simplification) into multiple features.
.IP \(bu 2
\-pc or \-\-no\-clipping: Don't clip features to the size of the tile. If a feature overlaps the tile's bounds or buffer at all, it is included completely. Be careful: this can produce very large tilesets, especially with large polygons.
.IP \(bu 2
\-pD or \-\-no\-duplication: As with \-\-no\-clipping, each feature is included intact instead of cut to tile boundaries. In addition, it is included only in a single tile per zoom level rather than potentially in multiple copies. Clients of the tileset must check adjacent tiles (possibly some distance away) to ensure they have all features.
.IP \(bu 2
\-pt or \-\-no\-tiny\-polygon\-reduction: Don't combine the area of very small polygons into small squares that represent their combined area.
.IP \(bu 2
\-q or \-\-quiet: Work quietly instead of reporting progress
\fB\fC\-pD\fR or \fB\fC\-\-no\-duplication\fR: As with \fB\fC\-\-no\-clipping\fR, each feature is included intact instead of cut to tile boundaries. In addition, it is included only in a single tile per zoom level rather than potentially in multiple copies. Clients of the tileset must check adjacent tiles (possibly some distance away) to ensure they have all features.
.RE
.SS Reordering features within each tile
.RS
.IP \(bu 2
\fB\fC\-pi\fR or \fB\fC\-\-preserve\-input\-order\fR: Preserve the original input order of features as the drawing order instead of ordering geographically. (This is implemented as a restoration of the original order at the end, so that dot\-dropping is still geographic, which means it also undoes \fB\fC\-ao\fR).
.IP \(bu 2
\fB\fC\-ao\fR or \fB\fC\-\-reorder\fR: Reorder features to put ones with the same properties in sequence, to try to get them to coalesce. You probably don't want to use this.
.IP \(bu 2
\fB\fC\-ac\fR or \fB\fC\-\-coalesce\fR: Coalesce adjacent line and polygon features that have the same properties. You probably don't want to use this.
.IP \(bu 2
\fB\fC\-ar\fR or \fB\fC\-\-reverse\fR: Try reversing the directions of lines to make them coalesce and compress better. You probably don't want to use this.
.RE
.SS Adding calculated attributes
.RS
.IP \(bu 2
\fB\fC\-ag\fR or \fB\fC\-\-calculate\-feature\-density\fR: Add a new attribute, \fB\fCtippecanoe_feature_density\fR, to each feature, to record how densely features are spaced in that area of the tile. You can use this attribute in the style to produce a glowing effect where points are densely packed. It can range from 0 in the sparsest areas to 255 in the densest.
.RE
.SS Trying to correct bad source geometry
.RS
.IP \(bu 2
\fB\fC\-aw\fR or \fB\fC\-\-detect\-longitude\-wraparound\fR: Detect when adjacent points within a feature jump to the other side of the world, and try to fix the geometry.
.RE
.SS Setting or disabling tile size limits
.RS
.IP \(bu 2
\fB\fC\-M\fR \fIbytes\fP or \fB\fC\-\-maximum\-tile\-bytes=\fR\fIbytes\fP: Use the specified number of \fIbytes\fP as the maximum compressed tile size instead of 500K.
.IP \(bu 2
\fB\fC\-pf\fR or \fB\fC\-\-no\-feature\-limit\fR: Don't limit tiles to 200,000 features
.IP \(bu 2
\fB\fC\-pk\fR or \fB\fC\-\-no\-tile\-size\-limit\fR: Don't limit tiles to 500K bytes
.IP \(bu 2
\fB\fC\-pC\fR or \fB\fC\-\-no\-tile\-compression\fR: Don't compress the PBF vector tile data.
.RE
.SS Temporary storage
.RS
.IP \(bu 2
\fB\fC\-t\fR \fIdirectory\fP or \fB\fC\-\-temporary\-directory=\fR\fIdirectory\fP: Put the temporary files in \fIdirectory\fP\&.
If you don't specify, it will use \fB\fC/tmp\fR\&.
.RE
.SS Progress indicator
.RS
.IP \(bu 2
\fB\fC\-q\fR or \fB\fC\-\-quiet\fR: Work quietly instead of reporting progress
.IP \(bu 2
\fB\fC\-v\fR or \fB\fC\-\-version\fR: Report Tippecanoe's version number
.RE
.SH Environment
.PP
Tippecanoe ordinarily uses as many parallel threads as the operating system claims that CPUs are available.
You can override this number by setting the \fB\fCTIPPECANOE_MAX_THREADS\fR environmental variable.
.SH Example
.PP
.RS
@ -297,9 +398,6 @@ have their probability diffused, so that some of them will be drawn as a square
this minimum size and others will not be drawn at all, preserving the total area that
all of them should have had together.
.PP
Any polygons that have over 700 vertices after line simplification will be split into
multiple features so they can be rendered efficiently, unless you use \-pp to prevent this.
.PP
Features in the same tile that share the same type and attributes are coalesced
together into a single geometry if you use \fB\fC\-\-coalesce\fR\&. You are strongly encouraged to use \-x to exclude
any unnecessary properties to reduce wasted file size.
@ -335,7 +433,7 @@ make install
.fi
.RE
.PP
Tippecanoe now requires features from the 2014 C++ standard. If your compiler is older than
Tippecanoe now requires features from the 2011 C++ standard. If your compiler is older than
that, you will need to install a newer one. On MacOS, updating to the lastest XCode should
get you a new enough version of \fB\fCclang++\fR\&. On Linux, you should be able to upgrade \fB\fCg++\fR with
.PP
@ -355,28 +453,47 @@ Check out some examples of maps made with tippecanoe \[la]MADE_WITH.md\[ra]
The name is a joking reference \[la]http://en.wikipedia.org/wiki/Tippecanoe_and_Tyler_Too\[ra] to a "tiler" for making map tiles.
.SH tile\-join
.PP
Tile\-join is a tool for joining new attributes from a CSV file to features that
have already been tiled with tippecanoe. It reads the tiles from an existing .mbtiles
file, matches them against the records of the CSV, and writes out a new tileset.
Tile\-join is a tool for joining new attributes from a CSV file to features
that have already been tiled with tippecanoe. It reads the tiles from an
existing .mbtiles file or a directory of tiles, matches them against the
records of the CSV, and writes out a new tileset.
.PP
If you specify multiple source mbtiles files, they are all read and their combined
contents are written to the new mbtiles output. If they define the same layers or
the same tiles, the layers or tiles are merged.
If you specify multiple source mbtiles files or source directories of tiles,
all the sources are read and their combined contents are written to the new
mbtiles output. If they define the same layers or the same tiles, the layers
or tiles are merged.
.PP
You can use the \fB\fC\-e\fR flag to output a directory of tiles rather than a
\&.mbtiles file.
.PP
The options are:
.RS
.IP \(bu 2
\-o \fIout.mbtiles\fP: Write the new tiles to the specified .mbtiles file
\fB\fC\-o\fR \fIout.mbtiles\fP or \fB\fC\-\-output=\fR\fIout.mbtiles\fP: Write the new tiles to the specified .mbtiles file.
.IP \(bu 2
\-f: Remove \fIout.mbtiles\fP if it already exists
\fB\fC\-e\fR \fIdirectory\fP or \fB\fC\-\-output\-to\-directory=\fR\fIdirectory\fP: Write the new tiles to the specified directory instead of to an mbtiles file.
.IP \(bu 2
\-c \fImatch.csv\fP: Use \fImatch.csv\fP as the source for new attributes to join to the features. The first line of the file should be the key names; the other lines are values. The first column is the one to match against the existing features; the other columns are the new data to add.
\fB\fC\-f\fR or \fB\fC\-\-force\fR: Remove \fIout.mbtiles\fP if it already exists.
.IP \(bu 2
\-x \fIkey\fP: Remove attributes of type \fIkey\fP from the output. You can use this to remove the field you are matching against if you no longer need it after joining, or to remove any other attributes you don't want.
\fB\fC\-c\fR \fImatch\fP\fB\fC\&.csv\fR or \fB\fC\-\-csv=\fR\fImatch\fP\fB\fC\&.csv\fR: Use \fImatch\fP\fB\fC\&.csv\fR as the source for new attributes to join to the features. The first line of the file should be the key names; the other lines are values. The first column is the one to match against the existing features; the other columns are the new data to add.
.IP \(bu 2
\-i: Only include features that matched the CSV.
\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
\-pk: Don't skip tiles larger than 500K.
\fB\fC\-i\fR or \fB\fC\-\-if\-matched\fR: Only include features that matched the CSV.
.IP \(bu 2
\fB\fC\-pk\fR or \fB\fC\-\-no\-tile\-size\-limit\fR: Don't skip tiles larger than 500K.
.IP \(bu 2
\fB\fC\-pC\fR or \fB\fC\-\-no\-tile\-compression\fR: Don't compress the PBF vector tile data.
.IP \(bu 2
\fB\fC\-l\fR \fIlayer\fP or \fB\fC\-\-layer=\fR\fIlayer\fP: Include the named layer in the output. You can specify multiple \fB\fC\-l\fR options to keep multiple layers. If you don't specify, they will all be retained.
.IP \(bu 2
\fB\fC\-L\fR \fIlayer\fP or \fB\fC\-\-exclude\-layer=\fR\fIlayer\fP: Remove the named layer from the output. You can specify multiple \fB\fC\-L\fR options to remove multiple layers.
.IP \(bu 2
\fB\fC\-A\fR \fIattribution\fP or \fB\fC\-\-attribution=\fR\fIattribution\fP: Set the attribution string.
.IP \(bu 2
\fB\fC\-n\fR \fIname\fP or \fB\fC\-\-name=\fR\fIname\fP: Set the tileset name.
.IP \(bu 2
\fB\fC\-N\fR \fIdescription\fP or \fB\fC\-\-description=\fR\fIdescription\fP: Set the tileset description.
.RE
.PP
Because tile\-join just copies the geometries to the new .mbtiles without processing them
@ -475,5 +592,13 @@ resolutions.
.SS Options
.RS
.IP \(bu 2
\-t \fIprojection\fP: Specify the projection of the output data. Currently supported are EPSG:4326 (WGS84, the default) and EPSG:3857 (Web Mercator).
\fB\fC\-s\fR \fIprojection\fP or \fB\fC\-\-projection=\fR\fIprojection\fP: Specify the projection of the output data. Currently supported are EPSG:4326 (WGS84, the default) and EPSG:3857 (Web Mercator).
.IP \(bu 2
\fB\fC\-z\fR \fImaxzoom\fP or \fB\fC\-\-maximum\-zoom=\fR\fImaxzoom\fP: Specify the highest zoom level to decode from the tileset
.IP \(bu 2
\fB\fC\-Z\fR \fIminzoom\fP or \fB\fC\-\-minimum\-zoom=\fR\fIminzoom\fP: Specify the lowest zoom level to decode from the tileset
.IP \(bu 2
\fB\fC\-l\fR \fIlayer\fP or \fB\fC\-\-layer=\fR\fIlayer\fP: Decode only layers with the specified names. (Multiple \fB\fC\-l\fR options can be specified.)
.IP \(bu 2
\fB\fC\-f\fR or \fB\fC\-\-force\fR: Decode tiles even if polygon ring order or closure problems are detected
.RE

View File

@ -0,0 +1,466 @@
#include <mapbox/geometry/geometry.hpp>
#include <math.h>
#include <map>
#include <set>
#include <vector>
#include <algorithm>
#include <cmath>
namespace mapbox {
namespace geometry {
template <typename T>
void add_vertical(size_t intermediate, size_t which_end, size_t into, std::vector<std::vector<point<T>>> &segments, bool &again, std::vector<size_t> &nexts) {
again = true;
std::vector<point<T>> dv;
dv.push_back(segments[intermediate][which_end]);
dv.push_back(segments[into][1]);
segments.push_back(dv);
segments[into][1] = segments[intermediate][which_end];
nexts.push_back(nexts[into]);
nexts[into] = nexts.size() - 1;
}
template <typename T>
void add_horizontal(size_t intermediate, size_t which_end, size_t into, std::vector<std::vector<point<T>>> &segments, bool &again, std::vector<size_t> &nexts) {
again = true;
T x = segments[intermediate][which_end].x;
T y = segments[intermediate][0].y +
(segments[intermediate][which_end].x - segments[intermediate][0].x) *
(segments[intermediate][1].y - segments[intermediate][0].y) /
(segments[intermediate][1].x - segments[intermediate][0].x);
point<T> d(x, y);
std::vector<point<T>> dv;
dv.push_back(d);
dv.push_back(segments[into][1]);
segments.push_back(dv);
segments[into][1] = d;
nexts.push_back(nexts[into]);
nexts[into] = nexts.size() - 1;
}
template <typename T>
void warn(std::vector<std::vector<point<T>>> &segments, size_t a, size_t b, bool do_warn) {
if (do_warn) {
fprintf(stderr, "%lld,%lld to %lld,%lld intersects %lld,%lld to %lld,%lld\n",
(long long) segments[a][0].x, (long long) segments[a][0].y,
(long long) segments[a][1].x, (long long) segments[a][1].y,
(long long) segments[b][0].x, (long long) segments[b][0].y,
(long long) segments[b][1].x, (long long) segments[b][1].y);
}
}
template <typename T>
void check_intersection(std::vector<std::vector<point<T>>> &segments, size_t a, size_t b, bool &again, std::vector<size_t> &nexts, bool do_warn, bool endpoint_ok) {
T s10_x = segments[a][1].x - segments[a][0].x;
T s10_y = segments[a][1].y - segments[a][0].y;
T s32_x = segments[b][1].x - segments[b][0].x;
T s32_y = segments[b][1].y - segments[b][0].y;
// http://stackoverflow.com/questions/563198/how-do-you-detect-where-two-line-segments-intersect
T denom = s10_x * s32_y - s32_x * s10_y;
if (denom == 0) {
// They are parallel or collinear. Find out if they are collinear.
// http://www.cpsc.ucalgary.ca/~marina/papers/Segment_intersection.ps
T ccw =
segments[a][0].x * segments[a][1].y +
segments[a][1].x * segments[b][0].y +
segments[b][0].x * segments[a][0].y -
segments[a][0].x * segments[b][0].y -
segments[a][1].x * segments[a][0].y -
segments[b][0].x * segments[a][1].y;
if (ccw == 0) {
if (segments[a][0].x == segments[a][1].x) {
// Vertical
T amin, amax, bmin, bmax;
if (segments[a][0].y < segments[a][1].y) {
amin = segments[a][0].y;
amax = segments[a][1].y;
} else {
amin = segments[a][1].y;
amax = segments[a][0].y;
}
if (segments[b][0].y < segments[b][1].y) {
bmin = segments[b][0].y;
bmax = segments[b][1].y;
} else {
bmin = segments[b][1].y;
bmax = segments[b][0].y;
}
// All of these transformations preserve verticality so we can check multiple cases
if (segments[b][0].y > amin && segments[b][0].y < amax) {
// B0 is in A
warn(segments, a, b, do_warn);
add_vertical(b, 0, a, segments, again, nexts);
}
if (segments[b][1].y > amin && segments[b][1].y < amax) {
// B1 is in A
warn(segments, a, b, do_warn);
add_vertical(b, 1, a, segments, again, nexts);
}
if (segments[a][0].y > bmin && segments[a][0].y < bmax) {
// A0 is in B
warn(segments, a, b, do_warn);
add_vertical(a, 0, b, segments, again, nexts);
}
if (segments[a][1].y > bmin && segments[a][1].y < bmax) {
// A1 is in B
warn(segments, a, b, do_warn);
add_vertical(a, 1, b, segments, again, nexts);
}
} else {
// Horizontal or diagonal
T amin, amax, bmin, bmax;
if (segments[a][0].x < segments[a][1].x) {
amin = segments[a][0].x;
amax = segments[a][1].x;
} else {
amin = segments[a][1].x;
amax = segments[a][0].x;
}
if (segments[b][0].x < segments[b][1].x) {
bmin = segments[b][0].x;
bmax = segments[b][1].x;
} else {
bmin = segments[b][1].x;
bmax = segments[b][0].x;
}
// Don't check multiples, because rounding may corrupt collinearity
if (segments[b][0].x > amin && segments[b][0].x < amax) {
// B0 is in A
add_horizontal(b, 0, a, segments, again, nexts);
warn(segments, a, b, do_warn);
} else if (segments[b][1].x > amin && segments[b][1].x < amax) {
// B1 is in A
add_horizontal(b, 1, a, segments, again, nexts);
warn(segments, a, b, do_warn);
} else if (segments[a][0].x > bmin && segments[a][0].x < bmax) {
// A0 is in B
warn(segments, a, b, do_warn);
add_horizontal(a, 0, b, segments, again, nexts);
} else if (segments[a][1].x > bmin && segments[a][1].x < bmax) {
// A1 is in B
warn(segments, a, b, do_warn);
add_horizontal(a, 1, b, segments, again, nexts);
}
}
}
} else {
// Neither parallel nor collinear, so may intersect at a single point
T s02_x = segments[a][0].x - segments[b][0].x;
T s02_y = segments[a][0].y - segments[b][0].y;
double s = (s10_x * s02_y - s10_y * s02_x) / (long double) denom;
double t = (s32_x * s02_y - s32_y * s02_x) / (long double) denom;
if (t >= 0 && t <= 1 && s >= 0 && s <= 1) {
T x = (T) round(segments[a][0].x + t * s10_x);
T y = (T) round(segments[a][0].y + t * s10_y);
if ((t > 0 && t < 1 && s > 0 && s < 1) || !endpoint_ok) {
if (t >= 0 && t <= 1) {
if ((x != segments[a][0].x || y != segments[a][0].y) && (x != segments[a][1].x || y != segments[a][1].y)) {
warn(segments, a, b, do_warn);
// splitting a
std::vector<point<T>> dv;
dv.push_back(point<T>(x, y));
dv.push_back(segments[a][1]);
segments.push_back(dv);
segments[a][1] = point<T>(x, y);
nexts.push_back(nexts[a]);
nexts[a] = nexts.size() - 1;
again = true;
}
}
if (s >= 0 && s <= 1) {
if ((x != segments[b][0].x || y != segments[b][0].y) && (x != segments[b][1].x || y != segments[b][1].y)) {
// splitting b
warn(segments, a, b, do_warn);
std::vector<point<T>> dv;
dv.push_back(point<T>(x, y));
dv.push_back(segments[b][1]);
segments.push_back(dv);
segments[b][1] = point<T>(x, y);
nexts.push_back(nexts[b]);
nexts[b] = nexts.size() - 1;
again = true;
}
}
}
}
}
}
template <typename T>
void partition(std::vector<std::vector<point<T>>> &segs, std::vector<size_t> &subset, int direction, std::set<std::pair<size_t, size_t>> &possible) {
std::vector<T> points;
// List of X or Y midpoints of edges, so we can find the median
if (direction == 0) {
for (size_t i = 0; i < subset.size(); i++) {
points.push_back((segs[subset[i]][0].x + segs[subset[i]][1].x) / 2);
}
} else {
for (size_t i = 0; i < subset.size(); i++) {
points.push_back((segs[subset[i]][0].y + segs[subset[i]][1].y) / 2);
}
}
if (points.size() == 0) {
return;
}
size_t mid = points.size() / 2;
std::nth_element(points.begin(), points.begin() + mid, points.end());
T median = points[mid];
// Partition into sets that are above or below, or to the left or to the right of, the median.
// Segments that cross the median appear in both.
std::vector<size_t> one;
std::vector<size_t> two;
if (direction == 0) {
for (size_t i = 0; i < subset.size(); i++) {
if (segs[subset[i]][0].x <= median || segs[subset[i]][1].x <= median) {
one.push_back(subset[i]);
}
if (segs[subset[i]][0].x >= median || segs[subset[i]][1].x >= median) {
two.push_back(subset[i]);
}
}
} else {
for (size_t i = 0; i < subset.size(); i++) {
if (segs[subset[i]][0].y <= median || segs[subset[i]][1].y <= median) {
one.push_back(subset[i]);
}
if (segs[subset[i]][0].y >= median || segs[subset[i]][1].y >= median) {
two.push_back(subset[i]);
}
}
}
if (one.size() >= subset.size() || two.size() >= subset.size()) {
for (size_t i = 0; i < subset.size(); i++) {
for (size_t j = i + 1; j < subset.size(); j++) {
possible.insert(std::pair<size_t, size_t>(subset[i], subset[j]));
}
}
} else {
// By experiment, stopping at 10 is a little faster than either 5 or 20
if (one.size() < 10) {
for (size_t i = 0; i < one.size(); i++) {
for (size_t j = i + 1; j < one.size(); j++) {
possible.insert(std::pair<size_t, size_t>(one[i], one[j]));
}
}
} else {
partition(segs, one, !direction, possible);
}
if (two.size() < 10) {
for (size_t i = 0; i < two.size(); i++) {
for (size_t j = i + 1; j < two.size(); j++) {
possible.insert(std::pair<size_t, size_t>(two[i], two[j]));
}
}
} else {
partition(segs, two, !direction, possible);
}
}
}
template <typename T>
std::vector<std::vector<point<T>>> intersect_segments(std::vector<std::vector<point<T>>> segments, std::vector<size_t> &nexts, bool do_warn, bool endpoint_ok) {
bool again = true;
while (again) {
again = false;
std::set<std::pair<size_t, size_t>> possible;
std::vector<size_t> subset;
for (size_t i = 0; i < segments.size(); i++) {
subset.push_back(i);
}
partition(segments, subset, 0, possible);
for (auto it = possible.begin(); it != possible.end(); ++it) {
check_intersection(segments, it->first, it->second, again, nexts, do_warn, endpoint_ok);
}
}
return segments;
}
template <typename T>
linear_ring<T> remove_collinear(linear_ring<T> ring) {
linear_ring<T> out;
size_t len = ring.size() - 1; // Exclude duplicated last point
for (size_t j = 0; j < len; j++) {
long long ccw =
ring[(j + len - 1) % len].x * ring[(j + len - 0) % len].y +
ring[(j + len - 0) % len].x * ring[(j + len + 1) % len].y +
ring[(j + len + 1) % len].x * ring[(j + len - 1) % len].y -
ring[(j + len - 1) % len].x * ring[(j + len + 1) % len].y -
ring[(j + len - 0) % len].x * ring[(j + len - 1) % len].y -
ring[(j + len + 1) % len].x * ring[(j + len - 0) % len].y;
if (ccw != 0) {
out.push_back(ring[j]);
}
if (ring.size() > 0 && ring[0] != ring[ring.size() - 1]) {
ring.push_back(ring[0]);
}
}
return out;
}
template <typename T>
multi_polygon<T> snap_round(multi_polygon<T> geom, bool do_warn, bool endpoint_ok) {
std::vector<std::vector<point<T>>> segments;
std::vector<size_t> nexts;
std::vector<std::vector<size_t>> ring_starts;
// Crunch out any 0-length segments
for (size_t i = 0; i < geom.size(); i++) {
for (size_t j = 0; j < geom[i].size(); j++) {
for (ssize_t k = geom[i][j].size() - 1; k > 0; k--) {
if (geom[i][j][k] == geom[i][j][k - 1]) {
geom[i][j].erase(geom[i][j].begin() + k);
}
}
}
}
for (size_t i = 0; i < geom.size(); i++) {
ring_starts.push_back(std::vector<size_t>());
for (size_t j = 0; j < geom[i].size(); j++) {
size_t s = geom[i][j].size();
if (s > 1) {
ring_starts[i].push_back(segments.size());
size_t first = nexts.size();
for (size_t k = 0; k + 1 < s; k++) {
std::vector<point<T>> dv;
dv.push_back(geom[i][j][k]);
dv.push_back(geom[i][j][k + 1]);
segments.push_back(dv);
nexts.push_back(nexts.size() + 1);
}
// Fabricate a point if ring was not closed
if (geom[i][j][0] != geom[i][j][s - 1]) {
std::vector<point<T>> dv;
dv.push_back(geom[i][j][s - 1]);
dv.push_back(geom[i][j][0]);
segments.push_back(dv);
nexts.push_back(nexts.size() + 1);
}
// Last point of ring points back to first
nexts[nexts.size() - 1] = first;
}
}
}
segments = intersect_segments(segments, nexts, do_warn, endpoint_ok);
multi_polygon<T> mp;
for (size_t i = 0; i < ring_starts.size(); i++) {
mp.push_back(polygon<T>());
for (size_t j = 0; j < ring_starts[i].size(); j++) {
mp[i].push_back(linear_ring<T>());
size_t k = ring_starts[i][j];
do {
mp[i][j].push_back(segments[k][0]);
k = nexts[k];
} while (k != ring_starts[i][j]);
mp[i][j].push_back(segments[ring_starts[i][j]][0]);
}
}
return mp;
}
template <typename T>
multi_line_string<T> snap_round(multi_line_string<T> geom, bool do_warn, bool endpoint_ok) {
std::vector<std::vector<point<T>>> segments;
std::vector<size_t> nexts;
std::vector<size_t> ring_starts;
// Crunch out any 0-length segments
for (size_t j = 0; j < geom.size(); j++) {
for (ssize_t k = geom[j].size() - 1; k > 0; k--) {
if (geom[j][k] == geom[j][k - 1]) {
geom[j].erase(geom[j].begin() + k);
}
}
}
for (size_t j = 0; j < geom.size(); j++) {
size_t s = geom[j].size();
if (s > 1) {
ring_starts.push_back(segments.size());
size_t first = nexts.size();
for (size_t k = 0; k + 1 < s; k++) {
std::vector<point<T>> dv;
dv.push_back(geom[j][k]);
dv.push_back(geom[j][k + 1]);
segments.push_back(dv);
nexts.push_back(nexts.size() + 1);
}
// Last point of ring points back to first
nexts[nexts.size() - 1] = first;
}
}
segments = intersect_segments(segments, nexts, do_warn, endpoint_ok);
multi_line_string<T> mp;
for (size_t j = 0; j < ring_starts.size(); j++) {
mp.push_back(line_string<T>());
size_t k = ring_starts[j];
size_t last = k;
do {
mp[j].push_back(segments[k][0]);
last = k;
k = nexts[k];
} while (k != ring_starts[j]);
mp[j].push_back(segments[last][1]);
}
return mp;
}
}
}

View File

@ -5,11 +5,6 @@
#include <mapbox/geometry/polygon.hpp>
#include <mapbox/geometry/wagyu/wagyu.hpp>
#include <experimental/optional>
template <typename T>
using optional_linear_ring = std::experimental::optional<mapbox::geometry::linear_ring<T>>;
namespace mapbox {
namespace geometry {
namespace wagyu {
@ -61,7 +56,7 @@ bool inside(mapbox::geometry::point<T> p, size_t edge, mapbox::geometry::box<T>
}
template <typename T>
optional_linear_ring<T> quick_lr_clip(mapbox::geometry::linear_ring<T> const& ring,
mapbox::geometry::linear_ring<T> quick_lr_clip(mapbox::geometry::linear_ring<T> const& ring,
mapbox::geometry::box<T> const& b) {
mapbox::geometry::linear_ring<T> out = ring;
@ -89,13 +84,14 @@ optional_linear_ring<T> quick_lr_clip(mapbox::geometry::linear_ring<T> const& ri
}
if (out.size() < 3) {
return optional_linear_ring<T>();
out.clear();
return out;
}
// Close the ring if the first/last point was outside
if (out[0] != out[out.size() - 1]) {
out.push_back(out[0]);
}
return optional_linear_ring<T>(std::move(out));
return out;
}
}
@ -107,8 +103,8 @@ mapbox::geometry::multi_polygon<T> clip(mapbox::geometry::polygon<T> const& poly
wagyu<T> clipper;
for (auto const& lr : poly) {
auto new_lr = quick_clip::quick_lr_clip(lr, b);
if (new_lr) {
clipper.add_ring(*new_lr, polygon_type_subject);
if (!new_lr.empty()) {
clipper.add_ring(new_lr, polygon_type_subject);
}
}
clipper.execute(clip_type_union, result, subject_fill_type, fill_type_even_odd);
@ -124,8 +120,8 @@ mapbox::geometry::multi_polygon<T> clip(mapbox::geometry::multi_polygon<T> const
for (auto const& poly : mp) {
for (auto const& lr : poly) {
auto new_lr = quick_clip::quick_lr_clip(lr, b);
if (new_lr) {
clipper.add_ring(*new_lr, polygon_type_subject);
if (!new_lr.empty()) {
clipper.add_ring(new_lr, polygon_type_subject);
}
}
}

View File

@ -15,6 +15,12 @@
#include <mapbox/geometry/wagyu/topology_correction.hpp>
#include <mapbox/geometry/wagyu/vatti.hpp>
#define WAGYU_MAJOR_VERSION 0
#define WAGYU_MINOR_VERSION 3
#define WAGYU_PATCH_VERSION 0
#define WAGYU_VERSION (WAGYU_MAJOR_VERSION * 100000) + (WAGYU_MINOR_VERSION * 100) + (WAGYU_PATCH_VERSION)
namespace mapbox {
namespace geometry {
namespace wagyu {

View File

@ -11,10 +11,8 @@
#include <string>
#include <set>
#include <map>
#include "main.hpp"
#include "pool.hpp"
#include "mvt.hpp"
#include "mbtiles.hpp"
#include "geometry.hpp"
sqlite3 *mbtiles_open(char *dbname, char **argv, int forcetable) {
sqlite3 *outdb;
@ -133,11 +131,23 @@ bool type_and_string::operator<(const type_and_string &o) const {
return false;
}
void mbtiles_write_metadata(sqlite3 *outdb, const char *fname, int minzoom, int maxzoom, double minlat, double minlon, double maxlat, double maxlon, double midlat, double midlon, int forcetable, const char *attribution, std::map<std::string, layermap_entry> const &layermap) {
void mbtiles_write_metadata(sqlite3 *outdb, const char *outdir, const char *fname, int minzoom, int maxzoom, double minlat, double minlon, double maxlat, double maxlon, double midlat, double midlon, int forcetable, const char *attribution, std::map<std::string, layermap_entry> const &layermap, bool vector, const char *description) {
char *sql, *err;
sqlite3 *db = outdb;
if (outdb == NULL) {
if (sqlite3_open("", &db) != SQLITE_OK) {
fprintf(stderr, "Temporary db: %s\n", sqlite3_errmsg(db));
exit(EXIT_FAILURE);
}
if (sqlite3_exec(db, "CREATE TABLE metadata (name text, value text);", NULL, NULL, &err) != SQLITE_OK) {
fprintf(stderr, "Create metadata table: %s\n", err);
exit(EXIT_FAILURE);
}
}
sql = sqlite3_mprintf("INSERT INTO metadata (name, value) VALUES ('name', %Q);", fname);
if (sqlite3_exec(outdb, sql, NULL, NULL, &err) != SQLITE_OK) {
if (sqlite3_exec(db, sql, NULL, NULL, &err) != SQLITE_OK) {
fprintf(stderr, "set name in metadata: %s\n", err);
if (!forcetable) {
exit(EXIT_FAILURE);
@ -145,8 +155,8 @@ void mbtiles_write_metadata(sqlite3 *outdb, const char *fname, int minzoom, int
}
sqlite3_free(sql);
sql = sqlite3_mprintf("INSERT INTO metadata (name, value) VALUES ('description', %Q);", fname);
if (sqlite3_exec(outdb, sql, NULL, NULL, &err) != SQLITE_OK) {
sql = sqlite3_mprintf("INSERT INTO metadata (name, value) VALUES ('description', %Q);", description != NULL ? description : fname);
if (sqlite3_exec(db, sql, NULL, NULL, &err) != SQLITE_OK) {
fprintf(stderr, "set description in metadata: %s\n", err);
if (!forcetable) {
exit(EXIT_FAILURE);
@ -155,7 +165,7 @@ void mbtiles_write_metadata(sqlite3 *outdb, const char *fname, int minzoom, int
sqlite3_free(sql);
sql = sqlite3_mprintf("INSERT INTO metadata (name, value) VALUES ('version', %d);", 2);
if (sqlite3_exec(outdb, sql, NULL, NULL, &err) != SQLITE_OK) {
if (sqlite3_exec(db, sql, NULL, NULL, &err) != SQLITE_OK) {
fprintf(stderr, "set version : %s\n", err);
if (!forcetable) {
exit(EXIT_FAILURE);
@ -164,7 +174,7 @@ void mbtiles_write_metadata(sqlite3 *outdb, const char *fname, int minzoom, int
sqlite3_free(sql);
sql = sqlite3_mprintf("INSERT INTO metadata (name, value) VALUES ('minzoom', %d);", minzoom);
if (sqlite3_exec(outdb, sql, NULL, NULL, &err) != SQLITE_OK) {
if (sqlite3_exec(db, sql, NULL, NULL, &err) != SQLITE_OK) {
fprintf(stderr, "set minzoom: %s\n", err);
if (!forcetable) {
exit(EXIT_FAILURE);
@ -173,7 +183,7 @@ void mbtiles_write_metadata(sqlite3 *outdb, const char *fname, int minzoom, int
sqlite3_free(sql);
sql = sqlite3_mprintf("INSERT INTO metadata (name, value) VALUES ('maxzoom', %d);", maxzoom);
if (sqlite3_exec(outdb, sql, NULL, NULL, &err) != SQLITE_OK) {
if (sqlite3_exec(db, sql, NULL, NULL, &err) != SQLITE_OK) {
fprintf(stderr, "set maxzoom: %s\n", err);
if (!forcetable) {
exit(EXIT_FAILURE);
@ -182,7 +192,7 @@ void mbtiles_write_metadata(sqlite3 *outdb, const char *fname, int minzoom, int
sqlite3_free(sql);
sql = sqlite3_mprintf("INSERT INTO metadata (name, value) VALUES ('center', '%f,%f,%d');", midlon, midlat, maxzoom);
if (sqlite3_exec(outdb, sql, NULL, NULL, &err) != SQLITE_OK) {
if (sqlite3_exec(db, sql, NULL, NULL, &err) != SQLITE_OK) {
fprintf(stderr, "set center: %s\n", err);
if (!forcetable) {
exit(EXIT_FAILURE);
@ -191,7 +201,7 @@ void mbtiles_write_metadata(sqlite3 *outdb, const char *fname, int minzoom, int
sqlite3_free(sql);
sql = sqlite3_mprintf("INSERT INTO metadata (name, value) VALUES ('bounds', '%f,%f,%f,%f');", minlon, minlat, maxlon, maxlat);
if (sqlite3_exec(outdb, sql, NULL, NULL, &err) != SQLITE_OK) {
if (sqlite3_exec(db, sql, NULL, NULL, &err) != SQLITE_OK) {
fprintf(stderr, "set bounds: %s\n", err);
if (!forcetable) {
exit(EXIT_FAILURE);
@ -200,7 +210,7 @@ void mbtiles_write_metadata(sqlite3 *outdb, const char *fname, int minzoom, int
sqlite3_free(sql);
sql = sqlite3_mprintf("INSERT INTO metadata (name, value) VALUES ('type', %Q);", "overlay");
if (sqlite3_exec(outdb, sql, NULL, NULL, &err) != SQLITE_OK) {
if (sqlite3_exec(db, sql, NULL, NULL, &err) != SQLITE_OK) {
fprintf(stderr, "set type: %s\n", err);
if (!forcetable) {
exit(EXIT_FAILURE);
@ -210,7 +220,7 @@ void mbtiles_write_metadata(sqlite3 *outdb, const char *fname, int minzoom, int
if (attribution != NULL) {
sql = sqlite3_mprintf("INSERT INTO metadata (name, value) VALUES ('attribution', %Q);", attribution);
if (sqlite3_exec(outdb, sql, NULL, NULL, &err) != SQLITE_OK) {
if (sqlite3_exec(db, sql, NULL, NULL, &err) != SQLITE_OK) {
fprintf(stderr, "set type: %s\n", err);
if (!forcetable) {
exit(EXIT_FAILURE);
@ -219,8 +229,8 @@ void mbtiles_write_metadata(sqlite3 *outdb, const char *fname, int minzoom, int
sqlite3_free(sql);
}
sql = sqlite3_mprintf("INSERT INTO metadata (name, value) VALUES ('format', %Q);", "pbf");
if (sqlite3_exec(outdb, sql, NULL, NULL, &err) != SQLITE_OK) {
sql = sqlite3_mprintf("INSERT INTO metadata (name, value) VALUES ('format', %Q);", vector ? "pbf" : "png");
if (sqlite3_exec(db, sql, NULL, NULL, &err) != SQLITE_OK) {
fprintf(stderr, "set format: %s\n", err);
if (!forcetable) {
exit(EXIT_FAILURE);
@ -228,69 +238,114 @@ void mbtiles_write_metadata(sqlite3 *outdb, const char *fname, int minzoom, int
}
sqlite3_free(sql);
std::string buf("{");
aprintf(&buf, "\"vector_layers\": [ ");
if (vector) {
std::string buf("{");
aprintf(&buf, "\"vector_layers\": [ ");
std::vector<std::string> lnames;
for (auto ai = layermap.begin(); ai != layermap.end(); ++ai) {
lnames.push_back(ai->first);
}
for (size_t i = 0; i < lnames.size(); i++) {
if (i != 0) {
aprintf(&buf, ", ");
std::vector<std::string> lnames;
for (auto ai = layermap.begin(); ai != layermap.end(); ++ai) {
lnames.push_back(ai->first);
}
auto fk = layermap.find(lnames[i]);
aprintf(&buf, "{ \"id\": \"");
quote(&buf, lnames[i].c_str());
aprintf(&buf, "\", \"description\": \"\", \"minzoom\": %d, \"maxzoom\": %d, \"fields\": {", fk->second.minzoom, fk->second.maxzoom);
std::set<type_and_string>::iterator j;
bool first = true;
for (j = fk->second.file_keys.begin(); j != fk->second.file_keys.end(); ++j) {
if (first) {
first = false;
} else {
for (size_t i = 0; i < lnames.size(); i++) {
if (i != 0) {
aprintf(&buf, ", ");
}
aprintf(&buf, "\"");
quote(&buf, j->string.c_str());
auto fk = layermap.find(lnames[i]);
aprintf(&buf, "{ \"id\": \"");
quote(&buf, lnames[i].c_str());
aprintf(&buf, "\", \"description\": \"\", \"minzoom\": %d, \"maxzoom\": %d, \"fields\": {", fk->second.minzoom, fk->second.maxzoom);
if (j->type == VT_NUMBER) {
aprintf(&buf, "\": \"Number\"");
} else if (j->type == VT_BOOLEAN) {
aprintf(&buf, "\": \"Boolean\"");
} else {
aprintf(&buf, "\": \"String\"");
std::set<type_and_string>::iterator j;
bool first = true;
for (j = fk->second.file_keys.begin(); j != fk->second.file_keys.end(); ++j) {
if (first) {
first = false;
} else {
aprintf(&buf, ", ");
}
aprintf(&buf, "\"");
quote(&buf, j->string.c_str());
if (j->type == mvt_double ||
j->type == mvt_float ||
j->type == mvt_double ||
j->type == mvt_uint ||
j->type == mvt_sint) {
aprintf(&buf, "\": \"Number\"");
} else if (j->type == mvt_bool) {
aprintf(&buf, "\": \"Boolean\"");
} else {
aprintf(&buf, "\": \"String\"");
}
}
aprintf(&buf, "} }");
}
aprintf(&buf, "} }");
aprintf(&buf, " ] }");
sql = sqlite3_mprintf("INSERT INTO metadata (name, value) VALUES ('json', %Q);", buf.c_str());
if (sqlite3_exec(db, sql, NULL, NULL, &err) != SQLITE_OK) {
fprintf(stderr, "set json: %s\n", err);
if (!forcetable) {
exit(EXIT_FAILURE);
}
}
sqlite3_free(sql);
}
aprintf(&buf, " ] }");
if (outdir != NULL) {
std::string metadata = std::string(outdir) + "/metadata.json";
FILE *fp = fopen(metadata.c_str(), "w");
if (fp == NULL) {
perror(metadata.c_str());
exit(EXIT_FAILURE);
}
sql = sqlite3_mprintf("INSERT INTO metadata (name, value) VALUES ('json', %Q);", buf.c_str());
if (sqlite3_exec(outdb, sql, NULL, NULL, &err) != SQLITE_OK) {
fprintf(stderr, "set json: %s\n", err);
if (!forcetable) {
fprintf(fp, "{\n");
sqlite3_stmt *stmt;
bool first = true;
if (sqlite3_prepare_v2(db, "SELECT name, value from metadata;", -1, &stmt, NULL) == SQLITE_OK) {
while (sqlite3_step(stmt) == SQLITE_ROW) {
std::string key, value;
quote(&key, (const char *) sqlite3_column_text(stmt, 0));
quote(&value, (const char *) sqlite3_column_text(stmt, 1));
if (!first) {
fprintf(fp, ",\n");
}
fprintf(fp, " \"%s\": \"%s\"", key.c_str(), value.c_str());
first = false;
}
sqlite3_finalize(stmt);
}
fprintf(fp, "\n}\n");
fclose(fp);
}
if (outdb == NULL) {
if (sqlite3_close(db) != SQLITE_OK) {
fprintf(stderr, "Could not close temp database: %s\n", sqlite3_errmsg(db));
exit(EXIT_FAILURE);
}
}
sqlite3_free(sql);
}
void mbtiles_close(sqlite3 *outdb, char **argv) {
void mbtiles_close(sqlite3 *outdb, const char *pgm) {
char *err;
if (sqlite3_exec(outdb, "ANALYZE;", NULL, NULL, &err) != SQLITE_OK) {
fprintf(stderr, "%s: ANALYZE failed: %s\n", argv[0], err);
fprintf(stderr, "%s: ANALYZE failed: %s\n", pgm, err);
exit(EXIT_FAILURE);
}
if (sqlite3_close(outdb) != SQLITE_OK) {
fprintf(stderr, "%s: could not close database: %s\n", argv[0], sqlite3_errmsg(outdb));
fprintf(stderr, "%s: could not close database: %s\n", pgm, sqlite3_errmsg(outdb));
exit(EXIT_FAILURE);
}
}

View File

@ -20,9 +20,9 @@ sqlite3 *mbtiles_open(char *dbname, char **argv, int forcetable);
void mbtiles_write_tile(sqlite3 *outdb, int z, int tx, int ty, const char *data, int size);
void mbtiles_write_metadata(sqlite3 *outdb, const char *fname, int minzoom, int maxzoom, double minlat, double minlon, double maxlat, double maxlon, double midlat, double midlon, int forcetable, const char *attribution, std::map<std::string, layermap_entry> const &layermap);
void mbtiles_write_metadata(sqlite3 *outdb, const char *outdir, const char *fname, int minzoom, int maxzoom, double minlat, double minlon, double maxlat, double maxlon, double midlat, double midlon, int forcetable, const char *attribution, std::map<std::string, layermap_entry> const &layermap, bool vector, const char *description);
void mbtiles_close(sqlite3 *outdb, char **argv);
void mbtiles_close(sqlite3 *outdb, const char *pgm);
void aprintf(std::string *buf, const char *format, ...);

View File

@ -53,7 +53,7 @@ int memfile_write(struct memfile *file, void *s, long long len) {
return -1;
}
file->len += INCREMENT;
file->len += (len + INCREMENT + 1) / INCREMENT * INCREMENT;
if (ftruncate(file->fd, file->len) != 0) {
return -1;

View File

@ -79,7 +79,7 @@ int compress(std::string const &input, std::string &output) {
return 0;
}
bool mvt_tile::decode(std::string &message) {
bool mvt_tile::decode(std::string &message, bool &was_compressed) {
layers.clear();
std::string src;
@ -87,8 +87,10 @@ bool mvt_tile::decode(std::string &message) {
std::string uncompressed;
decompress(message, uncompressed);
src = uncompressed;
was_compressed = true;
} else {
src = message;
was_compressed = false;
}
protozero::pbf_reader reader(src);
@ -367,10 +369,7 @@ std::string mvt_tile::encode() {
writer.add_message(3, layer_string);
}
std::string compressed;
compress(data, compressed);
return compressed;
return data;
}
bool mvt_value::operator<(const mvt_value &o) const {

14
mvt.hpp
View File

@ -13,6 +13,18 @@ struct mvt_geometry {
int /* mvt_operation */ op;
mvt_geometry(int op, long long x, long long y);
bool operator<(mvt_geometry const &s) const {
if (y < s.y || (y == s.y && x < s.x)) {
return true;
} else {
return false;
}
}
bool operator==(mvt_geometry const &s) const {
return y == s.y && x == s.x;
}
};
enum mvt_geometry_type {
@ -79,7 +91,7 @@ struct mvt_tile {
std::vector<mvt_layer> layers;
std::string encode();
bool decode(std::string &message);
bool decode(std::string &message, bool &was_compressed);
};
bool is_compressed(std::string const &data);

View File

@ -13,6 +13,8 @@
#define A_DROP_FRACTION_AS_NEEDED ((int) 'd')
#define A_DROP_SMALLEST_AS_NEEDED ((int) 'n')
#define A_GRID_LOW_ZOOMS ((int) 'L')
#define A_DETECT_WRAPAROUND ((int) 'w')
#define A_EXTEND_ZOOMS ((int) 'e')
#define P_SIMPLIFY ((int) 's')
#define P_SIMPLIFY_LOW ((int) 'S')
@ -24,6 +26,8 @@
#define P_CLIPPING ((int) 'c')
#define P_DUPLICATION ((int) 'D')
#define P_TINY_POLYGON_REDUCTION ((int) 't')
#define P_TILE_COMPRESSION ((int) 'C')
#define P_EXCLUDE_HUGE_GEOMETRIES ((int) 'h')
extern int prevent[256];
extern int additional[256];

View File

@ -83,13 +83,32 @@ unsigned long long encode(unsigned int wx, unsigned int wy) {
return out;
}
static unsigned char decodex[256];
static unsigned char decodey[256];
void decode(unsigned long long index, unsigned *wx, unsigned *wy) {
static int initialized = 0;
if (!initialized) {
for (size_t ix = 0; ix < 256; ix++) {
size_t xx = 0, yy = 0;
for (size_t i = 0; i < 32; i++) {
xx |= ((ix >> (64 - 2 * (i + 1) + 1)) & 1) << (32 - (i + 1));
yy |= ((ix >> (64 - 2 * (i + 1) + 0)) & 1) << (32 - (i + 1));
}
decodex[ix] = xx;
decodey[ix] = yy;
}
initialized = 1;
}
*wx = *wy = 0;
int i;
for (i = 0; i < 32; i++) {
*wx |= ((index >> (64 - 2 * (i + 1) + 1)) & 1) << (32 - (i + 1));
*wy |= ((index >> (64 - 2 * (i + 1) + 0)) & 1) << (32 - (i + 1));
for (size_t i = 0; i < 8; i++) {
*wx |= ((unsigned) decodex[(index >> (8 * i)) & 0xFF]) << (4 * i);
*wy |= ((unsigned) decodey[(index >> (8 * i)) & 0xFF]) << (4 * i);
}
}

View File

@ -16,56 +16,69 @@ documentation.
* @brief Contains functions to swap bytes in values (for different endianness).
*/
#include <cstdint>
#include <cassert>
#include <cstdint>
#include <protozero/config.hpp>
namespace protozero {
namespace detail {
/**
* Swap N byte value between endianness formats. This template function must
* be specialized to actually work.
*/
template <int N>
inline void byteswap(const char* /*data*/, char* /*result*/) {
static_assert(N == 1, "Can only swap 4 or 8 byte values");
}
/**
* Swap 4 byte value (int32_t, uint32_t, float) between endianness formats.
*/
template <>
inline void byteswap<4>(const char* data, char* result) {
inline uint32_t byteswap_impl(uint32_t value) noexcept {
#ifdef PROTOZERO_USE_BUILTIN_BSWAP
*reinterpret_cast<uint32_t*>(result) = __builtin_bswap32(*reinterpret_cast<const uint32_t*>(data));
return __builtin_bswap32(value);
#else
result[3] = data[0];
result[2] = data[1];
result[1] = data[2];
result[0] = data[3];
return ((value & 0xff000000) >> 24) |
((value & 0x00ff0000) >> 8) |
((value & 0x0000ff00) << 8) |
((value & 0x000000ff) << 24);
#endif
}
/**
* Swap 8 byte value (int64_t, uint64_t, double) between endianness formats.
*/
template <>
inline void byteswap<8>(const char* data, char* result) {
inline uint64_t byteswap_impl(uint64_t value) noexcept {
#ifdef PROTOZERO_USE_BUILTIN_BSWAP
*reinterpret_cast<uint64_t*>(result) = __builtin_bswap64(*reinterpret_cast<const uint64_t*>(data));
return __builtin_bswap64(value);
#else
result[7] = data[0];
result[6] = data[1];
result[5] = data[2];
result[4] = data[3];
result[3] = data[4];
result[2] = data[5];
result[1] = data[6];
result[0] = data[7];
return ((value & 0xff00000000000000ULL) >> 56) |
((value & 0x00ff000000000000ULL) >> 40) |
((value & 0x0000ff0000000000ULL) >> 24) |
((value & 0x000000ff00000000ULL) >> 8) |
((value & 0x00000000ff000000ULL) << 8) |
((value & 0x0000000000ff0000ULL) << 24) |
((value & 0x000000000000ff00ULL) << 40) |
((value & 0x00000000000000ffULL) << 56);
#endif
}
inline void byteswap_inplace(uint32_t* ptr) noexcept {
*ptr = byteswap_impl(*ptr);
}
inline void byteswap_inplace(uint64_t* ptr) noexcept {
*ptr = byteswap_impl(*ptr);
}
inline void byteswap_inplace(int32_t* ptr) noexcept {
auto bptr = reinterpret_cast<uint32_t*>(ptr);
*bptr = byteswap_impl(*bptr);
}
inline void byteswap_inplace(int64_t* ptr) noexcept {
auto bptr = reinterpret_cast<uint64_t*>(ptr);
*bptr = byteswap_impl(*bptr);
}
inline void byteswap_inplace(float* ptr) noexcept {
auto bptr = reinterpret_cast<uint32_t*>(ptr);
*bptr = byteswap_impl(*bptr);
}
inline void byteswap_inplace(double* ptr) noexcept {
auto bptr = reinterpret_cast<uint64_t*>(ptr);
*bptr = byteswap_impl(*bptr);
}
} // end namespace detail
} // end namespace protozero
#endif // PROTOZERO_BYTESWAP_HPP

View File

@ -35,17 +35,6 @@ documentation.
# define PROTOZERO_BYTE_ORDER PROTOZERO_LITTLE_ENDIAN
#endif
// On some ARM machines and depending on compiler settings access to unaligned
// floating point values will result in a SIGBUS. Do not use the bare pointers
// in this case.
#if PROTOZERO_BYTE_ORDER == PROTOZERO_LITTLE_ENDIAN
# if !defined(__arm__) && !defined(_M_ARM)
# ifndef PROTOZERO_DO_NOT_USE_BARE_POINTER
# define PROTOZERO_USE_BARE_POINTER_FOR_PACKED_FIXED
# endif
# endif
#endif
// Check whether __builtin_bswap is available
#if defined(__GNUC__) || defined(__clang__)
# define PROTOZERO_USE_BUILTIN_BSWAP

View File

@ -29,7 +29,7 @@ namespace protozero {
*/
struct exception : std::exception {
/// Returns the explanatory string.
const char *what() const noexcept override { return "pbf exception"; }
const char* what() const noexcept override { return "pbf exception"; }
};
/**
@ -38,7 +38,7 @@ struct exception : std::exception {
*/
struct varint_too_long_exception : exception {
/// Returns the explanatory string.
const char *what() const noexcept override { return "varint too long exception"; }
const char* what() const noexcept override { return "varint too long exception"; }
};
/**
@ -47,7 +47,7 @@ struct varint_too_long_exception : exception {
*/
struct unknown_pbf_wire_type_exception : exception {
/// Returns the explanatory string.
const char *what() const noexcept override { return "unknown pbf field type exception"; }
const char* what() const noexcept override { return "unknown pbf field type exception"; }
};
/**
@ -60,7 +60,7 @@ struct unknown_pbf_wire_type_exception : exception {
*/
struct end_of_buffer_exception : exception {
/// Returns the explanatory string.
const char *what() const noexcept override { return "end of buffer exception"; }
const char* what() const noexcept override { return "end of buffer exception"; }
};
} // end namespace protozero

328
protozero/iterators.hpp Normal file
View File

@ -0,0 +1,328 @@
#ifndef PROTOZERO_ITERATORS_HPP
#define PROTOZERO_ITERATORS_HPP
/*****************************************************************************
protozero - Minimalistic protocol buffer decoder and encoder in C++.
This file is from https://github.com/mapbox/protozero where you can find more
documentation.
*****************************************************************************/
/**
* @file iterators.hpp
*
* @brief Contains the iterators for access to packed repeated fields.
*/
#include <cstring>
#include <iterator>
#include <utility>
#include <protozero/config.hpp>
#include <protozero/varint.hpp>
#if PROTOZERO_BYTE_ORDER != PROTOZERO_LITTLE_ENDIAN
# include <protozero/byteswap.hpp>
#endif
namespace protozero {
/**
* A range of iterators based on std::pair. Created from beginning and
* end iterators. Used as a return type from some pbf_reader methods
* that is easy to use with range-based for loops.
*/
template <typename T, typename P = std::pair<T, T>>
class iterator_range :
#ifdef PROTOZERO_STRICT_API
protected
#else
public
#endif
P {
public:
/// The type of the iterators in this range.
using iterator = T;
/// The value type of the underlying iterator.
using value_type = typename std::iterator_traits<T>::value_type;
/**
* Default constructor. Create empty iterator_range.
*/
constexpr iterator_range() :
P(iterator{}, iterator{}) {
}
/**
* Create iterator range from two iterators.
*
* @param first_iterator Iterator to beginning or range.
* @param last_iterator Iterator to end or range.
*/
constexpr iterator_range(iterator&& first_iterator, iterator&& last_iterator) :
P(std::forward<iterator>(first_iterator),
std::forward<iterator>(last_iterator)) {
}
/// Return iterator to beginning of range.
constexpr iterator begin() const noexcept {
return this->first;
}
/// Return iterator to end of range.
constexpr iterator end() const noexcept {
return this->second;
}
/// Return iterator to beginning of range.
constexpr iterator cbegin() const noexcept {
return this->first;
}
/// Return iterator to end of range.
constexpr iterator cend() const noexcept {
return this->second;
}
/// Return true if this range is empty.
constexpr std::size_t empty() const noexcept {
return begin() == end();
}
/**
* Get element at the beginning of the range.
*
* @pre Range must not be empty.
*/
value_type front() const {
protozero_assert(!empty());
return *(this->first);
}
/**
* Advance beginning of range by one.
*
* @pre Range must not be empty.
*/
void drop_front() {
protozero_assert(!empty());
++this->first;
}
/**
* Swap the contents of this range with the other.
*
* @param other Other range to swap data with.
*/
void swap(iterator_range& other) noexcept {
using std::swap;
swap(this->first, other.first);
swap(this->second, other.second);
}
}; // struct iterator_range
/**
* Swap two iterator_ranges.
*
* @param lhs First range.
* @param rhs Second range.
*/
template <typename T>
inline void swap(iterator_range<T>& lhs, iterator_range<T>& rhs) noexcept {
lhs.swap(rhs);
}
/**
* A forward iterator used for accessing packed repeated fields of fixed
* length (fixed32, sfixed32, float, double).
*/
template <typename T>
class const_fixed_iterator {
/// Pointer to current iterator position
const char* m_data;
/// Pointer to end iterator position
const char* m_end;
public:
using iterator_category = std::forward_iterator_tag;
using value_type = T;
using difference_type = std::ptrdiff_t;
using pointer = value_type*;
using reference = value_type&;
const_fixed_iterator() noexcept :
m_data(nullptr),
m_end(nullptr) {
}
const_fixed_iterator(const char* data, const char* end) noexcept :
m_data(data),
m_end(end) {
}
const_fixed_iterator(const const_fixed_iterator&) noexcept = default;
const_fixed_iterator(const_fixed_iterator&&) noexcept = default;
const_fixed_iterator& operator=(const const_fixed_iterator&) noexcept = default;
const_fixed_iterator& operator=(const_fixed_iterator&&) noexcept = default;
~const_fixed_iterator() noexcept = default;
value_type operator*() const {
value_type result;
std::memcpy(&result, m_data, sizeof(value_type));
#if PROTOZERO_BYTE_ORDER != PROTOZERO_LITTLE_ENDIAN
detail::byteswap_inplace(&result);
#endif
return result;
}
const_fixed_iterator& operator++() {
m_data += sizeof(value_type);
return *this;
}
const_fixed_iterator operator++(int) {
const const_fixed_iterator tmp(*this);
++(*this);
return tmp;
}
bool operator==(const const_fixed_iterator& rhs) const noexcept {
return m_data == rhs.m_data && m_end == rhs.m_end;
}
bool operator!=(const const_fixed_iterator& rhs) const noexcept {
return !(*this == rhs);
}
}; // class const_fixed_iterator
/**
* A forward iterator used for accessing packed repeated varint fields
* (int32, uint32, int64, uint64, bool, enum).
*/
template <typename T>
class const_varint_iterator {
protected:
/// Pointer to current iterator position
const char* m_data;
/// Pointer to end iterator position
const char* m_end;
public:
using iterator_category = std::forward_iterator_tag;
using value_type = T;
using difference_type = std::ptrdiff_t;
using pointer = value_type*;
using reference = value_type&;
const_varint_iterator() noexcept :
m_data(nullptr),
m_end(nullptr) {
}
const_varint_iterator(const char* data, const char* end) noexcept :
m_data(data),
m_end(end) {
}
const_varint_iterator(const const_varint_iterator&) noexcept = default;
const_varint_iterator(const_varint_iterator&&) noexcept = default;
const_varint_iterator& operator=(const const_varint_iterator&) noexcept = default;
const_varint_iterator& operator=(const_varint_iterator&&) noexcept = default;
~const_varint_iterator() noexcept = default;
value_type operator*() const {
const char* d = m_data; // will be thrown away
return static_cast<value_type>(decode_varint(&d, m_end));
}
const_varint_iterator& operator++() {
skip_varint(&m_data, m_end);
return *this;
}
const_varint_iterator operator++(int) {
const const_varint_iterator tmp(*this);
++(*this);
return tmp;
}
bool operator==(const const_varint_iterator& rhs) const noexcept {
return m_data == rhs.m_data && m_end == rhs.m_end;
}
bool operator!=(const const_varint_iterator& rhs) const noexcept {
return !(*this == rhs);
}
}; // class const_varint_iterator
/**
* A forward iterator used for accessing packed repeated svarint fields
* (sint32, sint64).
*/
template <typename T>
class const_svarint_iterator : public const_varint_iterator<T> {
public:
using iterator_category = std::forward_iterator_tag;
using value_type = T;
using difference_type = std::ptrdiff_t;
using pointer = value_type*;
using reference = value_type&;
const_svarint_iterator() noexcept :
const_varint_iterator<T>() {
}
const_svarint_iterator(const char* data, const char* end) noexcept :
const_varint_iterator<T>(data, end) {
}
const_svarint_iterator(const const_svarint_iterator&) = default;
const_svarint_iterator(const_svarint_iterator&&) = default;
const_svarint_iterator& operator=(const const_svarint_iterator&) = default;
const_svarint_iterator& operator=(const_svarint_iterator&&) = default;
~const_svarint_iterator() = default;
value_type operator*() const {
const char* d = this->m_data; // will be thrown away
return static_cast<value_type>(decode_zigzag64(decode_varint(&d, this->m_end)));
}
const_svarint_iterator& operator++() {
skip_varint(&this->m_data, this->m_end);
return *this;
}
const_svarint_iterator operator++(int) {
const const_svarint_iterator tmp(*this);
++(*this);
return tmp;
}
}; // class const_svarint_iterator
} // end namespace protozero
#endif // PROTOZERO_ITERATORS_HPP

View File

@ -18,8 +18,8 @@ documentation.
#include <type_traits>
#include <protozero/types.hpp>
#include <protozero/pbf_writer.hpp>
#include <protozero/types.hpp>
namespace protozero {
@ -46,7 +46,7 @@ public:
using enum_type = T;
pbf_builder(std::string& data) noexcept :
explicit pbf_builder(std::string& data) noexcept :
pbf_writer(data) {
}
@ -57,7 +57,7 @@ public:
/// @cond INTERNAL
#define PROTOZERO_WRITER_WRAP_ADD_SCALAR(name, type) \
inline void add_##name(T tag, type value) { \
void add_##name(T tag, type value) { \
pbf_writer::add_##name(pbf_tag_type(tag), value); \
}
@ -79,38 +79,59 @@ public:
#undef PROTOZERO_WRITER_WRAP_ADD_SCALAR
/// @endcond
inline void add_bytes(T tag, const char* value, std::size_t size) {
void add_bytes(T tag, const char* value, std::size_t size) {
pbf_writer::add_bytes(pbf_tag_type(tag), value, size);
}
inline void add_bytes(T tag, const std::string& value) {
void add_bytes(T tag, const data_view& value) {
pbf_writer::add_bytes(pbf_tag_type(tag), value);
}
inline void add_string(T tag, const char* value, std::size_t size) {
void add_bytes(T tag, const std::string& value) {
pbf_writer::add_bytes(pbf_tag_type(tag), value);
}
void add_bytes(T tag, const char* value) {
pbf_writer::add_bytes(pbf_tag_type(tag), value);
}
template <typename... Ts>
void add_bytes_vectored(T tag, Ts&&... values) {
pbf_writer::add_bytes_vectored(pbf_tag_type(tag), std::forward<Ts>(values)...);
}
void add_string(T tag, const char* value, std::size_t size) {
pbf_writer::add_string(pbf_tag_type(tag), value, size);
}
inline void add_string(T tag, const std::string& value) {
void add_string(T tag, const data_view& value) {
pbf_writer::add_string(pbf_tag_type(tag), value);
}
inline void add_string(T tag, const char* value) {
void add_string(T tag, const std::string& value) {
pbf_writer::add_string(pbf_tag_type(tag), value);
}
inline void add_message(T tag, const char* value, std::size_t size) {
void add_string(T tag, const char* value) {
pbf_writer::add_string(pbf_tag_type(tag), value);
}
void add_message(T tag, const char* value, std::size_t size) {
pbf_writer::add_message(pbf_tag_type(tag), value, size);
}
inline void add_message(T tag, const std::string& value) {
void add_message(T tag, const data_view& value) {
pbf_writer::add_message(pbf_tag_type(tag), value);
}
void add_message(T tag, const std::string& value) {
pbf_writer::add_message(pbf_tag_type(tag), value);
}
/// @cond INTERNAL
#define PROTOZERO_WRITER_WRAP_ADD_PACKED(name) \
template <typename InputIterator> \
inline void add_packed_##name(T tag, InputIterator first, InputIterator last) { \
void add_packed_##name(T tag, InputIterator first, InputIterator last) { \
pbf_writer::add_packed_##name(pbf_tag_type(tag), first, last); \
}
@ -132,7 +153,7 @@ public:
#undef PROTOZERO_WRITER_WRAP_ADD_PACKED
/// @endcond
};
}; // class pbf_builder
} // end namespace protozero

View File

@ -13,7 +13,7 @@ documentation.
/**
* @file pbf_message.hpp
*
* @brief Contains the pbf_message class.
* @brief Contains the pbf_message template class.
*/
#include <type_traits>
@ -75,19 +75,23 @@ public:
pbf_reader(std::forward<Args>(args)...) {
}
inline bool next() {
bool next() {
return pbf_reader::next();
}
inline bool next(T tag) {
return pbf_reader::next(pbf_tag_type(tag));
bool next(T next_tag) {
return pbf_reader::next(pbf_tag_type(next_tag));
}
inline T tag() const noexcept {
bool next(T next_tag, pbf_wire_type type) {
return pbf_reader::next(pbf_tag_type(next_tag), type);
}
T tag() const noexcept {
return T(pbf_reader::tag());
}
};
}; // class pbf_message
} // end namespace protozero

File diff suppressed because it is too large Load Diff

View File

@ -22,6 +22,7 @@ documentation.
#include <iterator>
#include <limits>
#include <string>
#include <utility>
#include <protozero/config.hpp>
#include <protozero/types.hpp>
@ -68,38 +69,35 @@ class pbf_writer {
// parent to the position where the data of the submessage is written to.
std::size_t m_pos = 0;
inline void add_varint(uint64_t value) {
void add_varint(uint64_t value) {
protozero_assert(m_pos == 0 && "you can't add fields to a parent pbf_writer if there is an existing pbf_writer for a submessage");
protozero_assert(m_data);
write_varint(std::back_inserter(*m_data), value);
}
inline void add_field(pbf_tag_type tag, pbf_wire_type type) {
void add_field(pbf_tag_type tag, pbf_wire_type type) {
protozero_assert(((tag > 0 && tag < 19000) || (tag > 19999 && tag <= ((1 << 29) - 1))) && "tag out of range");
uint32_t b = (tag << 3) | uint32_t(type);
const uint32_t b = (tag << 3) | uint32_t(type);
add_varint(b);
}
inline void add_tagged_varint(pbf_tag_type tag, uint64_t value) {
void add_tagged_varint(pbf_tag_type tag, uint64_t value) {
add_field(tag, pbf_wire_type::varint);
add_varint(value);
}
template <typename T>
inline void add_fixed(T value) {
void add_fixed(T value) {
protozero_assert(m_pos == 0 && "you can't add fields to a parent pbf_writer if there is an existing pbf_writer for a submessage");
protozero_assert(m_data);
#if PROTOZERO_BYTE_ORDER == PROTOZERO_LITTLE_ENDIAN
m_data->append(reinterpret_cast<const char*>(&value), sizeof(T));
#else
auto size = m_data->size();
m_data->resize(size + sizeof(T));
byteswap<sizeof(T)>(reinterpret_cast<const char*>(&value), const_cast<char*>(m_data->data() + size));
#if PROTOZERO_BYTE_ORDER != PROTOZERO_LITTLE_ENDIAN
detail::byteswap_inplace(&value);
#endif
m_data->append(reinterpret_cast<const char*>(&value), sizeof(T));
}
template <typename T, typename It>
inline void add_packed_fixed(pbf_tag_type tag, It first, It last, std::input_iterator_tag) {
void add_packed_fixed(pbf_tag_type tag, It first, It last, std::input_iterator_tag) {
if (first == last) {
return;
}
@ -112,12 +110,12 @@ class pbf_writer {
}
template <typename T, typename It>
inline void add_packed_fixed(pbf_tag_type tag, It first, It last, std::forward_iterator_tag) {
void add_packed_fixed(pbf_tag_type tag, It first, It last, std::forward_iterator_tag) {
if (first == last) {
return;
}
auto length = std::distance(first, last);
const auto length = std::distance(first, last);
add_length_varint(tag, sizeof(T) * pbf_length_type(length));
reserve(sizeof(T) * std::size_t(length));
@ -127,7 +125,7 @@ class pbf_writer {
}
template <typename It>
inline void add_packed_varint(pbf_tag_type tag, It first, It last) {
void add_packed_varint(pbf_tag_type tag, It first, It last) {
if (first == last) {
return;
}
@ -140,7 +138,7 @@ class pbf_writer {
}
template <typename It>
inline void add_packed_svarint(pbf_tag_type tag, It first, It last) {
void add_packed_svarint(pbf_tag_type tag, It first, It last) {
if (first == last) {
return;
}
@ -155,14 +153,18 @@ class pbf_writer {
// The number of bytes to reserve for the varint holding the length of
// a length-delimited field. The length has to fit into pbf_length_type,
// and a varint needs 8 bit for every 7 bit.
static const int reserve_bytes = sizeof(pbf_length_type) * 8 / 7 + 1;
enum constant_reserve_bytes : int {
reserve_bytes = sizeof(pbf_length_type) * 8 / 7 + 1
};
// If m_rollpack_pos is set to this special value, it means that when
// the submessage is closed, nothing needs to be done, because the length
// of the submessage has already been written correctly.
static const std::size_t size_is_known = std::numeric_limits<std::size_t>::max();
enum constant_size_is_known : std::size_t {
size_is_known = std::numeric_limits<std::size_t>::max()
};
inline void open_submessage(pbf_tag_type tag, std::size_t size) {
void open_submessage(pbf_tag_type tag, std::size_t size) {
protozero_assert(m_pos == 0);
protozero_assert(m_data);
if (size == 0) {
@ -177,7 +179,7 @@ class pbf_writer {
m_pos = m_data->size();
}
inline void rollback_submessage() {
void rollback_submessage() {
protozero_assert(m_pos != 0);
protozero_assert(m_rollback_pos != size_is_known);
protozero_assert(m_data);
@ -185,20 +187,20 @@ class pbf_writer {
m_pos = 0;
}
inline void commit_submessage() {
void commit_submessage() {
protozero_assert(m_pos != 0);
protozero_assert(m_rollback_pos != size_is_known);
protozero_assert(m_data);
auto length = pbf_length_type(m_data->size() - m_pos);
const auto length = pbf_length_type(m_data->size() - m_pos);
protozero_assert(m_data->size() >= m_pos - reserve_bytes);
auto n = write_varint(m_data->begin() + long(m_pos) - reserve_bytes, length);
const auto n = write_varint(m_data->begin() + long(m_pos) - reserve_bytes, length);
m_data->erase(m_data->begin() + long(m_pos) - reserve_bytes + n, m_data->begin() + long(m_pos));
m_pos = 0;
}
inline void close_submessage() {
void close_submessage() {
protozero_assert(m_data);
if (m_pos == 0 || m_rollback_pos == size_is_known) {
return;
@ -210,7 +212,7 @@ class pbf_writer {
}
}
inline void add_length_varint(pbf_tag_type tag, pbf_length_type length) {
void add_length_varint(pbf_tag_type tag, pbf_length_type length) {
add_field(tag, pbf_wire_type::length_delimited);
add_varint(length);
}
@ -222,20 +224,18 @@ public:
* stores a reference to that string and adds all data to it. The string
* doesn't have to be empty. The pbf_writer will just append data.
*/
inline explicit pbf_writer(std::string& data) noexcept :
explicit pbf_writer(std::string& data) noexcept :
m_data(&data),
m_parent_writer(nullptr),
m_pos(0) {
m_parent_writer(nullptr) {
}
/**
* Create a writer without a data store. In this form the writer can not
* be used!
*/
inline pbf_writer() noexcept :
pbf_writer() noexcept :
m_data(nullptr),
m_parent_writer(nullptr),
m_pos(0) {
m_parent_writer(nullptr) {
}
/**
@ -248,10 +248,9 @@ public:
* Setting this allows some optimizations but is only possible in
* a few very specific cases.
*/
inline pbf_writer(pbf_writer& parent_writer, pbf_tag_type tag, std::size_t size=0) :
pbf_writer(pbf_writer& parent_writer, pbf_tag_type tag, std::size_t size=0) :
m_data(parent_writer.m_data),
m_parent_writer(&parent_writer),
m_pos(0) {
m_parent_writer(&parent_writer) {
m_parent_writer->open_submessage(tag, size);
}
@ -262,17 +261,30 @@ public:
pbf_writer& operator=(const pbf_writer&) noexcept = default;
/// A pbf_writer object can be moved
inline pbf_writer(pbf_writer&&) noexcept = default;
pbf_writer(pbf_writer&&) noexcept = default;
/// A pbf_writer object can be moved
inline pbf_writer& operator=(pbf_writer&&) noexcept = default;
pbf_writer& operator=(pbf_writer&&) noexcept = default;
inline ~pbf_writer() {
~pbf_writer() {
if (m_parent_writer) {
m_parent_writer->close_submessage();
}
}
/**
* Swap the contents of this object with the other.
*
* @param other Other object to swap data with.
*/
void swap(pbf_writer& other) noexcept {
using std::swap;
swap(m_data, other.m_data);
swap(m_parent_writer, other.m_parent_writer);
swap(m_rollback_pos, other.m_rollback_pos);
swap(m_pos, other.m_pos);
}
/**
* Reserve size bytes in the underlying message store in addition to
* whatever the message store already holds. So unlike
@ -286,7 +298,14 @@ public:
m_data->reserve(m_data->size() + size);
}
inline void rollback() {
/**
* Cancel writing of this submessage. The complete submessage will be
* removed as if it was never created and no fields were added.
*
* @pre Must be a pbf_writer of a submessage, ie one opened with the
* pbf_writer constructor taking a parent message.
*/
void rollback() {
protozero_assert(m_parent_writer && "you can't call rollback() on a pbf_writer without a parent");
protozero_assert(m_pos == 0 && "you can't call rollback() on a pbf_writer that has an open nested submessage");
m_parent_writer->rollback_submessage();
@ -304,7 +323,7 @@ public:
* @param tag Tag (field number) of the field
* @param value Value to be written
*/
inline void add_bool(pbf_tag_type tag, bool value) {
void add_bool(pbf_tag_type tag, bool value) {
add_field(tag, pbf_wire_type::varint);
protozero_assert(m_pos == 0 && "you can't add fields to a parent pbf_writer if there is an existing pbf_writer for a submessage");
protozero_assert(m_data);
@ -317,7 +336,7 @@ public:
* @param tag Tag (field number) of the field
* @param value Value to be written
*/
inline void add_enum(pbf_tag_type tag, int32_t value) {
void add_enum(pbf_tag_type tag, int32_t value) {
add_tagged_varint(tag, uint64_t(value));
}
@ -327,7 +346,7 @@ public:
* @param tag Tag (field number) of the field
* @param value Value to be written
*/
inline void add_int32(pbf_tag_type tag, int32_t value) {
void add_int32(pbf_tag_type tag, int32_t value) {
add_tagged_varint(tag, uint64_t(value));
}
@ -337,7 +356,7 @@ public:
* @param tag Tag (field number) of the field
* @param value Value to be written
*/
inline void add_sint32(pbf_tag_type tag, int32_t value) {
void add_sint32(pbf_tag_type tag, int32_t value) {
add_tagged_varint(tag, encode_zigzag32(value));
}
@ -347,7 +366,7 @@ public:
* @param tag Tag (field number) of the field
* @param value Value to be written
*/
inline void add_uint32(pbf_tag_type tag, uint32_t value) {
void add_uint32(pbf_tag_type tag, uint32_t value) {
add_tagged_varint(tag, value);
}
@ -357,7 +376,7 @@ public:
* @param tag Tag (field number) of the field
* @param value Value to be written
*/
inline void add_int64(pbf_tag_type tag, int64_t value) {
void add_int64(pbf_tag_type tag, int64_t value) {
add_tagged_varint(tag, uint64_t(value));
}
@ -367,7 +386,7 @@ public:
* @param tag Tag (field number) of the field
* @param value Value to be written
*/
inline void add_sint64(pbf_tag_type tag, int64_t value) {
void add_sint64(pbf_tag_type tag, int64_t value) {
add_tagged_varint(tag, encode_zigzag64(value));
}
@ -377,7 +396,7 @@ public:
* @param tag Tag (field number) of the field
* @param value Value to be written
*/
inline void add_uint64(pbf_tag_type tag, uint64_t value) {
void add_uint64(pbf_tag_type tag, uint64_t value) {
add_tagged_varint(tag, value);
}
@ -387,7 +406,7 @@ public:
* @param tag Tag (field number) of the field
* @param value Value to be written
*/
inline void add_fixed32(pbf_tag_type tag, uint32_t value) {
void add_fixed32(pbf_tag_type tag, uint32_t value) {
add_field(tag, pbf_wire_type::fixed32);
add_fixed<uint32_t>(value);
}
@ -398,7 +417,7 @@ public:
* @param tag Tag (field number) of the field
* @param value Value to be written
*/
inline void add_sfixed32(pbf_tag_type tag, int32_t value) {
void add_sfixed32(pbf_tag_type tag, int32_t value) {
add_field(tag, pbf_wire_type::fixed32);
add_fixed<int32_t>(value);
}
@ -409,7 +428,7 @@ public:
* @param tag Tag (field number) of the field
* @param value Value to be written
*/
inline void add_fixed64(pbf_tag_type tag, uint64_t value) {
void add_fixed64(pbf_tag_type tag, uint64_t value) {
add_field(tag, pbf_wire_type::fixed64);
add_fixed<uint64_t>(value);
}
@ -420,7 +439,7 @@ public:
* @param tag Tag (field number) of the field
* @param value Value to be written
*/
inline void add_sfixed64(pbf_tag_type tag, int64_t value) {
void add_sfixed64(pbf_tag_type tag, int64_t value) {
add_field(tag, pbf_wire_type::fixed64);
add_fixed<int64_t>(value);
}
@ -431,7 +450,7 @@ public:
* @param tag Tag (field number) of the field
* @param value Value to be written
*/
inline void add_float(pbf_tag_type tag, float value) {
void add_float(pbf_tag_type tag, float value) {
add_field(tag, pbf_wire_type::fixed32);
add_fixed<float>(value);
}
@ -442,7 +461,7 @@ public:
* @param tag Tag (field number) of the field
* @param value Value to be written
*/
inline void add_double(pbf_tag_type tag, double value) {
void add_double(pbf_tag_type tag, double value) {
add_field(tag, pbf_wire_type::fixed64);
add_fixed<double>(value);
}
@ -454,7 +473,7 @@ public:
* @param value Pointer to value to be written
* @param size Number of bytes to be written
*/
inline void add_bytes(pbf_tag_type tag, const char* value, std::size_t size) {
void add_bytes(pbf_tag_type tag, const char* value, std::size_t size) {
protozero_assert(m_pos == 0 && "you can't add fields to a parent pbf_writer if there is an existing pbf_writer for a submessage");
protozero_assert(m_data);
protozero_assert(size <= std::numeric_limits<pbf_length_type>::max());
@ -468,10 +487,62 @@ public:
* @param tag Tag (field number) of the field
* @param value Value to be written
*/
inline void add_bytes(pbf_tag_type tag, const std::string& value) {
void add_bytes(pbf_tag_type tag, const data_view& value) {
add_bytes(tag, value.data(), value.size());
}
/**
* Add "bytes" field to data.
*
* @param tag Tag (field number) of the field
* @param value Value to be written
*/
void add_bytes(pbf_tag_type tag, const std::string& value) {
add_bytes(tag, value.data(), value.size());
}
/**
* Add "bytes" field to data. Bytes from the value are written until
* a null byte is encountered. The null byte is not added.
*
* @param tag Tag (field number) of the field
* @param value Pointer to zero-delimited value to be written
*/
void add_bytes(pbf_tag_type tag, const char* value) {
add_bytes(tag, value, std::strlen(value));
}
/**
* Add "bytes" field to data using vectored input. All the data in the
* 2nd and further arguments is "concatenated" with only a single copy
* into the final buffer.
*
* This will work with objects of any type supporting the data() and
* size() methods like std::string or protozero::data_view.
*
* Example:
* @code
* std::string data1 = "abc";
* std::string data2 = "xyz";
* writer.add_bytes_vectored(1, data1, data2);
* @endcode
*
* @tparam Ts List of types supporting data() and size() methods.
* @param tag Tag (field number) of the field
* @param values List of objects of types Ts with data to be appended.
*/
template <typename... Ts>
void add_bytes_vectored(pbf_tag_type tag, Ts&&... values) {
protozero_assert(m_pos == 0 && "you can't add fields to a parent pbf_writer if there is an existing pbf_writer for a submessage");
protozero_assert(m_data);
size_t sum_size = 0;
(void)std::initializer_list<size_t>{sum_size += values.size()...};
protozero_assert(sum_size <= std::numeric_limits<pbf_length_type>::max());
add_length_varint(tag, pbf_length_type(sum_size));
m_data->reserve(m_data->size() + sum_size);
(void)std::initializer_list<int>{(m_data->append(values.data(), values.size()), 0)...};
}
/**
* Add "string" field to data.
*
@ -479,7 +550,7 @@ public:
* @param value Pointer to value to be written
* @param size Number of bytes to be written
*/
inline void add_string(pbf_tag_type tag, const char* value, std::size_t size) {
void add_string(pbf_tag_type tag, const char* value, std::size_t size) {
add_bytes(tag, value, size);
}
@ -489,7 +560,17 @@ public:
* @param tag Tag (field number) of the field
* @param value Value to be written
*/
inline void add_string(pbf_tag_type tag, const std::string& value) {
void add_string(pbf_tag_type tag, const data_view& value) {
add_bytes(tag, value.data(), value.size());
}
/**
* Add "string" field to data.
*
* @param tag Tag (field number) of the field
* @param value Value to be written
*/
void add_string(pbf_tag_type tag, const std::string& value) {
add_bytes(tag, value.data(), value.size());
}
@ -500,7 +581,7 @@ public:
* @param tag Tag (field number) of the field
* @param value Pointer to value to be written
*/
inline void add_string(pbf_tag_type tag, const char* value) {
void add_string(pbf_tag_type tag, const char* value) {
add_bytes(tag, value, std::strlen(value));
}
@ -511,7 +592,7 @@ public:
* @param value Pointer to message to be written
* @param size Length of the message
*/
inline void add_message(pbf_tag_type tag, const char* value, std::size_t size) {
void add_message(pbf_tag_type tag, const char* value, std::size_t size) {
add_bytes(tag, value, size);
}
@ -521,7 +602,17 @@ public:
* @param tag Tag (field number) of the field
* @param value Value to be written. The value must be a complete message.
*/
inline void add_message(pbf_tag_type tag, const std::string& value) {
void add_message(pbf_tag_type tag, const data_view& value) {
add_bytes(tag, value.data(), value.size());
}
/**
* Add "message" field to data.
*
* @param tag Tag (field number) of the field
* @param value Value to be written. The value must be a complete message.
*/
void add_message(pbf_tag_type tag, const std::string& value) {
add_bytes(tag, value.data(), value.size());
}
@ -535,126 +626,126 @@ public:
/**
* Add "repeated packed bool" field to data.
*
* @tparam InputIterator An type satisfying the InputIterator concept.
* @tparam InputIterator A type satisfying the InputIterator concept.
* Dereferencing the iterator must yield a type assignable to bool.
* @param tag Tag (field number) of the field
* @param first Iterator pointing to the beginning of the data
* @param last Iterator pointing one past the end of data
*/
template <typename InputIterator>
inline void add_packed_bool(pbf_tag_type tag, InputIterator first, InputIterator last) {
void add_packed_bool(pbf_tag_type tag, InputIterator first, InputIterator last) {
add_packed_varint(tag, first, last);
}
/**
* Add "repeated packed enum" field to data.
*
* @tparam InputIterator An type satisfying the InputIterator concept.
* @tparam InputIterator A type satisfying the InputIterator concept.
* Dereferencing the iterator must yield a type assignable to int32_t.
* @param tag Tag (field number) of the field
* @param first Iterator pointing to the beginning of the data
* @param last Iterator pointing one past the end of data
*/
template <typename InputIterator>
inline void add_packed_enum(pbf_tag_type tag, InputIterator first, InputIterator last) {
void add_packed_enum(pbf_tag_type tag, InputIterator first, InputIterator last) {
add_packed_varint(tag, first, last);
}
/**
* Add "repeated packed int32" field to data.
*
* @tparam InputIterator An type satisfying the InputIterator concept.
* @tparam InputIterator A type satisfying the InputIterator concept.
* Dereferencing the iterator must yield a type assignable to int32_t.
* @param tag Tag (field number) of the field
* @param first Iterator pointing to the beginning of the data
* @param last Iterator pointing one past the end of data
*/
template <typename InputIterator>
inline void add_packed_int32(pbf_tag_type tag, InputIterator first, InputIterator last) {
void add_packed_int32(pbf_tag_type tag, InputIterator first, InputIterator last) {
add_packed_varint(tag, first, last);
}
/**
* Add "repeated packed sint32" field to data.
*
* @tparam InputIterator An type satisfying the InputIterator concept.
* @tparam InputIterator A type satisfying the InputIterator concept.
* Dereferencing the iterator must yield a type assignable to int32_t.
* @param tag Tag (field number) of the field
* @param first Iterator pointing to the beginning of the data
* @param last Iterator pointing one past the end of data
*/
template <typename InputIterator>
inline void add_packed_sint32(pbf_tag_type tag, InputIterator first, InputIterator last) {
void add_packed_sint32(pbf_tag_type tag, InputIterator first, InputIterator last) {
add_packed_svarint(tag, first, last);
}
/**
* Add "repeated packed uint32" field to data.
*
* @tparam InputIterator An type satisfying the InputIterator concept.
* @tparam InputIterator A type satisfying the InputIterator concept.
* Dereferencing the iterator must yield a type assignable to uint32_t.
* @param tag Tag (field number) of the field
* @param first Iterator pointing to the beginning of the data
* @param last Iterator pointing one past the end of data
*/
template <typename InputIterator>
inline void add_packed_uint32(pbf_tag_type tag, InputIterator first, InputIterator last) {
void add_packed_uint32(pbf_tag_type tag, InputIterator first, InputIterator last) {
add_packed_varint(tag, first, last);
}
/**
* Add "repeated packed int64" field to data.
*
* @tparam InputIterator An type satisfying the InputIterator concept.
* @tparam InputIterator A type satisfying the InputIterator concept.
* Dereferencing the iterator must yield a type assignable to int64_t.
* @param tag Tag (field number) of the field
* @param first Iterator pointing to the beginning of the data
* @param last Iterator pointing one past the end of data
*/
template <typename InputIterator>
inline void add_packed_int64(pbf_tag_type tag, InputIterator first, InputIterator last) {
void add_packed_int64(pbf_tag_type tag, InputIterator first, InputIterator last) {
add_packed_varint(tag, first, last);
}
/**
* Add "repeated packed sint64" field to data.
*
* @tparam InputIterator An type satisfying the InputIterator concept.
* @tparam InputIterator A type satisfying the InputIterator concept.
* Dereferencing the iterator must yield a type assignable to int64_t.
* @param tag Tag (field number) of the field
* @param first Iterator pointing to the beginning of the data
* @param last Iterator pointing one past the end of data
*/
template <typename InputIterator>
inline void add_packed_sint64(pbf_tag_type tag, InputIterator first, InputIterator last) {
void add_packed_sint64(pbf_tag_type tag, InputIterator first, InputIterator last) {
add_packed_svarint(tag, first, last);
}
/**
* Add "repeated packed uint64" field to data.
*
* @tparam InputIterator An type satisfying the InputIterator concept.
* @tparam InputIterator A type satisfying the InputIterator concept.
* Dereferencing the iterator must yield a type assignable to uint64_t.
* @param tag Tag (field number) of the field
* @param first Iterator pointing to the beginning of the data
* @param last Iterator pointing one past the end of data
*/
template <typename InputIterator>
inline void add_packed_uint64(pbf_tag_type tag, InputIterator first, InputIterator last) {
void add_packed_uint64(pbf_tag_type tag, InputIterator first, InputIterator last) {
add_packed_varint(tag, first, last);
}
/**
* Add "repeated packed fixed32" field to data.
*
* @tparam InputIterator An type satisfying the InputIterator concept.
* @tparam InputIterator A type satisfying the InputIterator concept.
* Dereferencing the iterator must yield a type assignable to uint32_t.
* @param tag Tag (field number) of the field
* @param first Iterator pointing to the beginning of the data
* @param last Iterator pointing one past the end of data
*/
template <typename InputIterator>
inline void add_packed_fixed32(pbf_tag_type tag, InputIterator first, InputIterator last) {
void add_packed_fixed32(pbf_tag_type tag, InputIterator first, InputIterator last) {
add_packed_fixed<uint32_t, InputIterator>(tag, first, last,
typename std::iterator_traits<InputIterator>::iterator_category());
}
@ -662,14 +753,14 @@ public:
/**
* Add "repeated packed sfixed32" field to data.
*
* @tparam InputIterator An type satisfying the InputIterator concept.
* @tparam InputIterator A type satisfying the InputIterator concept.
* Dereferencing the iterator must yield a type assignable to int32_t.
* @param tag Tag (field number) of the field
* @param first Iterator pointing to the beginning of the data
* @param last Iterator pointing one past the end of data
*/
template <typename InputIterator>
inline void add_packed_sfixed32(pbf_tag_type tag, InputIterator first, InputIterator last) {
void add_packed_sfixed32(pbf_tag_type tag, InputIterator first, InputIterator last) {
add_packed_fixed<int32_t, InputIterator>(tag, first, last,
typename std::iterator_traits<InputIterator>::iterator_category());
}
@ -677,14 +768,14 @@ public:
/**
* Add "repeated packed fixed64" field to data.
*
* @tparam InputIterator An type satisfying the InputIterator concept.
* @tparam InputIterator A type satisfying the InputIterator concept.
* Dereferencing the iterator must yield a type assignable to uint64_t.
* @param tag Tag (field number) of the field
* @param first Iterator pointing to the beginning of the data
* @param last Iterator pointing one past the end of data
*/
template <typename InputIterator>
inline void add_packed_fixed64(pbf_tag_type tag, InputIterator first, InputIterator last) {
void add_packed_fixed64(pbf_tag_type tag, InputIterator first, InputIterator last) {
add_packed_fixed<uint64_t, InputIterator>(tag, first, last,
typename std::iterator_traits<InputIterator>::iterator_category());
}
@ -692,14 +783,14 @@ public:
/**
* Add "repeated packed sfixed64" field to data.
*
* @tparam InputIterator An type satisfying the InputIterator concept.
* @tparam InputIterator A type satisfying the InputIterator concept.
* Dereferencing the iterator must yield a type assignable to int64_t.
* @param tag Tag (field number) of the field
* @param first Iterator pointing to the beginning of the data
* @param last Iterator pointing one past the end of data
*/
template <typename InputIterator>
inline void add_packed_sfixed64(pbf_tag_type tag, InputIterator first, InputIterator last) {
void add_packed_sfixed64(pbf_tag_type tag, InputIterator first, InputIterator last) {
add_packed_fixed<int64_t, InputIterator>(tag, first, last,
typename std::iterator_traits<InputIterator>::iterator_category());
}
@ -707,14 +798,14 @@ public:
/**
* Add "repeated packed float" field to data.
*
* @tparam InputIterator An type satisfying the InputIterator concept.
* @tparam InputIterator A type satisfying the InputIterator concept.
* Dereferencing the iterator must yield a type assignable to float.
* @param tag Tag (field number) of the field
* @param first Iterator pointing to the beginning of the data
* @param last Iterator pointing one past the end of data
*/
template <typename InputIterator>
inline void add_packed_float(pbf_tag_type tag, InputIterator first, InputIterator last) {
void add_packed_float(pbf_tag_type tag, InputIterator first, InputIterator last) {
add_packed_fixed<float, InputIterator>(tag, first, last,
typename std::iterator_traits<InputIterator>::iterator_category());
}
@ -722,14 +813,14 @@ public:
/**
* Add "repeated packed double" field to data.
*
* @tparam InputIterator An type satisfying the InputIterator concept.
* @tparam InputIterator A type satisfying the InputIterator concept.
* Dereferencing the iterator must yield a type assignable to double.
* @param tag Tag (field number) of the field
* @param first Iterator pointing to the beginning of the data
* @param last Iterator pointing one past the end of data
*/
template <typename InputIterator>
inline void add_packed_double(pbf_tag_type tag, InputIterator first, InputIterator last) {
void add_packed_double(pbf_tag_type tag, InputIterator first, InputIterator last) {
add_packed_fixed<double, InputIterator>(tag, first, last,
typename std::iterator_traits<InputIterator>::iterator_category());
}
@ -742,6 +833,16 @@ public:
}; // class pbf_writer
/**
* Swap two pbf_writer objects.
*
* @param lhs First object.
* @param rhs Second object.
*/
inline void swap(pbf_writer& lhs, pbf_writer& rhs) noexcept {
lhs.swap(rhs);
}
namespace detail {
class packed_field {
@ -752,6 +853,12 @@ namespace detail {
public:
packed_field(const packed_field&) = delete;
packed_field& operator=(const packed_field&) = delete;
packed_field(packed_field&&) = default;
packed_field& operator=(packed_field&&) = default;
packed_field(pbf_writer& parent_writer, pbf_tag_type tag) :
m_writer(parent_writer, tag) {
}
@ -771,12 +878,14 @@ namespace detail {
public:
packed_field_fixed(pbf_writer& parent_writer, pbf_tag_type tag) :
packed_field(parent_writer, tag) {
template <typename P>
packed_field_fixed(pbf_writer& parent_writer, P tag) :
packed_field(parent_writer, static_cast<pbf_tag_type>(tag)) {
}
packed_field_fixed(pbf_writer& parent_writer, pbf_tag_type tag, std::size_t size) :
packed_field(parent_writer, tag, size * sizeof(T)) {
template <typename P>
packed_field_fixed(pbf_writer& parent_writer, P tag, std::size_t size) :
packed_field(parent_writer, static_cast<pbf_tag_type>(tag), size * sizeof(T)) {
}
void add_element(T value) {
@ -790,8 +899,9 @@ namespace detail {
public:
packed_field_varint(pbf_writer& parent_writer, pbf_tag_type tag) :
packed_field(parent_writer, tag) {
template <typename P>
packed_field_varint(pbf_writer& parent_writer, P tag) :
packed_field(parent_writer, static_cast<pbf_tag_type>(tag)) {
}
void add_element(T value) {
@ -805,8 +915,9 @@ namespace detail {
public:
packed_field_svarint(pbf_writer& parent_writer, pbf_tag_type tag) :
packed_field(parent_writer, tag) {
template <typename P>
packed_field_svarint(pbf_writer& parent_writer, P tag) :
packed_field(parent_writer, static_cast<pbf_tag_type>(tag)) {
}
void add_element(T value) {
@ -817,19 +928,46 @@ namespace detail {
} // end namespace detail
/// Class for generating packed repeated bool fields.
using packed_field_bool = detail::packed_field_varint<bool>;
/// Class for generating packed repeated enum fields.
using packed_field_enum = detail::packed_field_varint<int32_t>;
/// Class for generating packed repeated int32 fields.
using packed_field_int32 = detail::packed_field_varint<int32_t>;
/// Class for generating packed repeated sint32 fields.
using packed_field_sint32 = detail::packed_field_svarint<int32_t>;
/// Class for generating packed repeated uint32 fields.
using packed_field_uint32 = detail::packed_field_varint<uint32_t>;
/// Class for generating packed repeated int64 fields.
using packed_field_int64 = detail::packed_field_varint<int64_t>;
/// Class for generating packed repeated sint64 fields.
using packed_field_sint64 = detail::packed_field_svarint<int64_t>;
/// Class for generating packed repeated uint64 fields.
using packed_field_uint64 = detail::packed_field_varint<uint64_t>;
/// Class for generating packed repeated fixed32 fields.
using packed_field_fixed32 = detail::packed_field_fixed<uint32_t>;
/// Class for generating packed repeated sfixed32 fields.
using packed_field_sfixed32 = detail::packed_field_fixed<int32_t>;
/// Class for generating packed repeated fixed64 fields.
using packed_field_fixed64 = detail::packed_field_fixed<uint64_t>;
/// Class for generating packed repeated sfixed64 fields.
using packed_field_sfixed64 = detail::packed_field_fixed<int64_t>;
/// Class for generating packed repeated float fields.
using packed_field_float = detail::packed_field_fixed<float>;
/// Class for generating packed repeated double fields.
using packed_field_double = detail::packed_field_fixed<double>;
} // end namespace protozero

View File

@ -16,33 +16,190 @@ documentation.
* @brief Contains the declaration of low-level types used in the pbf format.
*/
#include <algorithm>
#include <cstddef>
#include <cstdint>
#include <cstring>
#include <string>
#include <utility>
#include <protozero/config.hpp>
namespace protozero {
/**
* The type used for field tags (field numbers).
*/
typedef uint32_t pbf_tag_type;
/**
* The type used for field tags (field numbers).
*/
using pbf_tag_type = uint32_t;
/**
* The type used to encode type information.
* See the table on
* https://developers.google.com/protocol-buffers/docs/encoding
*/
enum class pbf_wire_type : uint32_t {
varint = 0, // int32/64, uint32/64, sint32/64, bool, enum
fixed64 = 1, // fixed64, sfixed64, double
length_delimited = 2, // string, bytes, embedded messages,
// packed repeated fields
fixed32 = 5, // fixed32, sfixed32, float
unknown = 99 // used for default setting in this library
};
/**
* Get the tag and wire type of the current field in one integer suitable
* for comparison with a switch statement.
*
* See pbf_reader.tag_and_type() for an example how to use this.
*/
template <typename T>
constexpr inline uint32_t tag_and_type(T tag, pbf_wire_type wire_type) noexcept {
return (static_cast<uint32_t>(static_cast<pbf_tag_type>(tag)) << 3) | static_cast<uint32_t>(wire_type);
}
/**
* The type used for length values, such as the length of a field.
*/
using pbf_length_type = uint32_t;
#ifdef PROTOZERO_USE_VIEW
using data_view = PROTOZERO_USE_VIEW;
#else
/**
* Holds a pointer to some data and a length.
*
* This class is supposed to be compatible with the std::string_view
* that will be available in C++17.
*/
class data_view {
const char* m_data;
std::size_t m_size;
public:
/**
* The type used to encode type information.
* See the table on
* https://developers.google.com/protocol-buffers/docs/encoding
* Default constructor. Construct an empty data_view.
*/
enum class pbf_wire_type : uint32_t {
varint = 0, // int32/64, uint32/64, sint32/64, bool, enum
fixed64 = 1, // fixed64, sfixed64, double
length_delimited = 2, // string, bytes, embedded messages,
// packed repeated fields
fixed32 = 5, // fixed32, sfixed32, float
unknown = 99 // used for default setting in this library
};
constexpr data_view() noexcept
: m_data(nullptr),
m_size(0) {
}
/**
* The type used for length values, such as the length of a field.
* Create data_view from pointer and size.
*
* @param ptr Pointer to the data.
* @param length Length of the data.
*/
typedef uint32_t pbf_length_type;
constexpr data_view(const char* ptr, std::size_t length) noexcept
: m_data(ptr),
m_size(length) {
}
/**
* Create data_view from string.
*
* @param str String with the data.
*/
data_view(const std::string& str) noexcept
: m_data(str.data()),
m_size(str.size()) {
}
/**
* Create data_view from zero-terminated string.
*
* @param ptr Pointer to the data.
*/
data_view(const char* ptr) noexcept
: m_data(ptr),
m_size(std::strlen(ptr)) {
}
/**
* Swap the contents of this object with the other.
*
* @param other Other object to swap data with.
*/
void swap(data_view& other) noexcept {
using std::swap;
swap(m_data, other.m_data);
swap(m_size, other.m_size);
}
/// Return pointer to data.
constexpr const char* data() const noexcept {
return m_data;
}
/// Return length of data in bytes.
constexpr std::size_t size() const noexcept {
return m_size;
}
/// Returns true if size is 0.
constexpr bool empty() const noexcept {
return m_size == 0;
}
/**
* Convert data view to string.
*
* @pre Must not be default constructed data_view.
*/
std::string to_string() const {
protozero_assert(m_data);
return std::string{m_data, m_size};
}
/**
* Convert data view to string.
*
* @pre Must not be default constructed data_view.
*/
explicit operator std::string() const {
protozero_assert(m_data);
return std::string{m_data, m_size};
}
}; // class data_view
/**
* Swap two data_view objects.
*
* @param lhs First object.
* @param rhs Second object.
*/
inline void swap(data_view& lhs, data_view& rhs) noexcept {
lhs.swap(rhs);
}
/**
* Two data_view instances are equal if they have the same size and the
* same content.
*
* @param lhs First object.
* @param rhs Second object.
*/
inline bool operator==(const data_view& lhs, const data_view& rhs) noexcept {
return lhs.size() == rhs.size() && std::equal(lhs.data(), lhs.data() + lhs.size(), rhs.data());
}
/**
* Two data_view instances are not equal if they have different sizes or the
* content differs.
*
* @param lhs First object.
* @param rhs Second object.
*/
inline bool operator!=(const data_view& lhs, const data_view& rhs) noexcept {
return !(lhs == rhs);
}
#endif
} // end namespace protozero

View File

@ -23,13 +23,54 @@ documentation.
namespace protozero {
/**
* The maximum length of a 64bit varint.
* The maximum length of a 64 bit varint.
*/
constexpr const int8_t max_varint_length = sizeof(uint64_t) * 8 / 7 + 1;
// from https://github.com/facebook/folly/blob/master/folly/Varint.h
namespace detail {
// from https://github.com/facebook/folly/blob/master/folly/Varint.h
inline uint64_t decode_varint_impl(const char** data, const char* end) {
const int8_t* begin = reinterpret_cast<const int8_t*>(*data);
const int8_t* iend = reinterpret_cast<const int8_t*>(end);
const int8_t* p = begin;
uint64_t val = 0;
if (iend - begin >= max_varint_length) { // fast path
do {
int64_t b;
b = *p++; val = uint64_t((b & 0x7f) ); if (b >= 0) break;
b = *p++; val |= uint64_t((b & 0x7f) << 7); if (b >= 0) break;
b = *p++; val |= uint64_t((b & 0x7f) << 14); if (b >= 0) break;
b = *p++; val |= uint64_t((b & 0x7f) << 21); if (b >= 0) break;
b = *p++; val |= uint64_t((b & 0x7f) << 28); if (b >= 0) break;
b = *p++; val |= uint64_t((b & 0x7f) << 35); if (b >= 0) break;
b = *p++; val |= uint64_t((b & 0x7f) << 42); if (b >= 0) break;
b = *p++; val |= uint64_t((b & 0x7f) << 49); if (b >= 0) break;
b = *p++; val |= uint64_t((b & 0x7f) << 56); if (b >= 0) break;
b = *p++; val |= uint64_t((b & 0x7f) << 63); if (b >= 0) break;
throw varint_too_long_exception();
} while (false);
} else {
int shift = 0;
while (p != iend && *p < 0) {
val |= uint64_t(*p++ & 0x7f) << shift;
shift += 7;
}
if (p == iend) {
throw end_of_buffer_exception();
}
val |= uint64_t(*p++) << shift;
}
*data = reinterpret_cast<const char*>(p);
return val;
}
} // end namespace detail
/**
* Decode a 64bit varint.
* Decode a 64 bit varint.
*
* Strong exception guarantee: if there is an exception the data pointer will
* not be changed.
@ -39,55 +80,69 @@ constexpr const int8_t max_varint_length = sizeof(uint64_t) * 8 / 7 + 1;
* @param[in] end Pointer one past the end of the input data.
* @returns The decoded integer
* @throws varint_too_long_exception if the varint is longer then the maximum
* length that would fit in a 64bit int. Usually this means your data
* length that would fit in a 64 bit int. Usually this means your data
* is corrupted or you are trying to read something as a varint that
* isn't.
* @throws end_of_buffer_exception if the *end* of the buffer was reached
* before the end of the varint.
*/
inline uint64_t decode_varint(const char** data, const char* end) {
const int8_t* begin = reinterpret_cast<const int8_t*>(*data);
const int8_t* iend = reinterpret_cast<const int8_t*>(end);
const int8_t* p = begin;
uint64_t val = 0;
if (iend - begin >= max_varint_length) { // fast path
do {
int64_t b;
b = *p++; val = uint64_t((b & 0x7f) ); if (b >= 0) break;
b = *p++; val |= uint64_t((b & 0x7f) << 7); if (b >= 0) break;
b = *p++; val |= uint64_t((b & 0x7f) << 14); if (b >= 0) break;
b = *p++; val |= uint64_t((b & 0x7f) << 21); if (b >= 0) break;
b = *p++; val |= uint64_t((b & 0x7f) << 28); if (b >= 0) break;
b = *p++; val |= uint64_t((b & 0x7f) << 35); if (b >= 0) break;
b = *p++; val |= uint64_t((b & 0x7f) << 42); if (b >= 0) break;
b = *p++; val |= uint64_t((b & 0x7f) << 49); if (b >= 0) break;
b = *p++; val |= uint64_t((b & 0x7f) << 56); if (b >= 0) break;
b = *p++; val |= uint64_t((b & 0x7f) << 63); if (b >= 0) break;
throw varint_too_long_exception();
} while (false);
} else {
int shift = 0;
while (p != iend && *p < 0) {
val |= uint64_t(*p++ & 0x7f) << shift;
shift += 7;
}
if (p == iend) {
throw end_of_buffer_exception();
}
val |= uint64_t(*p++) << shift;
// If this is a one-byte varint, decode it here.
if (end != *data && ((**data & 0x80) == 0)) {
uint64_t val = uint64_t(**data);
++(*data);
return val;
}
*data = reinterpret_cast<const char*>(p);
return val;
// If this varint is more than one byte, defer to complete implementation.
return detail::decode_varint_impl(data, end);
}
/**
* Varint-encode a 64bit integer.
* Skip over a varint.
*
* Strong exception guarantee: if there is an exception the data pointer will
* not be changed.
*
* @param[in,out] data Pointer to pointer to the input data. After the function
* returns this will point to the next data to be read.
* @param[in] end Pointer one past the end of the input data.
* @throws end_of_buffer_exception if the *end* of the buffer was reached
* before the end of the varint.
*/
template <typename OutputIterator>
inline int write_varint(OutputIterator data, uint64_t value) {
int n=1;
inline void skip_varint(const char** data, const char* end) {
const int8_t* begin = reinterpret_cast<const int8_t*>(*data);
const int8_t* iend = reinterpret_cast<const int8_t*>(end);
const int8_t* p = begin;
while (p != iend && *p < 0) {
++p;
}
if (p >= begin + max_varint_length) {
throw varint_too_long_exception();
}
if (p == iend) {
throw end_of_buffer_exception();
}
++p;
*data = reinterpret_cast<const char*>(p);
}
/**
* Varint encode a 64 bit integer.
*
* @tparam T An output iterator type.
* @param data Output iterator the varint encoded value will be written to
* byte by byte.
* @param value The integer that will be encoded.
* @throws Any exception thrown by increment or dereference operator on data.
*/
template <typename T>
inline int write_varint(T data, uint64_t value) {
int n = 1;
while (value >= 0x80) {
*data++ = char((value & 0x7f) | 0x80);
@ -102,29 +157,29 @@ inline int write_varint(OutputIterator data, uint64_t value) {
/**
* ZigZag encodes a 32 bit integer.
*/
inline uint32_t encode_zigzag32(int32_t value) noexcept {
inline constexpr uint32_t encode_zigzag32(int32_t value) noexcept {
return (static_cast<uint32_t>(value) << 1) ^ (static_cast<uint32_t>(value >> 31));
}
/**
* ZigZag encodes a 64 bit integer.
*/
inline uint64_t encode_zigzag64(int64_t value) noexcept {
inline constexpr uint64_t encode_zigzag64(int64_t value) noexcept {
return (static_cast<uint64_t>(value) << 1) ^ (static_cast<uint64_t>(value >> 63));
}
/**
* Decodes a 32 bit ZigZag-encoded integer.
*/
inline int32_t decode_zigzag32(uint32_t value) noexcept {
return int32_t(value >> 1) ^ -int32_t(value & 1);
inline constexpr int32_t decode_zigzag32(uint32_t value) noexcept {
return static_cast<int32_t>(value >> 1) ^ -static_cast<int32_t>(value & 1);
}
/**
* Decodes a 64 bit ZigZag-encoded integer.
*/
inline int64_t decode_zigzag64(uint64_t value) noexcept {
return int64_t(value >> 1) ^ -int64_t(value & 1);
inline constexpr int64_t decode_zigzag64(uint64_t value) noexcept {
return static_cast<int64_t>(value >> 1) ^ -static_cast<int64_t>(value & 1);
}
} // end namespace protozero

View File

@ -10,13 +10,25 @@ documentation.
*****************************************************************************/
#define PROTOZERO_VERSION_MAJOR 1
#define PROTOZERO_VERSION_MINOR 3
#define PROTOZERO_VERSION_PATCH 0
/**
* @file version.hpp
*
* @brief Contains macros defining the protozero version.
*/
/// The major version number
#define PROTOZERO_VERSION_MAJOR 1
/// The minor version number
#define PROTOZERO_VERSION_MINOR 5
/// The patch number
#define PROTOZERO_VERSION_PATCH 2
/// The complete version number
#define PROTOZERO_VERSION_CODE (PROTOZERO_VERSION_MAJOR * 10000 + PROTOZERO_VERSION_MINOR * 100 + PROTOZERO_VERSION_PATCH)
#define PROTOZERO_VERSION_STRING "1.3.0"
/// Version number as string
#define PROTOZERO_VERSION_STRING "1.5.2"
#endif // PROTOZERO_VERSION_HPP

View File

@ -0,0 +1,39 @@
{ "type": "Feature", "properties": { "booltype": null, "expect": false }, "geometry": { "type": "Point", "coordinates": [ 0,0 ] } }
{ "type": "Feature", "properties": { "booltype": "null", "expect": false }, "geometry": { "type": "Point", "coordinates": [ 0,0 ] } }
{ "type": "Feature", "properties": { "booltype": "", "expect": false }, "geometry": { "type": "Point", "coordinates": [ 0,0 ] } }
{ "type": "Feature", "properties": { "booltype": 0, "expect": false }, "geometry": { "type": "Point", "coordinates": [ 0,0 ] } }
{ "type": "Feature", "properties": { "booltype": "0", "expect": false }, "geometry": { "type": "Point", "coordinates": [ 0,0 ] } }
{ "type": "Feature", "properties": { "booltype": false, "expect": false }, "geometry": { "type": "Point", "coordinates": [ 0,0 ] } }
{ "type": "Feature", "properties": { "booltype": "false", "expect": false }, "geometry": { "type": "Point", "coordinates": [ 0,0 ] } }
{ "type": "Feature", "properties": { "booltype": true, "expect": true }, "geometry": { "type": "Point", "coordinates": [ 0,0 ] } }
{ "type": "Feature", "properties": { "booltype": 1, "expect": true }, "geometry": { "type": "Point", "coordinates": [ 0,0 ] } }
{ "type": "Feature", "properties": { "booltype": 0.0, "expect": true }, "geometry": { "type": "Point", "coordinates": [ 0,0 ] } }
{ "type": "Feature", "properties": { "booltype": "yes", "expect": true }, "geometry": { "type": "Point", "coordinates": [ 0,0 ] } }
{ "type": "Feature", "properties": { "booltype": [ 2, 3 ], "expect": true }, "geometry": { "type": "Point", "coordinates": [ 0,0 ] } }
{ "type": "Feature", "properties": { "stringtype": null, "expect": "null" }, "geometry": { "type": "Point", "coordinates": [ 0,0 ] } }
{ "type": "Feature", "properties": { "stringtype": 2, "expect": "2" }, "geometry": { "type": "Point", "coordinates": [ 0,0 ] } }
{ "type": "Feature", "properties": { "stringtype": 2.5, "expect": "2.5" }, "geometry": { "type": "Point", "coordinates": [ 0,0 ] } }
{ "type": "Feature", "properties": { "stringtype": true, "expect": "true" }, "geometry": { "type": "Point", "coordinates": [ 0,0 ] } }
{ "type": "Feature", "properties": { "stringtype": false, "expect": "false" }, "geometry": { "type": "Point", "coordinates": [ 0,0 ] } }
{ "type": "Feature", "properties": { "stringtype": "something", "expect": "something" }, "geometry": { "type": "Point", "coordinates": [ 0,0 ] } }
{ "type": "Feature", "properties": { "stringtype": [ 2, 3 ], "expect": "[2,3]" }, "geometry": { "type": "Point", "coordinates": [ 0,0 ] } }
{ "type": "Feature", "properties": { "inttype": null, "expect": 0 }, "geometry": { "type": "Point", "coordinates": [ 0,0 ] } }
{ "type": "Feature", "properties": { "inttype": "5", "expect": 5 }, "geometry": { "type": "Point", "coordinates": [ 0,0 ] } }
{ "type": "Feature", "properties": { "inttype": "5.6", "expect": 6 }, "geometry": { "type": "Point", "coordinates": [ 0,0 ] } }
{ "type": "Feature", "properties": { "inttype": 5.6, "expect": 6 }, "geometry": { "type": "Point", "coordinates": [ 0,0 ] } }
{ "type": "Feature", "properties": { "inttype": true, "expect": 0 }, "geometry": { "type": "Point", "coordinates": [ 0,0 ] } }
{ "type": "Feature", "properties": { "inttype": false, "expect": 0 }, "geometry": { "type": "Point", "coordinates": [ 0,0 ] } }
{ "type": "Feature", "properties": { "inttype": "", "expect": 0 }, "geometry": { "type": "Point", "coordinates": [ 0,0 ] } }
{ "type": "Feature", "properties": { "inttype": "yes", "expect": 0 }, "geometry": { "type": "Point", "coordinates": [ 0,0 ] } }
{ "type": "Feature", "properties": { "inttype": " 3", "expect": 3 }, "geometry": { "type": "Point", "coordinates": [ 0,0 ] } }
{ "type": "Feature", "properties": { "inttype": [ 2, 3 ], "expect": 0 }, "geometry": { "type": "Point", "coordinates": [ 0,0 ] } }
{ "type": "Feature", "properties": { "floattype": null, "expect": 0 }, "geometry": { "type": "Point", "coordinates": [ 0,0 ] } }
{ "type": "Feature", "properties": { "floattype": "5", "expect": 5 }, "geometry": { "type": "Point", "coordinates": [ 0,0 ] } }
{ "type": "Feature", "properties": { "floattype": "5.6", "expect": 5.6 }, "geometry": { "type": "Point", "coordinates": [ 0,0 ] } }
{ "type": "Feature", "properties": { "floattype": 5.6, "expect": 5.6 }, "geometry": { "type": "Point", "coordinates": [ 0,0 ] } }
{ "type": "Feature", "properties": { "floattype": true, "expect": 0 }, "geometry": { "type": "Point", "coordinates": [ 0,0 ] } }
{ "type": "Feature", "properties": { "floattype": false, "expect": 0 }, "geometry": { "type": "Point", "coordinates": [ 0,0 ] } }
{ "type": "Feature", "properties": { "floattype": "", "expect": 0 }, "geometry": { "type": "Point", "coordinates": [ 0,0 ] } }
{ "type": "Feature", "properties": { "floattype": "yes", "expect": 0 }, "geometry": { "type": "Point", "coordinates": [ 0,0 ] } }
{ "type": "Feature", "properties": { "floattype": " 3", "expect": 3 }, "geometry": { "type": "Point", "coordinates": [ 0,0 ] } }
{ "type": "Feature", "properties": { "floattype": [ 2, 3 ], "expect": 0 }, "geometry": { "type": "Point", "coordinates": [ 0,0 ] } }

View File

@ -0,0 +1,94 @@
{ "type": "FeatureCollection", "properties": {
"bounds": "0.000000,0.000000,0.000000,0.000000",
"center": "0.000000,0.000000,0",
"description": "tests/attribute-type/out/-z0_-Tinttype@int_-Tfloattype@float_-Tbooltype@bool_-Tstringtype@string.json.check.mbtiles",
"format": "pbf",
"json": "{\"vector_layers\": [ { \"id\": \"in\", \"description\": \"\", \"minzoom\": 0, \"maxzoom\": 0, \"fields\": {\"booltype\": \"Boolean\", \"expect\": \"String\", \"expect\": \"Number\", \"expect\": \"Boolean\", \"floattype\": \"Number\", \"inttype\": \"Number\", \"stringtype\": \"String\"} } ] }",
"maxzoom": "0",
"minzoom": "0",
"name": "tests/attribute-type/out/-z0_-Tinttype@int_-Tfloattype@float_-Tbooltype@bool_-Tstringtype@string.json.check.mbtiles",
"type": "overlay",
"version": "2"
}, "features": [
{ "type": "FeatureCollection", "properties": { "zoom": 0, "x": 0, "y": 0 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "booltype": false, "expect": false }, "geometry": { "type": "Point", "coordinates": [ 0.000000, 0.000000 ] } }
,
{ "type": "Feature", "properties": { "booltype": false, "expect": false }, "geometry": { "type": "Point", "coordinates": [ 0.000000, 0.000000 ] } }
,
{ "type": "Feature", "properties": { "booltype": false, "expect": false }, "geometry": { "type": "Point", "coordinates": [ 0.000000, 0.000000 ] } }
,
{ "type": "Feature", "properties": { "booltype": false, "expect": false }, "geometry": { "type": "Point", "coordinates": [ 0.000000, 0.000000 ] } }
,
{ "type": "Feature", "properties": { "booltype": false, "expect": false }, "geometry": { "type": "Point", "coordinates": [ 0.000000, 0.000000 ] } }
,
{ "type": "Feature", "properties": { "booltype": false, "expect": false }, "geometry": { "type": "Point", "coordinates": [ 0.000000, 0.000000 ] } }
,
{ "type": "Feature", "properties": { "booltype": false, "expect": false }, "geometry": { "type": "Point", "coordinates": [ 0.000000, 0.000000 ] } }
,
{ "type": "Feature", "properties": { "booltype": true, "expect": true }, "geometry": { "type": "Point", "coordinates": [ 0.000000, 0.000000 ] } }
,
{ "type": "Feature", "properties": { "booltype": true, "expect": true }, "geometry": { "type": "Point", "coordinates": [ 0.000000, 0.000000 ] } }
,
{ "type": "Feature", "properties": { "booltype": true, "expect": true }, "geometry": { "type": "Point", "coordinates": [ 0.000000, 0.000000 ] } }
,
{ "type": "Feature", "properties": { "booltype": true, "expect": true }, "geometry": { "type": "Point", "coordinates": [ 0.000000, 0.000000 ] } }
,
{ "type": "Feature", "properties": { "booltype": true, "expect": true }, "geometry": { "type": "Point", "coordinates": [ 0.000000, 0.000000 ] } }
,
{ "type": "Feature", "properties": { "stringtype": "null", "expect": "null" }, "geometry": { "type": "Point", "coordinates": [ 0.000000, 0.000000 ] } }
,
{ "type": "Feature", "properties": { "stringtype": "2", "expect": "2" }, "geometry": { "type": "Point", "coordinates": [ 0.000000, 0.000000 ] } }
,
{ "type": "Feature", "properties": { "stringtype": "2.5", "expect": "2.5" }, "geometry": { "type": "Point", "coordinates": [ 0.000000, 0.000000 ] } }
,
{ "type": "Feature", "properties": { "stringtype": "true", "expect": "true" }, "geometry": { "type": "Point", "coordinates": [ 0.000000, 0.000000 ] } }
,
{ "type": "Feature", "properties": { "stringtype": "false", "expect": "false" }, "geometry": { "type": "Point", "coordinates": [ 0.000000, 0.000000 ] } }
,
{ "type": "Feature", "properties": { "stringtype": "something", "expect": "something" }, "geometry": { "type": "Point", "coordinates": [ 0.000000, 0.000000 ] } }
,
{ "type": "Feature", "properties": { "stringtype": "[2,3]", "expect": "[2,3]" }, "geometry": { "type": "Point", "coordinates": [ 0.000000, 0.000000 ] } }
,
{ "type": "Feature", "properties": { "inttype": 0, "expect": 0 }, "geometry": { "type": "Point", "coordinates": [ 0.000000, 0.000000 ] } }
,
{ "type": "Feature", "properties": { "inttype": 5, "expect": 5 }, "geometry": { "type": "Point", "coordinates": [ 0.000000, 0.000000 ] } }
,
{ "type": "Feature", "properties": { "inttype": 6, "expect": 6 }, "geometry": { "type": "Point", "coordinates": [ 0.000000, 0.000000 ] } }
,
{ "type": "Feature", "properties": { "inttype": 6, "expect": 6 }, "geometry": { "type": "Point", "coordinates": [ 0.000000, 0.000000 ] } }
,
{ "type": "Feature", "properties": { "inttype": 0, "expect": 0 }, "geometry": { "type": "Point", "coordinates": [ 0.000000, 0.000000 ] } }
,
{ "type": "Feature", "properties": { "inttype": 0, "expect": 0 }, "geometry": { "type": "Point", "coordinates": [ 0.000000, 0.000000 ] } }
,
{ "type": "Feature", "properties": { "inttype": 0, "expect": 0 }, "geometry": { "type": "Point", "coordinates": [ 0.000000, 0.000000 ] } }
,
{ "type": "Feature", "properties": { "inttype": 0, "expect": 0 }, "geometry": { "type": "Point", "coordinates": [ 0.000000, 0.000000 ] } }
,
{ "type": "Feature", "properties": { "inttype": 3, "expect": 3 }, "geometry": { "type": "Point", "coordinates": [ 0.000000, 0.000000 ] } }
,
{ "type": "Feature", "properties": { "inttype": 0, "expect": 0 }, "geometry": { "type": "Point", "coordinates": [ 0.000000, 0.000000 ] } }
,
{ "type": "Feature", "properties": { "floattype": 0, "expect": 0 }, "geometry": { "type": "Point", "coordinates": [ 0.000000, 0.000000 ] } }
,
{ "type": "Feature", "properties": { "floattype": 5, "expect": 5 }, "geometry": { "type": "Point", "coordinates": [ 0.000000, 0.000000 ] } }
,
{ "type": "Feature", "properties": { "floattype": 5.6, "expect": 5.6 }, "geometry": { "type": "Point", "coordinates": [ 0.000000, 0.000000 ] } }
,
{ "type": "Feature", "properties": { "floattype": 5.6, "expect": 5.6 }, "geometry": { "type": "Point", "coordinates": [ 0.000000, 0.000000 ] } }
,
{ "type": "Feature", "properties": { "floattype": 0, "expect": 0 }, "geometry": { "type": "Point", "coordinates": [ 0.000000, 0.000000 ] } }
,
{ "type": "Feature", "properties": { "floattype": 0, "expect": 0 }, "geometry": { "type": "Point", "coordinates": [ 0.000000, 0.000000 ] } }
,
{ "type": "Feature", "properties": { "floattype": 0, "expect": 0 }, "geometry": { "type": "Point", "coordinates": [ 0.000000, 0.000000 ] } }
,
{ "type": "Feature", "properties": { "floattype": 0, "expect": 0 }, "geometry": { "type": "Point", "coordinates": [ 0.000000, 0.000000 ] } }
,
{ "type": "Feature", "properties": { "floattype": 3, "expect": 3 }, "geometry": { "type": "Point", "coordinates": [ 0.000000, 0.000000 ] } }
,
{ "type": "Feature", "properties": { "floattype": 0, "expect": 0 }, "geometry": { "type": "Point", "coordinates": [ 0.000000, 0.000000 ] } }
] }
] }
] }

2
tests/islands/in.json Normal file

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,224 @@
{ "type": "FeatureCollection", "properties": {
"bounds": "-174.543406,-10.009861,174.245779,9.775580",
"center": "172.968750,1.405686,7",
"description": "tests/islands/out/-d7_-z7_-pt_-pp.json.check.mbtiles",
"format": "pbf",
"json": "{\"vector_layers\": [ { \"id\": \"in\", \"description\": \"\", \"minzoom\": 0, \"maxzoom\": 7, \"fields\": {\"OBJECTID_1\": \"Number\", \"adm0_a3\": \"String\", \"adm0_label\": \"Number\", \"adm0_sr\": \"Number\", \"adm1_cod_1\": \"String\", \"adm1_code\": \"String\", \"admin\": \"String\", \"area_sqkm\": \"Number\", \"check_me\": \"Number\", \"code_hasc\": \"String\", \"datarank\": \"Number\", \"diss_me\": \"Number\", \"featurecla\": \"String\", \"fips\": \"String\", \"gadm_level\": \"Number\", \"geonunit\": \"String\", \"gn_a1_code\": \"String\", \"gn_id\": \"Number\", \"gn_level\": \"Number\", \"gn_name\": \"String\", \"gns_adm1\": \"String\", \"gns_id\": \"Number\", \"gns_level\": \"Number\", \"gns_name\": \"String\", \"gu_a3\": \"String\", \"iso_3166_2\": \"String\", \"iso_a2\": \"String\", \"labelrank\": \"Number\", \"latitude\": \"Number\", \"longitude\": \"Number\", \"mapcolor13\": \"Number\", \"mapcolor9\": \"Number\", \"name\": \"String\", \"name_len\": \"Number\", \"note\": \"String\", \"provnum_ne\": \"Number\", \"sameascity\": \"Number\", \"scalerank\": \"Number\", \"sov_a3\": \"String\", \"wikipedia\": \"String\", \"woe_id\": \"Number\", \"woe_label\": \"String\", \"woe_name\": \"String\"} } ] }",
"maxzoom": "7",
"minzoom": "0",
"name": "tests/islands/out/-d7_-z7_-pt_-pp.json.check.mbtiles",
"type": "overlay",
"version": "2"
}, "features": [
{ "type": "FeatureCollection", "properties": { "zoom": 0, "x": 0, "y": 0 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm1_code": "KIR+99?", "OBJECTID_1": 3643, "diss_me": 10097, "adm1_cod_1": "KIR+99?", "iso_3166_2": "KI-", "iso_a2": "KI", "adm0_sr": 5, "code_hasc": "-99", "note": "KIR-99 (Kiribati minor island)", "provnum_ne": 0, "gadm_level": 0, "check_me": 0, "scalerank": 11, "datarank": 11, "area_sqkm": 0, "sameascity": -99, "labelrank": 20, "featurecla": "Admin-1 minor island", "name_len": 0, "mapcolor9": 6, "mapcolor13": 12, "woe_id": -99, "latitude": -4.68967, "longitude": -174.511, "sov_a3": "KIR", "adm0_a3": "KIR", "adm0_label": 7, "admin": "Kiribati", "geonunit": "Kiribati", "gu_a3": "KIR", "gn_id": 0, "gns_id": 0, "gn_level": 0, "gn_a1_code": "KI.", "gns_level": 0 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -43.242188, -3.951941 ], [ -43.154297, -3.951941 ], [ -43.154297, -4.039618 ], [ -43.242188, -4.039618 ], [ -43.242188, -3.951941 ] ] ] } }
,
{ "type": "Feature", "properties": { "adm1_code": "FSM-4943", "OBJECTID_1": 6464, "diss_me": 4943, "adm1_cod_1": "FSM-4943", "iso_3166_2": "FM-YAP", "wikipedia": "http://en.wikipedia.org/wiki/Yap_State", "iso_a2": "FM", "adm0_sr": 5, "name": "Yap", "code_hasc": "FM.YA", "provnum_ne": 0, "gadm_level": 0, "check_me": 0, "scalerank": 10, "datarank": 10, "area_sqkm": 0, "sameascity": -99, "labelrank": 20, "featurecla": "Admin-1 scale rank", "name_len": 3, "mapcolor9": 4, "mapcolor13": 13, "fips": "FM04", "woe_id": 2345343, "woe_label": "Yap, FM, Federated States of Micronesia", "woe_name": "Yap", "latitude": 9.58101, "longitude": 138.114, "sov_a3": "FSM", "adm0_a3": "FSM", "adm0_label": 5, "admin": "Federated States of Micronesia", "geonunit": "Federated States of Micronesia", "gu_a3": "FSM", "gn_id": 2081175, "gn_name": "State of Yap", "gns_id": -3741502, "gns_name": "Yap, State of", "gn_level": 1, "gn_a1_code": "FM.04", "gns_level": 1, "gns_adm1": "FM04" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 142.294922, 8.320212 ], [ 142.382812, 8.320212 ], [ 142.382812, 8.146243 ], [ 142.294922, 8.146243 ], [ 142.294922, 8.320212 ] ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 1, "x": 0, "y": 1 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm1_code": "KIR+99?", "OBJECTID_1": 3643, "diss_me": 10097, "adm1_cod_1": "KIR+99?", "iso_3166_2": "KI-", "iso_a2": "KI", "adm0_sr": 5, "code_hasc": "-99", "note": "KIR-99 (Kiribati minor island)", "provnum_ne": 0, "gadm_level": 0, "check_me": 0, "scalerank": 11, "datarank": 11, "area_sqkm": 0, "sameascity": -99, "labelrank": 20, "featurecla": "Admin-1 minor island", "name_len": 0, "mapcolor9": 6, "mapcolor13": 12, "woe_id": -99, "latitude": -4.68967, "longitude": -174.511, "sov_a3": "KIR", "adm0_a3": "KIR", "adm0_label": 7, "admin": "Kiribati", "geonunit": "Kiribati", "gu_a3": "KIR", "gn_id": 0, "gns_id": 0, "gn_level": 0, "gn_a1_code": "KI.", "gns_level": 0 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -155.917969, -5.572250 ], [ -155.874023, -5.615986 ], [ -155.961914, -5.615986 ], [ -155.917969, -5.572250 ] ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 1, "x": 1, "y": 1 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm1_code": "KIR+99?", "OBJECTID_1": 3643, "diss_me": 10097, "adm1_cod_1": "KIR+99?", "iso_3166_2": "KI-", "iso_a2": "KI", "adm0_sr": 5, "code_hasc": "-99", "note": "KIR-99 (Kiribati minor island)", "provnum_ne": 0, "gadm_level": 0, "check_me": 0, "scalerank": 11, "datarank": 11, "area_sqkm": 0, "sameascity": -99, "labelrank": 20, "featurecla": "Admin-1 minor island", "name_len": 0, "mapcolor9": 6, "mapcolor13": 12, "woe_id": -99, "latitude": -4.68967, "longitude": -174.511, "sov_a3": "KIR", "adm0_a3": "KIR", "adm0_label": 7, "admin": "Kiribati", "geonunit": "Kiribati", "gu_a3": "KIR", "gn_id": 0, "gns_id": 0, "gn_level": 0, "gn_a1_code": "KI.", "gns_level": 0 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 174.199219, -0.483393 ], [ 174.243164, -0.527336 ], [ 174.199219, -0.527336 ], [ 174.199219, -0.483393 ] ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 1, "x": 1, "y": 0 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm1_code": "KIR+99?", "OBJECTID_1": 3643, "diss_me": 10097, "adm1_cod_1": "KIR+99?", "iso_3166_2": "KI-", "iso_a2": "KI", "adm0_sr": 5, "code_hasc": "-99", "note": "KIR-99 (Kiribati minor island)", "provnum_ne": 0, "gadm_level": 0, "check_me": 0, "scalerank": 11, "datarank": 11, "area_sqkm": 0, "sameascity": -99, "labelrank": 20, "featurecla": "Admin-1 minor island", "name_len": 0, "mapcolor9": 6, "mapcolor13": 12, "woe_id": -99, "latitude": -4.68967, "longitude": -174.511, "sov_a3": "KIR", "adm0_a3": "KIR", "adm0_label": 7, "admin": "Kiribati", "geonunit": "Kiribati", "gu_a3": "KIR", "gn_id": 0, "gns_id": 0, "gn_level": 0, "gn_a1_code": "KI.", "gns_level": 0 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 174.199219, -0.483393 ], [ 174.243164, -0.527336 ], [ 174.199219, -0.527336 ], [ 174.199219, -0.483393 ] ] ] } }
,
{ "type": "Feature", "properties": { "adm1_code": "FSM-4943", "OBJECTID_1": 6464, "diss_me": 4943, "adm1_cod_1": "FSM-4943", "iso_3166_2": "FM-YAP", "wikipedia": "http://en.wikipedia.org/wiki/Yap_State", "iso_a2": "FM", "adm0_sr": 5, "name": "Yap", "code_hasc": "FM.YA", "provnum_ne": 0, "gadm_level": 0, "check_me": 0, "scalerank": 10, "datarank": 10, "area_sqkm": 0, "sameascity": -99, "labelrank": 20, "featurecla": "Admin-1 scale rank", "name_len": 3, "mapcolor9": 4, "mapcolor13": 13, "fips": "FM04", "woe_id": 2345343, "woe_label": "Yap, FM, Federated States of Micronesia", "woe_name": "Yap", "latitude": 9.58101, "longitude": 138.114, "sov_a3": "FSM", "adm0_a3": "FSM", "adm0_label": 5, "admin": "Federated States of Micronesia", "geonunit": "Federated States of Micronesia", "gu_a3": "FSM", "gn_id": 2081175, "gn_name": "State of Yap", "gns_id": -3741502, "gns_name": "Yap, State of", "gn_level": 1, "gn_a1_code": "FM.04", "gns_level": 1, "gns_adm1": "FM04" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.164062, 9.622414 ], [ 138.164062, 9.535749 ], [ 138.032227, 9.449062 ], [ 138.164062, 9.622414 ] ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 2, "x": 0, "y": 2 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm1_code": "KIR+99?", "OBJECTID_1": 3643, "diss_me": 10097, "adm1_cod_1": "KIR+99?", "iso_3166_2": "KI-", "iso_a2": "KI", "adm0_sr": 5, "code_hasc": "-99", "note": "KIR-99 (Kiribati minor island)", "provnum_ne": 0, "gadm_level": 0, "check_me": 0, "scalerank": 11, "datarank": 11, "area_sqkm": 0, "sameascity": -99, "labelrank": 20, "featurecla": "Admin-1 minor island", "name_len": 0, "mapcolor9": 6, "mapcolor13": 12, "woe_id": -99, "latitude": -4.68967, "longitude": -174.511, "sov_a3": "KIR", "adm0_a3": "KIR", "adm0_label": 7, "admin": "Kiribati", "geonunit": "Kiribati", "gu_a3": "KIR", "gn_id": 0, "gns_id": 0, "gn_level": 0, "gn_a1_code": "KI.", "gns_level": 0 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -155.917969, -5.594118 ], [ -155.874023, -5.615986 ], [ -155.939941, -5.615986 ], [ -155.917969, -5.594118 ] ] ], [ [ [ -174.528809, -4.653080 ], [ -174.506836, -4.674980 ], [ -174.528809, -4.674980 ], [ -174.528809, -4.653080 ] ] ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 2, "x": 3, "y": 2 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm1_code": "KIR+99?", "OBJECTID_1": 3643, "diss_me": 10097, "adm1_cod_1": "KIR+99?", "iso_3166_2": "KI-", "iso_a2": "KI", "adm0_sr": 5, "code_hasc": "-99", "note": "KIR-99 (Kiribati minor island)", "provnum_ne": 0, "gadm_level": 0, "check_me": 0, "scalerank": 11, "datarank": 11, "area_sqkm": 0, "sameascity": -99, "labelrank": 20, "featurecla": "Admin-1 minor island", "name_len": 0, "mapcolor9": 6, "mapcolor13": 12, "woe_id": -99, "latitude": -4.68967, "longitude": -174.511, "sov_a3": "KIR", "adm0_a3": "KIR", "adm0_label": 7, "admin": "Kiribati", "geonunit": "Kiribati", "gu_a3": "KIR", "gn_id": 0, "gns_id": 0, "gn_level": 0, "gn_a1_code": "KI.", "gns_level": 0 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 174.221191, -0.505365 ], [ 174.243164, -0.527336 ], [ 174.221191, -0.527336 ], [ 174.221191, -0.505365 ] ] ], [ [ [ 173.386230, 0.241699 ], [ 173.408203, 0.219726 ], [ 173.386230, 0.197754 ], [ 173.364258, 0.241699 ], [ 173.386230, 0.241699 ] ] ], [ [ [ 173.913574, 0.417477 ], [ 173.935547, 0.395505 ], [ 173.935547, 0.329588 ], [ 173.913574, 0.417477 ] ] ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 2, "x": 3, "y": 1 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm1_code": "KIR+99?", "OBJECTID_1": 3643, "diss_me": 10097, "adm1_cod_1": "KIR+99?", "iso_3166_2": "KI-", "iso_a2": "KI", "adm0_sr": 5, "code_hasc": "-99", "note": "KIR-99 (Kiribati minor island)", "provnum_ne": 0, "gadm_level": 0, "check_me": 0, "scalerank": 11, "datarank": 11, "area_sqkm": 0, "sameascity": -99, "labelrank": 20, "featurecla": "Admin-1 minor island", "name_len": 0, "mapcolor9": 6, "mapcolor13": 12, "woe_id": -99, "latitude": -4.68967, "longitude": -174.511, "sov_a3": "KIR", "adm0_a3": "KIR", "adm0_label": 7, "admin": "Kiribati", "geonunit": "Kiribati", "gu_a3": "KIR", "gn_id": 0, "gns_id": 0, "gn_level": 0, "gn_a1_code": "KI.", "gns_level": 0 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 174.221191, -0.505365 ], [ 174.243164, -0.527336 ], [ 174.221191, -0.527336 ], [ 174.221191, -0.505365 ] ] ], [ [ [ 173.386230, 0.241699 ], [ 173.408203, 0.219726 ], [ 173.386230, 0.197754 ], [ 173.364258, 0.241699 ], [ 173.386230, 0.241699 ] ] ], [ [ [ 173.913574, 0.417477 ], [ 173.935547, 0.395505 ], [ 173.935547, 0.329588 ], [ 173.913574, 0.417477 ] ] ] ] } }
,
{ "type": "Feature", "properties": { "adm1_code": "FSM-4943", "OBJECTID_1": 6464, "diss_me": 4943, "adm1_cod_1": "FSM-4943", "iso_3166_2": "FM-YAP", "wikipedia": "http://en.wikipedia.org/wiki/Yap_State", "iso_a2": "FM", "adm0_sr": 5, "name": "Yap", "code_hasc": "FM.YA", "provnum_ne": 0, "gadm_level": 0, "check_me": 0, "scalerank": 10, "datarank": 10, "area_sqkm": 0, "sameascity": -99, "labelrank": 20, "featurecla": "Admin-1 scale rank", "name_len": 3, "mapcolor9": 4, "mapcolor13": 13, "fips": "FM04", "woe_id": 2345343, "woe_label": "Yap, FM, Federated States of Micronesia", "woe_name": "Yap", "latitude": 9.58101, "longitude": 138.114, "sov_a3": "FSM", "adm0_a3": "FSM", "adm0_label": 5, "admin": "Federated States of Micronesia", "geonunit": "Federated States of Micronesia", "gu_a3": "FSM", "gn_id": 2081175, "gn_name": "State of Yap", "gns_id": -3741502, "gns_name": "Yap, State of", "gn_level": 1, "gn_a1_code": "FM.04", "gns_level": 1, "gns_adm1": "FM04" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.208008, 9.557417 ], [ 138.186035, 9.514079 ], [ 138.142090, 9.535749 ], [ 138.054199, 9.427387 ], [ 138.120117, 9.579084 ], [ 138.142090, 9.557417 ], [ 138.208008, 9.557417 ] ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 3, "x": 0, "y": 4 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm1_code": "KIR+99?", "OBJECTID_1": 3643, "diss_me": 10097, "adm1_cod_1": "KIR+99?", "iso_3166_2": "KI-", "iso_a2": "KI", "adm0_sr": 5, "code_hasc": "-99", "note": "KIR-99 (Kiribati minor island)", "provnum_ne": 0, "gadm_level": 0, "check_me": 0, "scalerank": 11, "datarank": 11, "area_sqkm": 0, "sameascity": -99, "labelrank": 20, "featurecla": "Admin-1 minor island", "name_len": 0, "mapcolor9": 6, "mapcolor13": 12, "woe_id": -99, "latitude": -4.68967, "longitude": -174.511, "sov_a3": "KIR", "adm0_a3": "KIR", "adm0_label": 7, "admin": "Kiribati", "geonunit": "Kiribati", "gu_a3": "KIR", "gn_id": 0, "gns_id": 0, "gn_level": 0, "gn_a1_code": "KI.", "gns_level": 0 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -155.917969, -5.615986 ], [ -155.895996, -5.594118 ], [ -155.874023, -5.594118 ], [ -155.874023, -5.615986 ], [ -155.917969, -5.615986 ] ] ], [ [ [ -174.506836, -4.674980 ], [ -174.506836, -4.696879 ], [ -174.528809, -4.674980 ], [ -174.506836, -4.674980 ] ] ], [ [ [ -174.528809, -4.653080 ], [ -174.506836, -4.674980 ], [ -174.550781, -4.653080 ], [ -174.528809, -4.653080 ] ] ], [ [ [ -171.276855, -4.434044 ], [ -171.232910, -4.455951 ], [ -171.276855, -4.455951 ], [ -171.276855, -4.434044 ] ] ], [ [ [ -155.917969, -5.615986 ], [ -155.939941, -5.615986 ], [ -155.939941, -5.594118 ], [ -155.917969, -5.594118 ], [ -155.917969, -5.615986 ] ] ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 3, "x": 7, "y": 4 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm1_code": "KIR+99?", "OBJECTID_1": 3643, "diss_me": 10097, "adm1_cod_1": "KIR+99?", "iso_3166_2": "KI-", "iso_a2": "KI", "adm0_sr": 5, "code_hasc": "-99", "note": "KIR-99 (Kiribati minor island)", "provnum_ne": 0, "gadm_level": 0, "check_me": 0, "scalerank": 11, "datarank": 11, "area_sqkm": 0, "sameascity": -99, "labelrank": 20, "featurecla": "Admin-1 minor island", "name_len": 0, "mapcolor9": 6, "mapcolor13": 12, "woe_id": -99, "latitude": -4.68967, "longitude": -174.511, "sov_a3": "KIR", "adm0_a3": "KIR", "adm0_label": 7, "admin": "Kiribati", "geonunit": "Kiribati", "gu_a3": "KIR", "gn_id": 0, "gns_id": 0, "gn_level": 0, "gn_a1_code": "KI.", "gns_level": 0 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 174.221191, -0.505365 ], [ 174.243164, -0.527336 ], [ 174.221191, -0.527336 ], [ 174.221191, -0.505365 ] ] ], [ [ [ 173.540039, 0.197754 ], [ 173.540039, 0.175781 ], [ 173.518066, 0.175781 ], [ 173.518066, 0.197754 ], [ 173.540039, 0.197754 ] ] ], [ [ [ 173.386230, 0.241699 ], [ 173.408203, 0.219726 ], [ 173.386230, 0.197754 ], [ 173.364258, 0.241699 ], [ 173.386230, 0.241699 ] ] ], [ [ [ 173.342285, 0.285643 ], [ 173.364258, 0.263671 ], [ 173.364258, 0.241699 ], [ 173.342285, 0.285643 ] ] ], [ [ [ 173.913574, 0.417477 ], [ 173.935547, 0.395505 ], [ 173.935547, 0.329588 ], [ 173.913574, 0.417477 ] ] ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 3, "x": 7, "y": 3 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm1_code": "KIR+99?", "OBJECTID_1": 3643, "diss_me": 10097, "adm1_cod_1": "KIR+99?", "iso_3166_2": "KI-", "iso_a2": "KI", "adm0_sr": 5, "code_hasc": "-99", "note": "KIR-99 (Kiribati minor island)", "provnum_ne": 0, "gadm_level": 0, "check_me": 0, "scalerank": 11, "datarank": 11, "area_sqkm": 0, "sameascity": -99, "labelrank": 20, "featurecla": "Admin-1 minor island", "name_len": 0, "mapcolor9": 6, "mapcolor13": 12, "woe_id": -99, "latitude": -4.68967, "longitude": -174.511, "sov_a3": "KIR", "adm0_a3": "KIR", "adm0_label": 7, "admin": "Kiribati", "geonunit": "Kiribati", "gu_a3": "KIR", "gn_id": 0, "gns_id": 0, "gn_level": 0, "gn_a1_code": "KI.", "gns_level": 0 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 174.221191, -0.505365 ], [ 174.243164, -0.527336 ], [ 174.221191, -0.527336 ], [ 174.221191, -0.505365 ] ] ], [ [ [ 173.540039, 0.197754 ], [ 173.540039, 0.175781 ], [ 173.518066, 0.175781 ], [ 173.518066, 0.197754 ], [ 173.540039, 0.197754 ] ] ], [ [ [ 173.386230, 0.241699 ], [ 173.408203, 0.219726 ], [ 173.386230, 0.197754 ], [ 173.364258, 0.241699 ], [ 173.386230, 0.241699 ] ] ], [ [ [ 173.342285, 0.285643 ], [ 173.364258, 0.263671 ], [ 173.364258, 0.241699 ], [ 173.342285, 0.285643 ] ] ], [ [ [ 173.913574, 0.417477 ], [ 173.935547, 0.395505 ], [ 173.935547, 0.329588 ], [ 173.913574, 0.417477 ] ] ] ] } }
,
{ "type": "Feature", "properties": { "adm1_code": "FSM-4943", "OBJECTID_1": 6464, "diss_me": 4943, "adm1_cod_1": "FSM-4943", "iso_3166_2": "FM-YAP", "wikipedia": "http://en.wikipedia.org/wiki/Yap_State", "iso_a2": "FM", "adm0_sr": 5, "name": "Yap", "code_hasc": "FM.YA", "provnum_ne": 0, "gadm_level": 0, "check_me": 0, "scalerank": 10, "datarank": 10, "area_sqkm": 0, "sameascity": -99, "labelrank": 20, "featurecla": "Admin-1 scale rank", "name_len": 3, "mapcolor9": 4, "mapcolor13": 13, "fips": "FM04", "woe_id": 2345343, "woe_label": "Yap, FM, Federated States of Micronesia", "woe_name": "Yap", "latitude": 9.58101, "longitude": 138.114, "sov_a3": "FSM", "adm0_a3": "FSM", "adm0_label": 5, "admin": "Federated States of Micronesia", "geonunit": "Federated States of Micronesia", "gu_a3": "FSM", "gn_id": 2081175, "gn_name": "State of Yap", "gns_id": -3741502, "gns_name": "Yap, State of", "gn_level": 1, "gn_a1_code": "FM.04", "gns_level": 1, "gns_adm1": "FM04" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 138.186035, 9.600750 ], [ 138.164062, 9.557417 ], [ 138.208008, 9.557417 ], [ 138.186035, 9.514079 ], [ 138.142090, 9.535749 ], [ 138.076172, 9.427387 ], [ 138.054199, 9.427387 ], [ 138.054199, 9.470736 ], [ 138.120117, 9.557417 ], [ 138.120117, 9.579084 ], [ 138.142090, 9.579084 ], [ 138.186035, 9.600750 ] ] ], [ [ [ 140.515137, 9.795678 ], [ 140.515137, 9.774025 ], [ 140.493164, 9.774025 ], [ 140.515137, 9.795678 ] ] ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 4, "x": 0, "y": 8 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm1_code": "KIR+99?", "OBJECTID_1": 3643, "diss_me": 10097, "adm1_cod_1": "KIR+99?", "iso_3166_2": "KI-", "iso_a2": "KI", "adm0_sr": 5, "code_hasc": "-99", "note": "KIR-99 (Kiribati minor island)", "provnum_ne": 0, "gadm_level": 0, "check_me": 0, "scalerank": 11, "datarank": 11, "area_sqkm": 0, "sameascity": -99, "labelrank": 20, "featurecla": "Admin-1 minor island", "name_len": 0, "mapcolor9": 6, "mapcolor13": 12, "woe_id": -99, "latitude": -4.68967, "longitude": -174.511, "sov_a3": "KIR", "adm0_a3": "KIR", "adm0_label": 7, "admin": "Kiribati", "geonunit": "Kiribati", "gu_a3": "KIR", "gn_id": 0, "gns_id": 0, "gn_level": 0, "gn_a1_code": "KI.", "gns_level": 0 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -174.528809, -4.653080 ], [ -174.506836, -4.674980 ], [ -174.506836, -4.696879 ], [ -174.528809, -4.674980 ], [ -174.528809, -4.653080 ] ] ], [ [ [ -171.254883, -4.434044 ], [ -171.232910, -4.455951 ], [ -171.276855, -4.455951 ], [ -171.276855, -4.434044 ], [ -171.254883, -4.434044 ] ] ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 4, "x": 1, "y": 8 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm1_code": "KIR+99?", "OBJECTID_1": 3643, "diss_me": 10097, "adm1_cod_1": "KIR+99?", "iso_3166_2": "KI-", "iso_a2": "KI", "adm0_sr": 5, "code_hasc": "-99", "note": "KIR-99 (Kiribati minor island)", "provnum_ne": 0, "gadm_level": 0, "check_me": 0, "scalerank": 11, "datarank": 11, "area_sqkm": 0, "sameascity": -99, "labelrank": 20, "featurecla": "Admin-1 minor island", "name_len": 0, "mapcolor9": 6, "mapcolor13": 12, "woe_id": -99, "latitude": -4.68967, "longitude": -174.511, "sov_a3": "KIR", "adm0_a3": "KIR", "adm0_label": 7, "admin": "Kiribati", "geonunit": "Kiribati", "gu_a3": "KIR", "gn_id": 0, "gns_id": 0, "gn_level": 0, "gn_a1_code": "KI.", "gns_level": 0 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -155.917969, -5.615986 ], [ -155.895996, -5.594118 ], [ -155.874023, -5.594118 ], [ -155.874023, -5.615986 ], [ -155.917969, -5.615986 ] ] ], [ [ [ -155.917969, -5.615986 ], [ -155.939941, -5.615986 ], [ -155.939941, -5.594118 ], [ -155.917969, -5.594118 ], [ -155.917969, -5.615986 ] ] ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 4, "x": 14, "y": 7 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm1_code": "FSM-4943", "OBJECTID_1": 6464, "diss_me": 4943, "adm1_cod_1": "FSM-4943", "iso_3166_2": "FM-YAP", "wikipedia": "http://en.wikipedia.org/wiki/Yap_State", "iso_a2": "FM", "adm0_sr": 5, "name": "Yap", "code_hasc": "FM.YA", "provnum_ne": 0, "gadm_level": 0, "check_me": 0, "scalerank": 10, "datarank": 10, "area_sqkm": 0, "sameascity": -99, "labelrank": 20, "featurecla": "Admin-1 scale rank", "name_len": 3, "mapcolor9": 4, "mapcolor13": 13, "fips": "FM04", "woe_id": 2345343, "woe_label": "Yap, FM, Federated States of Micronesia", "woe_name": "Yap", "latitude": 9.58101, "longitude": 138.114, "sov_a3": "FSM", "adm0_a3": "FSM", "adm0_label": 5, "admin": "Federated States of Micronesia", "geonunit": "Federated States of Micronesia", "gu_a3": "FSM", "gn_id": 2081175, "gn_name": "State of Yap", "gns_id": -3741502, "gns_name": "Yap, State of", "gn_level": 1, "gn_a1_code": "FM.04", "gns_level": 1, "gns_adm1": "FM04" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 138.164062, 9.579084 ], [ 138.164062, 9.557417 ], [ 138.208008, 9.557417 ], [ 138.186035, 9.535749 ], [ 138.186035, 9.514079 ], [ 138.164062, 9.514079 ], [ 138.142090, 9.535749 ], [ 138.120117, 9.514079 ], [ 138.076172, 9.427387 ], [ 138.054199, 9.427387 ], [ 138.054199, 9.470736 ], [ 138.076172, 9.514079 ], [ 138.120117, 9.557417 ], [ 138.120117, 9.579084 ], [ 138.164062, 9.579084 ] ] ], [ [ [ 138.186035, 9.579084 ], [ 138.164062, 9.579084 ], [ 138.164062, 9.600750 ], [ 138.186035, 9.600750 ], [ 138.186035, 9.579084 ] ] ], [ [ [ 140.515137, 9.795678 ], [ 140.515137, 9.774025 ], [ 140.493164, 9.774025 ], [ 140.515137, 9.795678 ] ] ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 4, "x": 15, "y": 8 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm1_code": "KIR+99?", "OBJECTID_1": 3643, "diss_me": 10097, "adm1_cod_1": "KIR+99?", "iso_3166_2": "KI-", "iso_a2": "KI", "adm0_sr": 5, "code_hasc": "-99", "note": "KIR-99 (Kiribati minor island)", "provnum_ne": 0, "gadm_level": 0, "check_me": 0, "scalerank": 11, "datarank": 11, "area_sqkm": 0, "sameascity": -99, "labelrank": 20, "featurecla": "Admin-1 minor island", "name_len": 0, "mapcolor9": 6, "mapcolor13": 12, "woe_id": -99, "latitude": -4.68967, "longitude": -174.511, "sov_a3": "KIR", "adm0_a3": "KIR", "adm0_label": 7, "admin": "Kiribati", "geonunit": "Kiribati", "gu_a3": "KIR", "gn_id": 0, "gns_id": 0, "gn_level": 0, "gn_a1_code": "KI.", "gns_level": 0 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 174.221191, -0.505365 ], [ 174.243164, -0.527336 ], [ 174.221191, -0.527336 ], [ 174.221191, -0.505365 ] ] ], [ [ [ 173.540039, 0.197754 ], [ 173.540039, 0.175781 ], [ 173.518066, 0.175781 ], [ 173.518066, 0.197754 ], [ 173.540039, 0.197754 ] ] ], [ [ [ 173.386230, 0.241699 ], [ 173.408203, 0.219726 ], [ 173.386230, 0.197754 ], [ 173.364258, 0.219726 ], [ 173.364258, 0.241699 ], [ 173.386230, 0.241699 ] ] ], [ [ [ 173.342285, 0.285643 ], [ 173.364258, 0.263671 ], [ 173.364258, 0.241699 ], [ 173.342285, 0.263671 ], [ 173.342285, 0.285643 ] ] ], [ [ [ 173.913574, 0.417477 ], [ 173.935547, 0.395505 ], [ 173.935547, 0.373533 ], [ 173.913574, 0.417477 ] ] ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 4, "x": 15, "y": 7 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm1_code": "KIR+99?", "OBJECTID_1": 3643, "diss_me": 10097, "adm1_cod_1": "KIR+99?", "iso_3166_2": "KI-", "iso_a2": "KI", "adm0_sr": 5, "code_hasc": "-99", "note": "KIR-99 (Kiribati minor island)", "provnum_ne": 0, "gadm_level": 0, "check_me": 0, "scalerank": 11, "datarank": 11, "area_sqkm": 0, "sameascity": -99, "labelrank": 20, "featurecla": "Admin-1 minor island", "name_len": 0, "mapcolor9": 6, "mapcolor13": 12, "woe_id": -99, "latitude": -4.68967, "longitude": -174.511, "sov_a3": "KIR", "adm0_a3": "KIR", "adm0_label": 7, "admin": "Kiribati", "geonunit": "Kiribati", "gu_a3": "KIR", "gn_id": 0, "gns_id": 0, "gn_level": 0, "gn_a1_code": "KI.", "gns_level": 0 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 173.540039, 0.197754 ], [ 173.540039, 0.175781 ], [ 173.518066, 0.175781 ], [ 173.518066, 0.197754 ], [ 173.540039, 0.197754 ] ] ], [ [ [ 173.386230, 0.241699 ], [ 173.408203, 0.219726 ], [ 173.386230, 0.197754 ], [ 173.364258, 0.219726 ], [ 173.364258, 0.241699 ], [ 173.386230, 0.241699 ] ] ], [ [ [ 173.342285, 0.285643 ], [ 173.364258, 0.263671 ], [ 173.364258, 0.241699 ], [ 173.342285, 0.263671 ], [ 173.342285, 0.285643 ] ] ], [ [ [ 173.913574, 0.417477 ], [ 173.935547, 0.395505 ], [ 173.935547, 0.373533 ], [ 173.913574, 0.417477 ] ] ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 5, "x": 0, "y": 16 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm1_code": "KIR+99?", "OBJECTID_1": 3643, "diss_me": 10097, "adm1_cod_1": "KIR+99?", "iso_3166_2": "KI-", "iso_a2": "KI", "adm0_sr": 5, "code_hasc": "-99", "note": "KIR-99 (Kiribati minor island)", "provnum_ne": 0, "gadm_level": 0, "check_me": 0, "scalerank": 11, "datarank": 11, "area_sqkm": 0, "sameascity": -99, "labelrank": 20, "featurecla": "Admin-1 minor island", "name_len": 0, "mapcolor9": 6, "mapcolor13": 12, "woe_id": -99, "latitude": -4.68967, "longitude": -174.511, "sov_a3": "KIR", "adm0_a3": "KIR", "adm0_label": 7, "admin": "Kiribati", "geonunit": "Kiribati", "gu_a3": "KIR", "gn_id": 0, "gns_id": 0, "gn_level": 0, "gn_a1_code": "KI.", "gns_level": 0 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -174.528809, -4.653080 ], [ -174.506836, -4.674980 ], [ -174.506836, -4.696879 ], [ -174.528809, -4.674980 ], [ -174.528809, -4.653080 ] ] ], [ [ [ -171.254883, -4.434044 ], [ -171.232910, -4.455951 ], [ -171.276855, -4.455951 ], [ -171.276855, -4.434044 ], [ -171.254883, -4.434044 ] ] ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 5, "x": 2, "y": 16 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm1_code": "KIR+99?", "OBJECTID_1": 3643, "diss_me": 10097, "adm1_cod_1": "KIR+99?", "iso_3166_2": "KI-", "iso_a2": "KI", "adm0_sr": 5, "code_hasc": "-99", "note": "KIR-99 (Kiribati minor island)", "provnum_ne": 0, "gadm_level": 0, "check_me": 0, "scalerank": 11, "datarank": 11, "area_sqkm": 0, "sameascity": -99, "labelrank": 20, "featurecla": "Admin-1 minor island", "name_len": 0, "mapcolor9": 6, "mapcolor13": 12, "woe_id": -99, "latitude": -4.68967, "longitude": -174.511, "sov_a3": "KIR", "adm0_a3": "KIR", "adm0_label": 7, "admin": "Kiribati", "geonunit": "Kiribati", "gu_a3": "KIR", "gn_id": 0, "gns_id": 0, "gn_level": 0, "gn_a1_code": "KI.", "gns_level": 0 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -155.917969, -5.615986 ], [ -155.895996, -5.594118 ], [ -155.874023, -5.594118 ], [ -155.874023, -5.615986 ], [ -155.917969, -5.615986 ] ] ], [ [ [ -155.917969, -5.615986 ], [ -155.939941, -5.615986 ], [ -155.939941, -5.594118 ], [ -155.917969, -5.594118 ], [ -155.917969, -5.615986 ] ] ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 5, "x": 28, "y": 15 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm1_code": "FSM-4943", "OBJECTID_1": 6464, "diss_me": 4943, "adm1_cod_1": "FSM-4943", "iso_3166_2": "FM-YAP", "wikipedia": "http://en.wikipedia.org/wiki/Yap_State", "iso_a2": "FM", "adm0_sr": 5, "name": "Yap", "code_hasc": "FM.YA", "provnum_ne": 0, "gadm_level": 0, "check_me": 0, "scalerank": 10, "datarank": 10, "area_sqkm": 0, "sameascity": -99, "labelrank": 20, "featurecla": "Admin-1 scale rank", "name_len": 3, "mapcolor9": 4, "mapcolor13": 13, "fips": "FM04", "woe_id": 2345343, "woe_label": "Yap, FM, Federated States of Micronesia", "woe_name": "Yap", "latitude": 9.58101, "longitude": 138.114, "sov_a3": "FSM", "adm0_a3": "FSM", "adm0_label": 5, "admin": "Federated States of Micronesia", "geonunit": "Federated States of Micronesia", "gu_a3": "FSM", "gn_id": 2081175, "gn_name": "State of Yap", "gns_id": -3741502, "gns_name": "Yap, State of", "gn_level": 1, "gn_a1_code": "FM.04", "gns_level": 1, "gns_adm1": "FM04" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 138.164062, 9.579084 ], [ 138.164062, 9.557417 ], [ 138.208008, 9.557417 ], [ 138.186035, 9.535749 ], [ 138.186035, 9.514079 ], [ 138.164062, 9.514079 ], [ 138.142090, 9.535749 ], [ 138.120117, 9.514079 ], [ 138.076172, 9.427387 ], [ 138.054199, 9.427387 ], [ 138.054199, 9.470736 ], [ 138.076172, 9.514079 ], [ 138.120117, 9.557417 ], [ 138.120117, 9.579084 ], [ 138.164062, 9.579084 ] ] ], [ [ [ 138.186035, 9.579084 ], [ 138.164062, 9.579084 ], [ 138.164062, 9.600750 ], [ 138.186035, 9.600750 ], [ 138.186035, 9.579084 ] ] ], [ [ [ 140.515137, 9.795678 ], [ 140.515137, 9.774025 ], [ 140.493164, 9.774025 ], [ 140.515137, 9.795678 ] ] ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 5, "x": 31, "y": 16 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm1_code": "KIR+99?", "OBJECTID_1": 3643, "diss_me": 10097, "adm1_cod_1": "KIR+99?", "iso_3166_2": "KI-", "iso_a2": "KI", "adm0_sr": 5, "code_hasc": "-99", "note": "KIR-99 (Kiribati minor island)", "provnum_ne": 0, "gadm_level": 0, "check_me": 0, "scalerank": 11, "datarank": 11, "area_sqkm": 0, "sameascity": -99, "labelrank": 20, "featurecla": "Admin-1 minor island", "name_len": 0, "mapcolor9": 6, "mapcolor13": 12, "woe_id": -99, "latitude": -4.68967, "longitude": -174.511, "sov_a3": "KIR", "adm0_a3": "KIR", "adm0_label": 7, "admin": "Kiribati", "geonunit": "Kiribati", "gu_a3": "KIR", "gn_id": 0, "gns_id": 0, "gn_level": 0, "gn_a1_code": "KI.", "gns_level": 0 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 174.221191, -0.505365 ], [ 174.243164, -0.527336 ], [ 174.221191, -0.527336 ], [ 174.221191, -0.505365 ] ] ], [ [ [ 173.540039, 0.197754 ], [ 173.540039, 0.175781 ], [ 173.518066, 0.175781 ], [ 173.518066, 0.197754 ], [ 173.540039, 0.197754 ] ] ], [ [ [ 173.408203, 0.219726 ], [ 173.386230, 0.197754 ], [ 173.364258, 0.219726 ], [ 173.408203, 0.219726 ] ] ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 5, "x": 31, "y": 15 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm1_code": "KIR+99?", "OBJECTID_1": 3643, "diss_me": 10097, "adm1_cod_1": "KIR+99?", "iso_3166_2": "KI-", "iso_a2": "KI", "adm0_sr": 5, "code_hasc": "-99", "note": "KIR-99 (Kiribati minor island)", "provnum_ne": 0, "gadm_level": 0, "check_me": 0, "scalerank": 11, "datarank": 11, "area_sqkm": 0, "sameascity": -99, "labelrank": 20, "featurecla": "Admin-1 minor island", "name_len": 0, "mapcolor9": 6, "mapcolor13": 12, "woe_id": -99, "latitude": -4.68967, "longitude": -174.511, "sov_a3": "KIR", "adm0_a3": "KIR", "adm0_label": 7, "admin": "Kiribati", "geonunit": "Kiribati", "gu_a3": "KIR", "gn_id": 0, "gns_id": 0, "gn_level": 0, "gn_a1_code": "KI.", "gns_level": 0 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 173.540039, 0.197754 ], [ 173.540039, 0.175781 ], [ 173.518066, 0.175781 ], [ 173.518066, 0.197754 ], [ 173.540039, 0.197754 ] ] ], [ [ [ 173.386230, 0.241699 ], [ 173.408203, 0.219726 ], [ 173.386230, 0.197754 ], [ 173.364258, 0.219726 ], [ 173.364258, 0.241699 ], [ 173.386230, 0.241699 ] ] ], [ [ [ 173.342285, 0.285643 ], [ 173.364258, 0.263671 ], [ 173.364258, 0.241699 ], [ 173.342285, 0.263671 ], [ 173.342285, 0.285643 ] ] ], [ [ [ 173.913574, 0.417477 ], [ 173.935547, 0.395505 ], [ 173.935547, 0.373533 ], [ 173.913574, 0.417477 ] ] ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 6, "x": 0, "y": 32 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm1_code": "KIR+99?", "OBJECTID_1": 3643, "diss_me": 10097, "adm1_cod_1": "KIR+99?", "iso_3166_2": "KI-", "iso_a2": "KI", "adm0_sr": 5, "code_hasc": "-99", "note": "KIR-99 (Kiribati minor island)", "provnum_ne": 0, "gadm_level": 0, "check_me": 0, "scalerank": 11, "datarank": 11, "area_sqkm": 0, "sameascity": -99, "labelrank": 20, "featurecla": "Admin-1 minor island", "name_len": 0, "mapcolor9": 6, "mapcolor13": 12, "woe_id": -99, "latitude": -4.68967, "longitude": -174.511, "sov_a3": "KIR", "adm0_a3": "KIR", "adm0_label": 7, "admin": "Kiribati", "geonunit": "Kiribati", "gu_a3": "KIR", "gn_id": 0, "gns_id": 0, "gn_level": 0, "gn_a1_code": "KI.", "gns_level": 0 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -174.528809, -4.653080 ], [ -174.506836, -4.674980 ], [ -174.506836, -4.696879 ], [ -174.528809, -4.674980 ], [ -174.528809, -4.653080 ] ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 6, "x": 1, "y": 32 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm1_code": "KIR+99?", "OBJECTID_1": 3643, "diss_me": 10097, "adm1_cod_1": "KIR+99?", "iso_3166_2": "KI-", "iso_a2": "KI", "adm0_sr": 5, "code_hasc": "-99", "note": "KIR-99 (Kiribati minor island)", "provnum_ne": 0, "gadm_level": 0, "check_me": 0, "scalerank": 11, "datarank": 11, "area_sqkm": 0, "sameascity": -99, "labelrank": 20, "featurecla": "Admin-1 minor island", "name_len": 0, "mapcolor9": 6, "mapcolor13": 12, "woe_id": -99, "latitude": -4.68967, "longitude": -174.511, "sov_a3": "KIR", "adm0_a3": "KIR", "adm0_label": 7, "admin": "Kiribati", "geonunit": "Kiribati", "gu_a3": "KIR", "gn_id": 0, "gns_id": 0, "gn_level": 0, "gn_a1_code": "KI.", "gns_level": 0 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -171.254883, -4.434044 ], [ -171.232910, -4.455951 ], [ -171.276855, -4.455951 ], [ -171.276855, -4.434044 ], [ -171.254883, -4.434044 ] ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 6, "x": 4, "y": 33 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm1_code": "KIR+99?", "OBJECTID_1": 3643, "diss_me": 10097, "adm1_cod_1": "KIR+99?", "iso_3166_2": "KI-", "iso_a2": "KI", "adm0_sr": 5, "code_hasc": "-99", "note": "KIR-99 (Kiribati minor island)", "provnum_ne": 0, "gadm_level": 0, "check_me": 0, "scalerank": 11, "datarank": 11, "area_sqkm": 0, "sameascity": -99, "labelrank": 20, "featurecla": "Admin-1 minor island", "name_len": 0, "mapcolor9": 6, "mapcolor13": 12, "woe_id": -99, "latitude": -4.68967, "longitude": -174.511, "sov_a3": "KIR", "adm0_a3": "KIR", "adm0_label": 7, "admin": "Kiribati", "geonunit": "Kiribati", "gu_a3": "KIR", "gn_id": 0, "gns_id": 0, "gn_level": 0, "gn_a1_code": "KI.", "gns_level": 0 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -155.917969, -5.615986 ], [ -155.895996, -5.594118 ], [ -155.874023, -5.594118 ], [ -155.874023, -5.615986 ], [ -155.917969, -5.615986 ] ] ], [ [ [ -155.917969, -5.615986 ], [ -155.939941, -5.615986 ], [ -155.939941, -5.594118 ], [ -155.917969, -5.594118 ], [ -155.917969, -5.615986 ] ] ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 6, "x": 4, "y": 32 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm1_code": "KIR+99?", "OBJECTID_1": 3643, "diss_me": 10097, "adm1_cod_1": "KIR+99?", "iso_3166_2": "KI-", "iso_a2": "KI", "adm0_sr": 5, "code_hasc": "-99", "note": "KIR-99 (Kiribati minor island)", "provnum_ne": 0, "gadm_level": 0, "check_me": 0, "scalerank": 11, "datarank": 11, "area_sqkm": 0, "sameascity": -99, "labelrank": 20, "featurecla": "Admin-1 minor island", "name_len": 0, "mapcolor9": 6, "mapcolor13": 12, "woe_id": -99, "latitude": -4.68967, "longitude": -174.511, "sov_a3": "KIR", "adm0_a3": "KIR", "adm0_label": 7, "admin": "Kiribati", "geonunit": "Kiribati", "gu_a3": "KIR", "gn_id": 0, "gns_id": 0, "gn_level": 0, "gn_a1_code": "KI.", "gns_level": 0 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -155.917969, -5.615986 ], [ -155.895996, -5.594118 ], [ -155.874023, -5.594118 ], [ -155.874023, -5.615986 ], [ -155.917969, -5.615986 ] ] ], [ [ [ -155.917969, -5.615986 ], [ -155.939941, -5.615986 ], [ -155.939941, -5.594118 ], [ -155.917969, -5.594118 ], [ -155.917969, -5.615986 ] ] ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 6, "x": 56, "y": 30 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm1_code": "FSM-4943", "OBJECTID_1": 6464, "diss_me": 4943, "adm1_cod_1": "FSM-4943", "iso_3166_2": "FM-YAP", "wikipedia": "http://en.wikipedia.org/wiki/Yap_State", "iso_a2": "FM", "adm0_sr": 5, "name": "Yap", "code_hasc": "FM.YA", "provnum_ne": 0, "gadm_level": 0, "check_me": 0, "scalerank": 10, "datarank": 10, "area_sqkm": 0, "sameascity": -99, "labelrank": 20, "featurecla": "Admin-1 scale rank", "name_len": 3, "mapcolor9": 4, "mapcolor13": 13, "fips": "FM04", "woe_id": 2345343, "woe_label": "Yap, FM, Federated States of Micronesia", "woe_name": "Yap", "latitude": 9.58101, "longitude": 138.114, "sov_a3": "FSM", "adm0_a3": "FSM", "adm0_label": 5, "admin": "Federated States of Micronesia", "geonunit": "Federated States of Micronesia", "gu_a3": "FSM", "gn_id": 2081175, "gn_name": "State of Yap", "gns_id": -3741502, "gns_name": "Yap, State of", "gn_level": 1, "gn_a1_code": "FM.04", "gns_level": 1, "gns_adm1": "FM04" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 138.164062, 9.579084 ], [ 138.164062, 9.557417 ], [ 138.208008, 9.557417 ], [ 138.186035, 9.535749 ], [ 138.186035, 9.514079 ], [ 138.164062, 9.514079 ], [ 138.142090, 9.535749 ], [ 138.120117, 9.514079 ], [ 138.076172, 9.427387 ], [ 138.054199, 9.427387 ], [ 138.054199, 9.470736 ], [ 138.076172, 9.514079 ], [ 138.120117, 9.557417 ], [ 138.120117, 9.579084 ], [ 138.164062, 9.579084 ] ] ], [ [ [ 138.186035, 9.579084 ], [ 138.164062, 9.579084 ], [ 138.164062, 9.600750 ], [ 138.186035, 9.600750 ], [ 138.186035, 9.579084 ] ] ], [ [ [ 140.515137, 9.795678 ], [ 140.515137, 9.774025 ], [ 140.493164, 9.774025 ], [ 140.515137, 9.795678 ] ] ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 6, "x": 62, "y": 32 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm1_code": "KIR+99?", "OBJECTID_1": 3643, "diss_me": 10097, "adm1_cod_1": "KIR+99?", "iso_3166_2": "KI-", "iso_a2": "KI", "adm0_sr": 5, "code_hasc": "-99", "note": "KIR-99 (Kiribati minor island)", "provnum_ne": 0, "gadm_level": 0, "check_me": 0, "scalerank": 11, "datarank": 11, "area_sqkm": 0, "sameascity": -99, "labelrank": 20, "featurecla": "Admin-1 minor island", "name_len": 0, "mapcolor9": 6, "mapcolor13": 12, "woe_id": -99, "latitude": -4.68967, "longitude": -174.511, "sov_a3": "KIR", "adm0_a3": "KIR", "adm0_label": 7, "admin": "Kiribati", "geonunit": "Kiribati", "gu_a3": "KIR", "gn_id": 0, "gns_id": 0, "gn_level": 0, "gn_a1_code": "KI.", "gns_level": 0 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 174.221191, -0.505365 ], [ 174.243164, -0.527336 ], [ 174.221191, -0.527336 ], [ 174.221191, -0.505365 ] ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 6, "x": 62, "y": 31 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm1_code": "KIR+99?", "OBJECTID_1": 3643, "diss_me": 10097, "adm1_cod_1": "KIR+99?", "iso_3166_2": "KI-", "iso_a2": "KI", "adm0_sr": 5, "code_hasc": "-99", "note": "KIR-99 (Kiribati minor island)", "provnum_ne": 0, "gadm_level": 0, "check_me": 0, "scalerank": 11, "datarank": 11, "area_sqkm": 0, "sameascity": -99, "labelrank": 20, "featurecla": "Admin-1 minor island", "name_len": 0, "mapcolor9": 6, "mapcolor13": 12, "woe_id": -99, "latitude": -4.68967, "longitude": -174.511, "sov_a3": "KIR", "adm0_a3": "KIR", "adm0_label": 7, "admin": "Kiribati", "geonunit": "Kiribati", "gu_a3": "KIR", "gn_id": 0, "gns_id": 0, "gn_level": 0, "gn_a1_code": "KI.", "gns_level": 0 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 173.540039, 0.197754 ], [ 173.540039, 0.175781 ], [ 173.518066, 0.175781 ], [ 173.518066, 0.197754 ], [ 173.540039, 0.197754 ] ] ], [ [ [ 173.386230, 0.241699 ], [ 173.408203, 0.219726 ], [ 173.386230, 0.197754 ], [ 173.364258, 0.219726 ], [ 173.364258, 0.241699 ], [ 173.386230, 0.241699 ] ] ], [ [ [ 173.342285, 0.285643 ], [ 173.364258, 0.263671 ], [ 173.364258, 0.241699 ], [ 173.342285, 0.263671 ], [ 173.342285, 0.285643 ] ] ], [ [ [ 173.913574, 0.417477 ], [ 173.935547, 0.395505 ], [ 173.935547, 0.373533 ], [ 173.913574, 0.417477 ] ] ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 7, "x": 1, "y": 65 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 128 }, "features": [
{ "type": "Feature", "properties": { "adm1_code": "KIR+99?", "OBJECTID_1": 3643, "diss_me": 10097, "adm1_cod_1": "KIR+99?", "iso_3166_2": "KI-", "iso_a2": "KI", "adm0_sr": 5, "code_hasc": "-99", "note": "KIR-99 (Kiribati minor island)", "provnum_ne": 0, "gadm_level": 0, "check_me": 0, "scalerank": 11, "datarank": 11, "area_sqkm": 0, "sameascity": -99, "labelrank": 20, "featurecla": "Admin-1 minor island", "name_len": 0, "mapcolor9": 6, "mapcolor13": 12, "woe_id": -99, "latitude": -4.68967, "longitude": -174.511, "sov_a3": "KIR", "adm0_a3": "KIR", "adm0_label": 7, "admin": "Kiribati", "geonunit": "Kiribati", "gu_a3": "KIR", "gn_id": 0, "gns_id": 0, "gn_level": 0, "gn_a1_code": "KI.", "gns_level": 0 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -174.528809, -4.653080 ], [ -174.506836, -4.674980 ], [ -174.528809, -4.674980 ], [ -174.528809, -4.653080 ] ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 7, "x": 3, "y": 65 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 128 }, "features": [
{ "type": "Feature", "properties": { "adm1_code": "KIR+99?", "OBJECTID_1": 3643, "diss_me": 10097, "adm1_cod_1": "KIR+99?", "iso_3166_2": "KI-", "iso_a2": "KI", "adm0_sr": 5, "code_hasc": "-99", "note": "KIR-99 (Kiribati minor island)", "provnum_ne": 0, "gadm_level": 0, "check_me": 0, "scalerank": 11, "datarank": 11, "area_sqkm": 0, "sameascity": -99, "labelrank": 20, "featurecla": "Admin-1 minor island", "name_len": 0, "mapcolor9": 6, "mapcolor13": 12, "woe_id": -99, "latitude": -4.68967, "longitude": -174.511, "sov_a3": "KIR", "adm0_a3": "KIR", "adm0_label": 7, "admin": "Kiribati", "geonunit": "Kiribati", "gu_a3": "KIR", "gn_id": 0, "gns_id": 0, "gn_level": 0, "gn_a1_code": "KI.", "gns_level": 0 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -171.188965, -3.754634 ], [ -171.166992, -3.754634 ], [ -171.166992, -3.798484 ], [ -171.188965, -3.798484 ], [ -171.188965, -3.754634 ] ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 7, "x": 8, "y": 66 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 128 }, "features": [
{ "type": "Feature", "properties": { "adm1_code": "KIR+99?", "OBJECTID_1": 3643, "diss_me": 10097, "adm1_cod_1": "KIR+99?", "iso_3166_2": "KI-", "iso_a2": "KI", "adm0_sr": 5, "code_hasc": "-99", "note": "KIR-99 (Kiribati minor island)", "provnum_ne": 0, "gadm_level": 0, "check_me": 0, "scalerank": 11, "datarank": 11, "area_sqkm": 0, "sameascity": -99, "labelrank": 20, "featurecla": "Admin-1 minor island", "name_len": 0, "mapcolor9": 6, "mapcolor13": 12, "woe_id": -99, "latitude": -4.68967, "longitude": -174.511, "sov_a3": "KIR", "adm0_a3": "KIR", "adm0_label": 7, "admin": "Kiribati", "geonunit": "Kiribati", "gu_a3": "KIR", "gn_id": 0, "gns_id": 0, "gn_level": 0, "gn_a1_code": "KI.", "gns_level": 0 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -155.917969, -5.594118 ], [ -155.917969, -5.615986 ], [ -155.939941, -5.615986 ], [ -155.939941, -5.594118 ], [ -155.917969, -5.594118 ] ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 7, "x": 8, "y": 65 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 128 }, "features": [
{ "type": "Feature", "properties": { "adm1_code": "KIR+99?", "OBJECTID_1": 3643, "diss_me": 10097, "adm1_cod_1": "KIR+99?", "iso_3166_2": "KI-", "iso_a2": "KI", "adm0_sr": 5, "code_hasc": "-99", "note": "KIR-99 (Kiribati minor island)", "provnum_ne": 0, "gadm_level": 0, "check_me": 0, "scalerank": 11, "datarank": 11, "area_sqkm": 0, "sameascity": -99, "labelrank": 20, "featurecla": "Admin-1 minor island", "name_len": 0, "mapcolor9": 6, "mapcolor13": 12, "woe_id": -99, "latitude": -4.68967, "longitude": -174.511, "sov_a3": "KIR", "adm0_a3": "KIR", "adm0_label": 7, "admin": "Kiribati", "geonunit": "Kiribati", "gu_a3": "KIR", "gn_id": 0, "gns_id": 0, "gn_level": 0, "gn_a1_code": "KI.", "gns_level": 0 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -155.917969, -5.594118 ], [ -155.874023, -5.615986 ], [ -155.939941, -5.615986 ], [ -155.917969, -5.594118 ] ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 7, "x": 113, "y": 60 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 128 }, "features": [
{ "type": "Feature", "properties": { "adm1_code": "FSM-4943", "OBJECTID_1": 6464, "diss_me": 4943, "adm1_cod_1": "FSM-4943", "iso_3166_2": "FM-YAP", "wikipedia": "http://en.wikipedia.org/wiki/Yap_State", "iso_a2": "FM", "adm0_sr": 5, "name": "Yap", "code_hasc": "FM.YA", "provnum_ne": 0, "gadm_level": 0, "check_me": 0, "scalerank": 10, "datarank": 10, "area_sqkm": 0, "sameascity": -99, "labelrank": 20, "featurecla": "Admin-1 scale rank", "name_len": 3, "mapcolor9": 4, "mapcolor13": 13, "fips": "FM04", "woe_id": 2345343, "woe_label": "Yap, FM, Federated States of Micronesia", "woe_name": "Yap", "latitude": 9.58101, "longitude": 138.114, "sov_a3": "FSM", "adm0_a3": "FSM", "adm0_label": 5, "admin": "Federated States of Micronesia", "geonunit": "Federated States of Micronesia", "gu_a3": "FSM", "gn_id": 2081175, "gn_name": "State of Yap", "gns_id": -3741502, "gns_name": "Yap, State of", "gn_level": 1, "gn_a1_code": "FM.04", "gns_level": 1, "gns_adm1": "FM04" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.208008, 9.557417 ], [ 138.186035, 9.514079 ], [ 138.142090, 9.535749 ], [ 138.054199, 9.427387 ], [ 138.120117, 9.579084 ], [ 138.142090, 9.557417 ], [ 138.208008, 9.557417 ] ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 7, "x": 125, "y": 64 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 128 }, "features": [
{ "type": "Feature", "properties": { "adm1_code": "KIR+99?", "OBJECTID_1": 3643, "diss_me": 10097, "adm1_cod_1": "KIR+99?", "iso_3166_2": "KI-", "iso_a2": "KI", "adm0_sr": 5, "code_hasc": "-99", "note": "KIR-99 (Kiribati minor island)", "provnum_ne": 0, "gadm_level": 0, "check_me": 0, "scalerank": 11, "datarank": 11, "area_sqkm": 0, "sameascity": -99, "labelrank": 20, "featurecla": "Admin-1 minor island", "name_len": 0, "mapcolor9": 6, "mapcolor13": 12, "woe_id": -99, "latitude": -4.68967, "longitude": -174.511, "sov_a3": "KIR", "adm0_a3": "KIR", "adm0_label": 7, "admin": "Kiribati", "geonunit": "Kiribati", "gu_a3": "KIR", "gn_id": 0, "gns_id": 0, "gn_level": 0, "gn_a1_code": "KI.", "gns_level": 0 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 174.221191, -0.505365 ], [ 174.243164, -0.527336 ], [ 174.221191, -0.527336 ], [ 174.221191, -0.505365 ] ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 7, "x": 125, "y": 63 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 128 }, "features": [
{ "type": "Feature", "properties": { "adm1_code": "KIR+99?", "OBJECTID_1": 3643, "diss_me": 10097, "adm1_cod_1": "KIR+99?", "iso_3166_2": "KI-", "iso_a2": "KI", "adm0_sr": 5, "code_hasc": "-99", "note": "KIR-99 (Kiribati minor island)", "provnum_ne": 0, "gadm_level": 0, "check_me": 0, "scalerank": 11, "datarank": 11, "area_sqkm": 0, "sameascity": -99, "labelrank": 20, "featurecla": "Admin-1 minor island", "name_len": 0, "mapcolor9": 6, "mapcolor13": 12, "woe_id": -99, "latitude": -4.68967, "longitude": -174.511, "sov_a3": "KIR", "adm0_a3": "KIR", "adm0_label": 7, "admin": "Kiribati", "geonunit": "Kiribati", "gu_a3": "KIR", "gn_id": 0, "gns_id": 0, "gn_level": 0, "gn_a1_code": "KI.", "gns_level": 0 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 173.386230, 0.241699 ], [ 173.408203, 0.219726 ], [ 173.386230, 0.197754 ], [ 173.364258, 0.241699 ], [ 173.386230, 0.241699 ] ] ], [ [ [ 173.913574, 0.417477 ], [ 173.935547, 0.395505 ], [ 173.935547, 0.329588 ], [ 173.913574, 0.417477 ] ] ] ] } }
] }
] }
] }

View File

@ -1,12 +1,12 @@
{ "type": "FeatureCollection", "properties": {
"bounds": "-122.334735,37.877356,-122.281639,37.898925",
"bounds": "-122.343750,37.857507,-122.255859,37.926868",
"center": "-122.299805,37.892187,12",
"description": "tests/join-population/joined-i.mbtiles",
"description": "tests/join-population/tabblock_06001420.mbtiles",
"format": "pbf",
"json": "{\"vector_layers\": [ { \"id\": \"tabblock_06001420\", \"description\": \"\", \"minzoom\": 3, \"maxzoom\": 12, \"fields\": {\"ALAND10\": \"Number\", \"AWATER10\": \"Number\", \"BLOCKCE10\": \"String\", \"COUNTYFP10\": \"String\", \"FUNCSTAT10\": \"String\", \"INTPTLAT10\": \"String\", \"INTPTLON10\": \"String\", \"MTFCC10\": \"String\", \"NAME10\": \"String\", \"STATEFP10\": \"String\", \"TRACTCE10\": \"String\", \"UACE10\": \"String\", \"UATYP10\": \"String\", \"UR10\": \"String\", \"population\": \"Number\"} } ] }",
"maxzoom": "12",
"minzoom": "0",
"name": "tests/join-population/joined-i.mbtiles",
"name": "tests/join-population/tabblock_06001420.mbtiles",
"type": "overlay",
"version": "2"
}, "features": [

View File

@ -1,21 +1,15 @@
{ "type": "FeatureCollection", "properties": {
"bounds": "-122.334735,37.877356,-122.281639,37.898925",
"bounds": "-122.343750,37.857507,-122.255859,37.926868",
"center": "-122.299805,37.892187,12",
"description": "tests/join-population/joined.mbtiles",
"description": "tests/join-population/tabblock_06001420.mbtiles",
"format": "pbf",
"json": "{\"vector_layers\": [ { \"id\": \"tabblock_06001420\", \"description\": \"\", \"minzoom\": 3, \"maxzoom\": 12, \"fields\": {\"ALAND10\": \"Number\", \"AWATER10\": \"Number\", \"BLOCKCE10\": \"String\", \"COUNTYFP10\": \"String\", \"FUNCSTAT10\": \"String\", \"INTPTLAT10\": \"String\", \"INTPTLON10\": \"String\", \"MTFCC10\": \"String\", \"NAME10\": \"String\", \"STATEFP10\": \"String\", \"TRACTCE10\": \"String\", \"UACE10\": \"String\", \"UATYP10\": \"String\", \"UR10\": \"String\", \"population\": \"Number\"} } ] }",
"maxzoom": "12",
"minzoom": "0",
"name": "tests/join-population/joined.mbtiles",
"name": "tests/join-population/tabblock_06001420.mbtiles",
"type": "overlay",
"version": "2"
}, "features": [
{ "type": "FeatureCollection", "properties": { "zoom": 3, "x": 1, "y": 3 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "tabblock_06001420", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420400", "BLOCKCE10": "1012", "NAME10": "Block 1012", "MTFCC10": "G5040", "UR10": "R", "FUNCSTAT10": "S", "ALAND10": 0, "AWATER10": 1632801, "INTPTLAT10": "+37.8842028", "INTPTLON10": "-122.3237534" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.321777, 37.892196 ], [ -122.321777, 37.874853 ], [ -122.343750, 37.874853 ], [ -122.343750, 37.892196 ], [ -122.321777, 37.892196 ] ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 4, "x": 2, "y": 6 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "tabblock_06001420", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420300", "BLOCKCE10": "3008", "NAME10": "Block 3008", "MTFCC10": "G5040", "UR10": "R", "FUNCSTAT10": "S", "ALAND10": 0, "AWATER10": 1111196, "INTPTLAT10": "+37.8928912", "INTPTLON10": "-122.3202957" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.316284, 37.900865 ], [ -122.310791, 37.896530 ], [ -122.310791, 37.892196 ], [ -122.338257, 37.892196 ], [ -122.316284, 37.900865 ] ] ] } }
@ -2501,528 +2495,4 @@
{ "type": "Feature", "id": 12345, "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "1031", "population": 15, "NAME10": "Block 1031", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 7920, "AWATER10": 0, "INTPTLAT10": "+37.8828579", "INTPTLON10": "-122.2863490" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.285728, 37.883559 ], [ -122.286072, 37.882475 ], [ -122.286758, 37.882475 ], [ -122.287145, 37.882577 ], [ -122.287016, 37.882881 ], [ -122.285728, 37.883559 ] ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 12, "x": 656, "y": 1581 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "tabblock_06001420", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420300", "BLOCKCE10": "3008", "NAME10": "Block 3008", "MTFCC10": "G5040", "UR10": "R", "FUNCSTAT10": "S", "ALAND10": 0, "AWATER10": 1111196, "INTPTLAT10": "+37.8928912", "INTPTLON10": "-122.3202957" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.312486, 37.897428 ], [ -122.312551, 37.897123 ], [ -122.312529, 37.897021 ], [ -122.312443, 37.896937 ], [ -122.312143, 37.896937 ], [ -122.311606, 37.896835 ], [ -122.311521, 37.896717 ], [ -122.311585, 37.896480 ], [ -122.311585, 37.896293 ], [ -122.311521, 37.896175 ], [ -122.311134, 37.896056 ], [ -122.311306, 37.895735 ], [ -122.311134, 37.895531 ], [ -122.311006, 37.895498 ], [ -122.310705, 37.895498 ], [ -122.310662, 37.895396 ], [ -122.310684, 37.895277 ], [ -122.310555, 37.895074 ], [ -122.310233, 37.894786 ], [ -122.310126, 37.894752 ], [ -122.309461, 37.893466 ], [ -122.309096, 37.892212 ], [ -122.309053, 37.891298 ], [ -122.309268, 37.889706 ], [ -122.309439, 37.889130 ], [ -122.309675, 37.888860 ], [ -122.309804, 37.888809 ], [ -122.309933, 37.888826 ], [ -122.310040, 37.888910 ], [ -122.310147, 37.889147 ], [ -122.310855, 37.889757 ], [ -122.310941, 37.889859 ], [ -122.311006, 37.890197 ], [ -122.311134, 37.890248 ], [ -122.311199, 37.890147 ], [ -122.311199, 37.889909 ], [ -122.311349, 37.889909 ], [ -122.311456, 37.889994 ], [ -122.311606, 37.890316 ], [ -122.311692, 37.890401 ], [ -122.312722, 37.891196 ], [ -122.313688, 37.891891 ], [ -122.314267, 37.891958 ], [ -122.314396, 37.892043 ], [ -122.314589, 37.892348 ], [ -122.314696, 37.892450 ], [ -122.314825, 37.892450 ], [ -122.314589, 37.892145 ], [ -122.314525, 37.891925 ], [ -122.314675, 37.891874 ], [ -122.315361, 37.891908 ], [ -122.315662, 37.891874 ], [ -122.315812, 37.891908 ], [ -122.315941, 37.891891 ], [ -122.315984, 37.891806 ], [ -122.315941, 37.891688 ], [ -122.315962, 37.891247 ], [ -122.316027, 37.891146 ], [ -122.317593, 37.890926 ], [ -122.318988, 37.890350 ], [ -122.319589, 37.890028 ], [ -122.319846, 37.889943 ], [ -122.322571, 37.889943 ], [ -122.322700, 37.889977 ], [ -122.322807, 37.890316 ], [ -122.323022, 37.890655 ], [ -122.323129, 37.890993 ], [ -122.323472, 37.891518 ], [ -122.323816, 37.892212 ], [ -122.323966, 37.892399 ], [ -122.324438, 37.892466 ], [ -122.324696, 37.892483 ], [ -122.324975, 37.892450 ], [ -122.325554, 37.892534 ], [ -122.325704, 37.892534 ], [ -122.325833, 37.892500 ], [ -122.325833, 37.892382 ], [ -122.325897, 37.892297 ], [ -122.325618, 37.892162 ], [ -122.325554, 37.892060 ], [ -122.325575, 37.891857 ], [ -122.325532, 37.891518 ], [ -122.325575, 37.890942 ], [ -122.325640, 37.890841 ], [ -122.325811, 37.890790 ], [ -122.326198, 37.890790 ], [ -122.326627, 37.890858 ], [ -122.327313, 37.890790 ], [ -122.327378, 37.890892 ], [ -122.327399, 37.891467 ], [ -122.327507, 37.891552 ], [ -122.327614, 37.891450 ], [ -122.327657, 37.890993 ], [ -122.327614, 37.890773 ], [ -122.327678, 37.890231 ], [ -122.327592, 37.889926 ], [ -122.327571, 37.889672 ], [ -122.334738, 37.889588 ], [ -122.333407, 37.892805 ], [ -122.312486, 37.897428 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420300", "BLOCKCE10": "3009", "NAME10": "Block 3009", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 265574, "AWATER10": 0, "INTPTLAT10": "+37.8905867", "INTPTLON10": "-122.3181131" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.311521, 37.896717 ], [ -122.310662, 37.895752 ], [ -122.309997, 37.894769 ], [ -122.309525, 37.893855 ], [ -122.309225, 37.893059 ], [ -122.309096, 37.892585 ], [ -122.309010, 37.892077 ], [ -122.308967, 37.891721 ], [ -122.308989, 37.891247 ], [ -122.308881, 37.890485 ], [ -122.308967, 37.888775 ], [ -122.309225, 37.887843 ], [ -122.309804, 37.888131 ], [ -122.310190, 37.888521 ], [ -122.311242, 37.889452 ], [ -122.315598, 37.889639 ], [ -122.315791, 37.889520 ], [ -122.327592, 37.889672 ], [ -122.327571, 37.889791 ], [ -122.327678, 37.890231 ], [ -122.327614, 37.890773 ], [ -122.327657, 37.890993 ], [ -122.327614, 37.891450 ], [ -122.327507, 37.891552 ], [ -122.327399, 37.891467 ], [ -122.327378, 37.890892 ], [ -122.327313, 37.890790 ], [ -122.326627, 37.890858 ], [ -122.326198, 37.890790 ], [ -122.325811, 37.890790 ], [ -122.325640, 37.890841 ], [ -122.325575, 37.890942 ], [ -122.325532, 37.891518 ], [ -122.325575, 37.891857 ], [ -122.325554, 37.892060 ], [ -122.325618, 37.892162 ], [ -122.325897, 37.892297 ], [ -122.325833, 37.892382 ], [ -122.325833, 37.892500 ], [ -122.325704, 37.892534 ], [ -122.325554, 37.892534 ], [ -122.324975, 37.892450 ], [ -122.324696, 37.892483 ], [ -122.323966, 37.892399 ], [ -122.323816, 37.892212 ], [ -122.323472, 37.891518 ], [ -122.323129, 37.890993 ], [ -122.323022, 37.890655 ], [ -122.322807, 37.890316 ], [ -122.322700, 37.889977 ], [ -122.322571, 37.889943 ], [ -122.319846, 37.889943 ], [ -122.319589, 37.890028 ], [ -122.318988, 37.890350 ], [ -122.317593, 37.890926 ], [ -122.316027, 37.891146 ], [ -122.315962, 37.891247 ], [ -122.315941, 37.891688 ], [ -122.315984, 37.891806 ], [ -122.315941, 37.891891 ], [ -122.315812, 37.891908 ], [ -122.315662, 37.891874 ], [ -122.315361, 37.891908 ], [ -122.314675, 37.891874 ], [ -122.314525, 37.891925 ], [ -122.314589, 37.892145 ], [ -122.314825, 37.892450 ], [ -122.314696, 37.892450 ], [ -122.314589, 37.892348 ], [ -122.314396, 37.892043 ], [ -122.314267, 37.891958 ], [ -122.313688, 37.891891 ], [ -122.312722, 37.891196 ], [ -122.311692, 37.890401 ], [ -122.311606, 37.890316 ], [ -122.311456, 37.889994 ], [ -122.311349, 37.889909 ], [ -122.311199, 37.889909 ], [ -122.311199, 37.890147 ], [ -122.311134, 37.890248 ], [ -122.311006, 37.890197 ], [ -122.310941, 37.889859 ], [ -122.310855, 37.889757 ], [ -122.310147, 37.889147 ], [ -122.310040, 37.888910 ], [ -122.309933, 37.888826 ], [ -122.309804, 37.888809 ], [ -122.309675, 37.888860 ], [ -122.309439, 37.889130 ], [ -122.309268, 37.889706 ], [ -122.309053, 37.891298 ], [ -122.309096, 37.892212 ], [ -122.309461, 37.893466 ], [ -122.310126, 37.894752 ], [ -122.310233, 37.894786 ], [ -122.310555, 37.895074 ], [ -122.310684, 37.895277 ], [ -122.310662, 37.895396 ], [ -122.310705, 37.895498 ], [ -122.311006, 37.895498 ], [ -122.311134, 37.895531 ], [ -122.311306, 37.895735 ], [ -122.311134, 37.896056 ], [ -122.311521, 37.896175 ], [ -122.311585, 37.896293 ], [ -122.311585, 37.896480 ], [ -122.311521, 37.896717 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420300", "BLOCKCE10": "3007", "NAME10": "Block 3007", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 3648, "AWATER10": 0, "INTPTLAT10": "+37.8971393", "INTPTLON10": "-122.3121267" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.312078, 37.897479 ], [ -122.311585, 37.896852 ], [ -122.311542, 37.896818 ], [ -122.312143, 37.896937 ], [ -122.312443, 37.896937 ], [ -122.312529, 37.897021 ], [ -122.312551, 37.897123 ], [ -122.312486, 37.897428 ], [ -122.312078, 37.897479 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420300", "BLOCKCE10": "3003", "NAME10": "Block 3003", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 18792, "AWATER10": 0, "INTPTLAT10": "+37.8946697", "INTPTLON10": "-122.3084294" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.309353, 37.897868 ], [ -122.309332, 37.897800 ], [ -122.308280, 37.895227 ], [ -122.307959, 37.894024 ], [ -122.307873, 37.893652 ], [ -122.307808, 37.892788 ], [ -122.307851, 37.892280 ], [ -122.308023, 37.892162 ], [ -122.308238, 37.892179 ], [ -122.308323, 37.893178 ], [ -122.308280, 37.893770 ], [ -122.308345, 37.894414 ], [ -122.309160, 37.896734 ], [ -122.309396, 37.897309 ], [ -122.309525, 37.897834 ], [ -122.309353, 37.897868 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420300", "BLOCKCE10": "3005", "NAME10": "Block 3005", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 30820, "AWATER10": 0, "INTPTLAT10": "+37.8910154", "INTPTLON10": "-122.3085406" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.311478, 37.897631 ], [ -122.309933, 37.895667 ], [ -122.309289, 37.894566 ], [ -122.308989, 37.893923 ], [ -122.308495, 37.892382 ], [ -122.308087, 37.890604 ], [ -122.308345, 37.890079 ], [ -122.308967, 37.892551 ], [ -122.309139, 37.893127 ], [ -122.309418, 37.893889 ], [ -122.309890, 37.894820 ], [ -122.310512, 37.895802 ], [ -122.310941, 37.896412 ], [ -122.311864, 37.897529 ], [ -122.311478, 37.897631 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420300", "BLOCKCE10": "3004", "NAME10": "Block 3004", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 59347, "AWATER10": 0, "INTPTLAT10": "+37.8955812", "INTPTLON10": "-122.3094534" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.309525, 37.897834 ], [ -122.309396, 37.897309 ], [ -122.309160, 37.896734 ], [ -122.308345, 37.894414 ], [ -122.308280, 37.893770 ], [ -122.308323, 37.893178 ], [ -122.308259, 37.892297 ], [ -122.307894, 37.890976 ], [ -122.308087, 37.890604 ], [ -122.308495, 37.892382 ], [ -122.308989, 37.893923 ], [ -122.309289, 37.894566 ], [ -122.309933, 37.895667 ], [ -122.311478, 37.897631 ], [ -122.310898, 37.897834 ], [ -122.309525, 37.897834 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420300", "BLOCKCE10": "3006", "NAME10": "Block 3006", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 19563, "AWATER10": 24, "INTPTLAT10": "+37.8904059", "INTPTLON10": "-122.3086941" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.311864, 37.897529 ], [ -122.310941, 37.896412 ], [ -122.310512, 37.895802 ], [ -122.309697, 37.894465 ], [ -122.309418, 37.893889 ], [ -122.309139, 37.893127 ], [ -122.308710, 37.891603 ], [ -122.308345, 37.890079 ], [ -122.308967, 37.888775 ], [ -122.308881, 37.890485 ], [ -122.308989, 37.891247 ], [ -122.308967, 37.891721 ], [ -122.309010, 37.892077 ], [ -122.309096, 37.892585 ], [ -122.309225, 37.893059 ], [ -122.309525, 37.893855 ], [ -122.309997, 37.894769 ], [ -122.310662, 37.895752 ], [ -122.311606, 37.896835 ], [ -122.311542, 37.896818 ], [ -122.312078, 37.897479 ], [ -122.311864, 37.897529 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420300", "BLOCKCE10": "3001", "NAME10": "Block 3001", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 24651, "AWATER10": 0, "INTPTLAT10": "+37.8921989", "INTPTLON10": "-122.3075517" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.309353, 37.897868 ], [ -122.309289, 37.897783 ], [ -122.307701, 37.894244 ], [ -122.307229, 37.893042 ], [ -122.307100, 37.892551 ], [ -122.307014, 37.891925 ], [ -122.307079, 37.890875 ], [ -122.307250, 37.890130 ], [ -122.307529, 37.889503 ], [ -122.307894, 37.890976 ], [ -122.307658, 37.891671 ], [ -122.307572, 37.892246 ], [ -122.307529, 37.892619 ], [ -122.307594, 37.893296 ], [ -122.307787, 37.893974 ], [ -122.308280, 37.895227 ], [ -122.309353, 37.897868 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420300", "BLOCKCE10": "3000", "NAME10": "Block 3000", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 27350, "AWATER10": 0, "INTPTLAT10": "+37.8907736", "INTPTLON10": "-122.3067658" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.308967, 37.897987 ], [ -122.308602, 37.897157 ], [ -122.308495, 37.896835 ], [ -122.307229, 37.893753 ], [ -122.306671, 37.892670 ], [ -122.306628, 37.892399 ], [ -122.306650, 37.892229 ], [ -122.306714, 37.892009 ], [ -122.306693, 37.891704 ], [ -122.306414, 37.890807 ], [ -122.306714, 37.890739 ], [ -122.306821, 37.890688 ], [ -122.307229, 37.889994 ], [ -122.307401, 37.889757 ], [ -122.307208, 37.890282 ], [ -122.307036, 37.891230 ], [ -122.307014, 37.891925 ], [ -122.307100, 37.892551 ], [ -122.307229, 37.893042 ], [ -122.307701, 37.894244 ], [ -122.309332, 37.897868 ], [ -122.309010, 37.897953 ], [ -122.308967, 37.897987 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420300", "BLOCKCE10": "3002", "NAME10": "Block 3002", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 9773, "AWATER10": 0, "INTPTLAT10": "+37.8920318", "INTPTLON10": "-122.3077138" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.308280, 37.895227 ], [ -122.307701, 37.893720 ], [ -122.307572, 37.893127 ], [ -122.307529, 37.892619 ], [ -122.307658, 37.891671 ], [ -122.307894, 37.890976 ], [ -122.308238, 37.892179 ], [ -122.308023, 37.892162 ], [ -122.307851, 37.892280 ], [ -122.307808, 37.893025 ], [ -122.307873, 37.893652 ], [ -122.308280, 37.895227 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420200", "BLOCKCE10": "1006", "NAME10": "Block 1006", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 1461, "AWATER10": 0, "INTPTLAT10": "+37.8973748", "INTPTLON10": "-122.3012481" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.301629, 37.898528 ], [ -122.301478, 37.898207 ], [ -122.300985, 37.896700 ], [ -122.301135, 37.896683 ], [ -122.301629, 37.898528 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420200", "BLOCKCE10": "1005", "population": 4, "NAME10": "Block 1005", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 14639, "AWATER10": 0, "INTPTLAT10": "+37.8976068", "INTPTLON10": "-122.3008394" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.301500, 37.898528 ], [ -122.300599, 37.898308 ], [ -122.300127, 37.896869 ], [ -122.300985, 37.896700 ], [ -122.301607, 37.898528 ], [ -122.301500, 37.898528 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420200", "BLOCKCE10": "1004", "population": 56, "NAME10": "Block 1004", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 11306, "AWATER10": 0, "INTPTLAT10": "+37.8976015", "INTPTLON10": "-122.2999287" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.300599, 37.898308 ], [ -122.300298, 37.898241 ], [ -122.299719, 37.898291 ], [ -122.299290, 37.897055 ], [ -122.300127, 37.896869 ], [ -122.300599, 37.898308 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420300", "BLOCKCE10": "2000", "population": 1118, "NAME10": "Block 2000", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 412555, "AWATER10": 0, "INTPTLAT10": "+37.8949184", "INTPTLON10": "-122.3048891" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.301629, 37.898528 ], [ -122.301135, 37.896683 ], [ -122.300920, 37.896022 ], [ -122.302616, 37.895667 ], [ -122.302015, 37.893821 ], [ -122.302852, 37.893652 ], [ -122.303109, 37.894515 ], [ -122.303131, 37.894261 ], [ -122.303088, 37.893855 ], [ -122.303131, 37.893533 ], [ -122.303302, 37.893144 ], [ -122.303495, 37.892839 ], [ -122.303088, 37.891603 ], [ -122.303324, 37.890841 ], [ -122.303452, 37.890536 ], [ -122.303560, 37.890350 ], [ -122.303731, 37.890180 ], [ -122.303967, 37.890045 ], [ -122.304418, 37.889909 ], [ -122.304933, 37.889825 ], [ -122.306027, 37.889588 ], [ -122.306693, 37.891704 ], [ -122.306714, 37.892009 ], [ -122.306628, 37.892399 ], [ -122.306671, 37.892670 ], [ -122.307229, 37.893753 ], [ -122.308495, 37.896835 ], [ -122.308602, 37.897157 ], [ -122.308967, 37.897987 ], [ -122.308795, 37.898037 ], [ -122.306199, 37.898241 ], [ -122.305341, 37.898427 ], [ -122.304590, 37.898427 ], [ -122.303731, 37.898528 ], [ -122.301629, 37.898528 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420300", "BLOCKCE10": "1008", "population": 11, "NAME10": "Block 1008", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 15574, "AWATER10": 0, "INTPTLAT10": "+37.8926328", "INTPTLON10": "-122.3029106" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.303109, 37.894515 ], [ -122.302251, 37.891772 ], [ -122.303088, 37.891603 ], [ -122.303495, 37.892839 ], [ -122.303302, 37.893144 ], [ -122.303131, 37.893533 ], [ -122.303088, 37.893855 ], [ -122.303131, 37.894261 ], [ -122.303109, 37.894515 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420300", "BLOCKCE10": "1001", "population": 41, "NAME10": "Block 1001", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 16165, "AWATER10": 0, "INTPTLAT10": "+37.8948170", "INTPTLON10": "-122.3018829" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.301779, 37.895836 ], [ -122.301178, 37.893990 ], [ -122.302015, 37.893821 ], [ -122.302616, 37.895667 ], [ -122.301779, 37.895836 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420200", "BLOCKCE10": "1007", "NAME10": "Block 1007", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 914, "AWATER10": 0, "INTPTLAT10": "+37.8963621", "INTPTLON10": "-122.3009413" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.300985, 37.896700 ], [ -122.300792, 37.896056 ], [ -122.300920, 37.896022 ], [ -122.301135, 37.896683 ], [ -122.300985, 37.896700 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420200", "BLOCKCE10": "1014", "NAME10": "Block 1014", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 1324, "AWATER10": 0, "INTPTLAT10": "+37.8955459", "INTPTLON10": "-122.3006834" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.300792, 37.896056 ], [ -122.300470, 37.895074 ], [ -122.300599, 37.895057 ], [ -122.300920, 37.896022 ], [ -122.300792, 37.896056 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420200", "BLOCKCE10": "1008", "population": 11, "NAME10": "Block 1008", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 14452, "AWATER10": 0, "INTPTLAT10": "+37.8959674", "INTPTLON10": "-122.3002912" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.300127, 37.896869 ], [ -122.299612, 37.895260 ], [ -122.300470, 37.895074 ], [ -122.300792, 37.896056 ], [ -122.300985, 37.896700 ], [ -122.300127, 37.896869 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420300", "BLOCKCE10": "1000", "population": 42, "NAME10": "Block 1000", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 16605, "AWATER10": 0, "INTPTLAT10": "+37.8950031", "INTPTLON10": "-122.3010393" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.300920, 37.896022 ], [ -122.300599, 37.895057 ], [ -122.300341, 37.894160 ], [ -122.301178, 37.893990 ], [ -122.301779, 37.895836 ], [ -122.300920, 37.896022 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420300", "BLOCKCE10": "1007", "population": 34, "NAME10": "Block 1007", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 16120, "AWATER10": 0, "INTPTLAT10": "+37.8927903", "INTPTLON10": "-122.3021281" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.302015, 37.893821 ], [ -122.301435, 37.891942 ], [ -122.302251, 37.891772 ], [ -122.302852, 37.893652 ], [ -122.302015, 37.893821 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420300", "BLOCKCE10": "1002", "population": 46, "NAME10": "Block 1002", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 16535, "AWATER10": 0, "INTPTLAT10": "+37.8929602", "INTPTLON10": "-122.3012875" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.301178, 37.893990 ], [ -122.300577, 37.892111 ], [ -122.301435, 37.891942 ], [ -122.302015, 37.893821 ], [ -122.301178, 37.893990 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420200", "BLOCKCE10": "3003", "NAME10": "Block 3003", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 2234, "AWATER10": 0, "INTPTLAT10": "+37.8942520", "INTPTLON10": "-122.3002730" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.300470, 37.895074 ], [ -122.299955, 37.893466 ], [ -122.300084, 37.893432 ], [ -122.300556, 37.894871 ], [ -122.300599, 37.895057 ], [ -122.300470, 37.895074 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420300", "BLOCKCE10": "1003", "population": 24, "NAME10": "Block 1003", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 16635, "AWATER10": 0, "INTPTLAT10": "+37.8931288", "INTPTLON10": "-122.3004328" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.300341, 37.894160 ], [ -122.300084, 37.893432 ], [ -122.299719, 37.892297 ], [ -122.300577, 37.892111 ], [ -122.301178, 37.893990 ], [ -122.300341, 37.894160 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420200", "BLOCKCE10": "3004", "population": 12, "NAME10": "Block 3004", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 1457, "AWATER10": 0, "INTPTLAT10": "+37.8928701", "INTPTLON10": "-122.2998265" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.299955, 37.893466 ], [ -122.299590, 37.892314 ], [ -122.299719, 37.892297 ], [ -122.300084, 37.893432 ], [ -122.299955, 37.893466 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420400", "BLOCKCE10": "1012", "NAME10": "Block 1012", "MTFCC10": "G5040", "UR10": "R", "FUNCSTAT10": "S", "ALAND10": 0, "AWATER10": 1632801, "INTPTLAT10": "+37.8842028", "INTPTLON10": "-122.3237534" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.327571, 37.889672 ], [ -122.327442, 37.889130 ], [ -122.327571, 37.888690 ], [ -122.327421, 37.888622 ], [ -122.327034, 37.888690 ], [ -122.326713, 37.888589 ], [ -122.325447, 37.888081 ], [ -122.324910, 37.887911 ], [ -122.324610, 37.887877 ], [ -122.322936, 37.888284 ], [ -122.322936, 37.888843 ], [ -122.322850, 37.889063 ], [ -122.322764, 37.889164 ], [ -122.322528, 37.889300 ], [ -122.322249, 37.889384 ], [ -122.321928, 37.889401 ], [ -122.321649, 37.889368 ], [ -122.321348, 37.889266 ], [ -122.320919, 37.889249 ], [ -122.319610, 37.889435 ], [ -122.318945, 37.889384 ], [ -122.317808, 37.889351 ], [ -122.317250, 37.889283 ], [ -122.316842, 37.888927 ], [ -122.316756, 37.888741 ], [ -122.316585, 37.888589 ], [ -122.316048, 37.887911 ], [ -122.315834, 37.887386 ], [ -122.315898, 37.886810 ], [ -122.315876, 37.886573 ], [ -122.315941, 37.886235 ], [ -122.316477, 37.886116 ], [ -122.316456, 37.885947 ], [ -122.315984, 37.885947 ], [ -122.316027, 37.885659 ], [ -122.316864, 37.885642 ], [ -122.316864, 37.885760 ], [ -122.317035, 37.885760 ], [ -122.317057, 37.885489 ], [ -122.316027, 37.885506 ], [ -122.316091, 37.885439 ], [ -122.315705, 37.885269 ], [ -122.315447, 37.884710 ], [ -122.315469, 37.884592 ], [ -122.315619, 37.884406 ], [ -122.315662, 37.884287 ], [ -122.315598, 37.884067 ], [ -122.315469, 37.884016 ], [ -122.315319, 37.884067 ], [ -122.315018, 37.883965 ], [ -122.314589, 37.883525 ], [ -122.314374, 37.883373 ], [ -122.314138, 37.883085 ], [ -122.313924, 37.882644 ], [ -122.313602, 37.882424 ], [ -122.313044, 37.882204 ], [ -122.312465, 37.881391 ], [ -122.327635, 37.877360 ], [ -122.334738, 37.889588 ], [ -122.327571, 37.889672 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420400", "BLOCKCE10": "1011", "NAME10": "Block 1011", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 542505, "AWATER10": 0, "INTPTLAT10": "+37.8862375", "INTPTLON10": "-122.3141377" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.327571, 37.889672 ], [ -122.315791, 37.889520 ], [ -122.315598, 37.889639 ], [ -122.311242, 37.889452 ], [ -122.310190, 37.888521 ], [ -122.309804, 37.888131 ], [ -122.309783, 37.888047 ], [ -122.309353, 37.887674 ], [ -122.309289, 37.887877 ], [ -122.309225, 37.887843 ], [ -122.309289, 37.887589 ], [ -122.309289, 37.887318 ], [ -122.309461, 37.887166 ], [ -122.309546, 37.886980 ], [ -122.309525, 37.886455 ], [ -122.308881, 37.884016 ], [ -122.308645, 37.883491 ], [ -122.308388, 37.882289 ], [ -122.312465, 37.881391 ], [ -122.313044, 37.882204 ], [ -122.313602, 37.882424 ], [ -122.313924, 37.882644 ], [ -122.314138, 37.883085 ], [ -122.314374, 37.883373 ], [ -122.314589, 37.883525 ], [ -122.315018, 37.883965 ], [ -122.315319, 37.884067 ], [ -122.315469, 37.884016 ], [ -122.315598, 37.884067 ], [ -122.315662, 37.884287 ], [ -122.315619, 37.884406 ], [ -122.315469, 37.884592 ], [ -122.315447, 37.884710 ], [ -122.315705, 37.885269 ], [ -122.316091, 37.885439 ], [ -122.316027, 37.885506 ], [ -122.317057, 37.885489 ], [ -122.317035, 37.885760 ], [ -122.316864, 37.885760 ], [ -122.316864, 37.885642 ], [ -122.316027, 37.885659 ], [ -122.315984, 37.885947 ], [ -122.316456, 37.885947 ], [ -122.316477, 37.886116 ], [ -122.315941, 37.886235 ], [ -122.315876, 37.886573 ], [ -122.315898, 37.886810 ], [ -122.315834, 37.887386 ], [ -122.316048, 37.887911 ], [ -122.316585, 37.888589 ], [ -122.316756, 37.888741 ], [ -122.316842, 37.888927 ], [ -122.317250, 37.889283 ], [ -122.317808, 37.889351 ], [ -122.318945, 37.889384 ], [ -122.319610, 37.889435 ], [ -122.320919, 37.889249 ], [ -122.321348, 37.889266 ], [ -122.321649, 37.889368 ], [ -122.321928, 37.889401 ], [ -122.322249, 37.889384 ], [ -122.322528, 37.889300 ], [ -122.322764, 37.889164 ], [ -122.322850, 37.889063 ], [ -122.322936, 37.888843 ], [ -122.322936, 37.888284 ], [ -122.324610, 37.887877 ], [ -122.324910, 37.887911 ], [ -122.325447, 37.888081 ], [ -122.326713, 37.888589 ], [ -122.327034, 37.888690 ], [ -122.327421, 37.888622 ], [ -122.327571, 37.888690 ], [ -122.327442, 37.889130 ], [ -122.327571, 37.889672 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420300", "BLOCKCE10": "3030", "NAME10": "Block 3030", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 744, "AWATER10": 0, "INTPTLAT10": "+37.8878859", "INTPTLON10": "-122.3094998" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.309804, 37.888131 ], [ -122.309611, 37.888030 ], [ -122.309332, 37.887894 ], [ -122.309289, 37.887877 ], [ -122.309353, 37.887674 ], [ -122.309783, 37.888047 ], [ -122.309804, 37.888131 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420300", "BLOCKCE10": "3010", "NAME10": "Block 3010", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 1835, "AWATER10": 0, "INTPTLAT10": "+37.8878520", "INTPTLON10": "-122.3091212" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.308967, 37.888775 ], [ -122.309053, 37.887437 ], [ -122.309289, 37.887318 ], [ -122.309289, 37.887589 ], [ -122.309096, 37.888385 ], [ -122.308967, 37.888775 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420300", "BLOCKCE10": "3011", "NAME10": "Block 3011", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 10961, "AWATER10": 0, "INTPTLAT10": "+37.8885068", "INTPTLON10": "-122.3086806" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.308345, 37.890079 ], [ -122.308345, 37.889215 ], [ -122.308366, 37.888995 ], [ -122.308538, 37.888284 ], [ -122.308495, 37.887640 ], [ -122.308538, 37.887556 ], [ -122.308624, 37.887335 ], [ -122.308881, 37.887420 ], [ -122.309053, 37.887437 ], [ -122.308967, 37.888775 ], [ -122.308345, 37.890079 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420300", "BLOCKCE10": "3016", "population": 33, "NAME10": "Block 3016", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 12044, "AWATER10": 0, "INTPTLAT10": "+37.8899556", "INTPTLON10": "-122.3067458" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.306414, 37.890807 ], [ -122.306242, 37.890248 ], [ -122.306607, 37.890197 ], [ -122.306306, 37.890096 ], [ -122.306135, 37.889909 ], [ -122.306027, 37.889588 ], [ -122.307487, 37.889317 ], [ -122.307529, 37.889537 ], [ -122.306821, 37.890688 ], [ -122.306714, 37.890739 ], [ -122.306414, 37.890807 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420300", "BLOCKCE10": "3017", "NAME10": "Block 3017", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 393, "AWATER10": 0, "INTPTLAT10": "+37.8901345", "INTPTLON10": "-122.3063016" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.306242, 37.890248 ], [ -122.306135, 37.889909 ], [ -122.306306, 37.890096 ], [ -122.306607, 37.890197 ], [ -122.306242, 37.890248 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420300", "BLOCKCE10": "3012", "NAME10": "Block 3012", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 14539, "AWATER10": 0, "INTPTLAT10": "+37.8894024", "INTPTLON10": "-122.3080555" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.307894, 37.890976 ], [ -122.307529, 37.889503 ], [ -122.308323, 37.888047 ], [ -122.308495, 37.887640 ], [ -122.308538, 37.888284 ], [ -122.308366, 37.888995 ], [ -122.308323, 37.889520 ], [ -122.308345, 37.890079 ], [ -122.307894, 37.890976 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420300", "BLOCKCE10": "3029", "NAME10": "Block 3029", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 14565, "AWATER10": 0, "INTPTLAT10": "+37.8878852", "INTPTLON10": "-122.3078467" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.307701, 37.889181 ], [ -122.307208, 37.887200 ], [ -122.307851, 37.887200 ], [ -122.308130, 37.887234 ], [ -122.308624, 37.887335 ], [ -122.308581, 37.887454 ], [ -122.308323, 37.888047 ], [ -122.307701, 37.889181 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420300", "BLOCKCE10": "3018", "population": 29, "NAME10": "Block 3018", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 9739, "AWATER10": 0, "INTPTLAT10": "+37.8891261", "INTPTLON10": "-122.3066496" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.306027, 37.889588 ], [ -122.305834, 37.888961 ], [ -122.307293, 37.888673 ], [ -122.307487, 37.889317 ], [ -122.306027, 37.889588 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420300", "BLOCKCE10": "3028", "population": 1, "NAME10": "Block 3028", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 444, "AWATER10": 0, "INTPTLAT10": "+37.8890070", "INTPTLON10": "-122.3053896" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.304976, 37.889130 ], [ -122.304955, 37.889080 ], [ -122.305813, 37.888910 ], [ -122.305834, 37.888961 ], [ -122.304976, 37.889130 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420300", "BLOCKCE10": "3015", "population": 7, "NAME10": "Block 3015", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 782, "AWATER10": 0, "INTPTLAT10": "+37.8887826", "INTPTLON10": "-122.3065328" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.305834, 37.888961 ], [ -122.305813, 37.888910 ], [ -122.307293, 37.888622 ], [ -122.307293, 37.888673 ], [ -122.305834, 37.888961 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420300", "BLOCKCE10": "3014", "population": 35, "NAME10": "Block 3014", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 10339, "AWATER10": 0, "INTPTLAT10": "+37.8884185", "INTPTLON10": "-122.3064403" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.305813, 37.888910 ], [ -122.305598, 37.888250 ], [ -122.307122, 37.887945 ], [ -122.307293, 37.888622 ], [ -122.305813, 37.888910 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420300", "BLOCKCE10": "3013", "NAME10": "Block 3013", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 7694, "AWATER10": 0, "INTPTLAT10": "+37.8877645", "INTPTLON10": "-122.3071265" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.307529, 37.889503 ], [ -122.307079, 37.887793 ], [ -122.307014, 37.887573 ], [ -122.306950, 37.887471 ], [ -122.306821, 37.887454 ], [ -122.306070, 37.887505 ], [ -122.305512, 37.887505 ], [ -122.305427, 37.887471 ], [ -122.306993, 37.887200 ], [ -122.307208, 37.887200 ], [ -122.307701, 37.889181 ], [ -122.307529, 37.889503 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420400", "BLOCKCE10": "1008", "NAME10": "Block 1008", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 447, "AWATER10": 0, "INTPTLAT10": "+37.8873248", "INTPTLON10": "-122.3088095" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.309053, 37.887437 ], [ -122.308881, 37.887420 ], [ -122.308624, 37.887335 ], [ -122.308667, 37.887217 ], [ -122.308967, 37.887335 ], [ -122.309053, 37.887437 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420400", "BLOCKCE10": "1009", "NAME10": "Block 1009", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 7572, "AWATER10": 0, "INTPTLAT10": "+37.8865874", "INTPTLON10": "-122.3090315" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.309053, 37.887437 ], [ -122.308967, 37.887335 ], [ -122.308667, 37.887217 ], [ -122.308838, 37.886472 ], [ -122.309010, 37.885388 ], [ -122.309010, 37.885134 ], [ -122.309268, 37.886319 ], [ -122.309332, 37.886827 ], [ -122.309289, 37.887318 ], [ -122.309053, 37.887437 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420400", "BLOCKCE10": "1010", "NAME10": "Block 1010", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 6192, "AWATER10": 0, "INTPTLAT10": "+37.8856733", "INTPTLON10": "-122.3091896" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.309289, 37.887318 ], [ -122.309332, 37.886827 ], [ -122.309268, 37.886319 ], [ -122.309010, 37.885134 ], [ -122.308645, 37.883491 ], [ -122.308881, 37.884016 ], [ -122.309525, 37.886455 ], [ -122.309525, 37.887064 ], [ -122.309461, 37.887166 ], [ -122.309289, 37.887318 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420400", "BLOCKCE10": "1006", "NAME10": "Block 1006", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 59431, "AWATER10": 0, "INTPTLAT10": "+37.8849426", "INTPTLON10": "-122.3081455" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.308667, 37.887217 ], [ -122.308044, 37.887098 ], [ -122.307401, 37.887064 ], [ -122.307229, 37.887081 ], [ -122.307358, 37.886726 ], [ -122.307572, 37.884169 ], [ -122.307830, 37.882018 ], [ -122.308366, 37.882187 ], [ -122.308645, 37.883491 ], [ -122.309010, 37.885134 ], [ -122.309010, 37.885388 ], [ -122.308838, 37.886472 ], [ -122.308667, 37.887217 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420400", "BLOCKCE10": "1007", "NAME10": "Block 1007", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 1737, "AWATER10": 0, "INTPTLAT10": "+37.8871632", "INTPTLON10": "-122.3079226" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.308624, 37.887335 ], [ -122.308517, 37.887318 ], [ -122.307851, 37.887200 ], [ -122.307208, 37.887200 ], [ -122.307229, 37.887081 ], [ -122.307401, 37.887064 ], [ -122.308044, 37.887098 ], [ -122.308667, 37.887217 ], [ -122.308624, 37.887335 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420300", "BLOCKCE10": "3031", "population": 38, "NAME10": "Block 3031", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 9685, "AWATER10": 0, "INTPTLAT10": "+37.8877891", "INTPTLON10": "-122.3061951" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.305598, 37.888250 ], [ -122.305341, 37.887471 ], [ -122.305427, 37.887471 ], [ -122.305512, 37.887505 ], [ -122.306070, 37.887505 ], [ -122.306907, 37.887454 ], [ -122.306993, 37.887522 ], [ -122.307122, 37.887945 ], [ -122.305598, 37.888250 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420400", "BLOCKCE10": "1005", "NAME10": "Block 1005", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 52400, "AWATER10": 0, "INTPTLAT10": "+37.8837458", "INTPTLON10": "-122.3069617" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.307165, 37.887081 ], [ -122.307100, 37.886878 ], [ -122.306800, 37.885591 ], [ -122.306178, 37.883271 ], [ -122.305813, 37.882102 ], [ -122.307100, 37.881882 ], [ -122.307315, 37.881916 ], [ -122.307358, 37.881865 ], [ -122.307830, 37.882018 ], [ -122.307572, 37.884169 ], [ -122.307358, 37.886726 ], [ -122.307229, 37.887081 ], [ -122.307165, 37.887081 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420300", "BLOCKCE10": "3021", "population": 23, "NAME10": "Block 3021", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 11997, "AWATER10": 0, "INTPTLAT10": "+37.8902784", "INTPTLON10": "-122.3030396" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.303088, 37.891603 ], [ -122.302465, 37.889622 ], [ -122.303302, 37.889452 ], [ -122.303560, 37.890350 ], [ -122.303324, 37.890841 ], [ -122.303088, 37.891603 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420300", "BLOCKCE10": "3019", "population": 50, "NAME10": "Block 3019", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 17581, "AWATER10": 0, "INTPTLAT10": "+37.8895455", "INTPTLON10": "-122.3046051" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.303560, 37.890350 ], [ -122.303302, 37.889452 ], [ -122.305834, 37.888961 ], [ -122.306027, 37.889588 ], [ -122.304161, 37.889977 ], [ -122.303967, 37.890045 ], [ -122.303731, 37.890180 ], [ -122.303560, 37.890350 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420300", "BLOCKCE10": "3020", "population": 1, "NAME10": "Block 3020", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 409, "AWATER10": 0, "INTPTLAT10": "+37.8891773", "INTPTLON10": "-122.3045386" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.304139, 37.889283 ], [ -122.304118, 37.889249 ], [ -122.304955, 37.889080 ], [ -122.304976, 37.889130 ], [ -122.304139, 37.889283 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420300", "BLOCKCE10": "3027", "population": 33, "NAME10": "Block 3027", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 13106, "AWATER10": 0, "INTPTLAT10": "+37.8882387", "INTPTLON10": "-122.3051246" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.304955, 37.889080 ], [ -122.304461, 37.887522 ], [ -122.305341, 37.887471 ], [ -122.305813, 37.888910 ], [ -122.304955, 37.889080 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420300", "BLOCKCE10": "3026", "population": 33, "NAME10": "Block 3026", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 14219, "AWATER10": 0, "INTPTLAT10": "+37.8883405", "INTPTLON10": "-122.3042616" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.304118, 37.889249 ], [ -122.303581, 37.887556 ], [ -122.304461, 37.887522 ], [ -122.304955, 37.889080 ], [ -122.304118, 37.889249 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420300", "BLOCKCE10": "3025", "NAME10": "Block 3025", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 406, "AWATER10": 0, "INTPTLAT10": "+37.8893398", "INTPTLON10": "-122.3036979" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.303302, 37.889452 ], [ -122.303281, 37.889401 ], [ -122.304118, 37.889249 ], [ -122.304139, 37.889283 ], [ -122.303302, 37.889452 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420300", "BLOCKCE10": "3022", "NAME10": "Block 3022", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 411, "AWATER10": 0, "INTPTLAT10": "+37.8895077", "INTPTLON10": "-122.3028537" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.302465, 37.889622 ], [ -122.302444, 37.889571 ], [ -122.303281, 37.889401 ], [ -122.303302, 37.889452 ], [ -122.302465, 37.889622 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420300", "BLOCKCE10": "3024", "population": 31, "NAME10": "Block 3024", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 15240, "AWATER10": 0, "INTPTLAT10": "+37.8884411", "INTPTLON10": "-122.3034025" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.303281, 37.889401 ], [ -122.302701, 37.887589 ], [ -122.303581, 37.887556 ], [ -122.304118, 37.889249 ], [ -122.303281, 37.889401 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420300", "BLOCKCE10": "1009", "population": 37, "NAME10": "Block 1009", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 17210, "AWATER10": 0, "INTPTLAT10": "+37.8906969", "INTPTLON10": "-122.3023492" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.302251, 37.891772 ], [ -122.301714, 37.890113 ], [ -122.301650, 37.889791 ], [ -122.302465, 37.889622 ], [ -122.303088, 37.891603 ], [ -122.302251, 37.891772 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420300", "BLOCKCE10": "1006", "population": 87, "NAME10": "Block 1006", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 17308, "AWATER10": 0, "INTPTLAT10": "+37.8908584", "INTPTLON10": "-122.3015099" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.301435, 37.891942 ], [ -122.300770, 37.889960 ], [ -122.301650, 37.889791 ], [ -122.301714, 37.890113 ], [ -122.302251, 37.891772 ], [ -122.301435, 37.891942 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420300", "BLOCKCE10": "1004", "population": 38, "NAME10": "Block 1004", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 17893, "AWATER10": 0, "INTPTLAT10": "+37.8912006", "INTPTLON10": "-122.2998090" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.299719, 37.892297 ], [ -122.299547, 37.891806 ], [ -122.299054, 37.890265 ], [ -122.299311, 37.890248 ], [ -122.299933, 37.890130 ], [ -122.300577, 37.892111 ], [ -122.299719, 37.892297 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420300", "BLOCKCE10": "1005", "population": 86, "NAME10": "Block 1005", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 17622, "AWATER10": 0, "INTPTLAT10": "+37.8910287", "INTPTLON10": "-122.3006658" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.300577, 37.892111 ], [ -122.299933, 37.890130 ], [ -122.300770, 37.889960 ], [ -122.301435, 37.891942 ], [ -122.300577, 37.892111 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420300", "BLOCKCE10": "3023", "population": 33, "NAME10": "Block 3023", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 16332, "AWATER10": 0, "INTPTLAT10": "+37.8885408", "INTPTLON10": "-122.3025479" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.302444, 37.889571 ], [ -122.301822, 37.887623 ], [ -122.302701, 37.887589 ], [ -122.303281, 37.889401 ], [ -122.302444, 37.889571 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420300", "BLOCKCE10": "1010", "population": 43, "NAME10": "Block 1010", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 20386, "AWATER10": 0, "INTPTLAT10": "+37.8886345", "INTPTLON10": "-122.3016225" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.301650, 37.889791 ], [ -122.300684, 37.887742 ], [ -122.301822, 37.887623 ], [ -122.302444, 37.889571 ], [ -122.302465, 37.889622 ], [ -122.301650, 37.889791 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420300", "BLOCKCE10": "1012", "NAME10": "Block 1012", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 372, "AWATER10": 0, "INTPTLAT10": "+37.8900118", "INTPTLON10": "-122.3003351" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.299933, 37.890130 ], [ -122.299912, 37.890079 ], [ -122.300770, 37.889909 ], [ -122.300770, 37.889960 ], [ -122.300105, 37.890096 ], [ -122.299933, 37.890130 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420300", "BLOCKCE10": "1011", "population": 69, "NAME10": "Block 1011", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 16453, "AWATER10": 0, "INTPTLAT10": "+37.8888638", "INTPTLON10": "-122.3008054" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.300770, 37.889960 ], [ -122.300062, 37.887725 ], [ -122.300684, 37.887742 ], [ -122.301650, 37.889791 ], [ -122.300770, 37.889960 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420300", "BLOCKCE10": "1015", "population": 70, "NAME10": "Block 1015", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 19773, "AWATER10": 0, "INTPTLAT10": "+37.8888596", "INTPTLON10": "-122.2999642" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.299912, 37.890079 ], [ -122.299182, 37.887742 ], [ -122.300062, 37.887725 ], [ -122.300770, 37.889909 ], [ -122.299912, 37.890079 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420400", "BLOCKCE10": "1002", "NAME10": "Block 1002", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 5453, "AWATER10": 0, "INTPTLAT10": "+37.8874129", "INTPTLON10": "-122.3045679" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.302101, 37.887606 ], [ -122.302079, 37.887505 ], [ -122.305834, 37.887318 ], [ -122.307229, 37.887081 ], [ -122.307208, 37.887200 ], [ -122.306993, 37.887200 ], [ -122.305427, 37.887471 ], [ -122.302208, 37.887606 ], [ -122.302101, 37.887606 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420400", "BLOCKCE10": "1001", "population": 212, "NAME10": "Block 1001", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 98716, "AWATER10": 0, "INTPTLAT10": "+37.8865962", "INTPTLON10": "-122.3039801" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.300684, 37.887742 ], [ -122.300963, 37.887657 ], [ -122.300513, 37.886319 ], [ -122.302337, 37.886031 ], [ -122.304590, 37.885845 ], [ -122.304482, 37.885337 ], [ -122.306800, 37.885591 ], [ -122.307165, 37.887081 ], [ -122.305834, 37.887318 ], [ -122.302079, 37.887505 ], [ -122.302101, 37.887606 ], [ -122.300684, 37.887742 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420400", "BLOCKCE10": "1016", "population": 116, "NAME10": "Block 1016", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 8910, "AWATER10": 0, "INTPTLAT10": "+37.8847438", "INTPTLON10": "-122.3040957" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.304225, 37.885879 ], [ -122.303903, 37.884744 ], [ -122.303603, 37.883660 ], [ -122.303967, 37.883593 ], [ -122.304525, 37.885473 ], [ -122.304590, 37.885845 ], [ -122.304225, 37.885879 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420400", "BLOCKCE10": "1003", "population": 145, "NAME10": "Block 1003", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 82198, "AWATER10": 0, "INTPTLAT10": "+37.8837071", "INTPTLON10": "-122.3049494" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.306800, 37.885591 ], [ -122.304482, 37.885337 ], [ -122.303967, 37.883593 ], [ -122.303452, 37.883694 ], [ -122.303431, 37.882881 ], [ -122.302938, 37.883017 ], [ -122.302616, 37.883068 ], [ -122.302444, 37.882763 ], [ -122.302358, 37.882509 ], [ -122.302530, 37.882458 ], [ -122.302744, 37.882458 ], [ -122.302959, 37.882407 ], [ -122.303131, 37.882323 ], [ -122.303324, 37.882289 ], [ -122.303967, 37.882255 ], [ -122.304525, 37.882272 ], [ -122.305233, 37.882221 ], [ -122.305813, 37.882102 ], [ -122.306199, 37.883322 ], [ -122.306800, 37.885591 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420400", "BLOCKCE10": "1017", "population": 90, "NAME10": "Block 1017", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 6144, "AWATER10": 0, "INTPTLAT10": "+37.8847470", "INTPTLON10": "-122.3037488" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.303946, 37.885896 ], [ -122.303903, 37.885659 ], [ -122.303302, 37.883711 ], [ -122.303603, 37.883660 ], [ -122.304225, 37.885879 ], [ -122.303946, 37.885896 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420400", "BLOCKCE10": "1013", "population": 133, "NAME10": "Block 1013", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 9671, "AWATER10": 0, "INTPTLAT10": "+37.8848967", "INTPTLON10": "-122.3034182" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.303431, 37.885947 ], [ -122.302959, 37.883796 ], [ -122.303302, 37.883711 ], [ -122.303903, 37.885659 ], [ -122.303946, 37.885896 ], [ -122.303431, 37.885947 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420400", "BLOCKCE10": "1014", "population": 414, "NAME10": "Block 1014", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 85670, "AWATER10": 0, "INTPTLAT10": "+37.8846770", "INTPTLON10": "-122.3015769" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.300513, 37.886319 ], [ -122.299933, 37.884440 ], [ -122.299912, 37.884067 ], [ -122.299805, 37.884084 ], [ -122.299826, 37.883881 ], [ -122.300019, 37.883389 ], [ -122.300234, 37.883220 ], [ -122.300534, 37.883288 ], [ -122.300663, 37.883356 ], [ -122.300856, 37.883406 ], [ -122.300985, 37.883406 ], [ -122.300942, 37.883389 ], [ -122.300985, 37.883356 ], [ -122.301114, 37.883356 ], [ -122.301414, 37.883271 ], [ -122.301607, 37.883254 ], [ -122.301650, 37.883220 ], [ -122.302079, 37.883119 ], [ -122.302616, 37.883068 ], [ -122.302959, 37.883796 ], [ -122.303431, 37.885947 ], [ -122.302508, 37.886014 ], [ -122.301800, 37.886099 ], [ -122.300513, 37.886319 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420400", "BLOCKCE10": "1004", "population": 30, "NAME10": "Block 1004", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 5050, "AWATER10": 0, "INTPTLAT10": "+37.8833234", "INTPTLON10": "-122.3030968" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.302959, 37.883796 ], [ -122.302616, 37.883068 ], [ -122.302938, 37.883017 ], [ -122.303431, 37.882881 ], [ -122.303452, 37.883694 ], [ -122.302959, 37.883796 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420400", "BLOCKCE10": "1020", "population": 44, "NAME10": "Block 1020", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 12062, "AWATER10": 0, "INTPTLAT10": "+37.8829654", "INTPTLON10": "-122.3013966" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.300856, 37.883406 ], [ -122.300663, 37.883356 ], [ -122.300534, 37.883288 ], [ -122.300341, 37.883254 ], [ -122.300298, 37.883220 ], [ -122.300277, 37.883119 ], [ -122.300212, 37.882881 ], [ -122.300642, 37.882814 ], [ -122.301092, 37.882780 ], [ -122.301908, 37.882577 ], [ -122.302337, 37.882509 ], [ -122.302616, 37.883068 ], [ -122.302079, 37.883119 ], [ -122.301650, 37.883220 ], [ -122.301607, 37.883254 ], [ -122.301414, 37.883271 ], [ -122.301114, 37.883356 ], [ -122.300985, 37.883356 ], [ -122.300942, 37.883389 ], [ -122.300985, 37.883406 ], [ -122.300856, 37.883406 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420200", "BLOCKCE10": "1003", "population": 62, "NAME10": "Block 1003", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 10975, "AWATER10": 0, "INTPTLAT10": "+37.8977494", "INTPTLON10": "-122.2990695" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.298861, 37.898478 ], [ -122.298453, 37.897208 ], [ -122.299290, 37.897055 ], [ -122.299719, 37.898291 ], [ -122.299397, 37.898325 ], [ -122.298861, 37.898478 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420200", "BLOCKCE10": "1002", "population": 68, "NAME10": "Block 1002", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 11372, "AWATER10": 0, "INTPTLAT10": "+37.8979512", "INTPTLON10": "-122.2982332" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.298045, 37.898749 ], [ -122.297616, 37.897394 ], [ -122.298453, 37.897208 ], [ -122.298861, 37.898478 ], [ -122.298045, 37.898749 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420200", "BLOCKCE10": "1001", "population": 49, "NAME10": "Block 1001", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 11928, "AWATER10": 0, "INTPTLAT10": "+37.8981515", "INTPTLON10": "-122.2974109" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.297208, 37.898901 ], [ -122.296779, 37.897546 ], [ -122.297616, 37.897394 ], [ -122.298045, 37.898749 ], [ -122.297788, 37.898833 ], [ -122.297208, 37.898901 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420200", "BLOCKCE10": "1000", "population": 113, "NAME10": "Block 1000", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 13452, "AWATER10": 0, "INTPTLAT10": "+37.8982712", "INTPTLON10": "-122.2964744" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.296221, 37.898935 ], [ -122.295706, 37.897767 ], [ -122.296779, 37.897546 ], [ -122.297208, 37.898901 ], [ -122.297015, 37.898935 ], [ -122.296221, 37.898935 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420200", "BLOCKCE10": "1012", "population": 29, "NAME10": "Block 1012", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 14000, "AWATER10": 0, "INTPTLAT10": "+37.8966536", "INTPTLON10": "-122.2969317" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.296779, 37.897546 ], [ -122.296264, 37.895938 ], [ -122.297080, 37.895768 ], [ -122.297616, 37.897394 ], [ -122.296779, 37.897546 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420200", "BLOCKCE10": "1013", "population": 27, "NAME10": "Block 1013", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 14541, "AWATER10": 0, "INTPTLAT10": "+37.8968185", "INTPTLON10": "-122.2960835" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.295921, 37.897733 ], [ -122.295406, 37.896090 ], [ -122.296264, 37.895938 ], [ -122.296779, 37.897546 ], [ -122.295921, 37.897733 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420100", "BLOCKCE10": "1006", "NAME10": "Block 1006", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 14453, "AWATER10": 0, "INTPTLAT10": "+37.8983329", "INTPTLON10": "-122.2952807" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.295985, 37.898935 ], [ -122.294569, 37.898749 ], [ -122.294590, 37.897750 ], [ -122.295706, 37.897767 ], [ -122.296221, 37.898935 ], [ -122.295985, 37.898935 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420200", "BLOCKCE10": "1009", "population": 47, "NAME10": "Block 1009", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 14237, "AWATER10": 0, "INTPTLAT10": "+37.8961439", "INTPTLON10": "-122.2994424" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.299290, 37.897055 ], [ -122.298775, 37.895430 ], [ -122.299612, 37.895260 ], [ -122.300127, 37.896869 ], [ -122.299290, 37.897055 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420200", "BLOCKCE10": "1010", "population": 32, "NAME10": "Block 1010", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 14169, "AWATER10": 0, "INTPTLAT10": "+37.8963113", "INTPTLON10": "-122.2986013" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.298453, 37.897208 ], [ -122.297938, 37.895599 ], [ -122.298775, 37.895430 ], [ -122.299290, 37.897055 ], [ -122.298453, 37.897208 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420200", "BLOCKCE10": "3001", "population": 46, "NAME10": "Block 3001", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 14042, "AWATER10": 0, "INTPTLAT10": "+37.8945232", "INTPTLON10": "-122.2989229" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.298775, 37.895430 ], [ -122.298260, 37.893821 ], [ -122.299075, 37.893635 ], [ -122.299612, 37.895260 ], [ -122.298775, 37.895430 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420200", "BLOCKCE10": "1011", "population": 32, "NAME10": "Block 1011", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 14193, "AWATER10": 0, "INTPTLAT10": "+37.8964819", "INTPTLON10": "-122.2977622" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.297616, 37.897394 ], [ -122.297080, 37.895768 ], [ -122.297938, 37.895599 ], [ -122.298453, 37.897208 ], [ -122.297616, 37.897394 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420200", "BLOCKCE10": "3000", "population": 46, "NAME10": "Block 3000", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 14087, "AWATER10": 0, "INTPTLAT10": "+37.8946922", "INTPTLON10": "-122.2980853" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.297938, 37.895599 ], [ -122.297423, 37.893957 ], [ -122.298260, 37.893821 ], [ -122.298775, 37.895430 ], [ -122.297938, 37.895599 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420200", "BLOCKCE10": "2005", "population": 31, "NAME10": "Block 2005", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 14270, "AWATER10": 0, "INTPTLAT10": "+37.8948540", "INTPTLON10": "-122.2972427" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.297080, 37.895768 ], [ -122.296565, 37.894126 ], [ -122.297423, 37.893957 ], [ -122.297938, 37.895599 ], [ -122.297080, 37.895768 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420200", "BLOCKCE10": "3002", "population": 57, "NAME10": "Block 3002", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 14593, "AWATER10": 0, "INTPTLAT10": "+37.8943454", "INTPTLON10": "-122.2997703" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.299612, 37.895260 ], [ -122.299075, 37.893635 ], [ -122.299955, 37.893466 ], [ -122.300470, 37.895074 ], [ -122.299612, 37.895260 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420200", "BLOCKCE10": "3005", "population": 10, "NAME10": "Block 3005", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 14799, "AWATER10": 0, "INTPTLAT10": "+37.8927197", "INTPTLON10": "-122.2992493" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.299075, 37.893635 ], [ -122.298560, 37.891992 ], [ -122.299418, 37.891823 ], [ -122.299590, 37.892314 ], [ -122.299955, 37.893466 ], [ -122.299075, 37.893635 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420200", "BLOCKCE10": "3006", "population": 53, "NAME10": "Block 3006", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 14044, "AWATER10": 0, "INTPTLAT10": "+37.8928963", "INTPTLON10": "-122.2984024" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.298260, 37.893821 ], [ -122.297745, 37.892179 ], [ -122.298560, 37.891992 ], [ -122.299075, 37.893635 ], [ -122.298260, 37.893821 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420200", "BLOCKCE10": "3007", "population": 41, "NAME10": "Block 3007", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 14185, "AWATER10": 0, "INTPTLAT10": "+37.8930639", "INTPTLON10": "-122.2975700" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.297423, 37.893957 ], [ -122.296908, 37.892348 ], [ -122.297745, 37.892179 ], [ -122.298260, 37.893821 ], [ -122.297423, 37.893957 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420200", "BLOCKCE10": "2004", "population": 33, "NAME10": "Block 2004", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 14101, "AWATER10": 0, "INTPTLAT10": "+37.8950194", "INTPTLON10": "-122.2964053" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.296264, 37.895938 ], [ -122.295749, 37.894295 ], [ -122.296565, 37.894126 ], [ -122.297080, 37.895768 ], [ -122.296264, 37.895938 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420200", "BLOCKCE10": "2000", "NAME10": "Block 2000", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 7737, "AWATER10": 0, "INTPTLAT10": "+37.8960946", "INTPTLON10": "-122.2952742" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.295706, 37.897767 ], [ -122.294655, 37.894532 ], [ -122.294891, 37.894482 ], [ -122.295921, 37.897733 ], [ -122.295749, 37.897767 ], [ -122.295706, 37.897767 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420100", "BLOCKCE10": "1007", "population": 87, "NAME10": "Block 1007", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 17265, "AWATER10": 0, "INTPTLAT10": "+37.8966238", "INTPTLON10": "-122.2949725" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.295706, 37.897767 ], [ -122.294590, 37.897750 ], [ -122.294719, 37.895379 ], [ -122.294397, 37.894566 ], [ -122.294655, 37.894532 ], [ -122.295706, 37.897767 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420200", "BLOCKCE10": "2003", "population": 28, "NAME10": "Block 2003", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 14449, "AWATER10": 0, "INTPTLAT10": "+37.8951947", "INTPTLON10": "-122.2955660" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.295406, 37.896090 ], [ -122.294891, 37.894482 ], [ -122.295749, 37.894295 ], [ -122.296264, 37.895938 ], [ -122.295406, 37.896090 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420200", "BLOCKCE10": "2007", "population": 33, "NAME10": "Block 2007", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 14053, "AWATER10": 0, "INTPTLAT10": "+37.8933931", "INTPTLON10": "-122.2958883" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.295749, 37.894295 ], [ -122.295234, 37.892687 ], [ -122.296071, 37.892517 ], [ -122.296565, 37.894126 ], [ -122.295749, 37.894295 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420200", "BLOCKCE10": "2006", "population": 32, "NAME10": "Block 2006", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 14158, "AWATER10": 0, "INTPTLAT10": "+37.8932322", "INTPTLON10": "-122.2967302" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.296565, 37.894126 ], [ -122.296071, 37.892517 ], [ -122.296908, 37.892348 ], [ -122.297423, 37.893957 ], [ -122.296565, 37.894126 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420200", "BLOCKCE10": "2002", "population": 32, "NAME10": "Block 2002", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 14523, "AWATER10": 0, "INTPTLAT10": "+37.8935661", "INTPTLON10": "-122.2950398" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.294891, 37.894482 ], [ -122.294354, 37.892856 ], [ -122.295234, 37.892687 ], [ -122.295749, 37.894295 ], [ -122.294891, 37.894482 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420200", "BLOCKCE10": "2001", "NAME10": "Block 2001", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 3995, "AWATER10": 0, "INTPTLAT10": "+37.8936801", "INTPTLON10": "-122.2944928" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.294655, 37.894532 ], [ -122.294118, 37.892856 ], [ -122.294354, 37.892856 ], [ -122.294891, 37.894482 ], [ -122.294655, 37.894532 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420100", "BLOCKCE10": "1005", "NAME10": "Block 1005", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 8083, "AWATER10": 0, "INTPTLAT10": "+37.8982104", "INTPTLON10": "-122.2941387" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.294569, 37.898749 ], [ -122.293689, 37.898647 ], [ -122.293668, 37.898528 ], [ -122.293711, 37.898393 ], [ -122.293732, 37.897716 ], [ -122.294590, 37.897750 ], [ -122.294569, 37.898749 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420100", "BLOCKCE10": "1004", "population": 9, "NAME10": "Block 1004", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 6640, "AWATER10": 0, "INTPTLAT10": "+37.8980962", "INTPTLON10": "-122.2932964" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.293689, 37.898647 ], [ -122.293582, 37.898630 ], [ -122.293196, 37.898427 ], [ -122.292831, 37.898376 ], [ -122.292852, 37.897699 ], [ -122.293732, 37.897716 ], [ -122.293711, 37.898393 ], [ -122.293668, 37.898528 ], [ -122.293689, 37.898647 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420100", "BLOCKCE10": "1003", "NAME10": "Block 1003", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 1246, "AWATER10": 0, "INTPTLAT10": "+37.8980064", "INTPTLON10": "-122.2927412" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.292831, 37.898376 ], [ -122.292659, 37.898342 ], [ -122.292659, 37.897987 ], [ -122.292616, 37.897699 ], [ -122.292852, 37.897699 ], [ -122.292831, 37.898376 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420100", "BLOCKCE10": "1010", "population": 2, "NAME10": "Block 1010", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 2269, "AWATER10": 0, "INTPTLAT10": "+37.8971964", "INTPTLON10": "-122.2927567" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.292616, 37.897699 ], [ -122.292681, 37.896717 ], [ -122.292917, 37.896734 ], [ -122.292852, 37.897699 ], [ -122.292616, 37.897699 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420100", "BLOCKCE10": "1002", "population": 31, "NAME10": "Block 1002", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 14980, "AWATER10": 0, "INTPTLAT10": "+37.8974821", "INTPTLON10": "-122.2921539" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.292659, 37.898342 ], [ -122.291994, 37.898241 ], [ -122.291608, 37.898105 ], [ -122.291715, 37.896700 ], [ -122.292681, 37.896717 ], [ -122.292616, 37.897699 ], [ -122.292659, 37.897987 ], [ -122.292659, 37.898342 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420100", "BLOCKCE10": "1001", "population": 21, "NAME10": "Block 1001", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 11297, "AWATER10": 0, "INTPTLAT10": "+37.8973215", "INTPTLON10": "-122.2912175" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.291608, 37.898105 ], [ -122.291093, 37.897936 ], [ -122.290728, 37.897902 ], [ -122.290814, 37.896666 ], [ -122.291715, 37.896700 ], [ -122.291608, 37.898105 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420100", "BLOCKCE10": "1000", "population": 16, "NAME10": "Block 1000", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 10019, "AWATER10": 0, "INTPTLAT10": "+37.8972478", "INTPTLON10": "-122.2903402" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.290728, 37.897902 ], [ -122.290192, 37.897834 ], [ -122.289870, 37.897834 ], [ -122.289977, 37.896649 ], [ -122.290814, 37.896666 ], [ -122.290728, 37.897902 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420100", "BLOCKCE10": "2005", "population": 17, "NAME10": "Block 2005", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 10320, "AWATER10": 0, "INTPTLAT10": "+37.8972288", "INTPTLON10": "-122.2894724" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.289011, 37.897885 ], [ -122.289097, 37.896615 ], [ -122.289977, 37.896649 ], [ -122.289870, 37.897834 ], [ -122.289484, 37.897834 ], [ -122.289011, 37.897885 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420100", "BLOCKCE10": "1008", "population": 37, "NAME10": "Block 1008", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 25122, "AWATER10": 0, "INTPTLAT10": "+37.8962273", "INTPTLON10": "-122.2942136" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.294590, 37.897750 ], [ -122.293732, 37.897716 ], [ -122.293882, 37.894685 ], [ -122.294397, 37.894566 ], [ -122.294719, 37.895379 ], [ -122.294590, 37.897750 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420100", "BLOCKCE10": "1009", "population": 44, "NAME10": "Block 1009", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 24911, "AWATER10": 0, "INTPTLAT10": "+37.8962389", "INTPTLON10": "-122.2933649" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.293732, 37.897716 ], [ -122.292852, 37.897699 ], [ -122.293003, 37.894871 ], [ -122.293882, 37.894685 ], [ -122.293839, 37.895294 ], [ -122.293732, 37.897716 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420100", "BLOCKCE10": "1011", "population": 1, "NAME10": "Block 1011", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 4495, "AWATER10": 0, "INTPTLAT10": "+37.8957842", "INTPTLON10": "-122.2928245" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.292917, 37.896734 ], [ -122.292681, 37.896717 ], [ -122.292745, 37.894871 ], [ -122.293003, 37.894871 ], [ -122.292917, 37.896734 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420100", "BLOCKCE10": "1016", "population": 13, "NAME10": "Block 1016", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 8255, "AWATER10": 0, "INTPTLAT10": "+37.8939086", "INTPTLON10": "-122.2941575" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.293882, 37.894685 ], [ -122.293947, 37.892856 ], [ -122.294118, 37.892856 ], [ -122.294655, 37.894532 ], [ -122.293882, 37.894685 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420100", "BLOCKCE10": "1015", "population": 30, "NAME10": "Block 1015", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 16238, "AWATER10": 0, "INTPTLAT10": "+37.8938032", "INTPTLON10": "-122.2934559" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.293003, 37.894871 ], [ -122.293088, 37.892839 ], [ -122.293947, 37.892856 ], [ -122.293882, 37.894685 ], [ -122.293003, 37.894871 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420100", "BLOCKCE10": "1014", "population": 2, "NAME10": "Block 1014", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 5007, "AWATER10": 0, "INTPTLAT10": "+37.8938437", "INTPTLON10": "-122.2929060" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.292745, 37.894871 ], [ -122.292831, 37.892822 ], [ -122.293088, 37.892839 ], [ -122.293003, 37.894871 ], [ -122.292745, 37.894871 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420100", "BLOCKCE10": "1013", "population": 38, "NAME10": "Block 1013", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 18897, "AWATER10": 0, "INTPTLAT10": "+37.8938347", "INTPTLON10": "-122.2923093" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.292745, 37.894871 ], [ -122.291801, 37.894854 ], [ -122.291887, 37.892822 ], [ -122.292831, 37.892822 ], [ -122.292745, 37.894871 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420100", "BLOCKCE10": "1012", "NAME10": "Block 1012", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 48606, "AWATER10": 0, "INTPTLAT10": "+37.8957510", "INTPTLON10": "-122.2913507" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.292681, 37.896717 ], [ -122.289977, 37.896649 ], [ -122.289999, 37.895836 ], [ -122.290063, 37.894786 ], [ -122.292745, 37.894871 ], [ -122.292681, 37.896717 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420100", "BLOCKCE10": "2006", "population": 31, "NAME10": "Block 2006", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 15730, "AWATER10": 0, "INTPTLAT10": "+37.8956964", "INTPTLON10": "-122.2895702" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.289977, 37.896649 ], [ -122.289097, 37.896615 ], [ -122.289205, 37.894769 ], [ -122.290063, 37.894786 ], [ -122.289977, 37.896649 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420100", "BLOCKCE10": "3001", "population": 31, "NAME10": "Block 3001", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 16246, "AWATER10": 0, "INTPTLAT10": "+37.8938831", "INTPTLON10": "-122.2913917" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.291801, 37.894854 ], [ -122.290921, 37.894820 ], [ -122.290986, 37.892941 ], [ -122.291887, 37.892974 ], [ -122.291801, 37.894854 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420100", "BLOCKCE10": "3000", "population": 31, "NAME10": "Block 3000", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 15665, "AWATER10": 0, "INTPTLAT10": "+37.8938607", "INTPTLON10": "-122.2905229" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.290921, 37.894820 ], [ -122.290063, 37.894786 ], [ -122.290149, 37.892907 ], [ -122.290986, 37.892941 ], [ -122.290921, 37.894820 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420100", "BLOCKCE10": "2015", "population": 35, "NAME10": "Block 2015", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 15921, "AWATER10": 0, "INTPTLAT10": "+37.8938332", "INTPTLON10": "-122.2896635" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.290063, 37.894786 ], [ -122.289205, 37.894769 ], [ -122.289290, 37.892890 ], [ -122.290149, 37.892907 ], [ -122.290063, 37.894786 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420100", "BLOCKCE10": "2004", "population": 16, "NAME10": "Block 2004", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 11206, "AWATER10": 0, "INTPTLAT10": "+37.8972632", "INTPTLON10": "-122.2886022" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.288175, 37.898105 ], [ -122.288218, 37.896598 ], [ -122.289097, 37.896615 ], [ -122.289011, 37.897885 ], [ -122.288496, 37.897936 ], [ -122.288175, 37.898105 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420100", "BLOCKCE10": "2003", "NAME10": "Block 2003", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 1027, "AWATER10": 0, "INTPTLAT10": "+37.8973454", "INTPTLON10": "-122.2881508" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.288110, 37.898156 ], [ -122.288153, 37.896598 ], [ -122.288218, 37.896598 ], [ -122.288175, 37.897800 ], [ -122.288175, 37.898105 ], [ -122.288110, 37.898156 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420100", "BLOCKCE10": "2002", "population": 35, "NAME10": "Block 2002", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 16183, "AWATER10": 0, "INTPTLAT10": "+37.8975006", "INTPTLON10": "-122.2876349" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.287145, 37.898647 ], [ -122.287273, 37.896564 ], [ -122.288153, 37.896598 ], [ -122.288110, 37.898156 ], [ -122.287145, 37.898647 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420100", "BLOCKCE10": "2000", "NAME10": "Block 2000", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 948, "AWATER10": 0, "INTPTLAT10": "+37.8984122", "INTPTLON10": "-122.2870554" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.286952, 37.898715 ], [ -122.287016, 37.898139 ], [ -122.287145, 37.898139 ], [ -122.287188, 37.898156 ], [ -122.287145, 37.898647 ], [ -122.286952, 37.898715 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420100", "BLOCKCE10": "2001", "population": 9, "NAME10": "Block 2001", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 2708, "AWATER10": 0, "INTPTLAT10": "+37.8973380", "INTPTLON10": "-122.2871259" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.287188, 37.898156 ], [ -122.287016, 37.898139 ], [ -122.287080, 37.896564 ], [ -122.287273, 37.896564 ], [ -122.287188, 37.898156 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420100", "BLOCKCE10": "2007", "population": 30, "NAME10": "Block 2007", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 15930, "AWATER10": 0, "INTPTLAT10": "+37.8956694", "INTPTLON10": "-122.2886965" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.289097, 37.896615 ], [ -122.288218, 37.896598 ], [ -122.288303, 37.894736 ], [ -122.289205, 37.894769 ], [ -122.289097, 37.896615 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420100", "BLOCKCE10": "2008", "NAME10": "Block 2008", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 1214, "AWATER10": 0, "INTPTLAT10": "+37.8956738", "INTPTLON10": "-122.2882217" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.288153, 37.896598 ], [ -122.288239, 37.894736 ], [ -122.288303, 37.894736 ], [ -122.288303, 37.895108 ], [ -122.288218, 37.896598 ], [ -122.288153, 37.896598 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420100", "BLOCKCE10": "2009", "population": 33, "NAME10": "Block 2009", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 15974, "AWATER10": 0, "INTPTLAT10": "+37.8956464", "INTPTLON10": "-122.2877473" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.288153, 37.896598 ], [ -122.287273, 37.896564 ], [ -122.287359, 37.894719 ], [ -122.288239, 37.894736 ], [ -122.288153, 37.896598 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420100", "BLOCKCE10": "2010", "population": 10, "NAME10": "Block 2010", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 3628, "AWATER10": 0, "INTPTLAT10": "+37.8956076", "INTPTLON10": "-122.2872058" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.287080, 37.896564 ], [ -122.287145, 37.894719 ], [ -122.287359, 37.894719 ], [ -122.287273, 37.896564 ], [ -122.287080, 37.896564 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420100", "BLOCKCE10": "2014", "population": 32, "NAME10": "Block 2014", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 16117, "AWATER10": 0, "INTPTLAT10": "+37.8938093", "INTPTLON10": "-122.2887874" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.289205, 37.894769 ], [ -122.288303, 37.894736 ], [ -122.288411, 37.892873 ], [ -122.289290, 37.892890 ], [ -122.289205, 37.894769 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420100", "BLOCKCE10": "2013", "NAME10": "Block 2013", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 1269, "AWATER10": 0, "INTPTLAT10": "+37.8937720", "INTPTLON10": "-122.2883131" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.288239, 37.894736 ], [ -122.288325, 37.892873 ], [ -122.288411, 37.892873 ], [ -122.288303, 37.894736 ], [ -122.288239, 37.894736 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420100", "BLOCKCE10": "2012", "population": 30, "NAME10": "Block 2012", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 16253, "AWATER10": 0, "INTPTLAT10": "+37.8937801", "INTPTLON10": "-122.2878360" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.288239, 37.894736 ], [ -122.287359, 37.894719 ], [ -122.287445, 37.892822 ], [ -122.288325, 37.892873 ], [ -122.288239, 37.894736 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420100", "BLOCKCE10": "2011", "population": 11, "NAME10": "Block 2011", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 4556, "AWATER10": 0, "INTPTLAT10": "+37.8937317", "INTPTLON10": "-122.2872753" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.287145, 37.894719 ], [ -122.287188, 37.892822 ], [ -122.287445, 37.892822 ], [ -122.287359, 37.894719 ], [ -122.287145, 37.894719 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420200", "BLOCKCE10": "3012", "NAME10": "Block 3012", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 636, "AWATER10": 0, "INTPTLAT10": "+37.8920512", "INTPTLON10": "-122.2995612" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.299590, 37.892314 ], [ -122.299418, 37.891823 ], [ -122.299547, 37.891806 ], [ -122.299719, 37.892297 ], [ -122.299590, 37.892314 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420200", "BLOCKCE10": "3010", "population": 30, "NAME10": "Block 3010", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 14291, "AWATER10": 0, "INTPTLAT10": "+37.8911018", "INTPTLON10": "-122.2987261" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.298560, 37.891992 ], [ -122.298045, 37.890333 ], [ -122.298946, 37.890282 ], [ -122.299418, 37.891823 ], [ -122.298560, 37.891992 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420200", "BLOCKCE10": "3011", "NAME10": "Block 3011", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 1922, "AWATER10": 0, "INTPTLAT10": "+37.8910433", "INTPTLON10": "-122.2992359" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.299418, 37.891823 ], [ -122.298946, 37.890282 ], [ -122.299054, 37.890265 ], [ -122.299461, 37.891501 ], [ -122.299547, 37.891806 ], [ -122.299418, 37.891823 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420300", "BLOCKCE10": "1013", "population": 4, "NAME10": "Block 1013", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 568, "AWATER10": 0, "INTPTLAT10": "+37.8901726", "INTPTLON10": "-122.2994482" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.299054, 37.890265 ], [ -122.299032, 37.890197 ], [ -122.299290, 37.890180 ], [ -122.299912, 37.890079 ], [ -122.299933, 37.890130 ], [ -122.299311, 37.890248 ], [ -122.299054, 37.890265 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420500", "BLOCKCE10": "1005", "NAME10": "Block 1005", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 627, "AWATER10": 0, "INTPTLAT10": "+37.8902672", "INTPTLON10": "-122.2984664" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.298045, 37.890333 ], [ -122.298024, 37.890265 ], [ -122.298925, 37.890214 ], [ -122.298946, 37.890282 ], [ -122.298517, 37.890316 ], [ -122.298045, 37.890333 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420200", "BLOCKCE10": "3009", "population": 84, "NAME10": "Block 3009", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 15100, "AWATER10": 0, "INTPTLAT10": "+37.8912058", "INTPTLON10": "-122.2978563" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.297745, 37.892179 ], [ -122.297144, 37.890367 ], [ -122.298045, 37.890333 ], [ -122.298152, 37.890655 ], [ -122.298560, 37.891992 ], [ -122.297745, 37.892179 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420500", "BLOCKCE10": "1004", "NAME10": "Block 1004", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 521, "AWATER10": 0, "INTPTLAT10": "+37.8903091", "INTPTLON10": "-122.2975987" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.297144, 37.890367 ], [ -122.297144, 37.890316 ], [ -122.298024, 37.890265 ], [ -122.298045, 37.890333 ], [ -122.297144, 37.890367 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420300", "BLOCKCE10": "1014", "population": 43, "NAME10": "Block 1014", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 21543, "AWATER10": 0, "INTPTLAT10": "+37.8889340", "INTPTLON10": "-122.2990835" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.299032, 37.890197 ], [ -122.298260, 37.887759 ], [ -122.299182, 37.887742 ], [ -122.299912, 37.890079 ], [ -122.299290, 37.890180 ], [ -122.299032, 37.890197 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420500", "BLOCKCE10": "1008", "NAME10": "Block 1008", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 3061, "AWATER10": 0, "INTPTLAT10": "+37.8890168", "INTPTLON10": "-122.2985896" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.298946, 37.890282 ], [ -122.298131, 37.887776 ], [ -122.298260, 37.887759 ], [ -122.299054, 37.890265 ], [ -122.298946, 37.890282 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420500", "BLOCKCE10": "1007", "population": 70, "NAME10": "Block 1007", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 32096, "AWATER10": 0, "INTPTLAT10": "+37.8884580", "INTPTLON10": "-122.2979153" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.298024, 37.890265 ], [ -122.297809, 37.889622 ], [ -122.296929, 37.886878 ], [ -122.297552, 37.886760 ], [ -122.297788, 37.886743 ], [ -122.297766, 37.886675 ], [ -122.297916, 37.886692 ], [ -122.298260, 37.887759 ], [ -122.298131, 37.887776 ], [ -122.298925, 37.890214 ], [ -122.298024, 37.890265 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420200", "BLOCKCE10": "3008", "population": 51, "NAME10": "Block 3008", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 16353, "AWATER10": 0, "INTPTLAT10": "+37.8913200", "INTPTLON10": "-122.2970017" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.296908, 37.892348 ], [ -122.296264, 37.890417 ], [ -122.297144, 37.890367 ], [ -122.297273, 37.890739 ], [ -122.297745, 37.892179 ], [ -122.296908, 37.892348 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420200", "BLOCKCE10": "2012", "population": 51, "NAME10": "Block 2012", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 17230, "AWATER10": 0, "INTPTLAT10": "+37.8914257", "INTPTLON10": "-122.2961445" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.296071, 37.892517 ], [ -122.295406, 37.890468 ], [ -122.296264, 37.890417 ], [ -122.296908, 37.892348 ], [ -122.296071, 37.892517 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420500", "BLOCKCE10": "1003", "NAME10": "Block 1003", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 422, "AWATER10": 0, "INTPTLAT10": "+37.8903581", "INTPTLON10": "-122.2966969" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.296264, 37.890417 ], [ -122.296264, 37.890367 ], [ -122.297144, 37.890316 ], [ -122.297144, 37.890367 ], [ -122.296972, 37.890384 ], [ -122.296264, 37.890417 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420500", "BLOCKCE10": "1002", "NAME10": "Block 1002", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 411, "AWATER10": 0, "INTPTLAT10": "+37.8904111", "INTPTLON10": "-122.2958187" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.295406, 37.890468 ], [ -122.295384, 37.890434 ], [ -122.296264, 37.890367 ], [ -122.296264, 37.890417 ], [ -122.295578, 37.890468 ], [ -122.295406, 37.890468 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420200", "BLOCKCE10": "2008", "population": 50, "NAME10": "Block 2008", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 18377, "AWATER10": 0, "INTPTLAT10": "+37.8915386", "INTPTLON10": "-122.2952863" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.295234, 37.892687 ], [ -122.294505, 37.890519 ], [ -122.295406, 37.890468 ], [ -122.296071, 37.892517 ], [ -122.295234, 37.892687 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420200", "BLOCKCE10": "2009", "population": 57, "NAME10": "Block 2009", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 19818, "AWATER10": 0, "INTPTLAT10": "+37.8916581", "INTPTLON10": "-122.2944181" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.294354, 37.892856 ], [ -122.293625, 37.890570 ], [ -122.294505, 37.890519 ], [ -122.295234, 37.892687 ], [ -122.294354, 37.892856 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420500", "BLOCKCE10": "1001", "NAME10": "Block 1001", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 419, "AWATER10": 0, "INTPTLAT10": "+37.8904693", "INTPTLON10": "-122.2949399" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.294505, 37.890519 ], [ -122.294505, 37.890485 ], [ -122.295384, 37.890434 ], [ -122.295406, 37.890468 ], [ -122.294698, 37.890519 ], [ -122.294505, 37.890519 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420500", "BLOCKCE10": "1015", "population": 83, "NAME10": "Block 1015", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 29154, "AWATER10": 0, "INTPTLAT10": "+37.8886165", "INTPTLON10": "-122.2970361" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.297144, 37.890316 ], [ -122.296093, 37.887064 ], [ -122.296929, 37.886878 ], [ -122.298024, 37.890265 ], [ -122.297144, 37.890316 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420500", "BLOCKCE10": "1014", "population": 69, "NAME10": "Block 1014", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 28068, "AWATER10": 0, "INTPTLAT10": "+37.8887349", "INTPTLON10": "-122.2961756" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.296264, 37.890367 ], [ -122.295234, 37.887234 ], [ -122.296093, 37.887064 ], [ -122.297144, 37.890316 ], [ -122.296264, 37.890367 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420500", "BLOCKCE10": "1010", "population": 33, "NAME10": "Block 1010", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 26672, "AWATER10": 0, "INTPTLAT10": "+37.8888488", "INTPTLON10": "-122.2953196" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.295384, 37.890434 ], [ -122.294419, 37.887386 ], [ -122.295234, 37.887234 ], [ -122.296264, 37.890367 ], [ -122.295384, 37.890434 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420500", "BLOCKCE10": "1011", "population": 68, "NAME10": "Block 1011", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 26518, "AWATER10": 0, "INTPTLAT10": "+37.8889300", "INTPTLON10": "-122.2944569" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.294505, 37.890485 ], [ -122.293561, 37.887505 ], [ -122.294397, 37.887318 ], [ -122.295384, 37.890434 ], [ -122.294505, 37.890485 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420400", "BLOCKCE10": "1000", "NAME10": "Block 1000", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 11282, "AWATER10": 0, "INTPTLAT10": "+37.8873799", "INTPTLON10": "-122.2988707" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.298260, 37.887759 ], [ -122.297916, 37.886692 ], [ -122.298152, 37.886743 ], [ -122.298410, 37.886844 ], [ -122.299311, 37.887352 ], [ -122.299569, 37.887471 ], [ -122.300169, 37.887606 ], [ -122.300577, 37.887623 ], [ -122.300684, 37.887657 ], [ -122.300963, 37.887657 ], [ -122.300684, 37.887742 ], [ -122.300062, 37.887725 ], [ -122.298260, 37.887759 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420400", "BLOCKCE10": "1015", "NAME10": "Block 1015", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 79019, "AWATER10": 0, "INTPTLAT10": "+37.8858279", "INTPTLON10": "-122.2991231" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.300684, 37.887657 ], [ -122.300577, 37.887623 ], [ -122.300169, 37.887606 ], [ -122.299569, 37.887471 ], [ -122.299311, 37.887352 ], [ -122.298410, 37.886844 ], [ -122.298152, 37.886743 ], [ -122.297916, 37.886692 ], [ -122.297251, 37.884592 ], [ -122.299912, 37.884067 ], [ -122.299933, 37.884440 ], [ -122.300127, 37.885117 ], [ -122.300963, 37.887657 ], [ -122.300684, 37.887657 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420500", "BLOCKCE10": "1017", "NAME10": "Block 1017", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 621, "AWATER10": 0, "INTPTLAT10": "+37.8867580", "INTPTLON10": "-122.2973472" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.296929, 37.886878 ], [ -122.296908, 37.886827 ], [ -122.297616, 37.886675 ], [ -122.297766, 37.886675 ], [ -122.297788, 37.886743 ], [ -122.297552, 37.886760 ], [ -122.296929, 37.886878 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420400", "BLOCKCE10": "1018", "population": 1, "NAME10": "Block 1018", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 22069, "AWATER10": 0, "INTPTLAT10": "+37.8835790", "INTPTLON10": "-122.2990681" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.298281, 37.884389 ], [ -122.298110, 37.883779 ], [ -122.298088, 37.883474 ], [ -122.298002, 37.883254 ], [ -122.298989, 37.883017 ], [ -122.300212, 37.882881 ], [ -122.300255, 37.883034 ], [ -122.300298, 37.883220 ], [ -122.300234, 37.883220 ], [ -122.300019, 37.883389 ], [ -122.299826, 37.883881 ], [ -122.299805, 37.884084 ], [ -122.298281, 37.884389 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420500", "BLOCKCE10": "2007", "NAME10": "Block 2007", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 2761, "AWATER10": 0, "INTPTLAT10": "+37.8856449", "INTPTLON10": "-122.2975097" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.297916, 37.886692 ], [ -122.297766, 37.886675 ], [ -122.297122, 37.884626 ], [ -122.297251, 37.884592 ], [ -122.297916, 37.886692 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420400", "BLOCKCE10": "1019", "NAME10": "Block 1019", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 11921, "AWATER10": 0, "INTPTLAT10": "+37.8839314", "INTPTLON10": "-122.2976037" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.297251, 37.884592 ], [ -122.296908, 37.883508 ], [ -122.297122, 37.883491 ], [ -122.297766, 37.883356 ], [ -122.298002, 37.883254 ], [ -122.298088, 37.883474 ], [ -122.298110, 37.883779 ], [ -122.298281, 37.884389 ], [ -122.297251, 37.884592 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420500", "BLOCKCE10": "1016", "NAME10": "Block 1016", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 614, "AWATER10": 0, "INTPTLAT10": "+37.8869296", "INTPTLON10": "-122.2964871" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.296093, 37.887064 ], [ -122.296071, 37.886980 ], [ -122.296908, 37.886827 ], [ -122.296929, 37.886878 ], [ -122.296093, 37.887064 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420500", "BLOCKCE10": "1013", "NAME10": "Block 1013", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 616, "AWATER10": 0, "INTPTLAT10": "+37.8870993", "INTPTLON10": "-122.2956428" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.295234, 37.887234 ], [ -122.295213, 37.887166 ], [ -122.296071, 37.886980 ], [ -122.296093, 37.887064 ], [ -122.295234, 37.887234 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420500", "BLOCKCE10": "1012", "NAME10": "Block 1012", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 615, "AWATER10": 0, "INTPTLAT10": "+37.8872675", "INTPTLON10": "-122.2948079" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.294419, 37.887386 ], [ -122.294397, 37.887318 ], [ -122.295213, 37.887166 ], [ -122.295234, 37.887234 ], [ -122.294419, 37.887386 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420500", "BLOCKCE10": "2003", "population": 58, "NAME10": "Block 2003", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 24754, "AWATER10": 0, "INTPTLAT10": "+37.8858112", "INTPTLON10": "-122.2943382" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.294397, 37.887318 ], [ -122.293475, 37.884507 ], [ -122.294333, 37.884321 ], [ -122.295213, 37.887166 ], [ -122.294397, 37.887318 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420500", "BLOCKCE10": "2006", "population": 91, "NAME10": "Block 2006", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 25305, "AWATER10": 0, "INTPTLAT10": "+37.8853070", "INTPTLON10": "-122.2968750" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.296908, 37.886827 ], [ -122.295985, 37.883999 ], [ -122.296865, 37.883830 ], [ -122.297766, 37.886675 ], [ -122.297616, 37.886675 ], [ -122.296908, 37.886827 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420500", "BLOCKCE10": "2005", "population": 98, "NAME10": "Block 2005", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 24545, "AWATER10": 0, "INTPTLAT10": "+37.8854914", "INTPTLON10": "-122.2960301" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.296071, 37.886980 ], [ -122.295170, 37.884169 ], [ -122.295985, 37.883999 ], [ -122.296908, 37.886827 ], [ -122.296071, 37.886980 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420500", "BLOCKCE10": "2008", "NAME10": "Block 2008", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 1060, "AWATER10": 0, "INTPTLAT10": "+37.8841984", "INTPTLON10": "-122.2970500" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.297122, 37.884626 ], [ -122.296865, 37.883830 ], [ -122.296994, 37.883796 ], [ -122.297251, 37.884592 ], [ -122.297122, 37.884626 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420500", "BLOCKCE10": "2009", "NAME10": "Block 2009", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 410, "AWATER10": 0, "INTPTLAT10": "+37.8836558", "INTPTLON10": "-122.2968731" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.296865, 37.883830 ], [ -122.296758, 37.883525 ], [ -122.296908, 37.883508 ], [ -122.296994, 37.883796 ], [ -122.296865, 37.883830 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420500", "BLOCKCE10": "2004", "population": 63, "NAME10": "Block 2004", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 24848, "AWATER10": 0, "INTPTLAT10": "+37.8856461", "INTPTLON10": "-122.2951842" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.295213, 37.887166 ], [ -122.294333, 37.884321 ], [ -122.295170, 37.884169 ], [ -122.296071, 37.886980 ], [ -122.295213, 37.887166 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420500", "BLOCKCE10": "2012", "population": 35, "NAME10": "Block 2012", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 12579, "AWATER10": 0, "INTPTLAT10": "+37.8835272", "INTPTLON10": "-122.2945038" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.294333, 37.884321 ], [ -122.293861, 37.882949 ], [ -122.294011, 37.882915 ], [ -122.294376, 37.882763 ], [ -122.294719, 37.882780 ], [ -122.295170, 37.884169 ], [ -122.294333, 37.884321 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420200", "BLOCKCE10": "2010", "NAME10": "Block 2010", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 8445, "AWATER10": 0, "INTPTLAT10": "+37.8914852", "INTPTLON10": "-122.2936957" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.294118, 37.892856 ], [ -122.293839, 37.891992 ], [ -122.293153, 37.891027 ], [ -122.293174, 37.890587 ], [ -122.293625, 37.890570 ], [ -122.294354, 37.892856 ], [ -122.294118, 37.892856 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420100", "BLOCKCE10": "1017", "population": 22, "NAME10": "Block 1017", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 10769, "AWATER10": 0, "INTPTLAT10": "+37.8921881", "INTPTLON10": "-122.2934770" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.294118, 37.892856 ], [ -122.293088, 37.892839 ], [ -122.293153, 37.891027 ], [ -122.293839, 37.891992 ], [ -122.294118, 37.892856 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420100", "BLOCKCE10": "1018", "NAME10": "Block 1018", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 4538, "AWATER10": 0, "INTPTLAT10": "+37.8918502", "INTPTLON10": "-122.2929851" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.293046, 37.892839 ], [ -122.292831, 37.892822 ], [ -122.292917, 37.890722 ], [ -122.293153, 37.891027 ], [ -122.293088, 37.892839 ], [ -122.293046, 37.892839 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420500", "BLOCKCE10": "1000", "NAME10": "Block 1000", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 367, "AWATER10": 0, "INTPTLAT10": "+37.8905130", "INTPTLON10": "-122.2941122" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.293754, 37.890570 ], [ -122.293711, 37.890519 ], [ -122.294505, 37.890485 ], [ -122.294505, 37.890519 ], [ -122.294397, 37.890536 ], [ -122.293754, 37.890570 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420200", "BLOCKCE10": "2011", "NAME10": "Block 2011", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 700, "AWATER10": 0, "INTPTLAT10": "+37.8907452", "INTPTLON10": "-122.2930474" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.293153, 37.891027 ], [ -122.292917, 37.890722 ], [ -122.292895, 37.890604 ], [ -122.293174, 37.890587 ], [ -122.293153, 37.891027 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "3005", "NAME10": "Block 3005", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 349, "AWATER10": 0, "INTPTLAT10": "+37.8905539", "INTPTLON10": "-122.2932516" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.292895, 37.890604 ], [ -122.292895, 37.890553 ], [ -122.293389, 37.890536 ], [ -122.293625, 37.890519 ], [ -122.293625, 37.890570 ], [ -122.292895, 37.890604 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420100", "BLOCKCE10": "1019", "population": 42, "NAME10": "Block 1019", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 20486, "AWATER10": 0, "INTPTLAT10": "+37.8917135", "INTPTLON10": "-122.2923947" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.291887, 37.892822 ], [ -122.291951, 37.891078 ], [ -122.291930, 37.890655 ], [ -122.292895, 37.890604 ], [ -122.292917, 37.891146 ], [ -122.292831, 37.892822 ], [ -122.291887, 37.892822 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "3004", "NAME10": "Block 3004", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 428, "AWATER10": 0, "INTPTLAT10": "+37.8905994", "INTPTLON10": "-122.2924155" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.291930, 37.890655 ], [ -122.291908, 37.890621 ], [ -122.292895, 37.890553 ], [ -122.292895, 37.890604 ], [ -122.292702, 37.890621 ], [ -122.291930, 37.890655 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420500", "BLOCKCE10": "1006", "population": 49, "NAME10": "Block 1006", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 25175, "AWATER10": 0, "INTPTLAT10": "+37.8890495", "INTPTLON10": "-122.2935928" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.293711, 37.890519 ], [ -122.293625, 37.890417 ], [ -122.293561, 37.890316 ], [ -122.292724, 37.887742 ], [ -122.292702, 37.887657 ], [ -122.293582, 37.887640 ], [ -122.293561, 37.887505 ], [ -122.294505, 37.890485 ], [ -122.293711, 37.890519 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420500", "BLOCKCE10": "1009", "NAME10": "Block 1009", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 5818, "AWATER10": 0, "INTPTLAT10": "+37.8888891", "INTPTLON10": "-122.2929659" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.293561, 37.890316 ], [ -122.293131, 37.889825 ], [ -122.292466, 37.887708 ], [ -122.292702, 37.887657 ], [ -122.292724, 37.887742 ], [ -122.293561, 37.890316 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "3006", "population": 17, "NAME10": "Block 3006", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 11825, "AWATER10": 0, "INTPTLAT10": "+37.8893267", "INTPTLON10": "-122.2928119" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.293625, 37.890570 ], [ -122.293625, 37.890519 ], [ -122.292895, 37.890553 ], [ -122.292809, 37.890028 ], [ -122.292144, 37.887860 ], [ -122.292488, 37.887776 ], [ -122.293131, 37.889825 ], [ -122.293711, 37.890519 ], [ -122.293754, 37.890570 ], [ -122.293625, 37.890570 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "3007", "population": 55, "NAME10": "Block 3007", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 27950, "AWATER10": 0, "INTPTLAT10": "+37.8892518", "INTPTLON10": "-122.2920141" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.291908, 37.890621 ], [ -122.291093, 37.888064 ], [ -122.292144, 37.887860 ], [ -122.292809, 37.890028 ], [ -122.292895, 37.890553 ], [ -122.291908, 37.890621 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "3008", "NAME10": "Block 3008", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 783, "AWATER10": 0, "INTPTLAT10": "+37.8879165", "INTPTLON10": "-122.2915924" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.291093, 37.888064 ], [ -122.291071, 37.887996 ], [ -122.292123, 37.887793 ], [ -122.292144, 37.887860 ], [ -122.291093, 37.888064 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420100", "BLOCKCE10": "3002", "population": 38, "NAME10": "Block 3002", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 19544, "AWATER10": 0, "INTPTLAT10": "+37.8918042", "INTPTLON10": "-122.2914745" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.291887, 37.892974 ], [ -122.290986, 37.892941 ], [ -122.291028, 37.892483 ], [ -122.291071, 37.890705 ], [ -122.291930, 37.890655 ], [ -122.291951, 37.891078 ], [ -122.291887, 37.892974 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420100", "BLOCKCE10": "3003", "population": 32, "NAME10": "Block 3003", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 18064, "AWATER10": 0, "INTPTLAT10": "+37.8918237", "INTPTLON10": "-122.2906157" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.290986, 37.892941 ], [ -122.290149, 37.892907 ], [ -122.290256, 37.890739 ], [ -122.291071, 37.890705 ], [ -122.291028, 37.892483 ], [ -122.290986, 37.892941 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "3003", "NAME10": "Block 3003", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 344, "AWATER10": 0, "INTPTLAT10": "+37.8906459", "INTPTLON10": "-122.2914849" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.291071, 37.890705 ], [ -122.291071, 37.890655 ], [ -122.291908, 37.890621 ], [ -122.291930, 37.890655 ], [ -122.291071, 37.890705 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420100", "BLOCKCE10": "3004", "population": 41, "NAME10": "Block 3004", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 18095, "AWATER10": 0, "INTPTLAT10": "+37.8918241", "INTPTLON10": "-122.2897641" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.290149, 37.892907 ], [ -122.289290, 37.892890 ], [ -122.289398, 37.890790 ], [ -122.290256, 37.890739 ], [ -122.290149, 37.892907 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420100", "BLOCKCE10": "3005", "population": 29, "NAME10": "Block 3005", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 16537, "AWATER10": 0, "INTPTLAT10": "+37.8919062", "INTPTLON10": "-122.2889102" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.289290, 37.892890 ], [ -122.288411, 37.892873 ], [ -122.288475, 37.891484 ], [ -122.288797, 37.891078 ], [ -122.288861, 37.890824 ], [ -122.289398, 37.890790 ], [ -122.289290, 37.892890 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "3002", "population": 82, "NAME10": "Block 3002", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 26786, "AWATER10": 0, "INTPTLAT10": "+37.8894113", "INTPTLON10": "-122.2909643" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.290792, 37.890722 ], [ -122.290084, 37.888267 ], [ -122.291093, 37.888064 ], [ -122.291908, 37.890621 ], [ -122.291071, 37.890655 ], [ -122.291071, 37.890705 ], [ -122.290792, 37.890722 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "3009", "NAME10": "Block 3009", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 746, "AWATER10": 0, "INTPTLAT10": "+37.8881229", "INTPTLON10": "-122.2905730" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.290084, 37.888267 ], [ -122.290063, 37.888199 ], [ -122.291071, 37.887996 ], [ -122.291093, 37.888064 ], [ -122.290084, 37.888267 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "3001", "population": 34, "NAME10": "Block 3001", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 22452, "AWATER10": 0, "INTPTLAT10": "+37.8895187", "INTPTLON10": "-122.2899595" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.289891, 37.890756 ], [ -122.289119, 37.888470 ], [ -122.290084, 37.888267 ], [ -122.290792, 37.890722 ], [ -122.289891, 37.890756 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "3000", "population": 47, "NAME10": "Block 3000", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 21823, "AWATER10": 0, "INTPTLAT10": "+37.8896695", "INTPTLON10": "-122.2890200" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.288861, 37.890824 ], [ -122.288861, 37.890688 ], [ -122.288239, 37.888860 ], [ -122.288239, 37.888656 ], [ -122.289119, 37.888470 ], [ -122.289891, 37.890722 ], [ -122.289891, 37.890756 ], [ -122.288861, 37.890824 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "3010", "NAME10": "Block 3010", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 689, "AWATER10": 0, "INTPTLAT10": "+37.8883258", "INTPTLON10": "-122.2895731" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.289119, 37.888470 ], [ -122.289097, 37.888402 ], [ -122.290063, 37.888199 ], [ -122.290084, 37.888267 ], [ -122.289119, 37.888470 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420500", "BLOCKCE10": "2002", "population": 60, "NAME10": "Block 2002", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 24228, "AWATER10": 0, "INTPTLAT10": "+37.8859970", "INTPTLON10": "-122.2935084" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.293561, 37.887505 ], [ -122.292638, 37.884677 ], [ -122.293475, 37.884507 ], [ -122.294397, 37.887318 ], [ -122.293561, 37.887505 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "3016", "NAME10": "Block 3016", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 253, "AWATER10": 0, "INTPTLAT10": "+37.8877763", "INTPTLON10": "-122.2922894" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.292144, 37.887860 ], [ -122.292123, 37.887793 ], [ -122.292466, 37.887708 ], [ -122.292488, 37.887776 ], [ -122.292144, 37.887860 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420500", "BLOCKCE10": "2001", "population": 58, "NAME10": "Block 2001", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 26078, "AWATER10": 0, "INTPTLAT10": "+37.8861973", "INTPTLON10": "-122.2926742" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.292702, 37.887657 ], [ -122.291780, 37.884863 ], [ -122.292638, 37.884677 ], [ -122.293561, 37.887505 ], [ -122.293582, 37.887640 ], [ -122.292702, 37.887657 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420500", "BLOCKCE10": "2000", "NAME10": "Block 2000", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 6434, "AWATER10": 0, "INTPTLAT10": "+37.8862789", "INTPTLON10": "-122.2921162" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.292466, 37.887708 ], [ -122.291694, 37.885286 ], [ -122.291522, 37.884914 ], [ -122.291715, 37.884863 ], [ -122.291780, 37.884863 ], [ -122.292702, 37.887657 ], [ -122.292466, 37.887708 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "3015", "population": 15, "NAME10": "Block 3015", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 10776, "AWATER10": 0, "INTPTLAT10": "+37.8863229", "INTPTLON10": "-122.2918172" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.292123, 37.887793 ], [ -122.291179, 37.884981 ], [ -122.291522, 37.884914 ], [ -122.291694, 37.885286 ], [ -122.292466, 37.887708 ], [ -122.292123, 37.887793 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420500", "BLOCKCE10": "2013", "population": 33, "NAME10": "Block 2013", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 12945, "AWATER10": 0, "INTPTLAT10": "+37.8836932", "INTPTLON10": "-122.2936333" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.293475, 37.884507 ], [ -122.293367, 37.884202 ], [ -122.292960, 37.883034 ], [ -122.293131, 37.883000 ], [ -122.293861, 37.882949 ], [ -122.294333, 37.884321 ], [ -122.293475, 37.884507 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420500", "BLOCKCE10": "2014", "population": 40, "NAME10": "Block 2014", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 13013, "AWATER10": 0, "INTPTLAT10": "+37.8838362", "INTPTLON10": "-122.2927774" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.292638, 37.884677 ], [ -122.292552, 37.884389 ], [ -122.292080, 37.883135 ], [ -122.292488, 37.883135 ], [ -122.292960, 37.883034 ], [ -122.293475, 37.884507 ], [ -122.292638, 37.884677 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420500", "BLOCKCE10": "2015", "population": 30, "NAME10": "Block 2015", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 13985, "AWATER10": 0, "INTPTLAT10": "+37.8839739", "INTPTLON10": "-122.2919263" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.291780, 37.884863 ], [ -122.291265, 37.883237 ], [ -122.292080, 37.883135 ], [ -122.292638, 37.884677 ], [ -122.291780, 37.884863 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "3014", "population": 66, "NAME10": "Block 3014", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 29422, "AWATER10": 0, "INTPTLAT10": "+37.8864950", "INTPTLON10": "-122.2911376" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.291071, 37.887996 ], [ -122.290363, 37.885693 ], [ -122.290170, 37.885219 ], [ -122.291179, 37.884981 ], [ -122.292123, 37.887793 ], [ -122.291071, 37.887996 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "3012", "population": 33, "NAME10": "Block 3012", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 20277, "AWATER10": 0, "INTPTLAT10": "+37.8875706", "INTPTLON10": "-122.2892190" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.288303, 37.888572 ], [ -122.289333, 37.885981 ], [ -122.290063, 37.888199 ], [ -122.288303, 37.888572 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "3013", "population": 60, "NAME10": "Block 3013", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 31172, "AWATER10": 0, "INTPTLAT10": "+37.8866087", "INTPTLON10": "-122.2901174" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.290063, 37.888199 ], [ -122.289333, 37.885981 ], [ -122.289848, 37.884507 ], [ -122.290041, 37.884897 ], [ -122.290363, 37.885693 ], [ -122.291071, 37.887996 ], [ -122.290063, 37.888199 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "3017", "population": 12, "NAME10": "Block 3017", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 6343, "AWATER10": 0, "INTPTLAT10": "+37.8840797", "INTPTLON10": "-122.2909809" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.291179, 37.884981 ], [ -122.290943, 37.884372 ], [ -122.290385, 37.883220 ], [ -122.290835, 37.883322 ], [ -122.291157, 37.883999 ], [ -122.291522, 37.884914 ], [ -122.291179, 37.884981 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420500", "BLOCKCE10": "2016", "NAME10": "Block 2016", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 5264, "AWATER10": 0, "INTPTLAT10": "+37.8839955", "INTPTLON10": "-122.2913154" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.291522, 37.884914 ], [ -122.291372, 37.884490 ], [ -122.290835, 37.883322 ], [ -122.291071, 37.883254 ], [ -122.291265, 37.883237 ], [ -122.291780, 37.884863 ], [ -122.291522, 37.884914 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "3018", "population": 32, "NAME10": "Block 3018", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 14557, "AWATER10": 0, "INTPTLAT10": "+37.8843696", "INTPTLON10": "-122.2904413" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.290170, 37.885219 ], [ -122.289848, 37.884507 ], [ -122.290170, 37.883576 ], [ -122.290299, 37.883034 ], [ -122.290320, 37.883203 ], [ -122.290385, 37.883220 ], [ -122.290943, 37.884372 ], [ -122.291179, 37.884981 ], [ -122.290170, 37.885219 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "2016", "NAME10": "Block 2016", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 1094, "AWATER10": 0, "INTPTLAT10": "+37.8853992", "INTPTLON10": "-122.2894711" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.289333, 37.885981 ], [ -122.289269, 37.885862 ], [ -122.289612, 37.884880 ], [ -122.289720, 37.884897 ], [ -122.289333, 37.885981 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "1023", "population": 41, "NAME10": "Block 1023", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 15260, "AWATER10": 0, "INTPTLAT10": "+37.8840099", "INTPTLON10": "-122.2895305" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.289720, 37.884897 ], [ -122.288754, 37.884694 ], [ -122.289312, 37.883288 ], [ -122.289355, 37.883305 ], [ -122.289526, 37.883271 ], [ -122.289762, 37.883186 ], [ -122.289977, 37.883152 ], [ -122.290106, 37.883169 ], [ -122.290256, 37.883186 ], [ -122.290170, 37.883576 ], [ -122.289720, 37.884897 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420500", "BLOCKCE10": "2010", "population": 24, "NAME10": "Block 2010", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 6161, "AWATER10": 0, "INTPTLAT10": "+37.8835363", "INTPTLON10": "-122.2962204" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.295985, 37.883999 ], [ -122.295706, 37.883017 ], [ -122.296093, 37.883068 ], [ -122.296243, 37.883186 ], [ -122.296371, 37.883339 ], [ -122.296715, 37.883525 ], [ -122.296758, 37.883525 ], [ -122.296865, 37.883830 ], [ -122.295985, 37.883999 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420500", "BLOCKCE10": "2011", "population": 33, "NAME10": "Block 2011", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 10125, "AWATER10": 0, "INTPTLAT10": "+37.8834818", "INTPTLON10": "-122.2953591" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.295170, 37.884169 ], [ -122.294719, 37.882780 ], [ -122.295449, 37.882983 ], [ -122.295706, 37.883017 ], [ -122.295985, 37.883999 ], [ -122.295170, 37.884169 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420100", "BLOCKCE10": "3006", "NAME10": "Block 3006", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 1509, "AWATER10": 0, "INTPTLAT10": "+37.8926066", "INTPTLON10": "-122.2883829" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.288325, 37.892873 ], [ -122.288411, 37.891484 ], [ -122.288496, 37.891332 ], [ -122.288754, 37.891027 ], [ -122.288775, 37.890824 ], [ -122.288861, 37.890824 ], [ -122.288797, 37.891078 ], [ -122.288475, 37.891484 ], [ -122.288411, 37.892873 ], [ -122.288325, 37.892873 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420100", "BLOCKCE10": "3007", "population": 28, "NAME10": "Block 3007", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 18637, "AWATER10": 0, "INTPTLAT10": "+37.8917853", "INTPTLON10": "-122.2879697" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.288325, 37.892873 ], [ -122.287445, 37.892822 ], [ -122.287531, 37.890892 ], [ -122.288775, 37.890824 ], [ -122.288754, 37.891027 ], [ -122.288496, 37.891332 ], [ -122.288411, 37.891484 ], [ -122.288325, 37.892873 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "2003", "NAME10": "Block 2003", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 446, "AWATER10": 0, "INTPTLAT10": "+37.8908208", "INTPTLON10": "-122.2882377" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.287724, 37.890875 ], [ -122.287703, 37.890841 ], [ -122.288775, 37.890773 ], [ -122.288775, 37.890824 ], [ -122.287939, 37.890875 ], [ -122.287724, 37.890875 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420100", "BLOCKCE10": "3008", "population": 12, "NAME10": "Block 3008", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 5620, "AWATER10": 0, "INTPTLAT10": "+37.8918093", "INTPTLON10": "-122.2873239" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.287188, 37.892822 ], [ -122.287188, 37.890926 ], [ -122.287531, 37.890892 ], [ -122.287467, 37.892433 ], [ -122.287445, 37.892822 ], [ -122.287188, 37.892822 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "2017", "NAME10": "Block 2017", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 379, "AWATER10": 0, "INTPTLAT10": "+37.8908918", "INTPTLON10": "-122.2870824" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.286651, 37.890942 ], [ -122.286651, 37.890909 ], [ -122.287531, 37.890841 ], [ -122.287531, 37.890892 ], [ -122.287188, 37.890926 ], [ -122.286651, 37.890942 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "2000", "NAME10": "Block 2000", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 375, "AWATER10": 0, "INTPTLAT10": "+37.8909521", "INTPTLON10": "-122.2861793" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.285707, 37.891010 ], [ -122.285686, 37.890976 ], [ -122.286651, 37.890909 ], [ -122.286651, 37.890942 ], [ -122.286458, 37.890959 ], [ -122.285707, 37.891010 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "2004", "NAME10": "Block 2004", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 1970, "AWATER10": 0, "INTPTLAT10": "+37.8896802", "INTPTLON10": "-122.2884737" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.288775, 37.890824 ], [ -122.288775, 37.890671 ], [ -122.288110, 37.888690 ], [ -122.288153, 37.888606 ], [ -122.288303, 37.888572 ], [ -122.288218, 37.888741 ], [ -122.288239, 37.888860 ], [ -122.288861, 37.890688 ], [ -122.288861, 37.890824 ], [ -122.288775, 37.890824 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "2005", "population": 54, "NAME10": "Block 2005", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 21301, "AWATER10": 0, "INTPTLAT10": "+37.8898284", "INTPTLON10": "-122.2879267" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.287703, 37.890841 ], [ -122.287102, 37.889080 ], [ -122.287381, 37.888944 ], [ -122.288110, 37.888690 ], [ -122.288775, 37.890671 ], [ -122.288775, 37.890773 ], [ -122.287703, 37.890841 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "3011", "NAME10": "Block 3011", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 598, "AWATER10": 0, "INTPTLAT10": "+37.8885114", "INTPTLON10": "-122.2886774" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.288239, 37.888656 ], [ -122.288303, 37.888572 ], [ -122.288926, 37.888436 ], [ -122.289097, 37.888402 ], [ -122.289119, 37.888470 ], [ -122.288239, 37.888656 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "2006", "NAME10": "Block 2006", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 812, "AWATER10": 0, "INTPTLAT10": "+37.8888233", "INTPTLON10": "-122.2875914" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.287102, 37.889080 ], [ -122.287080, 37.889012 ], [ -122.287316, 37.888893 ], [ -122.288153, 37.888606 ], [ -122.288110, 37.888690 ], [ -122.287381, 37.888944 ], [ -122.287102, 37.889080 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "2002", "population": 13, "NAME10": "Block 2002", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 16691, "AWATER10": 0, "INTPTLAT10": "+37.8900585", "INTPTLON10": "-122.2869139" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.286651, 37.890909 ], [ -122.286158, 37.889418 ], [ -122.286458, 37.889334 ], [ -122.287102, 37.889080 ], [ -122.287724, 37.890875 ], [ -122.287531, 37.890892 ], [ -122.287531, 37.890841 ], [ -122.286651, 37.890909 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "2007", "NAME10": "Block 2007", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 740, "AWATER10": 0, "INTPTLAT10": "+37.8892157", "INTPTLON10": "-122.2866157" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.286158, 37.889418 ], [ -122.286136, 37.889351 ], [ -122.286673, 37.889181 ], [ -122.287080, 37.889012 ], [ -122.287102, 37.889080 ], [ -122.286458, 37.889334 ], [ -122.286158, 37.889418 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "2010", "population": 27, "NAME10": "Block 2010", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 15494, "AWATER10": 0, "INTPTLAT10": "+37.8884410", "INTPTLON10": "-122.2866366" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.286136, 37.889351 ], [ -122.286050, 37.888995 ], [ -122.286050, 37.888555 ], [ -122.286394, 37.887606 ], [ -122.287488, 37.887877 ], [ -122.287273, 37.888216 ], [ -122.287080, 37.888826 ], [ -122.287080, 37.889012 ], [ -122.286673, 37.889181 ], [ -122.286136, 37.889351 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "2001", "population": 18, "NAME10": "Block 2001", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 14791, "AWATER10": 0, "INTPTLAT10": "+37.8902095", "INTPTLON10": "-122.2859011" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.285686, 37.890976 ], [ -122.285557, 37.890807 ], [ -122.285171, 37.889503 ], [ -122.285600, 37.889503 ], [ -122.286158, 37.889418 ], [ -122.286651, 37.890909 ], [ -122.285686, 37.890976 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "1002", "NAME10": "Block 1002", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 424, "AWATER10": 0, "INTPTLAT10": "+37.8910153", "INTPTLON10": "-122.2850935" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.284484, 37.891078 ], [ -122.284505, 37.891027 ], [ -122.285686, 37.890976 ], [ -122.285707, 37.891010 ], [ -122.284484, 37.891078 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "1003", "population": 27, "NAME10": "Block 1003", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 16431, "AWATER10": 0, "INTPTLAT10": "+37.8902144", "INTPTLON10": "-122.2848310" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.284505, 37.891027 ], [ -122.284527, 37.890926 ], [ -122.284484, 37.890671 ], [ -122.284398, 37.890485 ], [ -122.284033, 37.889317 ], [ -122.284741, 37.889486 ], [ -122.285171, 37.889503 ], [ -122.285557, 37.890807 ], [ -122.285686, 37.890976 ], [ -122.284505, 37.891027 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "1001", "NAME10": "Block 1001", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 394, "AWATER10": 0, "INTPTLAT10": "+37.8910689", "INTPTLON10": "-122.2839734" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.283497, 37.891129 ], [ -122.283497, 37.891078 ], [ -122.284505, 37.891027 ], [ -122.284484, 37.891078 ], [ -122.283497, 37.891129 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "1004", "population": 22, "NAME10": "Block 1004", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 19676, "AWATER10": 0, "INTPTLAT10": "+37.8901108", "INTPTLON10": "-122.2837239" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.283497, 37.891078 ], [ -122.282982, 37.889435 ], [ -122.282896, 37.889215 ], [ -122.282832, 37.889147 ], [ -122.283454, 37.889164 ], [ -122.284033, 37.889317 ], [ -122.284398, 37.890485 ], [ -122.284484, 37.890671 ], [ -122.284527, 37.890976 ], [ -122.284505, 37.891027 ], [ -122.283497, 37.891078 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "2008", "NAME10": "Block 2008", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 676, "AWATER10": 0, "INTPTLAT10": "+37.8894421", "INTPTLON10": "-122.2856518" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.285385, 37.889520 ], [ -122.285171, 37.889503 ], [ -122.285192, 37.889435 ], [ -122.285600, 37.889435 ], [ -122.286136, 37.889351 ], [ -122.286158, 37.889418 ], [ -122.286007, 37.889452 ], [ -122.285385, 37.889520 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "2009", "population": 34, "NAME10": "Block 2009", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 19896, "AWATER10": 0, "INTPTLAT10": "+37.8884164", "INTPTLON10": "-122.2856099" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.285385, 37.889452 ], [ -122.285192, 37.889435 ], [ -122.285085, 37.889130 ], [ -122.284999, 37.888639 ], [ -122.285042, 37.888250 ], [ -122.285149, 37.887894 ], [ -122.285385, 37.887386 ], [ -122.286394, 37.887606 ], [ -122.286050, 37.888555 ], [ -122.286050, 37.888995 ], [ -122.286136, 37.889351 ], [ -122.285385, 37.889452 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "1010", "population": 1, "NAME10": "Block 1010", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 1878, "AWATER10": 0, "INTPTLAT10": "+37.8889080", "INTPTLON10": "-122.2850205" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.285106, 37.889435 ], [ -122.284999, 37.889147 ], [ -122.284913, 37.888504 ], [ -122.284956, 37.888233 ], [ -122.285063, 37.887877 ], [ -122.285299, 37.887352 ], [ -122.285385, 37.887386 ], [ -122.285149, 37.887894 ], [ -122.284999, 37.888487 ], [ -122.285063, 37.889029 ], [ -122.285192, 37.889435 ], [ -122.285106, 37.889435 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "1008", "NAME10": "Block 1008", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 832, "AWATER10": 0, "INTPTLAT10": "+37.8893913", "INTPTLON10": "-122.2845906" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.285171, 37.889503 ], [ -122.284741, 37.889486 ], [ -122.284441, 37.889418 ], [ -122.284033, 37.889317 ], [ -122.284033, 37.889232 ], [ -122.284698, 37.889401 ], [ -122.285192, 37.889435 ], [ -122.285171, 37.889503 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "1007", "NAME10": "Block 1007", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 282, "AWATER10": 0, "INTPTLAT10": "+37.8892140", "INTPTLON10": "-122.2838288" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.284033, 37.889317 ], [ -122.283647, 37.889215 ], [ -122.283669, 37.889130 ], [ -122.284033, 37.889232 ], [ -122.284033, 37.889317 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "1009", "population": 36, "NAME10": "Block 1009", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 22493, "AWATER10": 0, "INTPTLAT10": "+37.8883323", "INTPTLON10": "-122.2844715" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.285106, 37.889435 ], [ -122.284698, 37.889401 ], [ -122.283690, 37.889147 ], [ -122.283669, 37.888961 ], [ -122.283711, 37.888775 ], [ -122.284334, 37.887149 ], [ -122.285299, 37.887352 ], [ -122.285063, 37.887877 ], [ -122.284956, 37.888233 ], [ -122.284913, 37.888504 ], [ -122.284999, 37.889147 ], [ -122.285106, 37.889435 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "1014", "population": 38, "NAME10": "Block 1014", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 22296, "AWATER10": 0, "INTPTLAT10": "+37.8880279", "INTPTLON10": "-122.2834249" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.283669, 37.889130 ], [ -122.283089, 37.889063 ], [ -122.282746, 37.889080 ], [ -122.282660, 37.888944 ], [ -122.282660, 37.888589 ], [ -122.283282, 37.886895 ], [ -122.283540, 37.886963 ], [ -122.284334, 37.887149 ], [ -122.283711, 37.888775 ], [ -122.283669, 37.889130 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "2012", "population": 1, "NAME10": "Block 2012", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 2533, "AWATER10": 0, "INTPTLAT10": "+37.8872385", "INTPTLON10": "-122.2887646" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.288153, 37.888606 ], [ -122.288325, 37.888284 ], [ -122.289269, 37.885862 ], [ -122.289333, 37.885981 ], [ -122.288303, 37.888572 ], [ -122.288153, 37.888606 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "2011", "population": 51, "NAME10": "Block 2011", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 36927, "AWATER10": 0, "INTPTLAT10": "+37.8868308", "INTPTLON10": "-122.2883823" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.287080, 37.889012 ], [ -122.287080, 37.888826 ], [ -122.287273, 37.888216 ], [ -122.287338, 37.888081 ], [ -122.287595, 37.887776 ], [ -122.287681, 37.887623 ], [ -122.288561, 37.885286 ], [ -122.288754, 37.884694 ], [ -122.289612, 37.884880 ], [ -122.289269, 37.885862 ], [ -122.288325, 37.888284 ], [ -122.288153, 37.888606 ], [ -122.287617, 37.888775 ], [ -122.287080, 37.889012 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "2013", "population": 64, "NAME10": "Block 2013", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 27693, "AWATER10": 0, "INTPTLAT10": "+37.8861944", "INTPTLON10": "-122.2877578" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.287488, 37.887877 ], [ -122.286758, 37.887691 ], [ -122.287037, 37.886912 ], [ -122.287488, 37.885828 ], [ -122.287960, 37.884507 ], [ -122.288754, 37.884694 ], [ -122.288561, 37.885286 ], [ -122.287681, 37.887623 ], [ -122.287595, 37.887776 ], [ -122.287488, 37.887877 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "2015", "population": 19, "NAME10": "Block 2015", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 8164, "AWATER10": 0, "INTPTLAT10": "+37.8861594", "INTPTLON10": "-122.2868653" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.287123, 37.886726 ], [ -122.286286, 37.886523 ], [ -122.286544, 37.885794 ], [ -122.286651, 37.885642 ], [ -122.286737, 37.885642 ], [ -122.287488, 37.885828 ], [ -122.287123, 37.886726 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "2014", "population": 73, "NAME10": "Block 2014", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 41589, "AWATER10": 0, "INTPTLAT10": "+37.8849195", "INTPTLON10": "-122.2873798" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.286758, 37.887691 ], [ -122.285385, 37.887386 ], [ -122.286673, 37.883999 ], [ -122.287188, 37.884101 ], [ -122.287810, 37.884169 ], [ -122.288067, 37.884253 ], [ -122.287488, 37.885828 ], [ -122.286737, 37.885642 ], [ -122.286651, 37.885642 ], [ -122.286544, 37.885794 ], [ -122.286286, 37.886523 ], [ -122.287123, 37.886726 ], [ -122.286758, 37.887691 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "1022", "population": 31, "NAME10": "Block 1022", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 12213, "AWATER10": 0, "INTPTLAT10": "+37.8838753", "INTPTLON10": "-122.2886289" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.288754, 37.884694 ], [ -122.287960, 37.884507 ], [ -122.288518, 37.883051 ], [ -122.289312, 37.883288 ], [ -122.288754, 37.884694 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "1019", "NAME10": "Block 1019", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 1466, "AWATER10": 0, "INTPTLAT10": "+37.8847579", "INTPTLON10": "-122.2863241" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.286072, 37.885557 ], [ -122.285986, 37.885523 ], [ -122.286587, 37.883982 ], [ -122.286673, 37.883999 ], [ -122.286565, 37.884321 ], [ -122.286072, 37.885557 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "1011", "NAME10": "Block 1011", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 1704, "AWATER10": 0, "INTPTLAT10": "+37.8864397", "INTPTLON10": "-122.2856823" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.285385, 37.887386 ], [ -122.285299, 37.887352 ], [ -122.285986, 37.885523 ], [ -122.286072, 37.885557 ], [ -122.285385, 37.887386 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "1012", "population": 39, "NAME10": "Block 1012", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 17780, "AWATER10": 0, "INTPTLAT10": "+37.8863390", "INTPTLON10": "-122.2851750" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.285299, 37.887352 ], [ -122.284334, 37.887149 ], [ -122.284570, 37.886709 ], [ -122.285085, 37.885320 ], [ -122.285986, 37.885523 ], [ -122.285299, 37.887352 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "1018", "population": 45, "NAME10": "Block 1018", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 20717, "AWATER10": 0, "INTPTLAT10": "+37.8843388", "INTPTLON10": "-122.2859716" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.285986, 37.885523 ], [ -122.285085, 37.885320 ], [ -122.285600, 37.883999 ], [ -122.285686, 37.883644 ], [ -122.286973, 37.882983 ], [ -122.286587, 37.883982 ], [ -122.285986, 37.885523 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "1025", "NAME10": "Block 1025", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 1018, "AWATER10": 0, "INTPTLAT10": "+37.8838716", "INTPTLON10": "-122.2850766" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.284505, 37.884202 ], [ -122.284462, 37.884135 ], [ -122.285707, 37.883542 ], [ -122.285686, 37.883644 ], [ -122.284741, 37.884101 ], [ -122.284505, 37.884202 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "1013", "population": 65, "NAME10": "Block 1013", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 28788, "AWATER10": 0, "INTPTLAT10": "+37.8854489", "INTPTLON10": "-122.2845719" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.284334, 37.887149 ], [ -122.283540, 37.886963 ], [ -122.283819, 37.886235 ], [ -122.284505, 37.884372 ], [ -122.284505, 37.884202 ], [ -122.285686, 37.883644 ], [ -122.285600, 37.883999 ], [ -122.284570, 37.886709 ], [ -122.284334, 37.887149 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "1029", "population": 30, "NAME10": "Block 1029", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 16994, "AWATER10": 0, "INTPTLAT10": "+37.8853080", "INTPTLON10": "-122.2836511" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.283819, 37.886235 ], [ -122.282681, 37.885981 ], [ -122.283175, 37.885371 ], [ -122.283282, 37.884778 ], [ -122.283390, 37.884727 ], [ -122.283862, 37.884541 ], [ -122.284505, 37.884202 ], [ -122.284505, 37.884372 ], [ -122.283819, 37.886235 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "1027", "NAME10": "Block 1027", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 906, "AWATER10": 0, "INTPTLAT10": "+37.8844362", "INTPTLON10": "-122.2839247" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.283390, 37.884727 ], [ -122.283347, 37.884677 ], [ -122.284462, 37.884135 ], [ -122.284505, 37.884202 ], [ -122.283862, 37.884541 ], [ -122.283390, 37.884727 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "1026", "population": 17, "NAME10": "Block 1026", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 63728, "AWATER10": 0, "INTPTLAT10": "+37.8834939", "INTPTLON10": "-122.2837979" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.282124, 37.884998 ], [ -122.281995, 37.884981 ], [ -122.282295, 37.884372 ], [ -122.281909, 37.884372 ], [ -122.282016, 37.884185 ], [ -122.282574, 37.882729 ], [ -122.282767, 37.882543 ], [ -122.282810, 37.882509 ], [ -122.283025, 37.882526 ], [ -122.283690, 37.882492 ], [ -122.285085, 37.882475 ], [ -122.285385, 37.882441 ], [ -122.286050, 37.882458 ], [ -122.285836, 37.883034 ], [ -122.285707, 37.883542 ], [ -122.283797, 37.884473 ], [ -122.283132, 37.884761 ], [ -122.282424, 37.884965 ], [ -122.282124, 37.884998 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "1000", "NAME10": "Block 1000", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 443, "AWATER10": 0, "INTPTLAT10": "+37.8911265", "INTPTLON10": "-122.2829474" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.282424, 37.891180 ], [ -122.282424, 37.891146 ], [ -122.283497, 37.891078 ], [ -122.283497, 37.891129 ], [ -122.282424, 37.891180 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "1005", "population": 22, "NAME10": "Block 1005", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 19453, "AWATER10": 0, "INTPTLAT10": "+37.8901660", "INTPTLON10": "-122.2826890" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.282424, 37.891146 ], [ -122.282381, 37.890790 ], [ -122.281909, 37.889418 ], [ -122.282295, 37.889232 ], [ -122.282639, 37.889164 ], [ -122.282853, 37.889164 ], [ -122.282982, 37.889435 ], [ -122.283497, 37.891078 ], [ -122.282424, 37.891146 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "1015", "NAME10": "Block 1015", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 627, "AWATER10": 0, "INTPTLAT10": "+37.8891127", "INTPTLON10": "-122.2832122" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.283647, 37.889215 ], [ -122.283282, 37.889147 ], [ -122.282832, 37.889147 ], [ -122.282746, 37.889080 ], [ -122.283089, 37.889063 ], [ -122.283475, 37.889097 ], [ -122.283669, 37.889130 ], [ -122.283647, 37.889215 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "1006", "NAME10": "Block 1006", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 691, "AWATER10": 0, "INTPTLAT10": "+37.8892075", "INTPTLON10": "-122.2823202" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.281909, 37.889418 ], [ -122.281866, 37.889351 ], [ -122.282338, 37.889147 ], [ -122.282746, 37.889080 ], [ -122.282832, 37.889147 ], [ -122.282295, 37.889232 ], [ -122.281909, 37.889418 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "1017", "population": 37, "NAME10": "Block 1017", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 24687, "AWATER10": 0, "INTPTLAT10": "+37.8879459", "INTPTLON10": "-122.2823713" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.281866, 37.889351 ], [ -122.281673, 37.888673 ], [ -122.281673, 37.888250 ], [ -122.282295, 37.886675 ], [ -122.283282, 37.886895 ], [ -122.282660, 37.888589 ], [ -122.282660, 37.888944 ], [ -122.282746, 37.889080 ], [ -122.282338, 37.889147 ], [ -122.281866, 37.889351 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "1016", "population": 16, "NAME10": "Block 1016", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 9100, "AWATER10": 0, "INTPTLAT10": "+37.8864607", "INTPTLON10": "-122.2830673" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.283540, 37.886963 ], [ -122.282295, 37.886675 ], [ -122.282488, 37.886319 ], [ -122.282681, 37.885981 ], [ -122.283819, 37.886235 ], [ -122.283540, 37.886963 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "1028", "NAME10": "Block 1028", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 1037, "AWATER10": 0, "INTPTLAT10": "+37.8849026", "INTPTLON10": "-122.2826795" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.282038, 37.885066 ], [ -122.281973, 37.885049 ], [ -122.281995, 37.884981 ], [ -122.282124, 37.884998 ], [ -122.282424, 37.884965 ], [ -122.282875, 37.884846 ], [ -122.283347, 37.884677 ], [ -122.283390, 37.884727 ], [ -122.282917, 37.884914 ], [ -122.282445, 37.885032 ], [ -122.282038, 37.885066 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "1021", "population": 45, "NAME10": "Block 1021", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 18586, "AWATER10": 0, "INTPTLAT10": "+37.8834620", "INTPTLON10": "-122.2875836" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.288067, 37.884253 ], [ -122.287810, 37.884169 ], [ -122.287188, 37.884101 ], [ -122.286673, 37.883999 ], [ -122.287080, 37.882915 ], [ -122.287209, 37.882594 ], [ -122.287939, 37.882881 ], [ -122.288518, 37.883051 ], [ -122.288067, 37.884253 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "1020", "NAME10": "Block 1020", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 979, "AWATER10": 0, "INTPTLAT10": "+37.8834653", "INTPTLON10": "-122.2868181" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.286673, 37.883999 ], [ -122.286587, 37.883982 ], [ -122.286973, 37.882983 ], [ -122.287080, 37.882915 ], [ -122.287037, 37.883051 ], [ -122.286673, 37.883999 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "1030", "population": 1, "NAME10": "Block 1030", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 280, "AWATER10": 0, "INTPTLAT10": "+37.8827246", "INTPTLON10": "-122.2870976" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.287080, 37.882915 ], [ -122.287016, 37.882864 ], [ -122.287123, 37.882560 ], [ -122.287209, 37.882594 ], [ -122.287188, 37.882661 ], [ -122.287080, 37.882915 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "1024", "population": 1, "NAME10": "Block 1024", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 1201, "AWATER10": 0, "INTPTLAT10": "+37.8832245", "INTPTLON10": "-122.2863663" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.285686, 37.883644 ], [ -122.285707, 37.883542 ], [ -122.287016, 37.882864 ], [ -122.287080, 37.882915 ], [ -122.285686, 37.883644 ] ] ] } }
,
{ "type": "Feature", "id": 12345, "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "1031", "population": 15, "NAME10": "Block 1031", "MTFCC10": "G5040", "UR10": "U", "UACE10": "78904", "UATYP10": "U", "FUNCSTAT10": "S", "ALAND10": 7920, "AWATER10": 0, "INTPTLAT10": "+37.8828579", "INTPTLON10": "-122.2863490" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.285707, 37.883542 ], [ -122.285836, 37.883034 ], [ -122.286050, 37.882458 ], [ -122.286758, 37.882458 ], [ -122.287123, 37.882560 ], [ -122.287016, 37.882864 ], [ -122.285707, 37.883542 ] ] ] } }
] }
] }
] }

View File

@ -0,0 +1,395 @@
{ "type": "FeatureCollection", "properties": {
"attribution": "macarthur attribution",
"bounds": "-122.343750,37.695438,-122.104097,37.926868",
"center": "-122.299805,37.892187,12",
"description": "macarthur description",
"format": "pbf",
"json": "{\"vector_layers\": [ { \"id\": \"macarthur\", \"description\": \"\", \"minzoom\": 5, \"maxzoom\": 11, \"fields\": {\"FULLNAME\": \"String\", \"LINEARID\": \"String\", \"MTFCC\": \"String\", \"RTTYP\": \"String\"} } ] }",
"maxzoom": "12",
"minzoom": "0",
"name": "macarthur name",
"type": "overlay",
"version": "2"
}, "features": [
{ "type": "FeatureCollection", "properties": { "zoom": 5, "x": 5, "y": 12 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "macarthur", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "LINEARID": "1104486392881", "FULLNAME": "W Macarthur", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.255859, 37.822802 ], [ -122.272339, 37.829311 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1102638069562", "FULLNAME": "Macarthur", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.242126, 37.807614 ], [ -122.239380, 37.807614 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1104486090991", "FULLNAME": "Macarthur Fwy", "RTTYP": "M", "MTFCC": "S1100" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.297058, 37.833649 ], [ -122.291565, 37.827141 ], [ -122.258606, 37.822802 ], [ -122.250366, 37.811954 ], [ -122.231140, 37.801104 ], [ -122.211914, 37.796763 ], [ -122.195435, 37.785911 ], [ -122.178955, 37.783740 ], [ -122.159729, 37.772886 ], [ -122.148743, 37.759859 ], [ -122.151489, 37.751172 ], [ -122.140503, 37.738141 ], [ -122.132263, 37.714245 ], [ -122.104797, 37.696861 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1104474748623", "FULLNAME": "Macarthur Fwy", "RTTYP": "M", "MTFCC": "S1100" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.104797, 37.696861 ], [ -122.132263, 37.716418 ], [ -122.143250, 37.738141 ], [ -122.154236, 37.751172 ], [ -122.148743, 37.762030 ], [ -122.159729, 37.775057 ], [ -122.250366, 37.811954 ], [ -122.261353, 37.822802 ], [ -122.294312, 37.831480 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1103690483032", "FULLNAME": "Macarthur", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.184448, 37.777228 ], [ -122.181702, 37.775057 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1103690483026", "FULLNAME": "Macarthur", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.178955, 37.772886 ], [ -122.176208, 37.772886 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1102954918511", "FULLNAME": "Macarthur", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.173462, 37.770715 ], [ -122.162476, 37.757687 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1103690383700", "FULLNAME": "Macarthur", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.162476, 37.753344 ], [ -122.159729, 37.751172 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1103690474249", "FULLNAME": "Macarthur", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.159729, 37.751172 ], [ -122.159729, 37.749001 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1103690474250", "FULLNAME": "Macarthur", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.143250, 37.740313 ], [ -122.159729, 37.749001 ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 6, "x": 10, "y": 24 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "macarthur", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "LINEARID": "1104486392881", "FULLNAME": "W Macarthur", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.255859, 37.821718 ], [ -122.259979, 37.824972 ], [ -122.272339, 37.828226 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1102638069562", "FULLNAME": "Macarthur", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.242126, 37.807614 ], [ -122.238007, 37.806529 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1102156241736", "FULLNAME": "Macarthur", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.194061, 37.786996 ], [ -122.195435, 37.786996 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1104486090991", "FULLNAME": "Macarthur Fwy", "RTTYP": "M", "MTFCC": "S1100" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.295685, 37.833649 ], [ -122.294312, 37.828226 ], [ -122.290192, 37.827141 ], [ -122.281952, 37.828226 ], [ -122.259979, 37.822802 ], [ -122.253113, 37.818463 ], [ -122.248993, 37.810869 ], [ -122.236633, 37.805444 ], [ -122.229767, 37.801104 ], [ -122.211914, 37.796763 ], [ -122.194061, 37.785911 ], [ -122.178955, 37.783740 ], [ -122.158356, 37.773971 ], [ -122.148743, 37.759859 ], [ -122.151489, 37.750087 ], [ -122.141876, 37.737055 ], [ -122.137756, 37.725108 ], [ -122.132263, 37.714245 ], [ -122.110291, 37.701207 ], [ -122.104797, 37.695774 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1104474748623", "FULLNAME": "Macarthur Fwy", "RTTYP": "M", "MTFCC": "S1100" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.104797, 37.695774 ], [ -122.110291, 37.701207 ], [ -122.132263, 37.715331 ], [ -122.137756, 37.726194 ], [ -122.140503, 37.738141 ], [ -122.151489, 37.751172 ], [ -122.148743, 37.760944 ], [ -122.158356, 37.773971 ], [ -122.178955, 37.783740 ], [ -122.194061, 37.785911 ], [ -122.210541, 37.796763 ], [ -122.229767, 37.801104 ], [ -122.236633, 37.806529 ], [ -122.250366, 37.810869 ], [ -122.254486, 37.819548 ], [ -122.259979, 37.822802 ], [ -122.281952, 37.828226 ], [ -122.290192, 37.827141 ], [ -122.294312, 37.829311 ], [ -122.294312, 37.831480 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1103690483032", "FULLNAME": "Macarthur", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.184448, 37.777228 ], [ -122.180328, 37.773971 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1103690483026", "FULLNAME": "Macarthur", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.177582, 37.771800 ], [ -122.176208, 37.771800 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1102954918511", "FULLNAME": "Macarthur", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.172089, 37.769629 ], [ -122.163849, 37.762030 ], [ -122.162476, 37.756601 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1103690383700", "FULLNAME": "Macarthur", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.161102, 37.753344 ], [ -122.159729, 37.750087 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1103690474249", "FULLNAME": "Macarthur", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.159729, 37.750087 ], [ -122.158356, 37.749001 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1103690474250", "FULLNAME": "Macarthur", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.143250, 37.739227 ], [ -122.152863, 37.742485 ], [ -122.158356, 37.747915 ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 7, "x": 20, "y": 49 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "macarthur", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "LINEARID": "1104486392881", "FULLNAME": "W Macarthur", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.255173, 37.821718 ], [ -122.259293, 37.824430 ], [ -122.272339, 37.827684 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1102156510290", "FULLNAME": "W Macarthur", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.254486, 37.820090 ], [ -122.254486, 37.820633 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1102654602215", "FULLNAME": "Macarthur", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.253113, 37.817378 ], [ -122.252426, 37.816836 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1102638069562", "FULLNAME": "Macarthur", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.242126, 37.807614 ], [ -122.237320, 37.805986 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1102156241736", "FULLNAME": "Macarthur", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.194061, 37.786453 ], [ -122.194748, 37.786996 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1104486090991", "FULLNAME": "Macarthur Fwy", "RTTYP": "M", "MTFCC": "S1100" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.294998, 37.833107 ], [ -122.293625, 37.828768 ], [ -122.290878, 37.827141 ], [ -122.288132, 37.826599 ], [ -122.281265, 37.827684 ], [ -122.260666, 37.822260 ], [ -122.253113, 37.818463 ], [ -122.250366, 37.811954 ], [ -122.248993, 37.810326 ], [ -122.235947, 37.805444 ], [ -122.229080, 37.801104 ], [ -122.211227, 37.796763 ], [ -122.205734, 37.794593 ], [ -122.200928, 37.789167 ], [ -122.194061, 37.785911 ], [ -122.189255, 37.784283 ], [ -122.178268, 37.783740 ], [ -122.158356, 37.773429 ], [ -122.155609, 37.770715 ], [ -122.148056, 37.759859 ], [ -122.148743, 37.757144 ], [ -122.152176, 37.753887 ], [ -122.151489, 37.750087 ], [ -122.149429, 37.745743 ], [ -122.141190, 37.737055 ], [ -122.138443, 37.725651 ], [ -122.131577, 37.714788 ], [ -122.121277, 37.707183 ], [ -122.109604, 37.700664 ], [ -122.104797, 37.695774 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1104474748623", "FULLNAME": "Macarthur Fwy", "RTTYP": "M", "MTFCC": "S1100" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.104111, 37.695774 ], [ -122.109604, 37.700664 ], [ -122.121964, 37.707726 ], [ -122.131577, 37.714788 ], [ -122.137756, 37.725651 ], [ -122.140503, 37.737598 ], [ -122.149429, 37.745743 ], [ -122.151489, 37.750629 ], [ -122.151489, 37.753887 ], [ -122.148743, 37.757144 ], [ -122.148056, 37.760401 ], [ -122.155609, 37.771258 ], [ -122.158356, 37.773429 ], [ -122.177582, 37.783740 ], [ -122.193375, 37.785911 ], [ -122.199554, 37.789167 ], [ -122.205734, 37.794050 ], [ -122.210541, 37.796763 ], [ -122.229080, 37.801104 ], [ -122.235947, 37.805986 ], [ -122.249680, 37.810869 ], [ -122.253799, 37.819006 ], [ -122.259979, 37.822802 ], [ -122.281265, 37.827684 ], [ -122.289505, 37.827141 ], [ -122.293625, 37.828768 ], [ -122.293625, 37.830938 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1102155930810", "FULLNAME": "Macarthur", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.185822, 37.775600 ], [ -122.185822, 37.776142 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1103690483032", "FULLNAME": "Macarthur", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.184448, 37.776685 ], [ -122.180328, 37.773971 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1103690483026", "FULLNAME": "Macarthur", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.176895, 37.771258 ], [ -122.175522, 37.771258 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1102954918511", "FULLNAME": "Macarthur", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.172089, 37.769629 ], [ -122.167969, 37.766372 ], [ -122.163849, 37.762030 ], [ -122.161789, 37.756601 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1103690383700", "FULLNAME": "Macarthur", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.160416, 37.753344 ], [ -122.159042, 37.750087 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1103690474249", "FULLNAME": "Macarthur", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.159042, 37.750087 ], [ -122.158356, 37.748458 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1103690474250", "FULLNAME": "Macarthur", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.143250, 37.738684 ], [ -122.152176, 37.742485 ], [ -122.157669, 37.747915 ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 8, "x": 41, "y": 99 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "macarthur", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "LINEARID": "1104486090991", "FULLNAME": "Macarthur Fwy", "RTTYP": "M", "MTFCC": "S1100" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.144279, 37.740313 ], [ -122.141533, 37.738141 ], [ -122.140503, 37.736784 ], [ -122.138100, 37.725379 ], [ -122.133636, 37.718590 ], [ -122.131577, 37.714517 ], [ -122.129860, 37.712887 ], [ -122.125397, 37.710443 ], [ -122.121277, 37.707183 ], [ -122.117157, 37.705553 ], [ -122.109604, 37.700664 ], [ -122.104454, 37.695503 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1104474748623", "FULLNAME": "Macarthur Fwy", "RTTYP": "M", "MTFCC": "S1100" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.104111, 37.695503 ], [ -122.109261, 37.700664 ], [ -122.115784, 37.705010 ], [ -122.121277, 37.707455 ], [ -122.124023, 37.709628 ], [ -122.129860, 37.713159 ], [ -122.131577, 37.715060 ], [ -122.133293, 37.718590 ], [ -122.137413, 37.725108 ], [ -122.140503, 37.737327 ], [ -122.143936, 37.740313 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1103690474250", "FULLNAME": "Macarthur", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.143250, 37.738413 ], [ -122.147369, 37.740313 ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 8, "x": 41, "y": 98 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "macarthur", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "LINEARID": "1104486392881", "FULLNAME": "W Macarthur", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.254829, 37.821446 ], [ -122.258949, 37.824430 ], [ -122.263756, 37.825786 ], [ -122.265816, 37.826599 ], [ -122.271996, 37.827684 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1102156510290", "FULLNAME": "W Macarthur", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.254143, 37.820090 ], [ -122.254486, 37.820362 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1102654602215", "FULLNAME": "Macarthur", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.253113, 37.817378 ], [ -122.252426, 37.816565 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1102638069562", "FULLNAME": "Macarthur", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.241783, 37.807343 ], [ -122.237320, 37.805715 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1102156241736", "FULLNAME": "Macarthur", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.194061, 37.786453 ], [ -122.194405, 37.786996 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1104486090991", "FULLNAME": "Macarthur Fwy", "RTTYP": "M", "MTFCC": "S1100" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.294655, 37.833107 ], [ -122.293625, 37.828768 ], [ -122.290878, 37.826870 ], [ -122.287788, 37.826599 ], [ -122.281265, 37.827413 ], [ -122.260323, 37.822260 ], [ -122.256203, 37.820362 ], [ -122.253113, 37.817921 ], [ -122.251740, 37.816293 ], [ -122.250366, 37.811954 ], [ -122.249336, 37.810598 ], [ -122.242126, 37.808428 ], [ -122.235603, 37.805444 ], [ -122.229080, 37.801104 ], [ -122.210884, 37.796763 ], [ -122.205391, 37.793779 ], [ -122.199554, 37.788624 ], [ -122.194061, 37.785639 ], [ -122.188911, 37.784283 ], [ -122.178268, 37.783740 ], [ -122.170029, 37.778856 ], [ -122.158356, 37.773429 ], [ -122.155266, 37.770715 ], [ -122.148399, 37.760401 ], [ -122.148056, 37.757959 ], [ -122.151833, 37.753615 ], [ -122.151833, 37.750901 ], [ -122.149429, 37.745743 ], [ -122.145996, 37.742757 ], [ -122.140846, 37.737055 ], [ -122.138100, 37.725379 ], [ -122.133636, 37.718590 ], [ -122.131577, 37.714517 ], [ -122.129860, 37.712887 ], [ -122.125397, 37.710443 ], [ -122.121277, 37.707183 ], [ -122.117157, 37.705553 ], [ -122.109604, 37.700664 ], [ -122.105827, 37.696861 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1104474748623", "FULLNAME": "Macarthur Fwy", "RTTYP": "M", "MTFCC": "S1100" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.105484, 37.696861 ], [ -122.109261, 37.700664 ], [ -122.115784, 37.705010 ], [ -122.121277, 37.707455 ], [ -122.125053, 37.710443 ], [ -122.129173, 37.712615 ], [ -122.131233, 37.714517 ], [ -122.133293, 37.718590 ], [ -122.137413, 37.725108 ], [ -122.140503, 37.737327 ], [ -122.143936, 37.740313 ], [ -122.145653, 37.742757 ], [ -122.148743, 37.745200 ], [ -122.151146, 37.749544 ], [ -122.151833, 37.751172 ], [ -122.151833, 37.752801 ], [ -122.151146, 37.754430 ], [ -122.148399, 37.757144 ], [ -122.148056, 37.759859 ], [ -122.155266, 37.770986 ], [ -122.158012, 37.773157 ], [ -122.170029, 37.779399 ], [ -122.177238, 37.783469 ], [ -122.179642, 37.784283 ], [ -122.188911, 37.784554 ], [ -122.193031, 37.785639 ], [ -122.199554, 37.788895 ], [ -122.205391, 37.794050 ], [ -122.209167, 37.795949 ], [ -122.214317, 37.797848 ], [ -122.228737, 37.801104 ], [ -122.236977, 37.806258 ], [ -122.241096, 37.808428 ], [ -122.248993, 37.810598 ], [ -122.250366, 37.812225 ], [ -122.252426, 37.817921 ], [ -122.255516, 37.820362 ], [ -122.258949, 37.822260 ], [ -122.281265, 37.827684 ], [ -122.284012, 37.827684 ], [ -122.288132, 37.826870 ], [ -122.289505, 37.827141 ], [ -122.293282, 37.828768 ], [ -122.293625, 37.830938 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1102155930810", "FULLNAME": "Macarthur", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.185478, 37.775600 ], [ -122.185478, 37.775871 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1103690483032", "FULLNAME": "Macarthur", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.184105, 37.776685 ], [ -122.179985, 37.773971 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1102654601627", "FULLNAME": "Macarthur", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.181702, 37.775057 ], [ -122.181358, 37.775057 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1103690483026", "FULLNAME": "Macarthur", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.176552, 37.771258 ], [ -122.175522, 37.770986 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1102954918511", "FULLNAME": "Macarthur", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.172089, 37.769358 ], [ -122.167969, 37.766101 ], [ -122.163849, 37.761758 ], [ -122.161789, 37.756601 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1103690383700", "FULLNAME": "Macarthur", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.160416, 37.753073 ], [ -122.159042, 37.750087 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1103690474249", "FULLNAME": "Macarthur", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.159042, 37.750087 ], [ -122.158012, 37.748458 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1103690474250", "FULLNAME": "Macarthur", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.143250, 37.738413 ], [ -122.151833, 37.742485 ], [ -122.156639, 37.746286 ], [ -122.157326, 37.747643 ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 9, "x": 82, "y": 198 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "macarthur", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "LINEARID": "1104486090991", "FULLNAME": "Macarthur Fwy", "RTTYP": "M", "MTFCC": "S1100" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.138615, 37.729453 ], [ -122.137928, 37.725379 ], [ -122.137413, 37.724293 ], [ -122.134666, 37.720763 ], [ -122.133465, 37.718590 ], [ -122.131405, 37.714381 ], [ -122.129860, 37.712751 ], [ -122.127972, 37.711665 ], [ -122.125397, 37.710307 ], [ -122.121105, 37.707183 ], [ -122.117157, 37.705418 ], [ -122.109432, 37.700664 ], [ -122.104454, 37.695503 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1104474748623", "FULLNAME": "Macarthur Fwy", "RTTYP": "M", "MTFCC": "S1100" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.104111, 37.695503 ], [ -122.109089, 37.700664 ], [ -122.115784, 37.704874 ], [ -122.121105, 37.707319 ], [ -122.125053, 37.710307 ], [ -122.129173, 37.712615 ], [ -122.130890, 37.714245 ], [ -122.133121, 37.718590 ], [ -122.137413, 37.724972 ], [ -122.138443, 37.729453 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1102406970094", "FULLNAME": "Macarthur Blvd", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.139130, 37.729453 ], [ -122.139130, 37.728910 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1102406970095", "FULLNAME": "Macarthur Blvd", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.139130, 37.729453 ], [ -122.139130, 37.728910 ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 9, "x": 82, "y": 197 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "macarthur", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "LINEARID": "1104486392881", "FULLNAME": "W Macarthur", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.254829, 37.821446 ], [ -122.255001, 37.821989 ], [ -122.256203, 37.822802 ], [ -122.258778, 37.824430 ], [ -122.263756, 37.825650 ], [ -122.265644, 37.826599 ], [ -122.271824, 37.827548 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1102156510290", "FULLNAME": "W Macarthur", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.254143, 37.819955 ], [ -122.254314, 37.820362 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1102654602215", "FULLNAME": "Macarthur", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.252941, 37.817243 ], [ -122.252426, 37.816429 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1102638069562", "FULLNAME": "Macarthur", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.241611, 37.807343 ], [ -122.241268, 37.806936 ], [ -122.239723, 37.806800 ], [ -122.237320, 37.805715 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1102156241736", "FULLNAME": "Macarthur", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.194061, 37.786453 ], [ -122.194405, 37.786860 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1104486090991", "FULLNAME": "Macarthur Fwy", "RTTYP": "M", "MTFCC": "S1100" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.294655, 37.833107 ], [ -122.294140, 37.832158 ], [ -122.293797, 37.828904 ], [ -122.292938, 37.827955 ], [ -122.290707, 37.826735 ], [ -122.289677, 37.826463 ], [ -122.287788, 37.826463 ], [ -122.283325, 37.827277 ], [ -122.281265, 37.827277 ], [ -122.268391, 37.824158 ], [ -122.262383, 37.822938 ], [ -122.259121, 37.821853 ], [ -122.256031, 37.820362 ], [ -122.252941, 37.817921 ], [ -122.251740, 37.816293 ], [ -122.250366, 37.811818 ], [ -122.249165, 37.810598 ], [ -122.241955, 37.808292 ], [ -122.235432, 37.805444 ], [ -122.229767, 37.801375 ], [ -122.228909, 37.800968 ], [ -122.217236, 37.798391 ], [ -122.210884, 37.796628 ], [ -122.205219, 37.793779 ], [ -122.200756, 37.789302 ], [ -122.199554, 37.788488 ], [ -122.193890, 37.785639 ], [ -122.191486, 37.784825 ], [ -122.188740, 37.784283 ], [ -122.179298, 37.783876 ], [ -122.178268, 37.783604 ], [ -122.169857, 37.778856 ], [ -122.164192, 37.776414 ], [ -122.158184, 37.773293 ], [ -122.155266, 37.770715 ], [ -122.152519, 37.766101 ], [ -122.150631, 37.763930 ], [ -122.148399, 37.760401 ], [ -122.148056, 37.758773 ], [ -122.148056, 37.757823 ], [ -122.148743, 37.756601 ], [ -122.151661, 37.753615 ], [ -122.152004, 37.752122 ], [ -122.151833, 37.750765 ], [ -122.149944, 37.746557 ], [ -122.148914, 37.745064 ], [ -122.145824, 37.742621 ], [ -122.144108, 37.740313 ], [ -122.141533, 37.738141 ], [ -122.140675, 37.737055 ], [ -122.138443, 37.728774 ], [ -122.137928, 37.725379 ], [ -122.137070, 37.723750 ], [ -122.134666, 37.720763 ], [ -122.133465, 37.718590 ], [ -122.131405, 37.714381 ], [ -122.129860, 37.712751 ], [ -122.127972, 37.711665 ], [ -122.125397, 37.710307 ], [ -122.121964, 37.707726 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1104474748623", "FULLNAME": "Macarthur Fwy", "RTTYP": "M", "MTFCC": "S1100" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.121620, 37.707726 ], [ -122.125053, 37.710307 ], [ -122.128143, 37.711936 ], [ -122.129688, 37.713159 ], [ -122.131405, 37.715060 ], [ -122.133121, 37.718590 ], [ -122.137413, 37.724972 ], [ -122.138271, 37.729045 ], [ -122.140503, 37.737327 ], [ -122.141361, 37.738413 ], [ -122.143764, 37.740313 ], [ -122.145653, 37.742757 ], [ -122.149086, 37.745472 ], [ -122.151146, 37.749544 ], [ -122.151833, 37.751172 ], [ -122.151661, 37.753073 ], [ -122.150974, 37.754294 ], [ -122.148228, 37.756873 ], [ -122.147884, 37.758094 ], [ -122.147884, 37.759859 ], [ -122.148743, 37.761623 ], [ -122.152348, 37.766237 ], [ -122.155266, 37.770986 ], [ -122.157841, 37.773157 ], [ -122.164192, 37.776549 ], [ -122.170029, 37.779263 ], [ -122.173977, 37.781298 ], [ -122.177067, 37.783333 ], [ -122.179470, 37.784147 ], [ -122.188911, 37.784554 ], [ -122.193031, 37.785639 ], [ -122.199554, 37.788760 ], [ -122.201099, 37.789845 ], [ -122.203846, 37.792829 ], [ -122.205219, 37.794050 ], [ -122.208996, 37.795949 ], [ -122.211399, 37.797034 ], [ -122.214146, 37.797713 ], [ -122.219810, 37.799205 ], [ -122.228565, 37.800968 ], [ -122.229939, 37.801646 ], [ -122.234745, 37.805308 ], [ -122.237320, 37.806529 ], [ -122.241440, 37.808428 ], [ -122.248821, 37.810598 ], [ -122.249508, 37.811140 ], [ -122.250366, 37.812089 ], [ -122.251568, 37.816293 ], [ -122.252426, 37.817785 ], [ -122.253284, 37.818734 ], [ -122.255344, 37.820226 ], [ -122.258949, 37.822124 ], [ -122.262039, 37.823074 ], [ -122.269764, 37.824701 ], [ -122.281094, 37.827548 ], [ -122.283325, 37.827684 ], [ -122.286758, 37.826870 ], [ -122.288132, 37.826735 ], [ -122.289333, 37.827006 ], [ -122.292080, 37.827955 ], [ -122.293110, 37.828768 ], [ -122.293453, 37.829853 ], [ -122.293453, 37.830938 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1102155930810", "FULLNAME": "Macarthur", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.185478, 37.775600 ], [ -122.185307, 37.775735 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1103690483032", "FULLNAME": "Macarthur", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.184105, 37.776685 ], [ -122.179813, 37.773971 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1102654601627", "FULLNAME": "Macarthur", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.181530, 37.775057 ], [ -122.181187, 37.774921 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1103690483026", "FULLNAME": "Macarthur", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.176552, 37.771258 ], [ -122.175522, 37.770850 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1102654601663", "FULLNAME": "Macarthur", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.169857, 37.767594 ], [ -122.170029, 37.767729 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1102954918511", "FULLNAME": "Macarthur", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.172089, 37.769222 ], [ -122.168140, 37.766508 ], [ -122.163849, 37.761623 ], [ -122.163162, 37.760808 ], [ -122.161789, 37.756601 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1103690383700", "FULLNAME": "Macarthur", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.160416, 37.752937 ], [ -122.159901, 37.751444 ], [ -122.158871, 37.750087 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1103690474249", "FULLNAME": "Macarthur", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.158871, 37.750087 ], [ -122.157841, 37.748322 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1103690474250", "FULLNAME": "Macarthur", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.143078, 37.738277 ], [ -122.151833, 37.742485 ], [ -122.153721, 37.744250 ], [ -122.156467, 37.746286 ], [ -122.157326, 37.747508 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1104485645649", "FULLNAME": "W Macarthur Blvd", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.279892, 37.828768 ], [ -122.284698, 37.828226 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1104485605278", "FULLNAME": "W Macarthur Blvd", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.279892, 37.828768 ], [ -122.281952, 37.828226 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1102156217102", "FULLNAME": "W Macarthur Blvd", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.279205, 37.828768 ], [ -122.272339, 37.827684 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1104475134288", "FULLNAME": "Macarthur Blvd", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.254486, 37.820633 ], [ -122.255173, 37.822260 ], [ -122.258606, 37.824430 ], [ -122.266846, 37.827141 ], [ -122.279892, 37.828768 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1104475134436", "FULLNAME": "W Macarthur Blvd", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.254486, 37.820633 ], [ -122.255173, 37.822260 ], [ -122.258606, 37.824430 ], [ -122.266846, 37.827141 ], [ -122.275772, 37.828226 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1102407366406", "FULLNAME": "W Macarthur Blvd", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.254486, 37.820090 ], [ -122.255173, 37.821718 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1104485773833", "FULLNAME": "Macarthur Blvd", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.253113, 37.817378 ], [ -122.255173, 37.821718 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1105089436004", "FULLNAME": "Macarthur Blvd", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.252426, 37.816836 ], [ -122.250366, 37.810869 ], [ -122.233887, 37.804359 ], [ -122.229767, 37.801104 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1104469713187", "FULLNAME": "Macarthur Blvd", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.242126, 37.807614 ], [ -122.241440, 37.807614 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1102156248968", "FULLNAME": "Macarthur Blvd", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.237320, 37.805986 ], [ -122.235947, 37.805444 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1102638078801", "FULLNAME": "Macarthur Blvd", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.229767, 37.801646 ], [ -122.228394, 37.801646 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1105281275689", "FULLNAME": "Macarthur Blvd", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.228394, 37.801646 ], [ -122.220840, 37.800019 ], [ -122.218781, 37.801104 ], [ -122.205734, 37.797848 ], [ -122.194061, 37.786453 ], [ -122.188568, 37.784283 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1103717593123", "FULLNAME": "Macarthur Blvd", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.228394, 37.801646 ], [ -122.220840, 37.800019 ], [ -122.218781, 37.801104 ], [ -122.207794, 37.798933 ], [ -122.202301, 37.795678 ], [ -122.193375, 37.785911 ], [ -122.187881, 37.784825 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1105281275688", "FULLNAME": "Macarthur Blvd", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.194061, 37.786453 ], [ -122.192688, 37.785368 ], [ -122.189255, 37.784283 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1105281275434", "FULLNAME": "Macarthur Blvd", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.189255, 37.784283 ], [ -122.188568, 37.784283 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1105281275687", "FULLNAME": "Macarthur Blvd", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.189255, 37.784283 ], [ -122.187195, 37.780484 ], [ -122.188568, 37.777770 ], [ -122.185822, 37.775600 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1105281275692", "FULLNAME": "Macarthur Blvd", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.188568, 37.784283 ], [ -122.187195, 37.780484 ], [ -122.188568, 37.777770 ], [ -122.185822, 37.775600 ], [ -122.184448, 37.776685 ], [ -122.181702, 37.775057 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1102406970092", "FULLNAME": "Macarthur Blvd", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.181702, 37.775057 ], [ -122.176895, 37.771258 ], [ -122.172089, 37.769629 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1102406970093", "FULLNAME": "Macarthur Blvd", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.172775, 37.769629 ], [ -122.170029, 37.768001 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1105089465114", "FULLNAME": "Macarthur Blvd", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.170029, 37.768001 ], [ -122.163849, 37.760944 ], [ -122.160416, 37.751715 ], [ -122.156982, 37.746286 ], [ -122.152176, 37.742485 ], [ -122.146683, 37.739770 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1102954189105", "FULLNAME": "Macarthur Blvd", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.161789, 37.756058 ], [ -122.159042, 37.750087 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1105089465116", "FULLNAME": "Macarthur Blvd", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.143250, 37.738684 ], [ -122.141190, 37.735969 ], [ -122.139130, 37.730539 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1102406970094", "FULLNAME": "Macarthur Blvd", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.139130, 37.730539 ], [ -122.139130, 37.728910 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1102406970095", "FULLNAME": "Macarthur Blvd", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.139130, 37.730539 ], [ -122.139130, 37.728910 ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 10, "x": 164, "y": 396 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "macarthur", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "LINEARID": "1104486090991", "FULLNAME": "Macarthur Fwy", "RTTYP": "M", "MTFCC": "S1100" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.137156, 37.724022 ], [ -122.134666, 37.720695 ], [ -122.133808, 37.719405 ], [ -122.133465, 37.718590 ], [ -122.131319, 37.714381 ], [ -122.129774, 37.712751 ], [ -122.127972, 37.711597 ], [ -122.125311, 37.710307 ], [ -122.121019, 37.707115 ], [ -122.117157, 37.705350 ], [ -122.114067, 37.703584 ], [ -122.109346, 37.700596 ], [ -122.108402, 37.699781 ], [ -122.105570, 37.696589 ], [ -122.104454, 37.695503 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1104474748623", "FULLNAME": "Macarthur Fwy", "RTTYP": "M", "MTFCC": "S1100" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.104111, 37.695503 ], [ -122.107286, 37.699034 ], [ -122.109003, 37.700664 ], [ -122.115698, 37.704807 ], [ -122.117929, 37.705961 ], [ -122.121019, 37.707319 ], [ -122.124281, 37.709899 ], [ -122.129087, 37.712547 ], [ -122.130804, 37.714177 ], [ -122.131920, 37.716078 ], [ -122.133121, 37.718590 ], [ -122.134151, 37.720356 ], [ -122.136898, 37.724022 ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 10, "x": 164, "y": 395 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "macarthur", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "LINEARID": "1102157651658", "FULLNAME": "Macarthur", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.271738, 37.827548 ], [ -122.271824, 37.827548 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1104486392881", "FULLNAME": "W Macarthur", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.254744, 37.821446 ], [ -122.255001, 37.821921 ], [ -122.256117, 37.822802 ], [ -122.258091, 37.824158 ], [ -122.258692, 37.824430 ], [ -122.260580, 37.824972 ], [ -122.263670, 37.825650 ], [ -122.265558, 37.826531 ], [ -122.267962, 37.827006 ], [ -122.271738, 37.827548 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1102156510290", "FULLNAME": "W Macarthur", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.254143, 37.819887 ], [ -122.254314, 37.820362 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1102654602215", "FULLNAME": "Macarthur", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.252855, 37.817243 ], [ -122.252512, 37.816768 ], [ -122.252426, 37.816361 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1102638069562", "FULLNAME": "Macarthur", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.241526, 37.807343 ], [ -122.241526, 37.807139 ], [ -122.241182, 37.806936 ], [ -122.240496, 37.806800 ], [ -122.239637, 37.806800 ], [ -122.238264, 37.805986 ], [ -122.237320, 37.805647 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1102156241736", "FULLNAME": "Macarthur", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.194061, 37.786386 ], [ -122.194405, 37.786860 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1104486090991", "FULLNAME": "Macarthur Fwy", "RTTYP": "M", "MTFCC": "S1100" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.294569, 37.833039 ], [ -122.294140, 37.832158 ], [ -122.293882, 37.830667 ], [ -122.293797, 37.828836 ], [ -122.292938, 37.827887 ], [ -122.290621, 37.826667 ], [ -122.289591, 37.826396 ], [ -122.287788, 37.826396 ], [ -122.283239, 37.827277 ], [ -122.281265, 37.827277 ], [ -122.275257, 37.825786 ], [ -122.270451, 37.824769 ], [ -122.268391, 37.824158 ], [ -122.267361, 37.824023 ], [ -122.265987, 37.823616 ], [ -122.262383, 37.822938 ], [ -122.259121, 37.821853 ], [ -122.255945, 37.820294 ], [ -122.254572, 37.819412 ], [ -122.252855, 37.817921 ], [ -122.252340, 37.817311 ], [ -122.251740, 37.816226 ], [ -122.250452, 37.811886 ], [ -122.250023, 37.811276 ], [ -122.249079, 37.810530 ], [ -122.246761, 37.809716 ], [ -122.241869, 37.808292 ], [ -122.239637, 37.807411 ], [ -122.235432, 37.805444 ], [ -122.232685, 37.803613 ], [ -122.229767, 37.801307 ], [ -122.228823, 37.800900 ], [ -122.227364, 37.800493 ], [ -122.227020, 37.800493 ], [ -122.217236, 37.798323 ], [ -122.215776, 37.797848 ], [ -122.212172, 37.797034 ], [ -122.210798, 37.796560 ], [ -122.207451, 37.795000 ], [ -122.205219, 37.793779 ], [ -122.204447, 37.793168 ], [ -122.202215, 37.790727 ], [ -122.200670, 37.789234 ], [ -122.199554, 37.788488 ], [ -122.193804, 37.785639 ], [ -122.191401, 37.784825 ], [ -122.188654, 37.784283 ], [ -122.184706, 37.784011 ], [ -122.179298, 37.783876 ], [ -122.178268, 37.783604 ], [ -122.173719, 37.780959 ], [ -122.169771, 37.778856 ], [ -122.164192, 37.776346 ], [ -122.158098, 37.773225 ], [ -122.156467, 37.771936 ], [ -122.155266, 37.770647 ], [ -122.152433, 37.766101 ], [ -122.150545, 37.763862 ], [ -122.148314, 37.760334 ], [ -122.147970, 37.758773 ], [ -122.148056, 37.757823 ], [ -122.148743, 37.756533 ], [ -122.150974, 37.754430 ], [ -122.151575, 37.753615 ], [ -122.152004, 37.752055 ], [ -122.151833, 37.750697 ], [ -122.149858, 37.746490 ], [ -122.148914, 37.745064 ], [ -122.148228, 37.744386 ], [ -122.145824, 37.742621 ], [ -122.144108, 37.740313 ], [ -122.141447, 37.738141 ], [ -122.140675, 37.737055 ], [ -122.140245, 37.736105 ], [ -122.139559, 37.732915 ], [ -122.138357, 37.728706 ], [ -122.137842, 37.725379 ], [ -122.136984, 37.723682 ], [ -122.134666, 37.720695 ], [ -122.133808, 37.719405 ], [ -122.133465, 37.718590 ], [ -122.131319, 37.714381 ], [ -122.130203, 37.713159 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1104474748623", "FULLNAME": "Macarthur Fwy", "RTTYP": "M", "MTFCC": "S1100" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.129774, 37.713159 ], [ -122.130804, 37.714177 ], [ -122.131319, 37.714992 ], [ -122.133121, 37.718590 ], [ -122.134151, 37.720356 ], [ -122.136555, 37.723546 ], [ -122.137413, 37.724904 ], [ -122.137671, 37.725787 ], [ -122.138186, 37.728977 ], [ -122.138872, 37.731150 ], [ -122.140074, 37.736241 ], [ -122.140503, 37.737259 ], [ -122.141361, 37.738345 ], [ -122.143764, 37.740245 ], [ -122.145653, 37.742757 ], [ -122.146511, 37.743503 ], [ -122.148056, 37.744521 ], [ -122.149000, 37.745472 ], [ -122.151489, 37.750358 ], [ -122.151747, 37.751172 ], [ -122.151747, 37.752258 ], [ -122.151575, 37.753005 ], [ -122.150888, 37.754226 ], [ -122.149086, 37.755855 ], [ -122.148142, 37.757008 ], [ -122.147799, 37.758094 ], [ -122.147884, 37.759791 ], [ -122.148142, 37.760537 ], [ -122.148743, 37.761555 ], [ -122.150288, 37.763862 ], [ -122.152262, 37.766237 ], [ -122.153721, 37.768747 ], [ -122.155180, 37.770918 ], [ -122.156639, 37.772343 ], [ -122.157755, 37.773157 ], [ -122.158871, 37.773836 ], [ -122.164106, 37.776481 ], [ -122.167282, 37.777838 ], [ -122.170029, 37.779195 ], [ -122.173977, 37.781298 ], [ -122.177067, 37.783333 ], [ -122.178440, 37.783876 ], [ -122.179470, 37.784079 ], [ -122.184963, 37.784215 ], [ -122.188826, 37.784486 ], [ -122.190886, 37.784893 ], [ -122.193031, 37.785572 ], [ -122.196035, 37.786928 ], [ -122.199469, 37.788692 ], [ -122.201014, 37.789845 ], [ -122.203760, 37.792829 ], [ -122.205133, 37.793982 ], [ -122.206421, 37.794728 ], [ -122.208824, 37.795814 ], [ -122.208910, 37.795949 ], [ -122.211313, 37.796967 ], [ -122.214060, 37.797713 ], [ -122.219725, 37.799137 ], [ -122.228479, 37.800968 ], [ -122.229939, 37.801646 ], [ -122.232943, 37.804088 ], [ -122.234659, 37.805241 ], [ -122.237234, 37.806529 ], [ -122.241354, 37.808360 ], [ -122.247963, 37.810259 ], [ -122.248821, 37.810598 ], [ -122.249508, 37.811072 ], [ -122.250280, 37.812089 ], [ -122.251482, 37.816226 ], [ -122.252340, 37.817717 ], [ -122.253284, 37.818734 ], [ -122.254486, 37.819684 ], [ -122.257147, 37.821243 ], [ -122.258949, 37.822057 ], [ -122.262039, 37.823074 ], [ -122.267618, 37.824226 ], [ -122.269077, 37.824633 ], [ -122.269764, 37.824701 ], [ -122.274485, 37.825989 ], [ -122.281094, 37.827480 ], [ -122.282038, 37.827616 ], [ -122.283325, 37.827616 ], [ -122.286758, 37.826870 ], [ -122.288132, 37.826735 ], [ -122.289248, 37.826938 ], [ -122.291050, 37.827480 ], [ -122.291994, 37.827887 ], [ -122.293110, 37.828701 ], [ -122.293282, 37.828972 ], [ -122.293453, 37.829853 ], [ -122.293367, 37.830938 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1102155930810", "FULLNAME": "Macarthur", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.185392, 37.775532 ], [ -122.185221, 37.775735 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1103690483032", "FULLNAME": "Macarthur", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.184105, 37.776617 ], [ -122.180328, 37.774446 ], [ -122.179728, 37.773971 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1102654601627", "FULLNAME": "Macarthur", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.181444, 37.774989 ], [ -122.181187, 37.774921 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1103690483026", "FULLNAME": "Macarthur", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.176466, 37.771258 ], [ -122.175436, 37.770783 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1102654601663", "FULLNAME": "Macarthur", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.169771, 37.767594 ], [ -122.170029, 37.767729 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1102954918511", "FULLNAME": "Macarthur", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.172003, 37.769222 ], [ -122.168055, 37.766440 ], [ -122.163849, 37.761623 ], [ -122.163162, 37.760741 ], [ -122.161703, 37.756533 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1103690383700", "FULLNAME": "Macarthur", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.160416, 37.752937 ], [ -122.159815, 37.751376 ], [ -122.158871, 37.750019 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1103690474249", "FULLNAME": "Macarthur", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.158871, 37.750019 ], [ -122.157755, 37.748322 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1103690474250", "FULLNAME": "Macarthur", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.142992, 37.738209 ], [ -122.151747, 37.742417 ], [ -122.152519, 37.743028 ], [ -122.153635, 37.744182 ], [ -122.156467, 37.746218 ], [ -122.157240, 37.747440 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1104485645649", "FULLNAME": "W Macarthur Blvd", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.279892, 37.828768 ], [ -122.284698, 37.827955 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1104485605278", "FULLNAME": "W Macarthur Blvd", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.279549, 37.828497 ], [ -122.281609, 37.828226 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1102156217102", "FULLNAME": "W Macarthur Blvd", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.279205, 37.828497 ], [ -122.271996, 37.827684 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1104475134288", "FULLNAME": "Macarthur Blvd", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.254486, 37.820362 ], [ -122.255173, 37.822260 ], [ -122.258263, 37.824430 ], [ -122.259293, 37.824972 ], [ -122.266846, 37.827141 ], [ -122.279892, 37.828768 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1104475134436", "FULLNAME": "W Macarthur Blvd", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.254486, 37.820362 ], [ -122.255173, 37.822260 ], [ -122.258263, 37.824430 ], [ -122.266846, 37.827141 ], [ -122.275429, 37.828226 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1102407366406", "FULLNAME": "W Macarthur Blvd", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.254486, 37.820090 ], [ -122.254829, 37.821446 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1104485773833", "FULLNAME": "Macarthur Blvd", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.253113, 37.817378 ], [ -122.254486, 37.819006 ], [ -122.254829, 37.821446 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1105089436004", "FULLNAME": "Macarthur Blvd", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.252426, 37.816565 ], [ -122.251053, 37.811954 ], [ -122.250023, 37.810869 ], [ -122.242813, 37.808156 ], [ -122.241783, 37.807071 ], [ -122.239723, 37.806800 ], [ -122.236290, 37.805173 ], [ -122.233887, 37.804088 ], [ -122.229767, 37.801104 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1104469713198", "FULLNAME": "Macarthur Blvd", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.241783, 37.807343 ], [ -122.241783, 37.807614 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1104469713187", "FULLNAME": "Macarthur Blvd", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.241783, 37.807343 ], [ -122.241440, 37.807343 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1102156248968", "FULLNAME": "Macarthur Blvd", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.237320, 37.805715 ], [ -122.235947, 37.805444 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1102638078801", "FULLNAME": "Macarthur Blvd", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.229424, 37.801646 ], [ -122.228050, 37.801375 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1105281275689", "FULLNAME": "Macarthur Blvd", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.228050, 37.801375 ], [ -122.220840, 37.800019 ], [ -122.219810, 37.800290 ], [ -122.219124, 37.801104 ], [ -122.218437, 37.801104 ], [ -122.209167, 37.798662 ], [ -122.207794, 37.798662 ], [ -122.205734, 37.797848 ], [ -122.201271, 37.794322 ], [ -122.194061, 37.786453 ], [ -122.192688, 37.785639 ], [ -122.188911, 37.784825 ], [ -122.188568, 37.784011 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1103717593123", "FULLNAME": "Macarthur Blvd", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.228050, 37.801375 ], [ -122.220497, 37.800019 ], [ -122.218781, 37.801104 ], [ -122.209511, 37.798662 ], [ -122.207794, 37.798933 ], [ -122.204704, 37.797306 ], [ -122.202301, 37.795407 ], [ -122.193375, 37.785911 ], [ -122.187881, 37.784554 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1105281275688", "FULLNAME": "Macarthur Blvd", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.194061, 37.786453 ], [ -122.192688, 37.785097 ], [ -122.188911, 37.784011 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1105281275434", "FULLNAME": "Macarthur Blvd", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.188911, 37.784011 ], [ -122.188568, 37.784011 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1105281275687", "FULLNAME": "Macarthur Blvd", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.188911, 37.784011 ], [ -122.187195, 37.780484 ], [ -122.187195, 37.778856 ], [ -122.188225, 37.777770 ], [ -122.185478, 37.775600 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1105281275692", "FULLNAME": "Macarthur Blvd", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.188568, 37.784011 ], [ -122.187195, 37.780213 ], [ -122.187195, 37.778585 ], [ -122.188225, 37.777770 ], [ -122.185478, 37.775600 ], [ -122.184105, 37.776685 ], [ -122.181702, 37.775057 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1102406970092", "FULLNAME": "Macarthur Blvd", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.181358, 37.775057 ], [ -122.176552, 37.771258 ], [ -122.172089, 37.769358 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1102406970093", "FULLNAME": "Macarthur Blvd", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.172432, 37.769358 ], [ -122.170029, 37.767729 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1105089465114", "FULLNAME": "Macarthur Blvd", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.170029, 37.767729 ], [ -122.167969, 37.766101 ], [ -122.163506, 37.761216 ], [ -122.160072, 37.751715 ], [ -122.156639, 37.746286 ], [ -122.151833, 37.742485 ], [ -122.146339, 37.739770 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1102954189105", "FULLNAME": "Macarthur Blvd", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.161446, 37.755787 ], [ -122.160072, 37.751444 ], [ -122.159042, 37.750087 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1105089465116", "FULLNAME": "Macarthur Blvd", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.143250, 37.738413 ], [ -122.141190, 37.737055 ], [ -122.140846, 37.735969 ], [ -122.139130, 37.730539 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1102406970094", "FULLNAME": "Macarthur Blvd", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.139130, 37.730539 ], [ -122.138786, 37.728910 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1102406970095", "FULLNAME": "Macarthur Blvd", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.139130, 37.730539 ], [ -122.138786, 37.728910 ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 11, "x": 328, "y": 791 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "macarthur", "version": 2, "extent": 1024 }, "features": [
{ "type": "Feature", "properties": { "LINEARID": "1104485645649", "FULLNAME": "W Macarthur Blvd", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.279720, 37.828633 ], [ -122.284527, 37.827684 ], [ -122.284698, 37.827819 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1104485605278", "FULLNAME": "W Macarthur Blvd", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.279549, 37.828362 ], [ -122.280579, 37.828362 ], [ -122.281437, 37.828091 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1102156217102", "FULLNAME": "W Macarthur Blvd", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.279205, 37.828497 ], [ -122.275429, 37.828226 ], [ -122.271824, 37.827548 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1104475134288", "FULLNAME": "Macarthur Blvd", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.254314, 37.820362 ], [ -122.254658, 37.821718 ], [ -122.255001, 37.822124 ], [ -122.258091, 37.824430 ], [ -122.259293, 37.824836 ], [ -122.264099, 37.825921 ], [ -122.265301, 37.826599 ], [ -122.266846, 37.827006 ], [ -122.276630, 37.828497 ], [ -122.279720, 37.828633 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1104475134436", "FULLNAME": "W Macarthur Blvd", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.254314, 37.820362 ], [ -122.254658, 37.821718 ], [ -122.255001, 37.822124 ], [ -122.258091, 37.824430 ], [ -122.264099, 37.825921 ], [ -122.265301, 37.826599 ], [ -122.266846, 37.827006 ], [ -122.275429, 37.828226 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1102407366406", "FULLNAME": "W Macarthur Blvd", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.254486, 37.820090 ], [ -122.254829, 37.821446 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1104485773833", "FULLNAME": "Macarthur Blvd", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.252941, 37.817243 ], [ -122.254314, 37.819006 ], [ -122.254829, 37.821446 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1105089436004", "FULLNAME": "Macarthur Blvd", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.252426, 37.816429 ], [ -122.251225, 37.813581 ], [ -122.250710, 37.811547 ], [ -122.249851, 37.810733 ], [ -122.248993, 37.810191 ], [ -122.246933, 37.809648 ], [ -122.246418, 37.809241 ], [ -122.242813, 37.808156 ], [ -122.241611, 37.807071 ], [ -122.240925, 37.806800 ], [ -122.239723, 37.806800 ], [ -122.237835, 37.805715 ], [ -122.236118, 37.805173 ], [ -122.233887, 37.804088 ], [ -122.229767, 37.800968 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1104469713198", "FULLNAME": "Macarthur Blvd", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.241611, 37.807343 ], [ -122.241783, 37.807614 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1104469713187", "FULLNAME": "Macarthur Blvd", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.241611, 37.807343 ], [ -122.241440, 37.807207 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1102156248968", "FULLNAME": "Macarthur Blvd", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.237320, 37.805715 ], [ -122.235775, 37.805308 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1102638078801", "FULLNAME": "Macarthur Blvd", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.229252, 37.801646 ], [ -122.227879, 37.801375 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1105281275689", "FULLNAME": "Macarthur Blvd", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.227879, 37.801375 ], [ -122.220840, 37.800019 ], [ -122.219982, 37.800019 ], [ -122.219124, 37.800968 ], [ -122.218266, 37.800968 ], [ -122.215862, 37.800154 ], [ -122.215176, 37.800154 ], [ -122.209167, 37.798527 ], [ -122.207794, 37.798662 ], [ -122.205563, 37.797713 ], [ -122.200756, 37.793915 ], [ -122.194061, 37.786453 ], [ -122.192688, 37.785639 ], [ -122.190628, 37.785368 ], [ -122.189083, 37.784825 ], [ -122.188568, 37.784418 ], [ -122.188396, 37.783876 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1103717593123", "FULLNAME": "Macarthur Blvd", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.227879, 37.801375 ], [ -122.220497, 37.800019 ], [ -122.220154, 37.800019 ], [ -122.219124, 37.801104 ], [ -122.218609, 37.801104 ], [ -122.209339, 37.798662 ], [ -122.207794, 37.798798 ], [ -122.204876, 37.797441 ], [ -122.202129, 37.795271 ], [ -122.194920, 37.787403 ], [ -122.193203, 37.785911 ], [ -122.192516, 37.785639 ], [ -122.190971, 37.785504 ], [ -122.187710, 37.784554 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1105281275688", "FULLNAME": "Macarthur Blvd", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.194061, 37.786453 ], [ -122.193890, 37.786046 ], [ -122.192688, 37.785097 ], [ -122.191486, 37.784554 ], [ -122.188911, 37.783876 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1105281275434", "FULLNAME": "Macarthur Blvd", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.188911, 37.783876 ], [ -122.188396, 37.783876 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1105281275687", "FULLNAME": "Macarthur Blvd", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.188911, 37.783876 ], [ -122.188396, 37.783604 ], [ -122.187195, 37.780484 ], [ -122.187195, 37.778720 ], [ -122.188225, 37.778042 ], [ -122.188225, 37.777770 ], [ -122.185478, 37.775464 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1105281275692", "FULLNAME": "Macarthur Blvd", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.188396, 37.783876 ], [ -122.187023, 37.780213 ], [ -122.187195, 37.778585 ], [ -122.188053, 37.778042 ], [ -122.188053, 37.777770 ], [ -122.187195, 37.776821 ], [ -122.185307, 37.775464 ], [ -122.184105, 37.776549 ], [ -122.181530, 37.775057 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1102406970092", "FULLNAME": "Macarthur Blvd", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.181187, 37.774921 ], [ -122.177753, 37.772343 ], [ -122.176895, 37.771393 ], [ -122.172089, 37.769222 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1102406970093", "FULLNAME": "Macarthur Blvd", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.172260, 37.769222 ], [ -122.170029, 37.767729 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1105089465114", "FULLNAME": "Macarthur Blvd", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.169857, 37.767594 ], [ -122.167969, 37.766237 ], [ -122.164536, 37.762166 ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 11, "x": 329, "y": 791 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "macarthur", "version": 2, "extent": 1024 }, "features": [
{ "type": "Feature", "properties": { "LINEARID": "1102406970093", "FULLNAME": "Macarthur Blvd", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.171402, 37.768679 ], [ -122.170029, 37.767729 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1105089465114", "FULLNAME": "Macarthur Blvd", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.169857, 37.767594 ], [ -122.167969, 37.766237 ], [ -122.163334, 37.760808 ], [ -122.159901, 37.751308 ], [ -122.156639, 37.746286 ], [ -122.153893, 37.744386 ], [ -122.151833, 37.742349 ], [ -122.146339, 37.739770 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1102954189105", "FULLNAME": "Macarthur Blvd", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.161446, 37.755651 ], [ -122.159901, 37.751444 ], [ -122.158871, 37.750087 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1105089465116", "FULLNAME": "Macarthur Blvd", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.143078, 37.738277 ], [ -122.141705, 37.737463 ], [ -122.140675, 37.735969 ], [ -122.139130, 37.730403 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1102406970094", "FULLNAME": "Macarthur Blvd", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.139130, 37.730403 ], [ -122.138786, 37.728774 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1102406970095", "FULLNAME": "Macarthur Blvd", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.139130, 37.730403 ], [ -122.138786, 37.728774 ] ] } }
,
{ "type": "Feature", "properties": { "LINEARID": "1102157509691", "FULLNAME": "Macarthur Blvd", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.143421, 37.722392 ], [ -122.143421, 37.722257 ] ] } }
] }
] }
] }

File diff suppressed because it is too large Load Diff

View File

@ -1,12 +1,12 @@
{ "type": "FeatureCollection", "properties": {
"bounds": "-122.334735,37.695438,-122.104097,37.898925",
"bounds": "-122.343750,37.695438,-122.104097,37.926868",
"center": "-122.299805,37.892187,12",
"description": "tests/join-population/merged.mbtiles",
"description": "tests/join-population/tabblock_06001420.mbtiles",
"format": "pbf",
"json": "{\"vector_layers\": [ { \"id\": \"macarthur\", \"description\": \"\", \"minzoom\": 5, \"maxzoom\": 11, \"fields\": {\"FULLNAME\": \"String\", \"LINEARID\": \"String\", \"MTFCC\": \"String\", \"RTTYP\": \"String\"} }, { \"id\": \"tabblock_06001420\", \"description\": \"\", \"minzoom\": 3, \"maxzoom\": 12, \"fields\": {\"ALAND10\": \"Number\", \"AWATER10\": \"Number\", \"BLOCKCE10\": \"String\", \"COUNTYFP10\": \"String\", \"FUNCSTAT10\": \"String\", \"GEOID10\": \"String\", \"INTPTLAT10\": \"String\", \"INTPTLON10\": \"String\", \"MTFCC10\": \"String\", \"NAME10\": \"String\", \"STATEFP10\": \"String\", \"TRACTCE10\": \"String\", \"UACE10\": \"String\", \"UATYP10\": \"String\", \"UR10\": \"String\"} } ] }",
"maxzoom": "12",
"minzoom": "0",
"name": "tests/join-population/merged.mbtiles",
"name": "tests/join-population/macarthur.mbtiles + tests/join-population/macarthur2.mbtiles + tests/join-population/tabblock_06001420.mbtiles",
"type": "overlay",
"version": "2"
}, "features": [

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,12 @@
{
"name": "tests/join-population/macarthur.mbtiles + tests/join-population/macarthur2.mbtiles + tests/join-population/tabblock_06001420.mbtiles",
"description": "tests/join-population/tabblock_06001420.mbtiles",
"version": "2",
"minzoom": "0",
"maxzoom": "12",
"center": "-122.299805,37.892187,12",
"bounds": "-122.343750,37.695438,-122.104097,37.926868",
"type": "overlay",
"format": "pbf",
"json": "{\"vector_layers\": [ { \"id\": \"macarthur\", \"description\": \"\", \"minzoom\": 5, \"maxzoom\": 11, \"fields\": {\"FULLNAME\": \"String\", \"LINEARID\": \"String\", \"MTFCC\": \"String\", \"RTTYP\": \"String\"} }, { \"id\": \"tabblock_06001420\", \"description\": \"\", \"minzoom\": 3, \"maxzoom\": 12, \"fields\": {\"ALAND10\": \"Number\", \"AWATER10\": \"Number\", \"BLOCKCE10\": \"String\", \"COUNTYFP10\": \"String\", \"FUNCSTAT10\": \"String\", \"GEOID10\": \"String\", \"INTPTLAT10\": \"String\", \"INTPTLON10\": \"String\", \"MTFCC10\": \"String\", \"NAME10\": \"String\", \"STATEFP10\": \"String\", \"TRACTCE10\": \"String\", \"UACE10\": \"String\", \"UATYP10\": \"String\", \"UR10\": \"String\"} } ] }"
}

View File

@ -1,12 +1,12 @@
{ "type": "FeatureCollection", "properties": {
"bounds": "-122.294563,37.695438,-122.104097,37.833010",
"bounds": "-122.343750,37.439974,-121.992188,37.996163",
"center": "-122.167969,37.833010,10",
"description": "tests/join-population/windows.mbtiles",
"description": "tests/join-population/macarthur.mbtiles",
"format": "pbf",
"json": "{\"vector_layers\": [ { \"id\": \"macarthur\", \"description\": \"\", \"minzoom\": 5, \"maxzoom\": 10, \"fields\": {\"FULLNAME\": \"String\", \"LINEARID\": \"String\", \"MTFCC\": \"String\", \"RTTYP\": \"String\"} } ] }",
"maxzoom": "10",
"minzoom": "5",
"name": "tests/join-population/windows.mbtiles",
"name": "tests/join-population/macarthur.mbtiles",
"type": "overlay",
"version": "2"
}, "features": [

53
tests/knox/in.json Normal file

File diff suppressed because one or more lines are too long

1144
tests/knox/out/-zg.json Normal file

File diff suppressed because it is too large Load Diff

1144
tests/knox/out/-zg_-P.json Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,63 @@
{ "type": "FeatureCollection", "properties": {
"bounds": "-122.538670,37.705764,-12.240000,37.836443",
"center": "-122.431641,37.788049,11",
"description": "tests/muni/decode/multi.mbtiles",
"format": "pbf",
"json": "{\"vector_layers\": [ { \"id\": \"muni\", \"description\": \"\", \"minzoom\": 11, \"maxzoom\": 11, \"fields\": {\"name\": \"String\"} }, { \"id\": \"subway\", \"description\": \"\", \"minzoom\": 11, \"maxzoom\": 11, \"fields\": {\"name\": \"String\"} } ] }",
"maxzoom": "11",
"minzoom": "11",
"name": "tests/muni/decode/multi.mbtiles",
"type": "overlay",
"version": "2"
}, "features": [
{ "type": "FeatureCollection", "properties": { "zoom": 11, "x": 326, "y": 791 }, "features": [
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 11, "x": 327, "y": 792 }, "features": [
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 11, "x": 327, "y": 791 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "subway", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "name": "Metro Castro Station/Outbound" }, "geometry": { "type": "Point", "coordinates": [ -122.435331, 37.762708 ] } }
,
{ "type": "Feature", "properties": { "name": "Metro Castro Station/Downtown" }, "geometry": { "type": "Point", "coordinates": [ -122.435246, 37.762641 ] } }
,
{ "type": "Feature", "properties": { "name": "Metro Forest Hill Station/Downtown" }, "geometry": { "type": "Point", "coordinates": [ -122.458634, 37.748356 ] } }
,
{ "type": "Feature", "properties": { "name": "Metro Montgomery Station/Outbound" }, "geometry": { "type": "Point", "coordinates": [ -122.402158, 37.788794 ] } }
,
{ "type": "Feature", "properties": { "name": "Metro Montgomery Station/Downtown" }, "geometry": { "type": "Point", "coordinates": [ -122.401943, 37.788726 ] } }
,
{ "type": "Feature", "properties": { "name": "Metro Embarcadero Station/Downtown" }, "geometry": { "type": "Point", "coordinates": [ -122.396579, 37.793033 ] } }
,
{ "type": "Feature", "properties": { "name": "Metro Embarcadero Station" }, "geometry": { "type": "Point", "coordinates": [ -122.396450, 37.793168 ] } }
,
{ "type": "Feature", "properties": { "name": "Metro Embarcadero Station" }, "geometry": { "type": "Point", "coordinates": [ -122.396407, 37.793168 ] } }
,
{ "type": "Feature", "properties": { "name": "Metro Civic Center Station/Downtown" }, "geometry": { "type": "Point", "coordinates": [ -122.412543, 37.780348 ] } }
,
{ "type": "Feature", "properties": { "name": "Van Ness Station Outbound" }, "geometry": { "type": "Point", "coordinates": [ -122.419367, 37.775260 ] } }
,
{ "type": "Feature", "properties": { "name": "Metro Van Ness Station/Outbound" }, "geometry": { "type": "Point", "coordinates": [ -122.419281, 37.775159 ] } }
,
{ "type": "Feature", "properties": { "name": "Metro Van Ness Station" }, "geometry": { "type": "Point", "coordinates": [ -122.419195, 37.775091 ] } }
,
{ "type": "Feature", "properties": { "name": "Metro Van Ness Station/Downtown" }, "geometry": { "type": "Point", "coordinates": [ -122.419281, 37.775057 ] } }
,
{ "type": "Feature", "properties": { "name": "Metro Civic Center Station/Outbd" }, "geometry": { "type": "Point", "coordinates": [ -122.415032, 37.778686 ] } }
,
{ "type": "Feature", "properties": { "name": "Metro Civic Center Station/Downtn" }, "geometry": { "type": "Point", "coordinates": [ -122.414818, 37.778551 ] } }
,
{ "type": "Feature", "properties": { "name": "Metro Church Station/Outbound" }, "geometry": { "type": "Point", "coordinates": [ -122.429323, 37.767356 ] } }
,
{ "type": "Feature", "properties": { "name": "Metro Church Station/Downtown" }, "geometry": { "type": "Point", "coordinates": [ -122.429194, 37.767221 ] } }
,
{ "type": "Feature", "properties": { "name": "Metro Powell Station/Outbound" }, "geometry": { "type": "Point", "coordinates": [ -122.407823, 37.784317 ] } }
,
{ "type": "Feature", "properties": { "name": "Metro Powell Station/Downtown" }, "geometry": { "type": "Point", "coordinates": [ -122.407737, 37.784215 ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 11, "x": 954, "y": 791 }, "features": [
] }
] }

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,270 @@
{ "type": "FeatureCollection", "properties": {
"bounds": "-1.000000,-1.000000,1.000000,1.000000",
"center": "-1.000000,1.000000,4",
"description": "NullIsland",
"format": "pbf",
"json": "{\"vector_layers\": [ { \"id\": \"in\", \"description\": \"\", \"minzoom\": 0, \"maxzoom\": 4, \"fields\": {} } ] }",
"maxzoom": "4",
"minzoom": "0",
"name": "tests/nullisland/out/-b0_-z4_-NNullIsland.json.check.mbtiles",
"type": "overlay",
"version": "2"
}, "features": [
{ "type": "FeatureCollection", "properties": { "zoom": 0, "x": 0, "y": 0 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 0.000000, 1.054628 ], [ 0.000000, 0.000000 ], [ -1.054688, 0.000000 ], [ -1.054688, 1.054628 ], [ 0.000000, 1.054628 ] ] ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ -1.054688, 0.000000 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ 0.000000, 0.000000 ], [ -1.054688, 0.000000 ] ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 0.000000, 0.000000 ], [ 0.000000, -0.966751 ], [ -1.054688, -0.966751 ], [ -1.054688, 0.000000 ], [ 0.000000, 0.000000 ] ] ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ 0.000000, 0.000000 ], [ 0.000000, 1.054628 ] ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 0.966797, 1.054628 ], [ 0.966797, 0.000000 ], [ 0.000000, 0.000000 ], [ 0.000000, 1.054628 ], [ 0.966797, 1.054628 ] ] ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ 0.000000, 0.000000 ], [ 0.000000, -0.966751 ] ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ 0.000000, 0.000000 ], [ 0.966797, 0.000000 ] ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 0.966797, 0.000000 ], [ 0.966797, -0.966751 ], [ 0.000000, -0.966751 ], [ 0.000000, 0.000000 ], [ 0.966797, 0.000000 ] ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 1, "x": 0, "y": 1 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ -1.010742, 0.000000 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ 0.000000, 0.000000 ], [ -1.010742, 0.000000 ] ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 0.000000, 0.000000 ], [ 0.000000, -0.966751 ], [ -1.010742, -0.966751 ], [ -1.010742, 0.000000 ], [ 0.000000, 0.000000 ] ] ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.000000, 0.000000 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ 0.000000, 0.000000 ], [ 0.000000, -0.966751 ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 1, "x": 0, "y": 0 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 0.000000, 1.010690 ], [ 0.000000, 0.000000 ], [ -1.010742, 0.000000 ], [ -1.010742, 1.010690 ], [ 0.000000, 1.010690 ] ] ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ -1.010742, 0.000000 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ 0.000000, 0.000000 ], [ -1.010742, 0.000000 ] ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.000000, 1.010690 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ 0.000000, 0.000000 ], [ 0.000000, 1.010690 ] ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.000000, 0.000000 ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 1, "x": 1, "y": 1 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.000000, 0.000000 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ 0.000000, 0.000000 ], [ 0.000000, -0.966751 ] ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ 0.000000, 0.000000 ], [ 0.966797, 0.000000 ] ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 0.966797, 0.000000 ], [ 0.966797, -0.966751 ], [ 0.000000, -0.966751 ], [ 0.000000, 0.000000 ], [ 0.966797, 0.000000 ] ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 1, "x": 1, "y": 0 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.000000, 1.010690 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ 0.000000, 0.000000 ], [ 0.000000, 1.010690 ] ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 0.966797, 1.010690 ], [ 0.966797, 0.000000 ], [ 0.000000, 0.000000 ], [ 0.000000, 1.010690 ], [ 0.966797, 1.010690 ] ] ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.000000, 0.000000 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ 0.000000, 0.000000 ], [ 0.966797, 0.000000 ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 2, "x": 1, "y": 2 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ -1.010742, 0.000000 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ 0.000000, 0.000000 ], [ -1.010742, 0.000000 ] ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 0.000000, 0.000000 ], [ 0.000000, -0.988720 ], [ -1.010742, -0.988720 ], [ -1.010742, 0.000000 ], [ 0.000000, 0.000000 ] ] ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.000000, 0.000000 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ 0.000000, 0.000000 ], [ 0.000000, -0.988720 ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 2, "x": 1, "y": 1 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 0.000000, 1.010690 ], [ 0.000000, 0.000000 ], [ -1.010742, 0.000000 ], [ -1.010742, 1.010690 ], [ 0.000000, 1.010690 ] ] ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ -1.010742, 0.000000 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ 0.000000, 0.000000 ], [ -1.010742, 0.000000 ] ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.000000, 1.010690 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ 0.000000, 0.000000 ], [ 0.000000, 1.010690 ] ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.000000, 0.000000 ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 2, "x": 2, "y": 2 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.000000, 0.000000 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ 0.000000, 0.000000 ], [ 0.000000, -0.988720 ] ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ 0.000000, 0.000000 ], [ 0.988770, 0.000000 ] ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 0.988770, 0.000000 ], [ 0.988770, -0.988720 ], [ 0.000000, -0.988720 ], [ 0.000000, 0.000000 ], [ 0.988770, 0.000000 ] ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 2, "x": 2, "y": 1 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.000000, 1.010690 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ 0.000000, 0.000000 ], [ 0.000000, 1.010690 ] ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 0.988770, 1.010690 ], [ 0.988770, 0.000000 ], [ 0.000000, 0.000000 ], [ 0.000000, 1.010690 ], [ 0.988770, 1.010690 ] ] ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.000000, 0.000000 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ 0.000000, 0.000000 ], [ 0.988770, 0.000000 ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 3, "x": 3, "y": 4 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ -1.010742, 0.000000 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ 0.000000, 0.000000 ], [ -1.010742, 0.000000 ] ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 0.000000, 0.000000 ], [ 0.000000, -0.999705 ], [ -1.010742, -0.999705 ], [ -1.010742, 0.000000 ], [ 0.000000, 0.000000 ] ] ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.000000, 0.000000 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ 0.000000, 0.000000 ], [ 0.000000, -0.999705 ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 3, "x": 3, "y": 3 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 0.000000, 1.010690 ], [ 0.000000, 0.000000 ], [ -1.010742, 0.000000 ], [ -1.010742, 1.010690 ], [ 0.000000, 1.010690 ] ] ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ -1.010742, 0.000000 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ 0.000000, 0.000000 ], [ -1.010742, 0.000000 ] ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.000000, 1.010690 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ 0.000000, 0.000000 ], [ 0.000000, 1.010690 ] ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.000000, 0.000000 ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 3, "x": 4, "y": 4 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.000000, 0.000000 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ 0.000000, 0.000000 ], [ 0.000000, -0.999705 ] ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ 0.000000, 0.000000 ], [ 0.999756, 0.000000 ] ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 0.999756, 0.000000 ], [ 0.999756, -0.999705 ], [ 0.000000, -0.999705 ], [ 0.000000, 0.000000 ], [ 0.999756, 0.000000 ] ] ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.999756, 0.000000 ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 3, "x": 4, "y": 3 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.000000, 1.010690 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ 0.000000, 0.000000 ], [ 0.000000, 1.010690 ] ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 0.999756, 1.010690 ], [ 0.999756, 0.000000 ], [ 0.000000, 0.000000 ], [ 0.000000, 1.010690 ], [ 0.999756, 1.010690 ] ] ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.000000, 0.000000 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ 0.000000, 0.000000 ], [ 0.999756, 0.000000 ] ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.999756, 0.000000 ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 4, "x": 7, "y": 8 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ -1.005249, 0.000000 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ 0.000000, 0.000000 ], [ -1.005249, 0.000000 ] ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 0.000000, 0.000000 ], [ 0.000000, -0.999705 ], [ -1.005249, -0.999705 ], [ -1.005249, 0.000000 ], [ 0.000000, 0.000000 ] ] ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.000000, 0.000000 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ 0.000000, 0.000000 ], [ 0.000000, -0.999705 ] ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.000000, -0.999705 ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 4, "x": 7, "y": 7 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 0.000000, 1.005197 ], [ 0.000000, 0.000000 ], [ -1.005249, 0.000000 ], [ -1.005249, 1.005197 ], [ 0.000000, 1.005197 ] ] ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ -1.005249, 0.000000 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ 0.000000, 0.000000 ], [ -1.005249, 0.000000 ] ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.000000, 1.005197 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ 0.000000, 0.000000 ], [ 0.000000, 1.005197 ] ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.000000, 0.000000 ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 4, "x": 8, "y": 8 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.000000, 0.000000 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ 0.000000, 0.000000 ], [ 0.000000, -0.999705 ] ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ 0.000000, 0.000000 ], [ 0.999756, 0.000000 ] ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 0.999756, 0.000000 ], [ 0.999756, -0.999705 ], [ 0.000000, -0.999705 ], [ 0.000000, 0.000000 ], [ 0.999756, 0.000000 ] ] ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.000000, -0.999705 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.999756, 0.000000 ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 4, "x": 8, "y": 7 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.000000, 1.005197 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ 0.000000, 0.000000 ], [ 0.000000, 1.005197 ] ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 0.999756, 1.005197 ], [ 0.999756, 0.000000 ], [ 0.000000, 0.000000 ], [ 0.000000, 1.005197 ], [ 0.999756, 1.005197 ] ] ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.000000, 0.000000 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ 0.000000, 0.000000 ], [ 0.999756, 0.000000 ] ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.999756, 0.000000 ] } }
] }
] }
] }

View File

@ -0,0 +1,20 @@
{ "type": "FeatureCollection", "properties": {
"bounds": "-135.000000,-31.000000,-3.000000,79.000000",
"center": "-3.000000,0.000000,0",
"description": "tests/overlap/out/-z0_-pC.json.check.mbtiles",
"format": "pbf",
"json": "{\"vector_layers\": [ { \"id\": \"in\", \"description\": \"\", \"minzoom\": 0, \"maxzoom\": 0, \"fields\": {} } ] }",
"maxzoom": "0",
"minzoom": "0",
"name": "tests/overlap/out/-z0_-pC.json.check.mbtiles",
"type": "overlay",
"version": "2"
}, "features": [
{ "type": "FeatureCollection", "properties": { "zoom": 0, "x": 0, "y": 0, "compressed": false }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -33.046875, 79.004962 ], [ -3.076172, 61.015725 ], [ -37.001953, 34.016242 ], [ -71.015625, 29.075375 ], [ -103.007812, 39.027719 ], [ -117.070312, 60.020952 ], [ -113.027344, 69.005675 ], [ -93.076172, 75.004940 ], [ -74.003906, 79.004962 ], [ -33.046875, 79.004962 ] ] ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -81.035156, 63.035039 ], [ -28.037109, 59.040555 ], [ -10.019531, 50.007739 ], [ -5.009766, 8.059230 ], [ -17.050781, -21.943046 ], [ -75.058594, -30.977609 ], [ -118.037109, -8.928487 ], [ -135.000000, 29.075375 ], [ -113.027344, 53.014783 ], [ -81.035156, 63.035039 ] ] ] } }
] }
] }
] }

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More