Compare commits

..

31 Commits

Author SHA1 Message Date
a1ddfc6b8b Externalize Catch too 2017-03-16 17:00:19 -07:00
d95eb3482d Upgrade to Wagyu version 0.4.1 2017-03-16 16:13:03 -07:00
8961ecb86d Merge branch 'master' into external-deps 2017-03-16 16:04:06 -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
030c555c13 Today I learned that MacOS tar automagically decompresses gzipped input 2017-02-17 16:28:30 -08:00
41bb4e225c Externalize dependencies 2017-02-17 15:48:39 -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
96 changed files with 2035 additions and 23083 deletions

View File

@ -1,3 +1,40 @@
## 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

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
@ -43,7 +43,7 @@ PG=
H = $(wildcard *.h) $(wildcard *.hpp)
C = $(wildcard *.c) $(wildcard *.cpp)
INCLUDES = -I/usr/local/include -I.
INCLUDES = -Iprotozero-1.5.1/include -Igeometry.hpp-0.9.0-gcc-4.9/include -Iwagyu-0.4.1/include -ICatch-1.8.2/single_include
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
@ -75,10 +75,38 @@ clean:
indent:
clang-format -i -style="{BasedOnStyle: Google, IndentWidth: 8, UseTab: Always, AllowShortIfStatementsOnASingleLine: false, ColumnLimit: 0, ContinuationIndentWidth: 8, SpaceAfterCStyleCast: true, IndentCaseLabels: false, AllowShortBlocksOnASingleLine: false, AllowShortFunctionsOnASingleLine: false, SortIncludes: false}" $(C) $(H)
###########################################################################
#
# EXTERNAL DEPENDENCIES
mvt.o serial.o decode.o: protozero-1.5.1/include/protozero/pbf_reader.hpp
protozero-1.5.1/include/protozero/pbf_reader.hpp:
curl -s -L https://github.com/mapbox/protozero/archive/v1.5.1.tar.gz | gzip -dc | tar xf -
geometry.o: wagyu-0.4.1/include/mapbox/geometry/wagyu/wagyu.hpp
wagyu-0.4.1/include/mapbox/geometry/wagyu/wagyu.hpp:
curl -s -L https://github.com/mapbox/wagyu/archive/0.4.1.tar.gz | gzip -dc | tar xf -
geometry.o: geometry.hpp-0.9.0-gcc-4.9/include/mapbox/geometry/geometry.hpp
geometry.hpp-0.9.0-gcc-4.9/include/mapbox/geometry/geometry.hpp:
curl -s -L https://github.com/mapbox/geometry.hpp/archive/v0.9.0-gcc-4.9.tar.gz | gzip -dc | tar xf -
unit.o: Catch-1.8.2/single_include/catch.hpp
Catch-1.8.2/single_include/catch.hpp:
curl -s -L https://github.com/philsquared/Catch/archive/v1.8.2.tar.gz | gzip -dc | tar xf -
###########################################################################
#
# TESTS
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)) parallel-test pbf-test join-test enumerate-test decode-test unit
./unit
# Work around Makefile and filename punctuation limits: _ for space, @ for :, % for /
@ -111,6 +139,13 @@ parallel-test:
cmp tests/parallel/linear-file.json tests/parallel/parallel-pipes.json
rm tests/parallel/*.mbtiles tests/parallel/*.json
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
@ -134,7 +169,7 @@ join-test:
./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 -z11 -Z4 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

View File

@ -132,6 +132,7 @@ resolution is obtained than by using a smaller _maxzoom_ or _detail_.
* -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.
* -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.
### Doing less
@ -141,12 +142,18 @@ resolution is obtained than by using a smaller _maxzoom_ or _detail_.
* -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.
* -pp or --no-polygon-splitting: This no longer has any effect.
* -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
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 +258,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 +283,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
@ -403,3 +407,6 @@ resolutions.
### Options
* -t _projection_: Specify the projection of the output data. Currently supported are EPSG:4326 (WGS84, the default) and EPSG:3857 (Web Mercator).
* -z _maxzoom_: Specify the highest zoom level to decode from the tileset
* -Z _minzoom_: Specify the lowest zoom level to decode from the tileset
* -l _layer_: Decode only layers with the specified names. (Multiple `-l` options can be specified.)

View File

@ -1,23 +0,0 @@
Boost Software License - Version 1.0 - August 17th, 2003
Permission is hereby granted, free of charge, to any person or organization
obtaining a copy of the software and accompanying documentation covered by
this license (the "Software") to use, reproduce, display, distribute,
execute, and transmit the Software, and to prepare derivative works of the
Software, and to permit third-parties to whom the Software is furnished to
do so, all subject to the following:
The copyright notices in the Software and this entire statement, including
the above license grant, this restriction and the following disclaimer,
must be included in all copies of the Software, in whole or in part, and
all derivative works of the Software, unless such copies or derivative
works are solely in the form of machine-executable object code generated by
a source language processor.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.

File diff suppressed because it is too large Load Diff

View File

@ -6,6 +6,7 @@
#include <string>
#include <vector>
#include <map>
#include <set>
#include <zlib.h>
#include <math.h>
#include <fcntl.h>
@ -16,6 +17,9 @@
#include "projection.hpp"
#include "geometry.hpp"
int minzoom = 0;
int maxzoom = 32;
void printq(const char *s) {
putchar('"');
for (; *s; s++) {
@ -46,7 +50,7 @@ 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;
@ -74,12 +78,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 +99,7 @@ void handle(std::string message, int z, unsigned x, unsigned y, int describe) {
printf(" }");
printf(", \"features\": [\n");
first_layer = false;
within = 0;
}
@ -330,7 +340,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 +355,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 +406,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 +432,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 +460,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 +479,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 +487,35 @@ 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) {
while ((i = getopt(argc, argv, "t:Z:z:l:")) != -1) {
switch (i) {
case 't':
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;
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);
}

View File

@ -75,7 +75,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 +96,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 +116,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;
}
@ -241,17 +257,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;
}
}
}
@ -336,8 +367,12 @@ 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);
}

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

@ -71,3 +71,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

@ -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;
}
@ -409,7 +416,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;
@ -708,6 +715,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 +1004,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, 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 ret = EXIT_SUCCESS;
struct reader reader[CPUS];
@ -1101,26 +1111,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 +1148,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 +1158,21 @@ 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;
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,6 +1184,13 @@ 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;
@ -1210,7 +1209,7 @@ 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);
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);
overall_offset += st.st_size - off;
checkdisk(reader, CPUS);
@ -1221,7 +1220,7 @@ int read_input(std::vector<source> &sources, char *fname, const char *layername,
} 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);
@ -1278,7 +1277,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);
initial_offset += ahead;
overall_offset += ahead;
@ -1315,7 +1314,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);
if (parser_created) {
if (pthread_join(parallel_parser, NULL) != 0) {
@ -1332,7 +1331,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);
json_end(jp);
overall_offset = layer_seq;
checkdisk(reader, CPUS);
@ -1870,7 +1869,7 @@ int main(int argc, char **argv) {
int i;
char *name = NULL;
char *layer = NULL;
char *layername = NULL;
char *outdir = NULL;
int maxzoom = 14;
int minzoom = 0;
@ -1941,6 +1940,7 @@ int main(int argc, char **argv) {
{"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},
{"detect-longitude-wraparound", no_argument, &additional[A_DETECT_WRAPAROUND], 1},
{"no-line-simplification", no_argument, &prevent[P_SIMPLIFY], 1},
{"simplify-only-low-zooms", no_argument, &prevent[P_SIMPLIFY_LOW], 1},
@ -1984,7 +1984,7 @@ int main(int argc, char **argv) {
break;
case 'l':
layer = optarg;
layername = optarg;
break;
case 'A':
@ -2250,9 +2250,22 @@ 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 : outdir, maxzoom, minzoom, basezoom, basezoom_marker_width, outdb, &exclude, &include, exclude_all, droprate, buffer, tmpdir, gamma, read_parallel, forcetable, attribution, gamma != 0, file_bbox);
mbtiles_close(outdb, argv);

View File

@ -188,6 +188,10 @@ which may not be what you want.
.IP \(bu 2
\-q or \-\-quiet: Work quietly instead of reporting progress
.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
@ -335,7 +339,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
@ -476,4 +480,10 @@ resolutions.
.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).
.IP \(bu 2
\-z \fImaxzoom\fP: Specify the highest zoom level to decode from the tileset
.IP \(bu 2
\-Z \fIminzoom\fP: Specify the lowest zoom level to decode from the tileset
.IP \(bu 2
\-l \fIlayer\fP: Decode only layers with the specified names. (Multiple \fB\fC\-l\fR options can be specified.)
.RE

View File

@ -1,13 +0,0 @@
Copyright (c) 2016, Mapbox
Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

View File

@ -1,25 +0,0 @@
Copyright (c) MapBox
All rights reserved.
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
- Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this
list of conditions and the following disclaimer in the documentation and/or
other materials provided with the distribution.
- Neither the name "MapBox" nor the names of its contributors may be
used to endorse or promote products derived from this software without
specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

View File

@ -1,37 +0,0 @@
Parts of the code in the Wagyu Library are derived from the version of the
Clipper Library by Angus Johnson listed below.
Author : Angus Johnson
Version : 6.4.0
Date : 2 July 2015
Website : http://www.angusj.com
Copyright for portions of the derived code in the Wagyu library are held
by Angus Johnson, 2010-2015. All other copyright for the Wagyu Library are held by
Mapbox, 2016. This code is published in accordance with, and retains the same license
as the Clipper Library by Angus Johnson.
Copyright (c) 2010-2015, Angus Johnson
Copyright (c) 2016, Mapbox
Permission is hereby granted, free of charge, to any person or organization
obtaining a copy of the software and accompanying documentation covered by
this license (the "Software") to use, reproduce, display, distribute,
execute, and transmit the Software, and to prepare derivative works of the
Software, and to permit third-parties to whom the Software is furnished to
do so, all subject to the following:
The copyright notices in the Software and this entire statement, including
the above license grant, this restriction and the following disclaimer,
must be included in all copies of the Software, in whole or in part, and
all derivative works of the Software, unless such copies or derivative
works are solely in the form of machine-executable object code generated by
a source language processor.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.

View File

@ -1,13 +0,0 @@
#pragma once
#include <mapbox/geometry/point.hpp>
#include <mapbox/geometry/line_string.hpp>
#include <mapbox/geometry/polygon.hpp>
#include <mapbox/geometry/multi_point.hpp>
#include <mapbox/geometry/multi_line_string.hpp>
#include <mapbox/geometry/multi_polygon.hpp>
#include <mapbox/geometry/geometry.hpp>
#include <mapbox/geometry/feature.hpp>
#include <mapbox/geometry/point_arithmetic.hpp>
#include <mapbox/geometry/for_each_point.hpp>
#include <mapbox/geometry/envelope.hpp>

View File

@ -1,34 +0,0 @@
#pragma once
#include <mapbox/geometry/point.hpp>
namespace mapbox {
namespace geometry {
template <typename T>
struct box
{
using point_type = point<T>;
constexpr box(point_type const& min_, point_type const& max_)
: min(min_), max(max_)
{}
point_type min;
point_type max;
};
template <typename T>
constexpr bool operator==(box<T> const& lhs, box<T> const& rhs)
{
return lhs.min == rhs.min && lhs.max == rhs.max;
}
template <typename T>
constexpr bool operator!=(box<T> const& lhs, box<T> const& rhs)
{
return lhs.min != rhs.min || lhs.max != rhs.max;
}
} // namespace geometry
} // namespace mapbox

View File

@ -1,33 +0,0 @@
#pragma once
#include <mapbox/geometry/box.hpp>
#include <mapbox/geometry/for_each_point.hpp>
#include <limits>
namespace mapbox {
namespace geometry {
template <typename G, typename T = typename G::coordinate_type>
box<T> envelope(G const& geometry)
{
using limits = std::numeric_limits<T>;
T min_t = limits::has_infinity ? -limits::infinity() : limits::min();
T max_t = limits::has_infinity ? limits::infinity() : limits::max();
point<T> min(max_t, max_t);
point<T> max(min_t, min_t);
for_each_point(geometry, [&] (point<T> const& point) {
if (min.x > point.x) min.x = point.x;
if (min.y > point.y) min.y = point.y;
if (max.x < point.x) max.x = point.x;
if (max.y < point.y) max.y = point.y;
});
return box<T>(min, max);
}
} // namespace geometry
} // namespace mapbox

View File

@ -1,81 +0,0 @@
#pragma once
#include <mapbox/geometry/geometry.hpp>
#include <mapbox/variant.hpp>
#include <cstdint>
#include <string>
#include <vector>
#include <unordered_map>
#include <experimental/optional>
namespace mapbox {
namespace geometry {
struct value;
struct null_value_t
{
constexpr null_value_t() {}
constexpr null_value_t(std::nullptr_t) {}
};
constexpr bool operator==(const null_value_t&, const null_value_t&) { return true; }
constexpr bool operator!=(const null_value_t&, const null_value_t&) { return false; }
constexpr null_value_t null_value = null_value_t();
// Multiple numeric types (uint64_t, int64_t, double) are present in order to support
// the widest possible range of JSON numbers, which do not have a maximum range.
// Implementations that produce `value`s should use that order for type preference,
// using uint64_t for positive integers, int64_t for negative integers, and double
// for non-integers and integers outside the range of 64 bits.
using value_base = mapbox::util::variant<null_value_t, bool, uint64_t, int64_t, double, std::string,
mapbox::util::recursive_wrapper<std::vector<value>>,
mapbox::util::recursive_wrapper<std::unordered_map<std::string, value>>>;
struct value : value_base
{
using value_base::value_base;
};
using property_map = std::unordered_map<std::string, value>;
// The same considerations and requirement for numeric types apply as for `value_base`.
using identifier = mapbox::util::variant<uint64_t, int64_t, double, std::string>;
template <class T>
struct feature
{
using coordinate_type = T;
using geometry_type = mapbox::geometry::geometry<T>; // Fully qualified to avoid GCC -fpermissive error.
geometry_type geometry;
property_map properties {};
std::experimental::optional<identifier> id {};
};
template <class T>
constexpr bool operator==(feature<T> const& lhs, feature<T> const& rhs)
{
return lhs.id == rhs.id && lhs.geometry == rhs.geometry && lhs.properties == rhs.properties;
}
template <class T>
constexpr bool operator!=(feature<T> const& lhs, feature<T> const& rhs)
{
return !(lhs == rhs);
}
template <class T, template <typename...> class Cont = std::vector>
struct feature_collection : Cont<feature<T>>
{
using coordinate_type = T;
using feature_type = feature<T>;
using container_type = Cont<feature_type>;
using container_type::container_type;
};
} // namespace geometry
} // namespace mapbox

View File

@ -1,45 +0,0 @@
#pragma once
#include <mapbox/geometry/geometry.hpp>
namespace mapbox {
namespace geometry {
template <typename Point, typename F>
auto for_each_point(Point&& point, F&& f)
-> decltype(point.x, point.y, void())
{
f(std::forward<Point>(point));
}
template <typename Container, typename F>
auto for_each_point(Container&& container, F&& f)
-> decltype(container.begin(), container.end(), void());
template <typename...Types, typename F>
void for_each_point(mapbox::util::variant<Types...> const& geom, F&& f)
{
mapbox::util::variant<Types...>::visit(geom, [&] (auto const& g) {
for_each_point(g, f);
});
}
template <typename...Types, typename F>
void for_each_point(mapbox::util::variant<Types...> & geom, F&& f)
{
mapbox::util::variant<Types...>::visit(geom, [&] (auto & g) {
for_each_point(g, f);
});
}
template <typename Container, typename F>
auto for_each_point(Container&& container, F&& f)
-> decltype(container.begin(), container.end(), void())
{
for (auto& e: container) {
for_each_point(e, f);
}
}
} // namespace geometry
} // namespace mapbox

View File

@ -1,53 +0,0 @@
#pragma once
#include <mapbox/geometry/point.hpp>
#include <mapbox/geometry/line_string.hpp>
#include <mapbox/geometry/polygon.hpp>
#include <mapbox/geometry/multi_point.hpp>
#include <mapbox/geometry/multi_line_string.hpp>
#include <mapbox/geometry/multi_polygon.hpp>
#include <mapbox/variant.hpp>
// stl
#include <vector>
namespace mapbox {
namespace geometry {
template <typename T, template <typename...> class Cont = std::vector>
struct geometry_collection;
template <typename T>
using geometry_base = mapbox::util::variant<point<T>,
line_string<T>,
polygon<T>,
multi_point<T>,
multi_line_string<T>,
multi_polygon<T>,
geometry_collection<T>>;
template <typename T>
struct geometry : geometry_base<T>
{
using coordinate_type = T;
using geometry_base<T>::geometry_base;
/*
* The default constructor would create a point geometry with default-constructed coordinates;
* i.e. (0, 0). Since this is not particularly useful, and could hide bugs, it is disabled.
*/
geometry() = delete;
};
template <typename T, template <typename...> class Cont>
struct geometry_collection : Cont<geometry<T>>
{
using coordinate_type = T;
using geometry_type = geometry<T>;
using container_type = Cont<geometry_type>;
using container_type::container_type;
};
} // namespace geometry
} // namespace mapbox

View File

@ -1,21 +0,0 @@
#pragma once
// mapbox
#include <mapbox/geometry/point.hpp>
// stl
#include <vector>
namespace mapbox {
namespace geometry {
template <typename T, template <typename...> class Cont = std::vector>
struct line_string : Cont<point<T> >
{
using coordinate_type = T;
using point_type = point<T>;
using container_type = Cont<point_type>;
using container_type::container_type;
};
} // namespace geometry
} // namespace mapbox

View File

@ -1,21 +0,0 @@
#pragma once
// mapbox
#include <mapbox/geometry/line_string.hpp>
// stl
#include <vector>
namespace mapbox {
namespace geometry {
template <typename T, template <typename...> class Cont = std::vector>
struct multi_line_string : Cont<line_string<T>>
{
using coordinate_type = T;
using line_string_type = line_string<T>;
using container_type = Cont<line_string_type>;
using container_type::container_type;
};
} // namespace geometry
} // namespace mapbox

View File

@ -1,21 +0,0 @@
#pragma once
// mapbox
#include <mapbox/geometry/point.hpp>
// stl
#include <vector>
namespace mapbox {
namespace geometry {
template <typename T, template <typename...> class Cont = std::vector>
struct multi_point : Cont<point<T>>
{
using coordinate_type = T;
using point_type = point<T>;
using container_type = Cont<point_type>;
using container_type::container_type;
};
} // namespace geometry
} // namespace mapbox

View File

@ -1,21 +0,0 @@
#pragma once
// mapbox
#include <mapbox/geometry/polygon.hpp>
// stl
#include <vector>
namespace mapbox {
namespace geometry {
template <typename T, template <typename...> class Cont = std::vector>
struct multi_polygon : Cont<polygon<T>>
{
using coordinate_type = T;
using polygon_type = polygon<T>;
using container_type = Cont<polygon_type>;
using container_type::container_type;
};
} // namespace geometry
} // namespace mapbox

View File

@ -1,35 +0,0 @@
#pragma once
namespace mapbox {
namespace geometry {
template <typename T>
struct point
{
using coordinate_type = T;
constexpr point()
: x(), y()
{}
constexpr point(T x_, T y_)
: x(x_), y(y_)
{}
T x;
T y;
};
template <typename T>
constexpr bool operator==(point<T> const& lhs, point<T> const& rhs)
{
return lhs.x == rhs.x && lhs.y == rhs.y;
}
template <typename T>
constexpr bool operator!=(point<T> const& lhs, point<T> const& rhs)
{
return !(lhs == rhs);
}
} // namespace geometry
} // namespace mapbox

View File

@ -1,119 +0,0 @@
#pragma once
namespace mapbox {
namespace geometry {
template <typename T>
constexpr point<T> operator+(point<T> const& lhs, point<T> const& rhs)
{
return point<T>(lhs.x + rhs.x, lhs.y + rhs.y);
}
template <typename T>
constexpr point<T> operator+(point<T> const& lhs, T const& rhs)
{
return point<T>(lhs.x + rhs, lhs.y + rhs);
}
template <typename T>
constexpr point<T> operator-(point<T> const& lhs, point<T> const& rhs)
{
return point<T>(lhs.x - rhs.x, lhs.y - rhs.y);
}
template <typename T>
constexpr point<T> operator-(point<T> const& lhs, T const& rhs)
{
return point<T>(lhs.x - rhs, lhs.y - rhs);
}
template <typename T>
constexpr point<T> operator*(point<T> const& lhs, point<T> const& rhs)
{
return point<T>(lhs.x * rhs.x, lhs.y * rhs.y);
}
template <typename T>
constexpr point<T> operator*(point<T> const& lhs, T const& rhs)
{
return point<T>(lhs.x * rhs, lhs.y * rhs);
}
template <typename T>
constexpr point<T> operator/(point<T> const& lhs, point<T> const& rhs)
{
return point<T>(lhs.x / rhs.x, lhs.y / rhs.y);
}
template <typename T>
constexpr point<T> operator/(point<T> const& lhs, T const& rhs)
{
return point<T>(lhs.x / rhs, lhs.y / rhs);
}
template <typename T>
constexpr point<T>& operator+=(point<T>& lhs, point<T> const& rhs)
{
lhs.x += rhs.x;
lhs.y += rhs.y;
return lhs;
}
template <typename T>
constexpr point<T>& operator+=(point<T>& lhs, T const& rhs)
{
lhs.x += rhs;
lhs.y += rhs;
return lhs;
}
template <typename T>
constexpr point<T>& operator-=(point<T>& lhs, point<T> const& rhs)
{
lhs.x -= rhs.x;
lhs.y -= rhs.y;
return lhs;
}
template <typename T>
constexpr point<T>& operator-=(point<T>& lhs, T const& rhs)
{
lhs.x -= rhs;
lhs.y -= rhs;
return lhs;
}
template <typename T>
constexpr point<T>& operator*=(point<T>& lhs, point<T> const& rhs)
{
lhs.x *= rhs.x;
lhs.y *= rhs.y;
return lhs;
}
template <typename T>
constexpr point<T>& operator*=(point<T>& lhs, T const& rhs)
{
lhs.x *= rhs;
lhs.y *= rhs;
return lhs;
}
template <typename T>
constexpr point<T>& operator/=(point<T>& lhs, point<T> const& rhs)
{
lhs.x /= rhs.x;
lhs.y /= rhs.y;
return lhs;
}
template <typename T>
constexpr point<T>& operator/=(point<T>& lhs, T const& rhs)
{
lhs.x /= rhs;
lhs.y /= rhs;
return lhs;
}
} // namespace geometry
} // namespace mapbox

View File

@ -1,31 +0,0 @@
#pragma once
// mapbox
#include <mapbox/geometry/point.hpp>
// stl
#include <vector>
namespace mapbox {
namespace geometry {
template <typename T, template <typename...> class Cont = std::vector>
struct linear_ring : Cont<point<T>>
{
using coordinate_type = T;
using point_type = point<T>;
using container_type = Cont<point_type>;
using container_type::container_type;
};
template <typename T, template <typename...> class Cont = std::vector>
struct polygon : Cont<linear_ring<T>>
{
using coordinate_type = T;
using linear_ring_type = linear_ring<T>;
using container_type = Cont<linear_ring_type>;
using container_type::container_type;
};
} // namespace geometry
} // namespace mapbox

View File

@ -0,0 +1,469 @@
#include <mapbox/geometry/point.hpp>
#include <mapbox/geometry/polygon.hpp>
#include <mapbox/geometry/multi_polygon.hpp>
#include <mapbox/geometry/multi_line_string.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

@ -1,425 +0,0 @@
#pragma once
#ifdef DEBUG
#include <iostream>
#include <sstream>
#endif
#include <mapbox/geometry/wagyu/bound.hpp>
#include <mapbox/geometry/wagyu/config.hpp>
#include <mapbox/geometry/wagyu/edge.hpp>
#include <mapbox/geometry/wagyu/local_minimum.hpp>
#include <mapbox/geometry/wagyu/local_minimum_util.hpp>
#include <mapbox/geometry/wagyu/ring.hpp>
#include <mapbox/geometry/wagyu/scanbeam.hpp>
#include <mapbox/geometry/wagyu/util.hpp>
namespace mapbox {
namespace geometry {
namespace wagyu {
template <typename T>
using active_bound_list = std::list<bound_ptr<T>>;
template <typename T>
using active_bound_list_itr = typename active_bound_list<T>::iterator;
template <typename T>
using active_bound_list_rev_itr = typename active_bound_list<T>::reverse_iterator;
#ifdef DEBUG
template <class charT, class traits, typename T>
inline std::basic_ostream<charT, traits>& operator<<(std::basic_ostream<charT, traits>& out,
const active_bound_list<T>& bnds) {
std::size_t c = 0;
for (auto const& bnd : bnds) {
out << "Index: " << c++ << std::endl;
out << *bnd;
}
return out;
}
template <typename T>
std::string output_edges(active_bound_list<T> const& bnds) {
std::ostringstream out;
out << "[";
bool first = true;
for (auto const& bnd : bnds) {
if (first) {
first = false;
} else {
out << ",";
}
out << "[[" << bnd->current_edge->bot.x << "," << bnd->current_edge->bot.y << "],[";
out << bnd->current_edge->top.x << "," << bnd->current_edge->top.y << "]]";
}
out << "]";
return out.str();
}
#endif
template <typename T>
bool is_even_odd_fill_type(bound<T> const& bound,
fill_type subject_fill_type,
fill_type clip_fill_type) {
if (bound.poly_type == polygon_type_subject) {
return subject_fill_type == fill_type_even_odd;
} else {
return clip_fill_type == fill_type_even_odd;
}
}
template <typename T>
bool is_even_odd_alt_fill_type(bound<T> const& bound,
fill_type subject_fill_type,
fill_type clip_fill_type) {
if (bound.poly_type == polygon_type_subject) {
return clip_fill_type == fill_type_even_odd;
} else {
return subject_fill_type == fill_type_even_odd;
}
}
template <typename T>
inline bool bound2_inserts_before_bound1(bound<T> const& bound1, bound<T> const& bound2) {
if (values_are_equal(bound2.current_x, bound1.current_x)) {
if (bound2.current_edge->top.y > bound1.current_edge->top.y) {
return bound2.current_edge->top.x <
get_current_x(*(bound1.current_edge), bound2.current_edge->top.y);
} else {
return bound1.current_edge->top.x >
get_current_x(*(bound2.current_edge), bound1.current_edge->top.y);
}
} else {
return bound2.current_x < bound1.current_x;
}
}
template <typename T>
active_bound_list_itr<T> insert_bound_into_ABL(bound<T>& bnd, active_bound_list<T>& active_bounds) {
auto itr = active_bounds.begin();
while (itr != active_bounds.end() && !bound2_inserts_before_bound1(*(*itr), bnd)) {
++itr;
}
return active_bounds.insert(itr, &bnd);
}
template <typename T>
active_bound_list_itr<T> insert_bound_into_ABL(bound<T>& bnd,
active_bound_list_itr<T> itr,
active_bound_list<T>& active_bounds) {
while (itr != active_bounds.end() && !bound2_inserts_before_bound1(*(*itr), bnd)) {
++itr;
}
return active_bounds.insert(itr, &bnd);
}
template <typename T>
inline bool is_maxima(bound<T>& bnd, T y) {
return bnd.next_edge == bnd.edges.end() && bnd.current_edge->top.y == y;
}
template <typename T>
inline bool is_maxima(active_bound_list_itr<T>& bnd, T y) {
return is_maxima(*(*bnd), y);
}
template <typename T>
inline bool is_intermediate(bound<T>& bnd, T y) {
return bnd.next_edge != bnd.edges.end() && bnd.current_edge->top.y == y;
}
template <typename T>
inline bool is_intermediate(active_bound_list_itr<T>& bnd, T y) {
return is_intermediate(*(*bnd), y);
}
template <typename T>
inline bool current_edge_is_horizontal(active_bound_list_itr<T>& bnd) {
return is_horizontal(*((*bnd)->current_edge));
}
template <typename T>
inline bool next_edge_is_horizontal(active_bound_list_itr<T>& bnd) {
return is_horizontal(*((*bnd)->next_edge));
}
template <typename T>
inline void swap_positions_in_ABL(active_bound_list_itr<T>& bnd1,
active_bound_list_itr<T>& bnd2,
active_bound_list<T>& active_bounds) {
if (std::next(bnd2) == bnd1) {
active_bounds.splice(bnd2, active_bounds, bnd1);
} else {
active_bounds.splice(bnd1, active_bounds, bnd2);
}
}
template <typename T>
void next_edge_in_bound(active_bound_list_itr<T>& bnd, scanbeam_list<T>& scanbeam) {
++((*bnd)->current_edge);
if ((*bnd)->current_edge != (*bnd)->edges.end()) {
++((*bnd)->next_edge);
(*bnd)->current_x = static_cast<double>((*bnd)->current_edge->bot.x);
if (!current_edge_is_horizontal<T>(bnd)) {
scanbeam.push((*bnd)->current_edge->top.y);
}
}
}
template <typename T>
active_bound_list_itr<T> get_maxima_pair(active_bound_list_itr<T> bnd,
active_bound_list<T>& active_bounds) {
auto bnd_itr = active_bounds.begin();
while (bnd_itr != active_bounds.end()) {
if (*bnd_itr == (*bnd)->maximum_bound) {
break;
}
++bnd_itr;
}
return bnd_itr;
}
template <typename T>
void set_winding_count(active_bound_list_itr<T>& bnd_itr,
active_bound_list<T>& active_bounds,
fill_type subject_fill_type,
fill_type clip_fill_type) {
auto rev_bnd_itr = active_bound_list_rev_itr<T>(bnd_itr);
if (rev_bnd_itr == active_bounds.rend()) {
(*bnd_itr)->winding_count = (*bnd_itr)->winding_delta;
(*bnd_itr)->winding_count2 = 0;
return;
}
// find the edge of the same polytype that immediately preceeds 'edge' in
// AEL
while (rev_bnd_itr != active_bounds.rend() &&
(*rev_bnd_itr)->poly_type != (*bnd_itr)->poly_type) {
++rev_bnd_itr;
}
if (rev_bnd_itr == active_bounds.rend()) {
(*bnd_itr)->winding_count = (*bnd_itr)->winding_delta;
(*bnd_itr)->winding_count2 = 0;
} else if (is_even_odd_fill_type(*(*bnd_itr), subject_fill_type, clip_fill_type)) {
// EvenOdd filling ...
(*bnd_itr)->winding_count = (*bnd_itr)->winding_delta;
(*bnd_itr)->winding_count2 = (*rev_bnd_itr)->winding_count2;
} else {
// nonZero, Positive or Negative filling ...
if ((*rev_bnd_itr)->winding_count * (*rev_bnd_itr)->winding_delta < 0) {
// prev edge is 'decreasing' WindCount (WC) toward zero
// so we're outside the previous polygon ...
if (std::abs(static_cast<int>((*rev_bnd_itr)->winding_count)) > 1) {
// outside prev poly but still inside another.
// when reversing direction of prev poly use the same WC
if ((*rev_bnd_itr)->winding_delta * (*bnd_itr)->winding_delta < 0) {
(*bnd_itr)->winding_count = (*rev_bnd_itr)->winding_count;
} else {
// otherwise continue to 'decrease' WC ...
(*bnd_itr)->winding_count =
(*rev_bnd_itr)->winding_count + (*bnd_itr)->winding_delta;
}
} else {
// now outside all polys of same polytype so set own WC ...
(*bnd_itr)->winding_count = (*bnd_itr)->winding_delta;
}
} else {
// prev edge is 'increasing' WindCount (WC) away from zero
// so we're inside the previous polygon ...
if ((*rev_bnd_itr)->winding_delta * (*bnd_itr)->winding_delta < 0) {
// if wind direction is reversing prev then use same WC
(*bnd_itr)->winding_count = (*rev_bnd_itr)->winding_count;
} else {
// otherwise add to WC ...
(*bnd_itr)->winding_count =
(*rev_bnd_itr)->winding_count + (*bnd_itr)->winding_delta;
}
}
(*bnd_itr)->winding_count2 = (*rev_bnd_itr)->winding_count2;
}
// update winding_count2 ...
auto bnd_itr_forward = rev_bnd_itr.base();
if (is_even_odd_alt_fill_type(*(*bnd_itr), subject_fill_type, clip_fill_type)) {
// EvenOdd filling ...
while (bnd_itr_forward != bnd_itr) {
if ((*bnd_itr_forward)->winding_delta != 0) {
(*bnd_itr)->winding_count2 = ((*bnd_itr)->winding_count2 == 0 ? 1 : 0);
}
++bnd_itr_forward;
}
} else {
// nonZero, Positive or Negative filling ...
while (bnd_itr_forward != bnd_itr) {
(*bnd_itr)->winding_count2 += (*bnd_itr_forward)->winding_delta;
++bnd_itr_forward;
}
}
}
template <typename T>
bool is_contributing(bound<T> const& bnd,
clip_type cliptype,
fill_type subject_fill_type,
fill_type clip_fill_type) {
fill_type pft = subject_fill_type;
fill_type pft2 = clip_fill_type;
if (bnd.poly_type != polygon_type_subject) {
pft = clip_fill_type;
pft2 = subject_fill_type;
}
switch (pft) {
case fill_type_even_odd:
break;
case fill_type_non_zero:
if (std::abs(static_cast<int>(bnd.winding_count)) != 1) {
return false;
}
break;
case fill_type_positive:
if (bnd.winding_count != 1) {
return false;
}
break;
case fill_type_negative:
default:
if (bnd.winding_count != -1) {
return false;
}
}
switch (cliptype) {
case clip_type_intersection:
switch (pft2) {
case fill_type_even_odd:
case fill_type_non_zero:
return (bnd.winding_count2 != 0);
case fill_type_positive:
return (bnd.winding_count2 > 0);
case fill_type_negative:
default:
return (bnd.winding_count2 < 0);
}
break;
case clip_type_union:
switch (pft2) {
case fill_type_even_odd:
case fill_type_non_zero:
return (bnd.winding_count2 == 0);
case fill_type_positive:
return (bnd.winding_count2 <= 0);
case fill_type_negative:
default:
return (bnd.winding_count2 >= 0);
}
break;
case clip_type_difference:
if (bnd.poly_type == polygon_type_subject) {
switch (pft2) {
case fill_type_even_odd:
case fill_type_non_zero:
return (bnd.winding_count2 == 0);
case fill_type_positive:
return (bnd.winding_count2 <= 0);
case fill_type_negative:
default:
return (bnd.winding_count2 >= 0);
}
} else {
switch (pft2) {
case fill_type_even_odd:
case fill_type_non_zero:
return (bnd.winding_count2 != 0);
case fill_type_positive:
return (bnd.winding_count2 > 0);
case fill_type_negative:
default:
return (bnd.winding_count2 < 0);
}
}
break;
case clip_type_x_or:
return true;
break;
default:
return true;
}
}
template <typename T>
void insert_lm_left_and_right_bound(bound<T>& left_bound,
bound<T>& right_bound,
active_bound_list<T>& active_bounds,
ring_manager<T>& rings,
scanbeam_list<T>& scanbeam,
clip_type cliptype,
fill_type subject_fill_type,
fill_type clip_fill_type) {
// Both left and right bound
auto lb_abl_itr = insert_bound_into_ABL(left_bound, active_bounds);
auto rb_abl_itr = active_bounds.insert(std::next(lb_abl_itr), &right_bound);
set_winding_count(lb_abl_itr, active_bounds, subject_fill_type, clip_fill_type);
(*rb_abl_itr)->winding_count = (*lb_abl_itr)->winding_count;
(*rb_abl_itr)->winding_count2 = (*lb_abl_itr)->winding_count2;
if (is_contributing(left_bound, cliptype, subject_fill_type, clip_fill_type)) {
add_local_minimum_point(lb_abl_itr, rb_abl_itr, active_bounds,
(*lb_abl_itr)->current_edge->bot, rings);
}
// Add top of edges to scanbeam
scanbeam.push((*lb_abl_itr)->current_edge->top.y);
if (!current_edge_is_horizontal<T>(rb_abl_itr)) {
scanbeam.push((*rb_abl_itr)->current_edge->top.y);
}
}
template <typename T>
void insert_local_minima_into_ABL(T const bot_y,
local_minimum_ptr_list<T> const& minima_sorted,
local_minimum_ptr_list_itr<T>& current_lm,
active_bound_list<T>& active_bounds,
ring_manager<T>& rings,
scanbeam_list<T>& scanbeam,
clip_type cliptype,
fill_type subject_fill_type,
fill_type clip_fill_type) {
while (current_lm != minima_sorted.end() && bot_y == (*current_lm)->y) {
initialize_lm<T>(current_lm);
auto& left_bound = (*current_lm)->left_bound;
auto& right_bound = (*current_lm)->right_bound;
insert_lm_left_and_right_bound(left_bound, right_bound, active_bounds, rings, scanbeam,
cliptype, subject_fill_type, clip_fill_type);
++current_lm;
}
}
template <typename T>
void insert_horizontal_local_minima_into_ABL(T const top_y,
local_minimum_ptr_list<T> const& minima_sorted,
local_minimum_ptr_list_itr<T>& current_lm,
active_bound_list<T>& active_bounds,
ring_manager<T>& rings,
scanbeam_list<T>& scanbeam,
clip_type cliptype,
fill_type subject_fill_type,
fill_type clip_fill_type) {
while (current_lm != minima_sorted.end() && top_y == (*current_lm)->y &&
(*current_lm)->minimum_has_horizontal) {
initialize_lm<T>(current_lm);
auto& left_bound = (*current_lm)->left_bound;
auto& right_bound = (*current_lm)->right_bound;
insert_lm_left_and_right_bound(left_bound, right_bound, active_bounds, rings, scanbeam,
cliptype, subject_fill_type, clip_fill_type);
++current_lm;
}
}
}
}
}

View File

@ -1,95 +0,0 @@
#pragma once
#include <list>
#include <mapbox/geometry/point.hpp>
#include <mapbox/geometry/wagyu/config.hpp>
#include <mapbox/geometry/wagyu/edge.hpp>
#include <mapbox/geometry/wagyu/ring.hpp>
#ifdef DEBUG
#include <iostream>
#endif
namespace mapbox {
namespace geometry {
namespace wagyu {
template <typename T>
struct bound {
edge_list<T> edges;
edge_list_itr<T> current_edge;
edge_list_itr<T> next_edge;
mapbox::geometry::point<T> last_point;
ring_ptr<T> ring;
bound_ptr<T> maximum_bound; // the bound who's maximum connects with this bound
double current_x;
std::size_t pos;
std::int32_t winding_count;
std::int32_t winding_count2; // winding count of the opposite polytype
std::int8_t winding_delta; // 1 or -1 depending on winding direction - 0 for linestrings
polygon_type poly_type;
edge_side side; // side only refers to current side of solution poly
bound() noexcept
: edges(),
current_edge(edges.end()),
last_point({ 0, 0 }),
ring(nullptr),
maximum_bound(nullptr),
current_x(0.0),
pos(0),
winding_count(0),
winding_count2(0),
winding_delta(0),
poly_type(polygon_type_subject),
side(edge_left) {
}
bound(bound<T>&& b) noexcept
: edges(std::move(b.edges)),
current_edge(std::move(b.current_edge)),
last_point(std::move(b.last_point)),
ring(std::move(b.ring)),
maximum_bound(std::move(b.maximum_bound)),
current_x(std::move(b.current_x)),
pos(std::move(b.pos)),
winding_count(std::move(b.winding_count)),
winding_count2(std::move(b.winding_count2)),
winding_delta(std::move(b.winding_delta)),
poly_type(std::move(b.poly_type)),
side(std::move(b.side)) {
}
};
#ifdef DEBUG
template <class charT, class traits, typename T>
inline std::basic_ostream<charT, traits>& operator<<(std::basic_ostream<charT, traits>& out,
const bound<T>& bnd) {
out << " Bound: " << &bnd << std::endl;
out << " current_x: " << bnd.current_x << std::endl;
out << " last_point: " << bnd.last_point.x << ", " << bnd.last_point.y << std::endl;
out << *(bnd.current_edge);
out << " winding count: " << bnd.winding_count << std::endl;
out << " winding_count2: " << bnd.winding_count2 << std::endl;
out << " winding_delta: " << static_cast<int>(bnd.winding_delta) << std::endl;
out << " maximum_bound: " << bnd.maximum_bound << std::endl;
if (bnd.side == edge_left) {
out << " side: left" << std::endl;
} else {
out << " side: right" << std::endl;
}
out << " ring: " << bnd.ring << std::endl;
if (bnd.ring) {
out << " ring index: " << bnd.ring->ring_index << std::endl;
}
return out;
}
#endif
}
}
}

View File

@ -1,181 +0,0 @@
#pragma once
#include <mapbox/geometry/line_string.hpp>
#include <mapbox/geometry/point.hpp>
#include <mapbox/geometry/polygon.hpp>
#include <mapbox/geometry/wagyu/config.hpp>
#include <mapbox/geometry/wagyu/edge.hpp>
#include <mapbox/geometry/wagyu/util.hpp>
namespace mapbox {
namespace geometry {
namespace wagyu {
template <typename T>
bool point_2_is_between_point_1_and_point_3(mapbox::geometry::point<T> const& pt1,
mapbox::geometry::point<T> const& pt2,
mapbox::geometry::point<T> const& pt3) {
if ((pt1 == pt3) || (pt1 == pt2) || (pt3 == pt2)) {
return false;
} else if (pt1.x != pt3.x) {
return (pt2.x > pt1.x) == (pt2.x < pt3.x);
} else {
return (pt2.y > pt1.y) == (pt2.y < pt3.y);
}
}
template <typename T>
bool build_edge_list(mapbox::geometry::linear_ring<T> const& path_geometry, edge_list<T>& edges) {
if (path_geometry.size() < 3) {
return false;
}
// As this is a loop, we need to first go backwards from end to try and find
// the proper starting point for the iterators before the beginning
auto itr_rev = path_geometry.rbegin();
auto itr = path_geometry.begin();
mapbox::geometry::point<T> pt1 = *itr_rev;
mapbox::geometry::point<T> pt2 = *itr;
// Find next non repeated point going backwards from
// end for pt1
while (pt1 == pt2) {
++itr_rev;
if (itr_rev == path_geometry.rend()) {
return false;
}
pt1 = *itr_rev;
}
++itr;
mapbox::geometry::point<T> pt3 = *itr;
auto itr_last = itr_rev.base();
mapbox::geometry::point<T> front_pt;
mapbox::geometry::point<T> back_pt;
while (true) {
if (pt3 == pt2) {
// Duplicate point advance itr, but do not
// advance other points
if (itr == itr_last) {
break;
}
++itr;
if (itr == itr_last) {
if (edges.empty()) {
break;
}
pt3 = front_pt;
} else {
pt3 = *itr;
}
continue;
}
// Now check if slopes are equal between two segments - either
// a spike or a collinear point - if so drop point number 2.
if (slopes_equal(pt1, pt2, pt3)) {
// We need to reconsider previously added points
// because the point it was using was found to be collinear
// or a spike
pt2 = pt1;
if (!edges.empty()) {
edges.pop_back(); // remove previous edge (pt1)
}
if (!edges.empty()) {
if (back_pt == edges.back().top) {
pt1 = edges.back().bot;
} else {
pt1 = edges.back().top;
}
back_pt = pt1;
} else {
// If this occurs we must look to the back of the
// ring for new points.
while (*itr_rev == pt2) {
++itr_rev;
if ((itr + 1) == itr_rev.base()) {
return false;
}
}
pt1 = *itr_rev;
itr_last = itr_rev.base();
}
continue;
}
if (edges.empty()) {
front_pt = pt2;
}
edges.emplace_back(pt2, pt3);
back_pt = pt2;
if (itr == itr_last) {
break;
}
pt1 = pt2;
pt2 = pt3;
++itr;
if (itr == itr_last) {
if (edges.empty()) {
break;
}
pt3 = front_pt;
} else {
pt3 = *itr;
}
}
bool modified = false;
do {
modified = false;
if (edges.size() < 3) {
return false;
}
auto& f = edges.front();
auto& b = edges.back();
if (slopes_equal(f, b)) {
if (f.bot == b.top) {
if (f.top == b.bot) {
edges.pop_back();
edges.erase(edges.begin());
} else {
f.bot = b.bot;
edges.pop_back();
}
modified = true;
} else if (f.top == b.bot) {
f.top = b.top;
edges.pop_back();
modified = true;
} else if (f.top == b.top && f.bot == b.bot) {
edges.pop_back();
edges.erase(edges.begin());
modified = true;
} else if (f.top == b.top) {
if (point_2_is_between_point_1_and_point_3(f.top, f.bot, b.bot)) {
b.top = f.bot;
edges.erase(edges.begin());
} else {
f.top = b.bot;
edges.pop_back();
}
modified = true;
} else if (f.bot == b.bot) {
if (point_2_is_between_point_1_and_point_3(f.bot, f.top, b.top)) {
b.bot = f.top;
edges.erase(edges.begin());
} else {
f.bot = b.top;
edges.pop_back();
}
modified = true;
}
}
} while (modified);
return true;
}
}
}
}

View File

@ -1,39 +0,0 @@
#pragma once
#include <mapbox/geometry/wagyu/build_edges.hpp>
#include <mapbox/geometry/wagyu/config.hpp>
#include <mapbox/geometry/wagyu/local_minimum.hpp>
#include <mapbox/geometry/wagyu/local_minimum_util.hpp>
namespace mapbox {
namespace geometry {
namespace wagyu {
template <typename T>
bool add_line_string(mapbox::geometry::line_string<T> const& path_geometry,
local_minimum_list<T>& minima_list) {
bool is_flat = true;
edge_list<T> new_edges;
new_edges.reserve(path_geometry.size());
if (!build_edge_list(path_geometry, new_edges, is_flat) || new_edges.empty()) {
return false;
}
add_line_to_local_minima_list(new_edges, minima_list, polygon_type_subject);
return true;
}
template <typename T>
bool add_linear_ring(mapbox::geometry::linear_ring<T> const& path_geometry,
local_minimum_list<T>& minima_list,
polygon_type p_type) {
edge_list<T> new_edges;
new_edges.reserve(path_geometry.size());
if (!build_edge_list(path_geometry, new_edges) || new_edges.empty()) {
return false;
}
add_ring_to_local_minima_list(new_edges, minima_list, p_type);
return true;
}
}
}
}

View File

@ -1,68 +0,0 @@
#pragma once
#include <mapbox/geometry/wagyu/ring.hpp>
#include <mapbox/geometry/wagyu/ring_util.hpp>
namespace mapbox {
namespace geometry {
namespace wagyu {
template <typename T>
void push_ring_to_polygon(mapbox::geometry::polygon<T>& poly, ring_ptr<T>& r, bool reverse_output) {
mapbox::geometry::linear_ring<T> lr;
lr.reserve(r->size + 1);
auto firstPt = r->points;
auto ptIt = r->points;
if (reverse_output) {
do {
lr.emplace_back(ptIt->x, ptIt->y);
ptIt = ptIt->next;
} while (ptIt != firstPt);
} else {
do {
lr.emplace_back(ptIt->x, ptIt->y);
ptIt = ptIt->prev;
} while (ptIt != firstPt);
}
lr.emplace_back(firstPt->x, firstPt->y); // close the ring
poly.push_back(lr);
}
template <typename T>
void build_result_polygons(std::vector<mapbox::geometry::polygon<T>>& solution,
ring_list<T>& rings,
bool reverse_output) {
for (auto& r : rings) {
assert(r->points);
std::size_t cnt = point_count(r->points);
if (cnt < 3) {
continue;
}
solution.emplace_back();
push_ring_to_polygon(solution.back(), r, reverse_output);
for (auto& c : r->children) {
assert(c->points);
cnt = point_count(c->points);
if (cnt < 3) {
continue;
}
push_ring_to_polygon(solution.back(), c, reverse_output);
}
for (auto& c : r->children) {
if (!c->children.empty()) {
build_result_polygons(solution, c->children, reverse_output);
}
}
}
}
template <typename T>
void build_result(std::vector<mapbox::geometry::polygon<T>>& solution,
ring_manager<T>& rings,
bool reverse_output) {
build_result_polygons(solution, rings.children, reverse_output);
}
}
}
}

View File

@ -1,53 +0,0 @@
#pragma once
#include <cassert>
#include <cstdint>
#include <list>
#include <stdexcept>
namespace mapbox {
namespace geometry {
namespace wagyu {
enum clip_type : std::uint8_t {
clip_type_intersection = 0,
clip_type_union,
clip_type_difference,
clip_type_x_or
};
enum polygon_type : std::uint8_t { polygon_type_subject = 0, polygon_type_clip };
enum fill_type : std::uint8_t {
fill_type_even_odd = 0,
fill_type_non_zero,
fill_type_positive,
fill_type_negative
};
static double const def_arc_tolerance = 0.25;
static int const EDGE_UNASSIGNED = -1; // edge not currently 'owning' a solution
static int const EDGE_SKIP = -2; // edge that would otherwise close a path
static std::int64_t const LOW_RANGE = 0x3FFFFFFF;
static std::int64_t const HIGH_RANGE = 0x3FFFFFFFFFFFFFFFLL;
enum horizontal_direction : std::uint8_t { right_to_left = 0, left_to_right = 1 };
enum edge_side : std::uint8_t { edge_left = 0, edge_right };
enum join_type : std::uint8_t { join_type_square = 0, join_type_round, join_type_miter };
enum end_type {
end_type_closed_polygon = 0,
end_type_closed_line,
end_type_open_butt,
end_type_open_square,
end_type_open_round
};
template <typename T>
using maxima_list = std::list<T>;
}
}
}

View File

@ -1,120 +0,0 @@
#pragma once
#include <cmath>
#include <limits>
#include <list>
#include <mapbox/geometry/point.hpp>
#include <mapbox/geometry/wagyu/config.hpp>
#include <mapbox/geometry/wagyu/util.hpp>
#ifdef DEBUG
#include <iostream>
#endif
namespace mapbox {
namespace geometry {
namespace wagyu {
template <typename T>
struct bound;
template <typename T>
using bound_ptr = bound<T>*;
template <typename T>
struct edge {
mapbox::geometry::point<T> bot;
mapbox::geometry::point<T> top;
double dx;
edge(edge<T>&& e) noexcept : bot(std::move(e.bot)), top(std::move(e.top)), dx(std::move(e.dx)) {
}
edge& operator=(edge<T>&& e) noexcept {
bot = std::move(e.bot);
top = std::move(e.top);
dx = std::move(e.dx);
return *this;
}
edge(mapbox::geometry::point<T> const& current,
mapbox::geometry::point<T> const& next_pt) noexcept
: bot(current), top(current), dx(0.0) {
if (current.y >= next_pt.y) {
top = next_pt;
} else {
bot = next_pt;
}
double dy = static_cast<double>(top.y - bot.y);
if (value_is_zero(dy)) {
dx = std::numeric_limits<double>::infinity();
} else {
dx = static_cast<double>(top.x - bot.x) / dy;
}
}
};
template <typename T>
using edge_ptr = edge<T>*;
template <typename T>
using edge_list = std::vector<edge<T>>;
template <typename T>
using edge_list_itr = typename edge_list<T>::iterator;
template <typename T>
bool slopes_equal(edge<T> const& e1, edge<T> const& e2) {
return (e1.top.y - e1.bot.y) * (e2.top.x - e2.bot.x) ==
(e1.top.x - e1.bot.x) * (e2.top.y - e2.bot.y);
}
template <typename T>
inline bool is_horizontal(edge<T> const& e) {
return std::isinf(e.dx);
}
template <typename T>
inline double get_current_x(edge<T> const& edge, const T current_y) {
if (current_y == edge.top.y) {
return static_cast<double>(edge.top.x);
} else {
return static_cast<double>(edge.bot.x) +
edge.dx * static_cast<double>(current_y - edge.bot.y);
}
}
#ifdef DEBUG
template <class charT, class traits, typename T>
inline std::basic_ostream<charT, traits>& operator<<(std::basic_ostream<charT, traits>& out,
const edge<T>& e) {
out << " Edge: " << std::endl;
out << " bot x: " << e.bot.x << " y: " << e.bot.y << std::endl;
out << " top x: " << e.top.x << " y: " << e.top.y << std::endl;
return out;
}
template <class charT, class traits, typename T>
inline std::basic_ostream<charT, traits>& operator<<(std::basic_ostream<charT, traits>& out,
edge_list<T> const& edges) {
out << "[";
bool first = true;
for (auto const& e : edges) {
if (first) {
first = false;
} else {
out << ",";
}
out << "[[" << e.bot.x << "," << e.bot.y << "],[";
out << e.top.x << "," << e.top.y << "]]";
}
out << "]";
return out;
}
#endif
}
}
}

View File

@ -1,23 +0,0 @@
#pragma once
#include <stdexcept>
namespace mapbox {
namespace geometry {
namespace wagyu {
class clipper_exception : public std::exception {
private:
std::string m_descr;
public:
clipper_exception(const char* description) : m_descr(description) {
}
virtual ~clipper_exception() noexcept {
}
virtual const char* what() const noexcept {
return m_descr.c_str();
}
};
}
}
}

View File

@ -1,72 +0,0 @@
#pragma once
#include <set>
#include <mapbox/geometry/point.hpp>
#include <mapbox/geometry/wagyu/active_bound_list.hpp>
#ifdef DEBUG
#include <iostream>
#endif
namespace mapbox {
namespace geometry {
namespace wagyu {
template <typename T>
struct intersect_node {
active_bound_list_itr<T> bound1;
active_bound_list_itr<T> bound2;
mapbox::geometry::point<double> pt;
intersect_node(intersect_node<T>&& n)
: bound1(std::move(n.bound1)), bound2(std::move(n.bound2)), pt(std::move(n.pt)) {
}
intersect_node& operator=(intersect_node<T>&& n) {
bound1 = std::move(n.bound1);
bound2 = std::move(n.bound2);
pt = std::move(n.pt);
return *this;
}
intersect_node(active_bound_list_itr<T> const& bound1_,
active_bound_list_itr<T> const& bound2_,
mapbox::geometry::point<double> const& pt_)
: bound1(bound1_), bound2(bound2_), pt(pt_) {
}
};
template <typename T>
using intersect_list = std::vector<intersect_node<T>>;
#ifdef DEBUG
template <class charT, class traits, typename T>
inline std::basic_ostream<charT, traits>& operator<<(std::basic_ostream<charT, traits>& out,
const intersect_node<T>& e) {
out << " point x: " << e.pt.x << " y: " << e.pt.y << std::endl;
out << " bound 1: " << std::endl;
out << *(*e.bound1) << std::endl;
out << " bound 2: " << std::endl;
out << *(*e.bound2) << std::endl;
return out;
}
template <class charT, class traits, typename T>
inline std::basic_ostream<charT, traits>& operator<<(std::basic_ostream<charT, traits>& out,
const intersect_list<T>& ints) {
std::size_t c = 0;
for (auto const& i : ints) {
out << "Intersection: " << c++ << std::endl;
out << i;
}
return out;
}
#endif
}
}
}

View File

@ -1,345 +0,0 @@
#pragma once
#include <mapbox/geometry/wagyu/active_bound_list.hpp>
#include <mapbox/geometry/wagyu/bound.hpp>
#include <mapbox/geometry/wagyu/config.hpp>
#include <mapbox/geometry/wagyu/intersect.hpp>
#include <mapbox/geometry/wagyu/ring_util.hpp>
#include <mapbox/geometry/wagyu/util.hpp>
namespace mapbox {
namespace geometry {
namespace wagyu {
template <typename T>
struct intersect_list_sorter {
inline bool operator()(intersect_node<T> const& node1, intersect_node<T> const& node2) {
if (!values_are_equal(node2.pt.y, node1.pt.y)) {
return node2.pt.y < node1.pt.y;
} else {
return ((*node2.bound1)->winding_count2 + (*node2.bound2)->winding_count2) >
((*node1.bound1)->winding_count2 + (*node1.bound2)->winding_count2);
}
}
};
template <typename T>
inline mapbox::geometry::point<T> round_point(mapbox::geometry::point<double> const& pt) {
return mapbox::geometry::point<T>(round_towards_max<T>(pt.x), round_towards_max<T>(pt.y));
}
template <typename T>
inline void swap_rings(bound<T>& b1, bound<T>& b2) {
ring_ptr<T> ring = b1.ring;
b1.ring = b2.ring;
b2.ring = ring;
}
template <typename T>
inline void swap_sides(bound<T>& b1, bound<T>& b2) {
edge_side side = b1.side;
b1.side = b2.side;
b2.side = side;
}
template <typename T1, typename T2>
bool get_edge_intersection(edge<T1> const& e1,
edge<T1> const& e2,
mapbox::geometry::point<T2>& pt) {
T2 p0_x = static_cast<T2>(e1.bot.x);
T2 p0_y = static_cast<T2>(e1.bot.y);
T2 p1_x = static_cast<T2>(e1.top.x);
T2 p1_y = static_cast<T2>(e1.top.y);
T2 p2_x = static_cast<T2>(e2.bot.x);
T2 p2_y = static_cast<T2>(e2.bot.y);
T2 p3_x = static_cast<T2>(e2.top.x);
T2 p3_y = static_cast<T2>(e2.top.y);
T2 s1_x, s1_y, s2_x, s2_y;
s1_x = p1_x - p0_x;
s1_y = p1_y - p0_y;
s2_x = p3_x - p2_x;
s2_y = p3_y - p2_y;
T2 s, t;
s = (-s1_y * (p0_x - p2_x) + s1_x * (p0_y - p2_y)) / (-s2_x * s1_y + s1_x * s2_y);
t = (s2_x * (p0_y - p2_y) - s2_y * (p0_x - p2_x)) / (-s2_x * s1_y + s1_x * s2_y);
if (s >= 0.0 && s <= 1.0 && t >= 0.0 && t <= 1.0) {
pt.x = p0_x + (t * s1_x);
pt.y = p0_y + (t * s1_y);
return true;
}
// LCOV_EXCL_START
return false;
// LCOV_EXCL_END
}
template <typename T>
void build_intersect_list(active_bound_list<T>& active_bounds, intersect_list<T>& intersects) {
// bubblesort ...
bool isModified = false;
do {
isModified = false;
auto bnd = active_bounds.begin();
auto bnd_next = std::next(bnd);
while (bnd_next != active_bounds.end()) {
if ((*bnd)->current_x > (*bnd_next)->current_x &&
!slopes_equal(*((*bnd)->current_edge), *((*bnd_next)->current_edge))) {
mapbox::geometry::point<double> pt;
if (!get_edge_intersection<T, double>(*((*bnd)->current_edge),
*((*bnd_next)->current_edge), pt)) {
// LCOV_EXCL_START
throw std::runtime_error(
"Trying to find intersection of lines that do not intersect");
// LCOV_EXCL_END
}
intersects.emplace_back(bnd, bnd_next, pt);
swap_positions_in_ABL(bnd, bnd_next, active_bounds);
bnd_next = std::next(bnd);
isModified = true;
} else {
bnd = bnd_next;
++bnd_next;
}
}
} while (isModified);
}
template <typename T>
void intersect_bounds(active_bound_list_itr<T>& b1,
active_bound_list_itr<T>& b2,
mapbox::geometry::point<T> const& pt,
clip_type cliptype,
fill_type subject_fill_type,
fill_type clip_fill_type,
ring_manager<T>& rings,
active_bound_list<T>& active_bounds) {
bool b1Contributing = ((*b1)->ring != nullptr);
bool b2Contributing = ((*b2)->ring != nullptr);
// update winding counts...
// assumes that b1 will be to the Right of b2 ABOVE the intersection
if ((*b1)->poly_type == (*b2)->poly_type) {
if (is_even_odd_fill_type(*(*b1), subject_fill_type, clip_fill_type)) {
std::int32_t oldE1winding_count = (*b1)->winding_count;
(*b1)->winding_count = (*b2)->winding_count;
(*b2)->winding_count = oldE1winding_count;
} else {
if ((*b1)->winding_count + (*b2)->winding_delta == 0) {
(*b1)->winding_count = -(*b1)->winding_count;
} else {
(*b1)->winding_count += (*b2)->winding_delta;
}
if ((*b2)->winding_count - (*b1)->winding_delta == 0) {
(*b2)->winding_count = -(*b2)->winding_count;
} else {
(*b2)->winding_count -= (*b1)->winding_delta;
}
}
} else {
if (!is_even_odd_fill_type(*(*b2), subject_fill_type, clip_fill_type)) {
(*b1)->winding_count2 += (*b2)->winding_delta;
} else {
(*b1)->winding_count2 = ((*b1)->winding_count2 == 0) ? 1 : 0;
}
if (!is_even_odd_fill_type(*(*b1), subject_fill_type, clip_fill_type)) {
(*b2)->winding_count2 -= (*b1)->winding_delta;
} else {
(*b2)->winding_count2 = ((*b2)->winding_count2 == 0) ? 1 : 0;
}
}
fill_type b1FillType, b2FillType, b1FillType2, b2FillType2;
if ((*b1)->poly_type == polygon_type_subject) {
b1FillType = subject_fill_type;
b1FillType2 = clip_fill_type;
} else {
b1FillType = clip_fill_type;
b1FillType2 = subject_fill_type;
}
if ((*b2)->poly_type == polygon_type_subject) {
b2FillType = subject_fill_type;
b2FillType2 = clip_fill_type;
} else {
b2FillType = clip_fill_type;
b2FillType2 = subject_fill_type;
}
std::int32_t b1Wc, b2Wc;
switch (b1FillType) {
case fill_type_positive:
b1Wc = (*b1)->winding_count;
break;
case fill_type_negative:
b1Wc = -(*b1)->winding_count;
break;
case fill_type_even_odd:
case fill_type_non_zero:
default:
b1Wc = std::abs(static_cast<int>((*b1)->winding_count));
}
switch (b2FillType) {
case fill_type_positive:
b2Wc = (*b2)->winding_count;
break;
case fill_type_negative:
b2Wc = -(*b2)->winding_count;
break;
case fill_type_even_odd:
case fill_type_non_zero:
default:
b2Wc = std::abs(static_cast<int>((*b2)->winding_count));
}
if (b1Contributing && b2Contributing) {
if ((b1Wc != 0 && b1Wc != 1) || (b2Wc != 0 && b2Wc != 1) ||
((*b1)->poly_type != (*b2)->poly_type && cliptype != clip_type_x_or)) {
add_local_maximum_point(b1, b2, pt, rings, active_bounds);
} else {
add_point(b1, active_bounds, pt, rings);
add_point(b2, active_bounds, pt, rings);
swap_sides(*(*b1), *(*b2));
swap_rings(*(*b1), *(*b2));
}
} else if (b1Contributing) {
if (b2Wc == 0 || b2Wc == 1) {
add_point(b1, active_bounds, pt, rings);
(*b2)->last_point = pt;
swap_sides(*(*b1), *(*b2));
swap_rings(*(*b1), *(*b2));
}
} else if (b2Contributing) {
if (b1Wc == 0 || b1Wc == 1) {
(*b1)->last_point = pt;
add_point(b2, active_bounds, pt, rings);
swap_sides(*(*b1), *(*b2));
swap_rings(*(*b1), *(*b2));
}
} else if ((b1Wc == 0 || b1Wc == 1) && (b2Wc == 0 || b2Wc == 1)) {
// neither bound is currently contributing ...
std::int32_t b1Wc2, b2Wc2;
switch (b1FillType2) {
case fill_type_positive:
b1Wc2 = (*b1)->winding_count2;
break;
case fill_type_negative:
b1Wc2 = -(*b1)->winding_count2;
break;
case fill_type_even_odd:
case fill_type_non_zero:
default:
b1Wc2 = std::abs(static_cast<int>((*b1)->winding_count2));
}
switch (b2FillType2) {
case fill_type_positive:
b2Wc2 = (*b2)->winding_count2;
break;
case fill_type_negative:
b2Wc2 = -(*b2)->winding_count2;
break;
case fill_type_even_odd:
case fill_type_non_zero:
default:
b2Wc2 = std::abs(static_cast<int>((*b2)->winding_count2));
}
if ((*b1)->poly_type != (*b2)->poly_type) {
add_local_minimum_point(b1, b2, active_bounds, pt, rings);
} else if (b1Wc == 1 && b2Wc == 1) {
switch (cliptype) {
case clip_type_intersection:
if (b1Wc2 > 0 && b2Wc2 > 0) {
add_local_minimum_point(b1, b2, active_bounds, pt, rings);
}
break;
default:
case clip_type_union:
if (b1Wc2 <= 0 && b2Wc2 <= 0) {
add_local_minimum_point(b1, b2, active_bounds, pt, rings);
}
break;
case clip_type_difference:
if ((((*b1)->poly_type == polygon_type_clip) && (b1Wc2 > 0) && (b2Wc2 > 0)) ||
(((*b1)->poly_type == polygon_type_subject) && (b1Wc2 <= 0) && (b2Wc2 <= 0))) {
add_local_minimum_point(b1, b2, active_bounds, pt, rings);
}
break;
case clip_type_x_or:
add_local_minimum_point(b1, b2, active_bounds, pt, rings);
}
} else {
swap_sides(*(*b1), *(*b2));
}
}
}
template <typename T>
bool bounds_adjacent(intersect_node<T> const& inode) {
return (std::next(inode.bound1) == inode.bound2) || (std::next(inode.bound2) == inode.bound1);
}
template <typename T>
void process_intersect_list(intersect_list<T>& intersects,
clip_type cliptype,
fill_type subject_fill_type,
fill_type clip_fill_type,
ring_manager<T>& rings,
active_bound_list<T>& active_bounds) {
for (auto node_itr = intersects.begin(); node_itr != intersects.end(); ++node_itr) {
if (!bounds_adjacent(*node_itr)) {
auto next_itr = std::next(node_itr);
while (next_itr != intersects.end() && !bounds_adjacent(*next_itr)) {
++next_itr;
}
if (next_itr == intersects.end()) {
throw std::runtime_error("Could not properly correct intersection order.");
}
std::iter_swap(node_itr, next_itr);
}
mapbox::geometry::point<T> pt = round_point<T>(node_itr->pt);
intersect_bounds(node_itr->bound1, node_itr->bound2, pt, cliptype, subject_fill_type,
clip_fill_type, rings, active_bounds);
swap_positions_in_ABL(node_itr->bound1, node_itr->bound2, active_bounds);
}
}
template <typename T>
void update_current_x(active_bound_list<T>& active_bounds, T top_y) {
std::size_t pos = 0;
for (auto& bnd : active_bounds) {
bnd->pos = pos++;
bnd->current_x = get_current_x(*bnd->current_edge, top_y);
}
}
template <typename T>
void process_intersections(T top_y,
active_bound_list<T>& active_bounds,
clip_type cliptype,
fill_type subject_fill_type,
fill_type clip_fill_type,
ring_manager<T>& rings) {
if (active_bounds.empty()) {
return;
}
update_current_x(active_bounds, top_y);
intersect_list<T> intersects;
build_intersect_list(active_bounds, intersects);
if (intersects.empty()) {
return;
}
// Restore order of active bounds list
active_bounds.sort(
[](bound_ptr<T> const& b1, bound_ptr<T> const& b2) { return b1->pos < b2->pos; });
// Sort the intersection list
std::stable_sort(intersects.begin(), intersects.end(), intersect_list_sorter<T>());
process_intersect_list(intersects, cliptype, subject_fill_type, clip_fill_type, rings,
active_bounds);
}
}
}
}

View File

@ -1,118 +0,0 @@
#pragma once
#ifdef DEBUG
#include <iostream>
#include <sstream>
#endif
#include <queue>
#include <mapbox/geometry/wagyu/bound.hpp>
namespace mapbox {
namespace geometry {
namespace wagyu {
template <typename T>
struct local_minimum {
bound<T> left_bound;
bound<T> right_bound;
T y;
bool minimum_has_horizontal;
local_minimum(bound<T>&& left_bound_, bound<T>&& right_bound_, T y_, bool has_horz_)
: left_bound(std::move(left_bound_)),
right_bound(std::move(right_bound_)),
y(y_),
minimum_has_horizontal(has_horz_) {
}
};
template <typename T>
using local_minimum_list = std::deque<local_minimum<T>>;
template <typename T>
using local_minimum_itr = typename local_minimum_list<T>::iterator;
template <typename T>
using local_minimum_ptr = local_minimum<T>*;
template <typename T>
using local_minimum_ptr_list = std::vector<local_minimum_ptr<T>>;
template <typename T>
using local_minimum_ptr_list_itr = typename local_minimum_ptr_list<T>::iterator;
template <typename T>
struct local_minimum_sorter {
inline bool operator()(local_minimum_ptr<T> const& locMin1,
local_minimum_ptr<T> const& locMin2) {
if (locMin2->y == locMin1->y) {
return locMin2->minimum_has_horizontal != locMin1->minimum_has_horizontal &&
locMin1->minimum_has_horizontal;
}
return locMin2->y < locMin1->y;
}
};
#ifdef DEBUG
template <class charT, class traits, typename T>
inline std::basic_ostream<charT, traits>& operator<<(std::basic_ostream<charT, traits>& out,
const local_minimum<T>& lm) {
out << " Local Minimum:" << std::endl;
out << " y: " << lm.y << std::endl;
if (lm.minimum_has_horizontal) {
out << " minimum_has_horizontal: true" << std::endl;
} else {
out << " minimum_has_horizontal: false" << std::endl;
}
out << " left_bound: " << std::endl;
out << lm.left_bound << std::endl;
out << " right_bound: " << std::endl;
out << lm.right_bound << std::endl;
return out;
}
template <class charT, class traits, typename T>
inline std::basic_ostream<charT, traits>& operator<<(std::basic_ostream<charT, traits>& out,
const local_minimum_ptr_list<T>& lms) {
for (auto const& lm : lms) {
out << *lm;
}
return out;
}
template <typename T>
std::string output_all_edges(local_minimum_ptr_list<T> const& lms) {
std::ostringstream out;
out << "[";
bool first = true;
for (auto const& lm : lms) {
for (auto const& e : lm->left_bound.edges) {
if (first) {
first = false;
} else {
out << ",";
}
out << "[[" << e.bot.x << "," << e.bot.y << "],[";
out << e.top.x << "," << e.top.y << "]]";
}
for (auto const& e : lm->right_bound.edges) {
if (first) {
first = false;
} else {
out << ",";
}
out << "[[" << e.bot.x << "," << e.bot.y << "],[";
out << e.top.x << "," << e.top.y << "]]";
}
}
out << "]";
return out.str();
}
#endif
}
}
}

View File

@ -1,321 +0,0 @@
#pragma once
#include <mapbox/geometry/wagyu/edge.hpp>
#include <mapbox/geometry/wagyu/local_minimum.hpp>
#ifdef DEBUG
#include <stdexcept>
#endif
namespace mapbox {
namespace geometry {
namespace wagyu {
template <typename T>
inline void reverse_horizontal(edge<T>& e) {
// swap horizontal edges' top and bottom x's so they follow the natural
// progression of the bounds - ie so their xbots will align with the
// adjoining lower edge. [Helpful in the process_horizontal() method.]
std::swap(e.top.x, e.bot.x);
}
// Make a list start on a local maximum by
// shifting all the points not on a local maximum to the
template <typename T>
void start_list_on_local_maximum(edge_list<T>& edges) {
if (edges.size() <= 2) {
return;
}
// Find the first local maximum going forward in the list
auto prev_edge = edges.end();
--prev_edge;
bool prev_edge_is_horizontal = is_horizontal(*prev_edge);
auto edge = edges.begin();
bool edge_is_horizontal;
bool y_decreasing_before_last_horizontal = false; // assume false at start
while (edge != edges.end()) {
edge_is_horizontal = is_horizontal(*edge);
if ((!prev_edge_is_horizontal && !edge_is_horizontal && edge->top == prev_edge->top)) {
break;
}
if (!edge_is_horizontal && prev_edge_is_horizontal) {
if (y_decreasing_before_last_horizontal &&
(edge->top == prev_edge->bot || edge->top == prev_edge->top)) {
break;
}
} else if (!y_decreasing_before_last_horizontal && !prev_edge_is_horizontal &&
edge_is_horizontal &&
(prev_edge->top == edge->top || prev_edge->top == edge->bot)) {
y_decreasing_before_last_horizontal = true;
}
prev_edge_is_horizontal = edge_is_horizontal;
prev_edge = edge;
++edge;
}
std::rotate(edges.begin(), edge, edges.end());
}
template <typename T>
bound<T> create_bound_towards_minimum(edge_list<T>& edges) {
if (edges.size() == 1) {
if (is_horizontal(edges.front())) {
reverse_horizontal(edges.front());
}
bound<T> bnd;
std::swap(bnd.edges, edges);
return bnd;
}
auto next_edge = edges.begin();
auto edge = next_edge;
++next_edge;
bool edge_is_horizontal = is_horizontal(*edge);
if (edge_is_horizontal) {
reverse_horizontal(*edge);
}
bool next_edge_is_horizontal;
bool y_increasing_before_last_horizontal = false; // assume false at start
while (next_edge != edges.end()) {
next_edge_is_horizontal = is_horizontal(*next_edge);
if ((!next_edge_is_horizontal && !edge_is_horizontal && edge->bot == next_edge->bot)) {
break;
}
if (!next_edge_is_horizontal && edge_is_horizontal) {
if (y_increasing_before_last_horizontal &&
(next_edge->bot == edge->bot || next_edge->bot == edge->top)) {
break;
}
} else if (!y_increasing_before_last_horizontal && !edge_is_horizontal &&
next_edge_is_horizontal &&
(edge->bot == next_edge->top || edge->bot == next_edge->bot)) {
y_increasing_before_last_horizontal = true;
}
edge_is_horizontal = next_edge_is_horizontal;
edge = next_edge;
if (edge_is_horizontal) {
reverse_horizontal(*edge);
}
++next_edge;
}
bound<T> bnd;
if (next_edge == edges.end()) {
std::swap(edges, bnd.edges);
} else {
bnd.edges.reserve(std::distance(edges.begin(), next_edge));
std::move(edges.begin(), next_edge, std::back_inserter(bnd.edges));
edges.erase(edges.begin(), next_edge);
}
std::reverse(bnd.edges.begin(), bnd.edges.end());
return bnd;
}
template <typename T>
bound<T> create_bound_towards_maximum(edge_list<T>& edges) {
if (edges.size() == 1) {
bound<T> bnd;
std::swap(bnd.edges, edges);
return bnd;
}
auto next_edge = edges.begin();
auto edge = next_edge;
++next_edge;
bool edge_is_horizontal = is_horizontal(*edge);
bool next_edge_is_horizontal;
bool y_decreasing_before_last_horizontal = false; // assume false at start
while (next_edge != edges.end()) {
next_edge_is_horizontal = is_horizontal(*next_edge);
if ((!next_edge_is_horizontal && !edge_is_horizontal && edge->top == next_edge->top)) {
break;
}
if (!next_edge_is_horizontal && edge_is_horizontal) {
if (y_decreasing_before_last_horizontal &&
(next_edge->top == edge->bot || next_edge->top == edge->top)) {
break;
}
} else if (!y_decreasing_before_last_horizontal && !edge_is_horizontal &&
next_edge_is_horizontal &&
(edge->top == next_edge->top || edge->top == next_edge->bot)) {
y_decreasing_before_last_horizontal = true;
}
edge_is_horizontal = next_edge_is_horizontal;
edge = next_edge;
++next_edge;
}
bound<T> bnd;
if (next_edge == edges.end()) {
std::swap(bnd.edges, edges);
} else {
bnd.edges.reserve(std::distance(edges.begin(), next_edge));
std::move(edges.begin(), next_edge, std::back_inserter(bnd.edges));
edges.erase(edges.begin(), next_edge);
}
return bnd;
}
template <typename T>
void fix_horizontals(bound<T>& bnd) {
auto edge_itr = bnd.edges.begin();
auto next_itr = std::next(edge_itr);
if (next_itr == bnd.edges.end()) {
return;
}
if (is_horizontal(*edge_itr) && next_itr->bot != edge_itr->top) {
reverse_horizontal(*edge_itr);
}
auto prev_itr = edge_itr++;
while (edge_itr != bnd.edges.end()) {
if (is_horizontal(*edge_itr) && prev_itr->top != edge_itr->bot) {
reverse_horizontal(*edge_itr);
}
prev_itr = edge_itr;
++edge_itr;
}
}
template <typename T>
void move_horizontals_on_left_to_right(bound<T>& left_bound, bound<T>& right_bound) {
// We want all the horizontal segments that are at the same Y as the minimum to be on the right
// bound
auto edge_itr = left_bound.edges.begin();
while (edge_itr != left_bound.edges.end()) {
if (!is_horizontal(*edge_itr)) {
break;
}
reverse_horizontal(*edge_itr);
++edge_itr;
}
if (edge_itr == left_bound.edges.begin()) {
return;
}
std::reverse(left_bound.edges.begin(), edge_itr);
auto dist = std::distance(left_bound.edges.begin(), edge_itr);
std::move(left_bound.edges.begin(), edge_itr, std::back_inserter(right_bound.edges));
left_bound.edges.erase(left_bound.edges.begin(), edge_itr);
std::rotate(right_bound.edges.begin(), std::prev(right_bound.edges.end(), dist),
right_bound.edges.end());
}
template <typename T>
void add_ring_to_local_minima_list(edge_list<T>& edges,
local_minimum_list<T>& minima_list,
polygon_type poly_type) {
if (edges.empty()) {
return;
}
// Adjust the order of the ring so we start on a local maximum
// therefore we start right away on a bound.
start_list_on_local_maximum(edges);
bound_ptr<T> first_minimum = nullptr;
bound_ptr<T> last_maximum = nullptr;
while (!edges.empty()) {
bool lm_minimum_has_horizontal = false;
auto to_minimum = create_bound_towards_minimum(edges);
if (edges.empty()) {
throw std::runtime_error("Edges is empty after only creating a single bound.");
}
auto to_maximum = create_bound_towards_maximum(edges);
fix_horizontals(to_minimum);
fix_horizontals(to_maximum);
auto to_max_first_non_horizontal = to_maximum.edges.begin();
auto to_min_first_non_horizontal = to_minimum.edges.begin();
bool minimum_is_left = true;
while (to_max_first_non_horizontal != to_maximum.edges.end() &&
is_horizontal(*to_max_first_non_horizontal)) {
lm_minimum_has_horizontal = true;
++to_max_first_non_horizontal;
}
while (to_min_first_non_horizontal != to_minimum.edges.end() &&
is_horizontal(*to_min_first_non_horizontal)) {
lm_minimum_has_horizontal = true;
++to_min_first_non_horizontal;
}
#ifdef DEBUG
if (to_max_first_non_horizontal == to_maximum.edges.end() ||
to_min_first_non_horizontal == to_minimum.edges.end()) {
throw std::runtime_error("should not have a horizontal only bound for a ring");
}
#endif
if (lm_minimum_has_horizontal) {
if (to_max_first_non_horizontal->bot.x > to_min_first_non_horizontal->bot.x) {
minimum_is_left = true;
move_horizontals_on_left_to_right(to_minimum, to_maximum);
} else {
minimum_is_left = false;
move_horizontals_on_left_to_right(to_maximum, to_minimum);
}
} else {
if (to_max_first_non_horizontal->dx > to_min_first_non_horizontal->dx) {
minimum_is_left = false;
} else {
minimum_is_left = true;
}
}
assert(!to_minimum.edges.empty());
assert(!to_maximum.edges.empty());
auto const& min_front = to_minimum.edges.front();
if (last_maximum) {
to_minimum.maximum_bound = last_maximum;
}
to_minimum.poly_type = poly_type;
to_maximum.poly_type = poly_type;
if (!minimum_is_left) {
to_minimum.side = edge_right;
to_maximum.side = edge_left;
to_minimum.winding_delta = -1;
to_maximum.winding_delta = 1;
minima_list.emplace_back(std::move(to_maximum), std::move(to_minimum), min_front.bot.y,
lm_minimum_has_horizontal);
if (!last_maximum) {
first_minimum = &(minima_list.back().right_bound);
} else {
last_maximum->maximum_bound = &(minima_list.back().right_bound);
}
last_maximum = &(minima_list.back().left_bound);
} else {
to_minimum.side = edge_left;
to_maximum.side = edge_right;
to_minimum.winding_delta = -1;
to_maximum.winding_delta = 1;
minima_list.emplace_back(std::move(to_minimum), std::move(to_maximum), min_front.bot.y,
lm_minimum_has_horizontal);
if (!last_maximum) {
first_minimum = &(minima_list.back().left_bound);
} else {
last_maximum->maximum_bound = &(minima_list.back().left_bound);
}
last_maximum = &(minima_list.back().right_bound);
}
}
last_maximum->maximum_bound = first_minimum;
first_minimum->maximum_bound = last_maximum;
}
template <typename T>
void initialize_lm(local_minimum_ptr_list_itr<T>& lm) {
if (!(*lm)->left_bound.edges.empty()) {
(*lm)->left_bound.current_edge = (*lm)->left_bound.edges.begin();
(*lm)->left_bound.next_edge = std::next((*lm)->left_bound.current_edge);
(*lm)->left_bound.current_x = static_cast<double>((*lm)->left_bound.current_edge->bot.x);
(*lm)->left_bound.winding_count = 0;
(*lm)->left_bound.winding_count2 = 0;
(*lm)->left_bound.side = edge_left;
(*lm)->left_bound.ring = nullptr;
}
if (!(*lm)->right_bound.edges.empty()) {
(*lm)->right_bound.current_edge = (*lm)->right_bound.edges.begin();
(*lm)->right_bound.next_edge = std::next((*lm)->right_bound.current_edge);
(*lm)->right_bound.current_x = static_cast<double>((*lm)->right_bound.current_edge->bot.x);
(*lm)->right_bound.winding_count = 0;
(*lm)->right_bound.winding_count2 = 0;
(*lm)->right_bound.side = edge_right;
(*lm)->right_bound.ring = nullptr;
}
}
}
}
}

View File

@ -1,111 +0,0 @@
#pragma once
#include <mapbox/geometry/point.hpp>
#ifdef DEBUG
#include <iostream>
#endif
namespace mapbox {
namespace geometry {
namespace wagyu {
template <typename T>
struct point;
template <typename T>
using point_ptr = point<T>*;
template <typename T>
using const_point_ptr = point<T>* const;
template <typename T>
struct ring;
template <typename T>
using ring_ptr = ring<T>*;
template <typename T>
using const_ring_ptr = ring<T>* const;
template <typename T>
struct point {
using coordinate_type = T;
ring_ptr<T> ring;
T x;
T y;
point_ptr<T> next;
point_ptr<T> prev;
point(point<T>&& p)
: ring(std::move(p.ring)),
x(std::move(p.x)),
y(std::move(p.y)),
next(std::move(p.next)),
prev(std::move(p.prev)) {
}
point() : ring(nullptr), x(0), y(0), prev(this), next(this) {
}
point(T x_, T y_) : ring(nullptr), x(x_), y(y_), next(this), prev(this) {
}
point(ring_ptr<T> ring_, mapbox::geometry::point<T> const& pt)
: ring(ring_), x(pt.x), y(pt.y), next(this), prev(this) {
}
point(ring_ptr<T> ring_, mapbox::geometry::point<T> const& pt, point_ptr<T> before_this_point)
: ring(ring_), x(pt.x), y(pt.y), next(before_this_point), prev(before_this_point->prev) {
before_this_point->prev = this;
prev->next = this;
}
};
template <typename T>
bool operator==(point<T> const& lhs, point<T> const& rhs) {
return lhs.x == rhs.x && lhs.y == rhs.y;
}
template <typename T>
bool operator==(mapbox::geometry::point<T> const& lhs, point<T> const& rhs) {
return lhs.x == rhs.x && lhs.y == rhs.y;
}
template <typename T>
bool operator==(point<T> const& lhs, mapbox::geometry::point<T> const& rhs) {
return lhs.x == rhs.x && lhs.y == rhs.y;
}
template <typename T>
bool operator!=(point<T> const& lhs, point<T> const& rhs) {
return lhs.x != rhs.x || lhs.y != rhs.y;
}
template <typename T>
bool operator!=(mapbox::geometry::point<T> const& lhs, point<T> const& rhs) {
return lhs.x != rhs.x || lhs.y != rhs.y;
}
template <typename T>
bool operator!=(point<T> const& lhs, mapbox::geometry::point<T> const& rhs) {
return lhs.x != rhs.x || lhs.y != rhs.y;
}
#ifdef DEBUG
template <class charT, class traits, typename T>
inline std::basic_ostream<charT, traits>& operator<<(std::basic_ostream<charT, traits>& out,
const point<T>& p) {
out << " point at: " << p.x << ", " << p.y;
return out;
}
template <class charT, class traits, typename T>
inline std::basic_ostream<charT, traits>& operator<<(std::basic_ostream<charT, traits>& out,
const mapbox::geometry::point<T>& p) {
out << " point at: " << p.x << ", " << p.y;
return out;
}
#endif
}
}
}

View File

@ -1,273 +0,0 @@
#pragma once
#include <mapbox/geometry/line_string.hpp>
#include <mapbox/geometry/point.hpp>
#include <mapbox/geometry/polygon.hpp>
#include <mapbox/geometry/wagyu/config.hpp>
#include <mapbox/geometry/wagyu/edge.hpp>
#include <mapbox/geometry/wagyu/local_minimum.hpp>
#include <mapbox/geometry/wagyu/util.hpp>
namespace mapbox {
namespace geometry {
namespace wagyu {
template <typename T>
active_bound_list_itr<T> process_horizontal_left_to_right(T scanline_y,
active_bound_list_itr<T>& horz_bound,
active_bound_list<T>& active_bounds,
ring_manager<T>& rings,
scanbeam_list<T>& scanbeam,
clip_type cliptype,
fill_type subject_fill_type,
fill_type clip_fill_type) {
auto horizontal_itr_behind = horz_bound;
bool is_maxima_edge = is_maxima(horz_bound, scanline_y);
auto bound_max_pair = active_bounds.end();
if (is_maxima_edge) {
bound_max_pair = get_maxima_pair<T>(horz_bound, active_bounds);
}
auto hp_itr = rings.current_hp_itr;
while (hp_itr != rings.hot_pixels.end() &&
(hp_itr->y > scanline_y ||
(hp_itr->y == scanline_y && hp_itr->x < (*horz_bound)->current_edge->bot.x))) {
++hp_itr;
}
auto bnd = std::next(horz_bound);
while (bnd != active_bounds.end()) {
// this code block inserts extra coords into horizontal edges (in output
// polygons) wherever hot pixels touch these horizontal edges. This helps
//'simplifying' polygons (ie if the Simplify property is set).
while (hp_itr != rings.hot_pixels.end() && hp_itr->y == scanline_y &&
hp_itr->x < std::llround((*bnd)->current_x) &&
hp_itr->x < (*horz_bound)->current_edge->top.x) {
if ((*horz_bound)->ring) {
add_point_to_ring(*(*horz_bound), *hp_itr, rings);
}
++hp_itr;
}
if ((*bnd)->current_x > static_cast<double>((*horz_bound)->current_edge->top.x)) {
break;
}
// Also break if we've got to the end of an intermediate horizontal edge ...
// nb: Smaller Dx's are to the right of larger Dx's ABOVE the horizontal.
if (std::llround((*bnd)->current_x) == (*horz_bound)->current_edge->top.x &&
(*horz_bound)->next_edge != (*horz_bound)->edges.end() &&
(*horz_bound)->current_edge->dx < (*horz_bound)->next_edge->dx) {
break;
}
// note: may be done multiple times
if ((*horz_bound)->ring) {
add_point_to_ring(
*(*horz_bound),
mapbox::geometry::point<T>(std::llround((*bnd)->current_x), scanline_y), rings);
}
// OK, so far we're still in range of the horizontal Edge but make sure
// we're at the last of consec. horizontals when matching with eMaxPair
if (is_maxima_edge && bnd == bound_max_pair) {
if ((*horz_bound)->ring) {
add_local_maximum_point(horz_bound, bound_max_pair,
(*horz_bound)->current_edge->top, rings, active_bounds);
}
active_bounds.erase(bound_max_pair);
auto after_horz = active_bounds.erase(horz_bound);
if (horizontal_itr_behind != horz_bound) {
return horizontal_itr_behind;
} else {
return after_horz;
}
}
intersect_bounds(horz_bound, bnd,
mapbox::geometry::point<T>(std::llround((*bnd)->current_x), scanline_y),
cliptype, subject_fill_type, clip_fill_type, rings, active_bounds);
auto next_bnd = std::next(bnd);
swap_positions_in_ABL(horz_bound, bnd, active_bounds);
if (current_edge_is_horizontal<T>(bnd) && horizontal_itr_behind == horz_bound) {
horizontal_itr_behind = bnd;
}
bnd = next_bnd;
} // end while (bnd != active_bounds.end())
if ((*horz_bound)->ring) {
while (hp_itr != rings.hot_pixels.end() && hp_itr->y == scanline_y &&
hp_itr->x < std::llround((*horz_bound)->current_edge->top.x)) {
add_point_to_ring(*(*horz_bound), *hp_itr, rings);
++hp_itr;
}
}
if ((*horz_bound)->next_edge != (*horz_bound)->edges.end()) {
if ((*horz_bound)->ring) {
add_point_to_ring(*(*horz_bound), (*horz_bound)->current_edge->top, rings);
next_edge_in_bound(horz_bound, scanbeam);
} else {
next_edge_in_bound(horz_bound, scanbeam);
}
if (horizontal_itr_behind != horz_bound) {
return horizontal_itr_behind;
} else {
return std::next(horz_bound);
}
} else {
if ((*horz_bound)->ring) {
add_point_to_ring(*(*horz_bound), (*horz_bound)->current_edge->top, rings);
}
auto after_horz = active_bounds.erase(horz_bound);
if (horizontal_itr_behind != horz_bound) {
return horizontal_itr_behind;
} else {
return after_horz;
}
}
}
template <typename T>
active_bound_list_itr<T> process_horizontal_right_to_left(T scanline_y,
active_bound_list_itr<T>& horz_bound,
active_bound_list<T>& active_bounds,
ring_manager<T>& rings,
scanbeam_list<T>& scanbeam,
clip_type cliptype,
fill_type subject_fill_type,
fill_type clip_fill_type) {
bool is_maxima_edge = is_maxima(horz_bound, scanline_y);
auto bound_max_pair = active_bounds.end();
if (is_maxima_edge) {
bound_max_pair = get_maxima_pair<T>(horz_bound, active_bounds);
}
auto hp_itr_fwd = rings.current_hp_itr;
while (hp_itr_fwd != rings.hot_pixels.end() &&
(hp_itr_fwd->y < scanline_y ||
(hp_itr_fwd->y == scanline_y && hp_itr_fwd->x < (*horz_bound)->current_edge->top.x))) {
++hp_itr_fwd;
}
auto hp_itr = hot_pixel_rev_itr<T>(hp_itr_fwd);
auto bnd = active_bound_list_rev_itr<T>(horz_bound);
while (bnd != active_bounds.rend()) {
// this code block inserts extra coords into horizontal edges (in output
// polygons) wherever hot pixels touch these horizontal edges.
while (hp_itr != rings.hot_pixels.rend() && hp_itr->y == scanline_y &&
hp_itr->x > std::llround((*bnd)->current_x) &&
hp_itr->x > (*horz_bound)->current_edge->top.x) {
if ((*horz_bound)->ring) {
add_point_to_ring(*(*horz_bound), *hp_itr, rings);
}
++hp_itr;
}
if ((*bnd)->current_x < static_cast<double>((*horz_bound)->current_edge->top.x)) {
break;
}
// Also break if we've got to the end of an intermediate horizontal edge ...
// nb: Smaller Dx's are to the right of larger Dx's ABOVE the horizontal.
if (std::llround((*bnd)->current_x) == (*horz_bound)->current_edge->top.x &&
(*horz_bound)->next_edge != (*horz_bound)->edges.end() &&
(*horz_bound)->current_edge->dx < (*horz_bound)->next_edge->dx) {
break;
}
// note: may be done multiple times
if ((*horz_bound)->ring) {
add_point_to_ring(
*(*horz_bound),
mapbox::geometry::point<T>(std::llround((*bnd)->current_x), scanline_y), rings);
}
auto bnd_forward = --(bnd.base());
// OK, so far we're still in range of the horizontal Edge but make sure
// we're at the last of consec. horizontals when matching with eMaxPair
if (is_maxima_edge && bnd_forward == bound_max_pair) {
if ((*horz_bound)->ring) {
add_local_maximum_point(horz_bound, bound_max_pair,
(*horz_bound)->current_edge->top, rings, active_bounds);
}
active_bounds.erase(bound_max_pair);
return active_bounds.erase(horz_bound);
}
intersect_bounds(bnd_forward, horz_bound,
mapbox::geometry::point<T>(std::llround((*bnd)->current_x), scanline_y),
cliptype, subject_fill_type, clip_fill_type, rings, active_bounds);
swap_positions_in_ABL(horz_bound, bnd_forward, active_bounds);
// Why are we not incrementing the bnd iterator here:
// It is because reverse iterators point to a `base()` iterator that is a forward
// iterator that is one ahead of the reverse bound. This will always be the horizontal
// bound,
// so what the reverse bound points to will have changed.
} // end while (bnd != active_bounds.rend())
if ((*horz_bound)->ring) {
while (hp_itr != rings.hot_pixels.rend() && hp_itr->y == scanline_y &&
hp_itr->x > (*horz_bound)->current_edge->top.x) {
add_point_to_ring(*(*horz_bound), *hp_itr, rings);
++hp_itr;
}
}
if ((*horz_bound)->next_edge != (*horz_bound)->edges.end()) {
if ((*horz_bound)->ring) {
add_point_to_ring(*(*horz_bound), (*horz_bound)->current_edge->top, rings);
next_edge_in_bound(horz_bound, scanbeam);
} else {
next_edge_in_bound(horz_bound, scanbeam);
}
return std::next(horz_bound);
} else {
if ((*horz_bound)->ring) {
add_point_to_ring(*(*horz_bound), (*horz_bound)->current_edge->top, rings);
}
return active_bounds.erase(horz_bound);
}
}
template <typename T>
active_bound_list_itr<T> process_horizontal(T scanline_y,
active_bound_list_itr<T>& horz_bound,
active_bound_list<T>& active_bounds,
ring_manager<T>& rings,
scanbeam_list<T>& scanbeam,
clip_type cliptype,
fill_type subject_fill_type,
fill_type clip_fill_type) {
if ((*horz_bound)->current_edge->bot.x < (*horz_bound)->current_edge->top.x) {
return process_horizontal_left_to_right(scanline_y, horz_bound, active_bounds, rings,
scanbeam, cliptype, subject_fill_type,
clip_fill_type);
} else {
return process_horizontal_right_to_left(scanline_y, horz_bound, active_bounds, rings,
scanbeam, cliptype, subject_fill_type,
clip_fill_type);
}
}
template <typename T>
void process_horizontals(T scanline_y,
active_bound_list<T>& active_bounds,
ring_manager<T>& rings,
scanbeam_list<T>& scanbeam,
clip_type cliptype,
fill_type subject_fill_type,
fill_type clip_fill_type) {
for (auto bnd_itr = active_bounds.begin(); bnd_itr != active_bounds.end();) {
if (current_edge_is_horizontal<T>(bnd_itr)) {
bnd_itr = process_horizontal(scanline_y, bnd_itr, active_bounds, rings, scanbeam,
cliptype, subject_fill_type, clip_fill_type);
} else {
++bnd_itr;
}
}
}
}
}
}

View File

@ -1,125 +0,0 @@
#pragma once
#include <mapbox/geometry/wagyu/active_bound_list.hpp>
#include <mapbox/geometry/wagyu/config.hpp>
#include <mapbox/geometry/wagyu/edge.hpp>
#include <mapbox/geometry/wagyu/intersect_util.hpp>
#include <mapbox/geometry/wagyu/local_minimum.hpp>
#include <mapbox/geometry/wagyu/local_minimum_util.hpp>
#include <mapbox/geometry/wagyu/process_horizontal.hpp>
#include <mapbox/geometry/wagyu/ring.hpp>
#include <mapbox/geometry/wagyu/ring_util.hpp>
#include <mapbox/geometry/wagyu/topology_correction.hpp>
#include <mapbox/geometry/wagyu/util.hpp>
namespace mapbox {
namespace geometry {
namespace wagyu {
template <typename T>
active_bound_list_itr<T> do_maxima(active_bound_list_itr<T>& bnd,
active_bound_list_itr<T>& bndMaxPair,
clip_type cliptype,
fill_type subject_fill_type,
fill_type clip_fill_type,
ring_manager<T>& rings,
active_bound_list<T>& active_bounds) {
if (bndMaxPair == active_bounds.end()) {
if ((*bnd)->ring) {
add_point_to_ring(*(*bnd), (*bnd)->current_edge->top, rings);
}
return active_bounds.erase(bnd);
}
auto bnd_next = std::next(bnd);
auto return_bnd = bnd_next;
bool skipped = false;
while (bnd_next != active_bounds.end() && bnd_next != bndMaxPair) {
skipped = true;
intersect_bounds(bnd, bnd_next, (*bnd)->current_edge->top, cliptype, subject_fill_type,
clip_fill_type, rings, active_bounds);
swap_positions_in_ABL(bnd, bnd_next, active_bounds);
bnd_next = std::next(bnd);
}
if (!(*bnd)->ring && !(*bndMaxPair)->ring) {
active_bounds.erase(bndMaxPair);
} else if ((*bnd)->ring && (*bndMaxPair)->ring) {
add_local_maximum_point(bnd, bndMaxPair, (*bnd)->current_edge->top, rings, active_bounds);
active_bounds.erase(bndMaxPair);
} else {
throw std::runtime_error("DoMaxima error");
}
auto prev_itr = active_bounds.erase(bnd);
if (skipped) {
return return_bnd;
} else {
return prev_itr;
}
}
template <typename T>
void process_edges_at_top_of_scanbeam(T top_y,
active_bound_list<T>& active_bounds,
scanbeam_list<T>& scanbeam,
local_minimum_ptr_list<T> const& minima_sorted,
local_minimum_ptr_list_itr<T>& current_lm,
ring_manager<T>& rings,
clip_type cliptype,
fill_type subject_fill_type,
fill_type clip_fill_type) {
for (auto bnd = active_bounds.begin(); bnd != active_bounds.end();) {
// 1. Process maxima, treating them as if they are "bent" horizontal edges,
// but exclude maxima with horizontal edges.
bool is_maxima_edge = is_maxima(bnd, top_y);
if (is_maxima_edge) {
auto bnd_max_pair = get_maxima_pair(bnd, active_bounds);
is_maxima_edge = ((bnd_max_pair == active_bounds.end() ||
!current_edge_is_horizontal<T>(bnd_max_pair)) &&
is_maxima(bnd_max_pair, top_y));
if (is_maxima_edge) {
bnd = do_maxima(bnd, bnd_max_pair, cliptype, subject_fill_type, clip_fill_type,
rings, active_bounds);
continue;
}
}
// 2. Promote horizontal edges.
if (is_intermediate(bnd, top_y) && next_edge_is_horizontal<T>(bnd)) {
if ((*bnd)->ring) {
insert_hot_pixels_in_path(*(*bnd), (*bnd)->current_edge->top, rings, false);
}
next_edge_in_bound(bnd, scanbeam);
if ((*bnd)->ring) {
add_point_to_ring(*(*bnd), (*bnd)->current_edge->bot, rings);
}
} else {
(*bnd)->current_x = get_current_x(*((*bnd)->current_edge), top_y);
}
++bnd;
}
insert_horizontal_local_minima_into_ABL(top_y, minima_sorted, current_lm, active_bounds, rings,
scanbeam, cliptype, subject_fill_type, clip_fill_type);
process_horizontals(top_y, active_bounds, rings, scanbeam, cliptype, subject_fill_type,
clip_fill_type);
// 4. Promote intermediate vertices
for (auto bnd = active_bounds.begin(); bnd != active_bounds.end(); ++bnd) {
if (is_intermediate(bnd, top_y)) {
if ((*bnd)->ring) {
add_point_to_ring(*(*bnd), (*bnd)->current_edge->top, rings);
insert_hot_pixels_in_path(*(*bnd), (*bnd)->current_edge->top, rings, false);
}
next_edge_in_bound(bnd, scanbeam);
}
}
}
}
}
}

View File

@ -1,137 +0,0 @@
#pragma once
#include <mapbox/geometry/box.hpp>
#include <mapbox/geometry/multi_polygon.hpp>
#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 {
namespace quick_clip {
template <typename T>
mapbox::geometry::point<T> intersect(mapbox::geometry::point<T> a,
mapbox::geometry::point<T> b,
size_t edge,
mapbox::geometry::box<T> const& box) {
switch (edge) {
case 0:
return mapbox::geometry::point<T>(
static_cast<T>(a.x + static_cast<double>(b.x - a.x) * (box.min.y - a.y) / (b.y - a.y)),
box.min.y);
case 1:
return mapbox::geometry::point<T>(
box.max.x,
static_cast<T>(a.y + static_cast<double>(b.y - a.y) * (box.max.x - a.x) / (b.x - a.x)));
case 2:
return mapbox::geometry::point<T>(
static_cast<T>(a.x + static_cast<double>(b.x - a.x) * (box.max.y - a.y) / (b.y - a.y)),
box.max.y);
default: // case 3
return mapbox::geometry::point<T>(
box.min.x,
static_cast<T>(a.y + static_cast<double>(b.y - a.y) * (box.min.x - a.x) / (b.x - a.x)));
}
}
template <typename T>
bool inside(mapbox::geometry::point<T> p, size_t edge, mapbox::geometry::box<T> const& b) {
switch (edge) {
case 0:
return p.y > b.min.y;
case 1:
return p.x < b.max.x;
case 2:
return p.y < b.max.y;
default: // case 3
return p.x > b.min.x;
}
}
template <typename T>
optional_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;
for (size_t edge = 0; edge < 4; edge++) {
if (out.size() > 0) {
mapbox::geometry::linear_ring<T> in = out;
mapbox::geometry::point<T> S = in[in.size() - 1];
out.resize(0);
for (size_t e = 0; e < in.size(); e++) {
mapbox::geometry::point<T> E = in[e];
if (inside(E, edge, b)) {
if (!inside(S, edge, b)) {
out.push_back(intersect(S, E, edge, b));
}
out.push_back(E);
} else if (inside(S, edge, b)) {
out.push_back(intersect(S, E, edge, b));
}
S = E;
}
}
}
if (out.size() < 3) {
return optional_linear_ring<T>();
}
// 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));
}
}
template <typename T>
mapbox::geometry::multi_polygon<T> clip(mapbox::geometry::polygon<T> const& poly,
mapbox::geometry::box<T> const& b,
fill_type subject_fill_type) {
mapbox::geometry::multi_polygon<T> result;
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);
}
}
clipper.execute(clip_type_union, result, subject_fill_type, fill_type_even_odd);
return result;
}
template <typename T>
mapbox::geometry::multi_polygon<T> clip(mapbox::geometry::multi_polygon<T> const& mp,
mapbox::geometry::box<T> const& b,
fill_type subject_fill_type) {
mapbox::geometry::multi_polygon<T> result;
wagyu<T> clipper;
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);
}
}
}
clipper.execute(clip_type_union, result, subject_fill_type, fill_type_even_odd);
return result;
}
}
}
}

View File

@ -1,475 +0,0 @@
#pragma once
#include <assert.h>
#include <cmath>
#include <deque>
#include <list>
#include <map>
#include <mapbox/geometry/wagyu/point.hpp>
#include <set>
#include <sstream>
#include <vector>
#ifdef DEBUG
#include <execinfo.h>
#include <iostream>
#include <sstream>
#include <stdio.h>
//
// void* callstack[128];
// int i, frames = backtrace(callstack, 128);
// char** strs = backtrace_symbols(callstack, frames);
// for (i = 0; i < frames; ++i) {
// printf("%s\n", strs[i]);
// }
// free(strs);
#endif
namespace mapbox {
namespace geometry {
namespace wagyu {
// NOTE: ring and ring_ptr are forward declared in wagyu/point.hpp
template <typename T>
using ring_vector = std::vector<ring_ptr<T>>;
template <typename T>
using ring_list = std::list<ring_ptr<T>>;
template <typename T>
struct ring {
std::size_t ring_index; // To support unset 0 is undefined and indexes offset by 1
std::size_t size;
double area;
ring_ptr<T> parent;
ring_list<T> children;
point_ptr<T> points;
point_ptr<T> bottom_point;
ring(ring const&) = delete;
ring& operator=(ring const&) = delete;
ring()
: ring_index(0),
size(0),
area(std::numeric_limits<double>::quiet_NaN()),
parent(nullptr),
children(),
points(nullptr),
bottom_point(nullptr) {
}
};
template <typename T>
using hot_pixel_vector = std::vector<mapbox::geometry::point<T>>;
template <typename T>
using hot_pixel_itr = typename hot_pixel_vector<T>::iterator;
template <typename T>
using hot_pixel_rev_itr = typename hot_pixel_vector<T>::reverse_iterator;
template <typename T>
struct ring_manager {
ring_list<T> children;
std::vector<point_ptr<T>> all_points;
hot_pixel_vector<T> hot_pixels;
hot_pixel_itr<T> current_hp_itr;
std::deque<point<T>> points;
std::deque<ring<T>> rings;
std::vector<point<T>> storage;
std::size_t index;
ring_manager(ring_manager const&) = delete;
ring_manager& operator=(ring_manager const&) = delete;
ring_manager()
: children(),
all_points(),
hot_pixels(),
current_hp_itr(hot_pixels.end()),
points(),
rings(),
storage(),
index(0) {
}
};
template <typename T>
void preallocate_point_memory(ring_manager<T>& rings, std::size_t size) {
rings.storage.reserve(size);
rings.all_points.reserve(size);
}
template <typename T>
ring_ptr<T> create_new_ring(ring_manager<T>& rings) {
rings.rings.emplace_back();
ring_ptr<T> result = &rings.rings.back();
result->ring_index = rings.index++;
return result;
}
template <typename T>
point_ptr<T>
create_new_point(ring_ptr<T> r, mapbox::geometry::point<T> const& pt, ring_manager<T>& rings) {
point_ptr<T> point;
if (rings.storage.size() < rings.storage.capacity()) {
rings.storage.emplace_back(r, pt);
point = &rings.storage.back();
} else {
rings.points.emplace_back(r, pt);
point = &rings.points.back();
}
rings.all_points.push_back(point);
return point;
}
template <typename T>
point_ptr<T> create_new_point(ring_ptr<T> r,
mapbox::geometry::point<T> const& pt,
point_ptr<T> before_this_point,
ring_manager<T>& rings) {
point_ptr<T> point;
if (rings.storage.size() < rings.storage.capacity()) {
rings.storage.emplace_back(r, pt, before_this_point);
point = &rings.storage.back();
} else {
rings.points.emplace_back(r, pt, before_this_point);
point = &rings.points.back();
}
rings.all_points.push_back(point);
return point;
}
template <typename T>
void ring1_child_of_ring2(ring_ptr<T> ring1, ring_ptr<T> ring2, ring_manager<T>& manager) {
assert(ring1 != ring2);
if (ring1->parent == ring2) {
return;
}
if (ring1->parent == nullptr) {
manager.children.remove(ring1);
} else {
ring1->parent->children.remove(ring1);
}
if (ring2 == nullptr) {
ring1->parent = nullptr;
manager.children.push_back(ring1);
} else {
ring1->parent = ring2;
ring2->children.push_back(ring1);
}
}
template <typename T>
void ring1_sibling_of_ring2(ring_ptr<T> ring1, ring_ptr<T> ring2, ring_manager<T>& manager) {
assert(ring1 != ring2);
if (ring1->parent == ring2->parent) {
return;
}
if (ring1->parent == nullptr) {
manager.children.remove(ring1);
} else {
ring1->parent->children.remove(ring1);
}
if (ring2->parent == nullptr) {
manager.children.push_back(ring1);
} else {
ring2->parent->children.push_back(ring1);
}
ring1->parent = ring2->parent;
}
template <typename T>
void ring1_replaces_ring2(ring_ptr<T> ring1, ring_ptr<T> ring2, ring_manager<T>& manager) {
assert(ring1 != ring2);
if (ring2->parent == nullptr) {
manager.children.remove(ring2);
} else {
ring2->parent->children.remove(ring2);
}
for (auto& c : ring2->children) {
c->parent = ring1;
}
if (ring1 == nullptr) {
manager.children.splice(manager.children.end(), ring2->children);
} else {
ring1->children.splice(ring1->children.end(), ring2->children);
}
ring2->parent = nullptr;
}
template <typename T>
void remove_ring(ring_ptr<T> r, ring_manager<T>& manager) {
if (r->parent == nullptr) {
manager.children.remove(r);
for (auto& c : r->children) {
c->parent = nullptr;
}
manager.children.splice(manager.children.end(), r->children);
} else {
r->parent->children.remove(r);
for (auto& c : r->children) {
c->parent = r->parent;
}
r->parent->children.splice(r->parent->children.end(), r->children);
r->parent = nullptr;
}
}
template <typename T>
inline std::size_t ring_depth(ring_ptr<T> r) {
std::size_t depth = 0;
if (!r) {
return depth;
}
while (r->parent) {
depth++;
r = r->parent;
}
return depth;
}
template <typename T>
inline bool ring_is_hole(ring_ptr<T> r) {
return ring_depth(r) & 1;
}
template <typename T>
void set_next(const_point_ptr<T>& node, const const_point_ptr<T>& next_node) {
node->next = next_node;
}
template <typename T>
point_ptr<T> get_next(const_point_ptr<T>& node) {
return node->next;
}
template <typename T>
point_ptr<T> get_prev(const_point_ptr<T>& node) {
return node->prev;
}
template <typename T>
void set_prev(const_point_ptr<T>& node, const const_point_ptr<T>& prev_node) {
node->prev = prev_node;
}
template <typename T>
void init(const_point_ptr<T>& node) {
set_next(node, node);
set_prev(node, node);
}
template <typename T>
std::size_t point_count(const const_point_ptr<T>& orig_node) {
std::size_t size = 0;
point_ptr<T> n = orig_node;
do {
n = get_next(n);
++size;
} while (n != orig_node);
return size;
}
template <typename T>
void link_before(point_ptr<T>& node, point_ptr<T>& new_node) {
point_ptr<T> prev_node = get_prev(node);
set_prev(new_node, prev_node);
set_next(new_node, node);
set_prev(node, new_node);
set_next(prev_node, new_node);
}
template <typename T>
void link_after(point_ptr<T>& node, point_ptr<T>& new_node) {
point_ptr<T> next_node = get_next(node);
set_prev(new_node, node);
set_next(new_node, next_node);
set_next(node, new_node);
set_prev(next_node, new_node);
}
template <typename T>
void transfer_point(point_ptr<T>& p, point_ptr<T>& b, point_ptr<T>& e) {
if (b != e) {
point_ptr<T> prev_p = get_prev(p);
point_ptr<T> prev_b = get_prev(b);
point_ptr<T> prev_e = get_prev(e);
set_next(prev_e, p);
set_prev(p, prev_e);
set_next(prev_b, e);
set_prev(e, prev_b);
set_next(prev_p, b);
set_prev(b, prev_p);
} else {
link_before(p, b);
}
}
template <typename T>
void reverse_ring(point_ptr<T> pp) {
if (!pp) {
return;
}
point_ptr<T> pp1;
point_ptr<T> pp2;
pp1 = pp;
do {
pp2 = pp1->next;
pp1->next = pp1->prev;
pp1->prev = pp2;
pp1 = pp2;
} while (pp1 != pp);
}
template <typename T>
double area_from_point(point_ptr<T> op, std::size_t& size) {
point_ptr<T> startOp = op;
size = 1;
double a = 0.0;
do {
++size;
a += static_cast<double>(op->prev->x + op->x) * static_cast<double>(op->prev->y - op->y);
op = op->next;
} while (op != startOp);
return a * 0.5;
}
template <typename T>
double area(ring_ptr<T> r) {
assert(r != nullptr);
if (std::isnan(r->area)) {
r->area = area_from_point(r->points, r->size);
}
return r->area;
}
#ifdef DEBUG
template <class charT, class traits, typename T>
inline std::basic_ostream<charT, traits>& operator<<(std::basic_ostream<charT, traits>& out,
const ring<T>& r) {
out << " ring_index: " << r.ring_index << std::endl;
if (!r.parent) {
// out << " parent_ring ptr: nullptr" << std::endl;
out << " parent_index: -----" << std::endl;
} else {
// out << " parent_ring ptr: " << r.parent << std::endl;
out << " parent_ring idx: " << r.parent->ring_index << std::endl;
}
ring_ptr<T> n = const_cast<ring_ptr<T>>(&r);
if (ring_is_hole(n)) {
out << " is_hole: true " << std::endl;
} else {
out << " is_hole: false " << std::endl;
}
auto pt_itr = r.points;
if (pt_itr) {
out << " area: " << r.area << std::endl;
out << " points:" << std::endl;
out << " [[[" << pt_itr->x << "," << pt_itr->y << "],";
pt_itr = pt_itr->next;
while (pt_itr != r.points) {
out << "[" << pt_itr->x << "," << pt_itr->y << "],";
pt_itr = pt_itr->next;
}
out << "[" << pt_itr->x << "," << pt_itr->y << "]]]" << std::endl;
} else {
out << " area: NONE" << std::endl;
out << " points: NONE" << std::endl;
}
return out;
}
template <typename T>
std::string output_as_polygon(ring_ptr<T> r) {
std::ostringstream out;
auto pt_itr = r->points;
if (pt_itr) {
out << "[";
out << "[[" << pt_itr->x << "," << pt_itr->y << "],";
pt_itr = pt_itr->next;
while (pt_itr != r->points) {
out << "[" << pt_itr->x << "," << pt_itr->y << "],";
pt_itr = pt_itr->next;
}
out << "[" << pt_itr->x << "," << pt_itr->y << "]]";
for (auto const& c : r->children) {
pt_itr = c->points;
if (pt_itr) {
out << ",[[" << pt_itr->x << "," << pt_itr->y << "],";
pt_itr = pt_itr->next;
while (pt_itr != c->points) {
out << "[" << pt_itr->x << "," << pt_itr->y << "],";
pt_itr = pt_itr->next;
}
out << "[" << pt_itr->x << "," << pt_itr->y << "]]";
}
}
out << "]" << std::endl;
} else {
out << "[]" << std::endl;
}
return out.str();
}
template <class charT, class traits, typename T>
inline std::basic_ostream<charT, traits>& operator<<(std::basic_ostream<charT, traits>& out,
const ring_list<T>& rings) {
out << "START RING LIST" << std::endl;
for (auto& r : rings) {
out << " ring: " << r->ring_index << " - " << r << std::endl;
out << *r;
}
out << "END RING LIST" << std::endl;
return out;
}
template <class charT, class traits, typename T>
inline std::basic_ostream<charT, traits>& operator<<(std::basic_ostream<charT, traits>& out,
const ring_vector<T>& rings) {
out << "START RING VECTOR" << std::endl;
for (auto& r : rings) {
if (!r->points) {
continue;
}
out << " ring: " << r->ring_index << " - " << r << std::endl;
out << *r;
}
out << "END RING VECTOR" << std::endl;
return out;
}
template <class charT, class traits, typename T>
inline std::basic_ostream<charT, traits>& operator<<(std::basic_ostream<charT, traits>& out,
const std::deque<ring<T>>& rings) {
out << "START RING VECTOR" << std::endl;
for (auto& r : rings) {
if (!r.points) {
continue;
}
out << " ring: " << r.ring_index << std::endl;
out << r;
}
out << "END RING VECTOR" << std::endl;
return out;
}
template <class charT, class traits, typename T>
inline std::basic_ostream<charT, traits>& operator<<(std::basic_ostream<charT, traits>& out,
const hot_pixel_vector<T>& hp_vec) {
out << "Hot Pixels: " << std::endl;
for (auto& hp : hp_vec) {
out << hp << std::endl;
}
return out;
}
#endif
}
}
}

View File

@ -1,906 +0,0 @@
#pragma once
#ifdef DEBUG
#include <iostream>
// Example debug print for backtrace - only works on IOS
#include <execinfo.h>
#include <stdio.h>
//
// void* callstack[128];
// int i, frames = backtrace(callstack, 128);
// char** strs = backtrace_symbols(callstack, frames);
// for (i = 0; i < frames; ++i) {
// printf("%s\n", strs[i]);
// }
// free(strs);
#endif
#include <queue>
#include <mapbox/geometry/wagyu/active_bound_list.hpp>
#include <mapbox/geometry/wagyu/config.hpp>
#include <mapbox/geometry/wagyu/edge.hpp>
#include <mapbox/geometry/wagyu/ring.hpp>
#include <mapbox/geometry/wagyu/util.hpp>
namespace mapbox {
namespace geometry {
namespace wagyu {
template <typename T>
void set_hole_state(active_bound_list_itr<T>& bnd,
active_bound_list<T>& active_bounds,
ring_manager<T>& rings) {
auto bnd2 = active_bound_list_rev_itr<T>(bnd);
bound_ptr<T> bndTmp = nullptr;
// Find first non line ring to the left of current bound.
while (bnd2 != active_bounds.rend()) {
if ((*bnd2)->ring && (*bnd2)->winding_delta != 0) {
if (!bndTmp) {
bndTmp = (*bnd2);
} else if (bndTmp->ring == (*bnd2)->ring) {
bndTmp = nullptr;
}
}
++bnd2;
}
if (!bndTmp) {
(*bnd)->ring->parent = nullptr;
rings.children.push_back((*bnd)->ring);
} else {
(*bnd)->ring->parent = bndTmp->ring;
bndTmp->ring->children.push_back((*bnd)->ring);
}
}
template <typename T>
void set_hole_state(active_bound_list_rev_itr<T>& bnd,
active_bound_list<T>& active_bounds,
ring_manager<T>& rings) {
auto bnd2 = std::next(bnd);
bound_ptr<T> bndTmp = nullptr;
// Find first non line ring to the left of current bound.
while (bnd2 != active_bounds.rend()) {
if ((*bnd2)->ring && (*bnd2)->winding_delta != 0) {
if (!bndTmp) {
bndTmp = (*bnd2);
} else if (bndTmp->ring == (*bnd2)->ring) {
bndTmp = nullptr;
}
}
++bnd2;
}
if (!bndTmp) {
(*bnd)->ring->parent = nullptr;
rings.children.push_back((*bnd)->ring);
} else {
(*bnd)->ring->parent = bndTmp->ring;
bndTmp->ring->children.push_back((*bnd)->ring);
}
}
template <typename T>
void update_current_hp_itr(T scanline_y, ring_manager<T>& rings) {
while (rings.current_hp_itr->y > scanline_y) {
++rings.current_hp_itr;
}
}
template <typename T>
struct hot_pixel_sorter {
inline bool operator()(mapbox::geometry::point<T> const& pt1,
mapbox::geometry::point<T> const& pt2) {
if (pt1.y == pt2.y) {
return pt1.x < pt2.x;
} else {
return pt1.y > pt2.y;
}
}
};
// Due to the nature of floating point calculations
// and the high likely hood of values around X.5, we
// need to fudge what is X.5 some for our rounding.
const double rounding_offset = 1e-12;
const double rounding_offset_y = 5e-13;
template <typename T>
T round_towards_min(double val) {
// 0.5 rounds to 0
// 0.0 rounds to 0
// -0.5 rounds to -1
return static_cast<T>(std::ceil(val - 0.5 + rounding_offset));
}
template <typename T>
T round_towards_max(double val) {
// 0.5 rounds to 1
// 0.0 rounds to 0
// -0.5 rounds to 0
return static_cast<T>(std::floor(val + 0.5 + rounding_offset));
}
template <typename T>
inline T get_edge_min_x(edge<T> const& edge, const T current_y) {
if (is_horizontal(edge)) {
if (edge.bot.x < edge.top.x) {
return edge.bot.x;
} else {
return edge.top.x;
}
} else if (edge.dx > 0.0) {
if (current_y == edge.top.y) {
return edge.top.x;
} else {
double lower_range_y = static_cast<double>(current_y - edge.bot.y) - 0.5;
double return_val = static_cast<double>(edge.bot.x) + edge.dx * lower_range_y;
T value = round_towards_min<T>(return_val);
return value;
}
} else {
if (current_y == edge.bot.y) {
return edge.bot.x;
} else {
double return_val =
static_cast<double>(edge.bot.x) +
edge.dx * (static_cast<double>(current_y - edge.bot.y) + 0.5 - rounding_offset_y);
T value = round_towards_min<T>(return_val);
return value;
}
}
}
template <typename T>
inline T get_edge_max_x(edge<T> const& edge, const T current_y) {
if (is_horizontal(edge)) {
if (edge.bot.x > edge.top.x) {
return edge.bot.x;
} else {
return edge.top.x;
}
} else if (edge.dx < 0.0) {
if (current_y == edge.top.y) {
return edge.top.x;
} else {
double lower_range_y = static_cast<double>(current_y - edge.bot.y) - 0.5;
double return_val = static_cast<double>(edge.bot.x) + edge.dx * lower_range_y;
T value = round_towards_max<T>(return_val);
return value;
}
} else {
if (current_y == edge.bot.y) {
return edge.bot.x;
} else {
double return_val =
static_cast<double>(edge.bot.x) +
edge.dx * (static_cast<double>(current_y - edge.bot.y) + 0.5 - rounding_offset_y);
T value = round_towards_max<T>(return_val);
return value;
}
}
}
template <typename T>
void hot_pixel_set_left_to_right(T y,
T start_x,
T end_x,
bound<T>& bnd,
ring_manager<T>& rings,
hot_pixel_itr<T>& itr,
hot_pixel_itr<T>& end,
bool add_end_point) {
T x_min = get_edge_min_x(*(bnd.current_edge), y);
x_min = std::max(x_min, start_x);
T x_max = get_edge_max_x(*(bnd.current_edge), y);
x_max = std::min(x_max, end_x);
for (; itr != end; ++itr) {
if (itr->x < x_min) {
continue;
}
if (itr->x > x_max) {
break;
}
if (!add_end_point && itr->x == end_x) {
continue;
}
point_ptr<T> op = bnd.ring->points;
bool to_front = (bnd.side == edge_left);
if (to_front && (*itr == *op)) {
continue;
} else if (!to_front && (*itr == *op->prev)) {
continue;
}
point_ptr<T> new_point = create_new_point(bnd.ring, *itr, op, rings);
if (to_front) {
bnd.ring->points = new_point;
}
}
}
template <typename T>
void hot_pixel_set_right_to_left(T y,
T start_x,
T end_x,
bound<T>& bnd,
ring_manager<T>& rings,
hot_pixel_rev_itr<T>& itr,
hot_pixel_rev_itr<T>& end,
bool add_end_point) {
T x_min = get_edge_min_x(*(bnd.current_edge), y);
x_min = std::max(x_min, end_x);
T x_max = get_edge_max_x(*(bnd.current_edge), y);
x_max = std::min(x_max, start_x);
for (; itr != end; ++itr) {
if (itr->x > x_max) {
continue;
}
if (itr->x < x_min) {
break;
}
if (!add_end_point && itr->x == end_x) {
continue;
}
point_ptr<T> op = bnd.ring->points;
bool to_front = (bnd.side == edge_left);
if (to_front && (*itr == *op)) {
continue;
} else if (!to_front && (*itr == *op->prev)) {
continue;
}
point_ptr<T> new_point = create_new_point(bnd.ring, *itr, op, rings);
if (to_front) {
bnd.ring->points = new_point;
}
}
}
template <typename T>
void sort_hot_pixels(ring_manager<T>& rings) {
std::sort(rings.hot_pixels.begin(), rings.hot_pixels.end(), hot_pixel_sorter<T>());
auto last = std::unique(rings.hot_pixels.begin(), rings.hot_pixels.end());
rings.hot_pixels.erase(last, rings.hot_pixels.end());
}
template <typename T>
void insert_hot_pixels_in_path(bound<T>& bnd,
mapbox::geometry::point<T> const& end_pt,
ring_manager<T>& rings,
bool add_end_point) {
if (end_pt == bnd.last_point) {
return;
}
T start_y = bnd.last_point.y;
T start_x = bnd.last_point.x;
T end_y = end_pt.y;
T end_x = end_pt.x;
auto itr = rings.current_hp_itr;
while (itr->y <= start_y && itr != rings.hot_pixels.begin()) {
--itr;
}
if (start_x > end_x) {
for (; itr != rings.hot_pixels.end();) {
if (itr->y > start_y) {
++itr;
continue;
}
if (itr->y < end_y) {
break;
}
T y = itr->y;
auto last_itr = hot_pixel_rev_itr<T>(itr);
while (itr != rings.hot_pixels.end() && itr->y == y) {
++itr;
}
auto first_itr = hot_pixel_rev_itr<T>(itr);
bool add_end_point_itr = (y != end_pt.y || add_end_point);
hot_pixel_set_right_to_left(y, start_x, end_x, bnd, rings, first_itr, last_itr,
add_end_point_itr);
}
} else {
for (; itr != rings.hot_pixels.end();) {
if (itr->y > start_y) {
++itr;
continue;
}
if (itr->y < end_y) {
break;
}
T y = itr->y;
auto first_itr = itr;
while (itr != rings.hot_pixels.end() && itr->y == y) {
++itr;
}
auto last_itr = itr;
bool add_end_point_itr = (y != end_pt.y || add_end_point);
hot_pixel_set_left_to_right(y, start_x, end_x, bnd, rings, first_itr, last_itr,
add_end_point_itr);
}
}
bnd.last_point = end_pt;
}
template <typename T>
void add_to_hot_pixels(mapbox::geometry::point<T> const& pt, ring_manager<T>& rings) {
rings.hot_pixels.push_back(pt);
}
template <typename T>
void add_first_point(active_bound_list_itr<T>& bnd,
active_bound_list<T>& active_bounds,
mapbox::geometry::point<T> const& pt,
ring_manager<T>& rings) {
ring_ptr<T> r = create_new_ring(rings);
(*bnd)->ring = r;
r->points = create_new_point(r, pt, rings);
set_hole_state(bnd, active_bounds, rings);
(*bnd)->last_point = pt;
}
template <typename T>
void add_first_point(active_bound_list_rev_itr<T>& bnd,
active_bound_list<T>& active_bounds,
mapbox::geometry::point<T> const& pt,
ring_manager<T>& rings) {
ring_ptr<T> r = create_new_ring(rings);
// no ring currently set!
(*bnd)->ring = r;
r->points = create_new_point(r, pt, rings);
set_hole_state(bnd, active_bounds, rings);
(*bnd)->last_point = pt;
}
template <typename T>
void add_point_to_ring(bound<T>& bnd,
mapbox::geometry::point<T> const& pt,
ring_manager<T>& rings) {
assert(bnd.ring);
// Handle hot pixels
insert_hot_pixels_in_path(bnd, pt, rings, false);
// bnd.ring->points is the 'Left-most' point & bnd.ring->points->prev is the
// 'Right-most'
point_ptr<T> op = bnd.ring->points;
bool to_front = (bnd.side == edge_left);
if (to_front && (pt == *op)) {
return;
} else if (!to_front && (pt == *op->prev)) {
return;
}
point_ptr<T> new_point = create_new_point(bnd.ring, pt, bnd.ring->points, rings);
if (to_front) {
bnd.ring->points = new_point;
}
}
template <typename T>
void add_point(active_bound_list_itr<T>& bnd,
active_bound_list<T>& active_bounds,
mapbox::geometry::point<T> const& pt,
ring_manager<T>& rings) {
if (!(*bnd)->ring) {
add_first_point(bnd, active_bounds, pt, rings);
} else {
add_point_to_ring(*(*bnd), pt, rings);
}
}
template <typename T>
void add_point(active_bound_list_rev_itr<T>& bnd,
active_bound_list<T>& active_bounds,
mapbox::geometry::point<T> const& pt,
ring_manager<T>& rings) {
if (!(*bnd)->ring) {
add_first_point(bnd, active_bounds, pt, rings);
} else {
add_point_to_ring(*(*bnd), pt, rings);
}
}
template <typename T>
void add_local_minimum_point(active_bound_list_itr<T> b1,
active_bound_list_itr<T> b2,
active_bound_list<T>& active_bounds,
mapbox::geometry::point<T> const& pt,
ring_manager<T>& rings) {
active_bound_list_itr<T> b;
active_bound_list_rev_itr<T> prev_bound;
active_bound_list_rev_itr<T> prev_b1(b1);
active_bound_list_rev_itr<T> prev_b2(b2);
if (is_horizontal(*((*b2)->current_edge)) ||
((*b1)->current_edge->dx > (*b2)->current_edge->dx)) {
add_point(b1, active_bounds, pt, rings);
(*b2)->last_point = pt;
(*b2)->ring = (*b1)->ring;
(*b1)->side = edge_left;
(*b2)->side = edge_right;
b = b1;
if (prev_b1 != active_bounds.rend() && std::prev(b) == b2) {
prev_bound = prev_b2;
} else {
prev_bound = prev_b1;
}
} else {
add_point(b2, active_bounds, pt, rings);
(*b1)->last_point = pt;
(*b1)->ring = (*b2)->ring;
(*b1)->side = edge_right;
(*b2)->side = edge_left;
b = b2;
if (prev_b2 != active_bounds.rend() && std::prev(b) == b1) {
prev_bound = prev_b1;
} else {
prev_bound = prev_b2;
}
}
}
template <typename T>
inline double get_dx(point<T> const& pt1, point<T> const& pt2) {
if (pt1.y == pt2.y) {
return std::numeric_limits<double>::infinity();
} else {
return static_cast<double>(pt2.x - pt2.x) / static_cast<double>(pt2.y - pt1.y);
}
}
template <typename T>
bool first_is_bottom_point(const_point_ptr<T> btmPt1, const_point_ptr<T> btmPt2) {
point_ptr<T> p = btmPt1->prev;
while ((*p == *btmPt1) && (p != btmPt1)) {
p = p->prev;
}
double dx1p = std::fabs(get_dx(*btmPt1, *p));
p = btmPt1->next;
while ((*p == *btmPt1) && (p != btmPt1)) {
p = p->next;
}
double dx1n = std::fabs(get_dx(*btmPt1, *p));
p = btmPt2->prev;
while ((*p == *btmPt2) && (p != btmPt2)) {
p = p->prev;
}
double dx2p = std::fabs(get_dx(*btmPt2, *p));
p = btmPt2->next;
while ((*p == *btmPt2) && (p != btmPt2)) {
p = p->next;
}
double dx2n = std::fabs(get_dx(*btmPt2, *p));
if (values_are_equal(std::max(dx1p, dx1n), std::max(dx2p, dx2n)) &&
values_are_equal(std::min(dx1p, dx1n), std::min(dx2p, dx2n))) {
std::size_t s = 0;
return area_from_point(btmPt1, s) > 0.0; // if otherwise identical use orientation
} else {
return (greater_than_or_equal(dx1p, dx2p) && greater_than_or_equal(dx1p, dx2n)) ||
(greater_than_or_equal(dx1n, dx2p) && greater_than_or_equal(dx1n, dx2n));
}
}
template <typename T>
point_ptr<T> get_bottom_point(point_ptr<T> pp) {
point_ptr<T> dups = nullptr;
point_ptr<T> p = pp->next;
while (p != pp) {
if (p->y > pp->y) {
pp = p;
dups = nullptr;
} else if (p->y == pp->y && p->x <= pp->x) {
if (p->x < pp->x) {
dups = nullptr;
pp = p;
} else {
if (p->next != pp && p->prev != pp) {
dups = p;
}
}
}
p = p->next;
}
if (dups) {
// there appears to be at least 2 vertices at bottom_point so ...
while (dups != p) {
if (!first_is_bottom_point(p, dups)) {
pp = dups;
}
dups = dups->next;
while (*dups != *pp) {
dups = dups->next;
}
}
}
return pp;
}
template <typename T>
ring_ptr<T> get_lower_most_ring(ring_ptr<T> outRec1, ring_ptr<T> outRec2) {
// work out which polygon fragment has the correct hole state ...
if (!outRec1->bottom_point) {
outRec1->bottom_point = get_bottom_point(outRec1->points);
}
if (!outRec2->bottom_point) {
outRec2->bottom_point = get_bottom_point(outRec2->points);
}
point_ptr<T> OutPt1 = outRec1->bottom_point;
point_ptr<T> OutPt2 = outRec2->bottom_point;
if (OutPt1->y > OutPt2->y) {
return outRec1;
} else if (OutPt1->y < OutPt2->y) {
return outRec2;
} else if (OutPt1->x < OutPt2->x) {
return outRec1;
} else if (OutPt1->x > OutPt2->x) {
return outRec2;
} else if (OutPt1->next == OutPt1) {
return outRec2;
} else if (OutPt2->next == OutPt2) {
return outRec1;
} else if (first_is_bottom_point(OutPt1, OutPt2)) {
return outRec1;
} else {
return outRec2;
}
}
template <typename T>
bool ring1_child_below_ring2(ring_ptr<T> ring1, ring_ptr<T> ring2) {
do {
ring1 = ring1->parent;
if (ring1 == ring2) {
return true;
}
} while (ring1);
return false;
}
template <typename T>
void update_points_ring(ring_ptr<T> ring) {
point_ptr<T> op = ring->points;
do {
op->ring = ring;
op = op->prev;
} while (op != ring->points);
}
template <typename T>
void append_ring(active_bound_list_itr<T>& b1,
active_bound_list_itr<T>& b2,
active_bound_list<T>& active_bounds,
ring_manager<T>& manager) {
// get the start and ends of both output polygons ...
ring_ptr<T> outRec1 = (*b1)->ring;
ring_ptr<T> outRec2 = (*b2)->ring;
ring_ptr<T> keep_ring;
bound_ptr<T> keep_bound;
ring_ptr<T> remove_ring;
bound_ptr<T> remove_bound;
if (ring1_child_below_ring2(outRec1, outRec2)) {
keep_ring = outRec2;
keep_bound = *b2;
remove_ring = outRec1;
remove_bound = *b1;
} else if (ring1_child_below_ring2(outRec2, outRec1)) {
keep_ring = outRec1;
keep_bound = *b1;
remove_ring = outRec2;
remove_bound = *b2;
} else if (outRec1 == get_lower_most_ring(outRec1, outRec2)) {
keep_ring = outRec1;
keep_bound = *b1;
remove_ring = outRec2;
remove_bound = *b2;
} else {
keep_ring = outRec2;
keep_bound = *b2;
remove_ring = outRec1;
remove_bound = *b1;
}
// get the start and ends of both output polygons and
// join b2 poly onto b1 poly and delete pointers to b2 ...
point_ptr<T> p1_lft = keep_ring->points;
point_ptr<T> p1_rt = p1_lft->prev;
point_ptr<T> p2_lft = remove_ring->points;
point_ptr<T> p2_rt = p2_lft->prev;
// join b2 poly onto b1 poly and delete pointers to b2 ...
if (keep_bound->side == edge_left) {
if (remove_bound->side == edge_left) {
// z y x a b c
reverse_ring(p2_lft);
p2_lft->next = p1_lft;
p1_lft->prev = p2_lft;
p1_rt->next = p2_rt;
p2_rt->prev = p1_rt;
keep_ring->points = p2_rt;
} else {
// x y z a b c
p2_rt->next = p1_lft;
p1_lft->prev = p2_rt;
p2_lft->prev = p1_rt;
p1_rt->next = p2_lft;
keep_ring->points = p2_lft;
}
} else {
if (remove_bound->side == edge_right) {
// a b c z y x
reverse_ring(p2_lft);
p1_rt->next = p2_rt;
p2_rt->prev = p1_rt;
p2_lft->next = p1_lft;
p1_lft->prev = p2_lft;
} else {
// a b c x y z
p1_rt->next = p2_lft;
p2_lft->prev = p1_rt;
p1_lft->prev = p2_rt;
p2_rt->next = p1_lft;
}
}
keep_ring->bottom_point = nullptr;
bool keep_is_hole = ring_is_hole(keep_ring);
bool remove_is_hole = ring_is_hole(remove_ring);
remove_ring->points = nullptr;
remove_ring->bottom_point = nullptr;
if (keep_is_hole != remove_is_hole) {
ring1_replaces_ring2(keep_ring->parent, remove_ring, manager);
} else {
ring1_replaces_ring2(keep_ring, remove_ring, manager);
}
update_points_ring(keep_ring);
// nb: safe because we only get here via AddLocalMaxPoly
keep_bound->ring = nullptr;
remove_bound->ring = nullptr;
for (auto& b : active_bounds) {
if (b->ring == remove_ring) {
b->ring = keep_ring;
b->side = keep_bound->side;
break; // Not sure why there is a break here but was transfered logic from angus
}
}
}
template <typename T>
void add_local_maximum_point(active_bound_list_itr<T>& b1,
active_bound_list_itr<T>& b2,
mapbox::geometry::point<T> const& pt,
ring_manager<T>& rings,
active_bound_list<T>& active_bounds) {
insert_hot_pixels_in_path(*(*b2), pt, rings, false);
add_point(b1, active_bounds, pt, rings);
if ((*b1)->ring == (*b2)->ring) {
(*b1)->ring = nullptr;
(*b2)->ring = nullptr;
// I am not certain that order is important here?
} else if ((*b1)->ring->ring_index < (*b2)->ring->ring_index) {
append_ring(b1, b2, active_bounds, rings);
} else {
append_ring(b2, b1, active_bounds, rings);
}
}
enum point_in_polygon_result : std::int8_t {
point_on_polygon = -1,
point_inside_polygon = 0,
point_outside_polygon = 1
};
template <typename T>
point_in_polygon_result point_in_polygon(point<T> const& pt, point_ptr<T> op) {
// returns 0 if false, +1 if true, -1 if pt ON polygon boundary
point_in_polygon_result result = point_outside_polygon;
point_ptr<T> startOp = op;
do {
if (op->next->y == pt.y) {
if ((op->next->x == pt.x) ||
(op->y == pt.y && ((op->next->x > pt.x) == (op->x < pt.x)))) {
return point_on_polygon;
}
}
if ((op->y < pt.y) != (op->next->y < pt.y)) {
if (op->x >= pt.x) {
if (op->next->x > pt.x) {
// Switch between point outside polygon and point inside
// polygon
if (result == point_outside_polygon) {
result = point_inside_polygon;
} else {
result = point_outside_polygon;
}
} else {
double d =
static_cast<double>(op->x - pt.x) *
static_cast<double>(op->next->y - pt.y) -
static_cast<double>(op->next->x - pt.x) * static_cast<double>(op->y - pt.y);
if (value_is_zero(d)) {
return point_on_polygon;
}
if ((d > 0) == (op->next->y > op->y)) {
// Switch between point outside polygon and point inside
// polygon
if (result == point_outside_polygon) {
result = point_inside_polygon;
} else {
result = point_outside_polygon;
}
}
}
} else {
if (op->next->x > pt.x) {
double d =
static_cast<double>(op->x - pt.x) *
static_cast<double>(op->next->y - pt.y) -
static_cast<double>(op->next->x - pt.x) * static_cast<double>(op->y - pt.y);
if (value_is_zero(d)) {
return point_on_polygon;
}
if ((d > 0) == (op->next->y > op->y)) {
// Switch between point outside polygon and point inside
// polygon
if (result == point_outside_polygon) {
result = point_inside_polygon;
} else {
result = point_outside_polygon;
}
}
}
}
}
op = op->next;
} while (startOp != op);
return result;
}
template <typename T>
point_in_polygon_result point_in_polygon(mapbox::geometry::point<double> const& pt,
point_ptr<T> op) {
// returns 0 if false, +1 if true, -1 if pt ON polygon boundary
point_in_polygon_result result = point_outside_polygon;
point_ptr<T> startOp = op;
do {
double op_x = static_cast<double>(op->x);
double op_y = static_cast<double>(op->y);
double op_next_x = static_cast<double>(op->next->x);
double op_next_y = static_cast<double>(op->next->y);
if (values_are_equal(op_next_y, pt.y)) {
if (values_are_equal(op_next_x, pt.x) ||
(values_are_equal(op_y, pt.y) && ((op_next_x > pt.x) == (op_x < pt.x)))) {
return point_on_polygon;
}
}
if ((op_y < pt.y) != (op_next_y < pt.y)) {
if (greater_than_or_equal(op_x, pt.x)) {
if (op_next_x > pt.x) {
// Switch between point outside polygon and point inside
// polygon
if (result == point_outside_polygon) {
result = point_inside_polygon;
} else {
result = point_outside_polygon;
}
} else {
double d =
(op_x - pt.x) * (op_next_y - pt.y) - (op_next_x - pt.x) * (op_y - pt.y);
if (value_is_zero(d)) {
return point_on_polygon;
}
if ((d > 0.0) == (op_next_y > op->y)) {
// Switch between point outside polygon and point inside
// polygon
if (result == point_outside_polygon) {
result = point_inside_polygon;
} else {
result = point_outside_polygon;
}
}
}
} else {
if (op_next_x > pt.x) {
double d =
(op_x - pt.x) * (op_next_y - pt.y) - (op_next_x - pt.x) * (op_y - pt.y);
if (value_is_zero(d)) {
return point_on_polygon;
}
if ((d > 0.0) == (op_next_y > op->y)) {
// Switch between point outside polygon and point inside
// polygon
if (result == point_outside_polygon) {
result = point_inside_polygon;
} else {
result = point_outside_polygon;
}
}
}
}
}
op = op->next;
} while (startOp != op);
return result;
}
template <typename T>
point_in_polygon_result inside_or_outside_special(point_ptr<T> first_pt, point_ptr<T> other_poly) {
if (value_is_zero(area(first_pt->ring))) {
return point_inside_polygon;
}
if (value_is_zero(area(other_poly->ring))) {
return point_outside_polygon;
}
point_ptr<T> pt = first_pt;
do {
if (*pt == *(pt->prev) || *pt == *(pt->next) || *(pt->next) == *(pt->prev) ||
slopes_equal(*(pt->prev), *pt, *(pt->next))) {
pt = pt->next;
continue;
}
double dx = ((pt->prev->x - pt->x) / 3.0) + ((pt->next->x - pt->x) / 3.0);
double dy = ((pt->prev->y - pt->y) / 3.0) + ((pt->next->y - pt->y) / 3.0);
mapbox::geometry::point<double> offset_pt(pt->x + dx, pt->y + dy);
point_in_polygon_result res = point_in_polygon(offset_pt, pt);
if (res != point_inside_polygon) {
offset_pt.x = pt->x - dx;
offset_pt.y = pt->y - dy;
res = point_in_polygon(offset_pt, pt);
if (res != point_inside_polygon) {
pt = pt->next;
continue;
}
}
res = point_in_polygon(offset_pt, other_poly);
if (res == point_on_polygon) {
pt = pt->next;
continue;
}
return res;
} while (pt != first_pt);
return point_inside_polygon;
}
template <typename T>
bool poly2_contains_poly1(ring_ptr<T> ring1, ring_ptr<T> ring2) {
point_ptr<T> outpt1 = ring1->points->next;
point_ptr<T> outpt2 = ring2->points->next;
point_ptr<T> op = outpt1;
do {
// nb: PointInPolygon returns 0 if false, +1 if true, -1 if pt on polygon
point_in_polygon_result res = point_in_polygon(*op, outpt2);
if (res != point_on_polygon) {
return res == point_inside_polygon;
}
op = op->next;
} while (op != outpt1);
point_in_polygon_result res = inside_or_outside_special(outpt1, outpt2);
return res == point_inside_polygon;
}
template <typename T>
void dispose_out_points(point_ptr<T>& pp) {
if (pp == nullptr) {
return;
}
pp->prev->next = nullptr;
while (pp) {
point_ptr<T> tmpPp = pp;
pp = pp->next;
tmpPp->next = tmpPp;
tmpPp->prev = tmpPp;
tmpPp->ring = nullptr;
}
}
}
}
}

View File

@ -1,37 +0,0 @@
#pragma once
#include <queue>
#include <mapbox/geometry/wagyu/config.hpp>
#include <mapbox/geometry/wagyu/local_minimum.hpp>
namespace mapbox {
namespace geometry {
namespace wagyu {
template <typename T>
using scanbeam_list = std::priority_queue<T>;
template <typename T>
bool pop_from_scanbeam(T& Y, scanbeam_list<T>& scanbeam) {
if (scanbeam.empty()) {
return false;
}
Y = scanbeam.top();
scanbeam.pop();
while (!scanbeam.empty() && Y == scanbeam.top()) {
scanbeam.pop();
} // Pop duplicates.
return true;
}
template <typename T>
void setup_scanbeam(local_minimum_list<T>& minima_list, scanbeam_list<T>& scanbeam) {
for (auto lm = minima_list.begin(); lm != minima_list.end(); ++lm) {
scanbeam.push(lm->y);
}
}
}
}
}

View File

@ -1,172 +0,0 @@
#pragma once
#include <mapbox/geometry/wagyu/active_bound_list.hpp>
#include <mapbox/geometry/wagyu/bound.hpp>
#include <mapbox/geometry/wagyu/config.hpp>
#include <mapbox/geometry/wagyu/edge.hpp>
#include <mapbox/geometry/wagyu/intersect.hpp>
#include <mapbox/geometry/wagyu/intersect_util.hpp>
#include <mapbox/geometry/wagyu/ring.hpp>
#include <mapbox/geometry/wagyu/ring_util.hpp>
#include <mapbox/geometry/wagyu/util.hpp>
namespace mapbox {
namespace geometry {
namespace wagyu {
template <typename T>
void process_hot_pixel_intersections(T top_y,
active_bound_list<T>& active_bounds,
ring_manager<T>& rings) {
if (active_bounds.empty()) {
return;
}
update_current_x(active_bounds, top_y);
// bubblesort ...
bool isModified;
do {
isModified = false;
auto bnd = active_bounds.begin();
auto bnd_next = std::next(bnd);
while (bnd_next != active_bounds.end()) {
if ((*bnd)->current_x > (*bnd_next)->current_x &&
!slopes_equal(*(*bnd)->current_edge, *(*bnd_next)->current_edge)) {
mapbox::geometry::point<double> pt;
if (!get_edge_intersection<T, double>(*((*bnd)->current_edge),
*((*bnd_next)->current_edge), pt)) {
// LCOV_EXCL_START
throw std::runtime_error("Edges do not intersect!");
// LCOV_EXCL_END
}
add_to_hot_pixels(round_point<T>(pt), rings);
swap_positions_in_ABL(bnd, bnd_next, active_bounds);
bnd_next = std::next(bnd);
isModified = true;
} else {
bnd = bnd_next;
++bnd_next;
}
}
} while (isModified);
}
template <typename T>
void process_hot_pixel_edges_at_top_of_scanbeam(T top_y,
scanbeam_list<T>& scanbeam,
active_bound_list<T>& active_bounds,
ring_manager<T>& rings) {
for (auto bnd = active_bounds.begin(); bnd != active_bounds.end();) {
auto bnd_2 = std::next(bnd);
while ((*bnd)->current_edge != (*bnd)->edges.end() &&
(*bnd)->current_edge->top.y == top_y) {
add_to_hot_pixels((*bnd)->current_edge->top, rings);
if (current_edge_is_horizontal<T>(bnd)) {
(*bnd)->current_x = static_cast<double>((*bnd)->current_edge->top.x);
if ((*bnd)->current_edge->bot.x < (*bnd)->current_edge->top.x) {
// left to right
auto bnd_next = std::next(bnd);
while (bnd_next != active_bounds.end() &&
(*bnd_next)->current_x < (*bnd)->current_x) {
if (std::llround((*bnd_next)->current_edge->top.y) != top_y &&
std::llround((*bnd_next)->current_edge->bot.y) != top_y) {
mapbox::geometry::point<T> pt(std::llround((*bnd_next)->current_x),
top_y);
add_to_hot_pixels(pt, rings);
}
swap_positions_in_ABL(bnd, bnd_next, active_bounds);
bnd_next = std::next(bnd);
}
} else {
// right to left
if (bnd != active_bounds.begin()) {
auto bnd_prev = std::prev(bnd);
while (bnd != active_bounds.begin() &&
(*bnd_prev)->current_x > (*bnd)->current_x) {
if (std::llround((*bnd_prev)->current_edge->top.y) != top_y &&
std::llround((*bnd_prev)->current_edge->bot.y) != top_y) {
mapbox::geometry::point<T> pt(std::llround((*bnd_prev)->current_x),
top_y);
add_to_hot_pixels(pt, rings);
}
swap_positions_in_ABL(bnd, bnd_prev, active_bounds);
bnd_prev = std::prev(bnd);
}
}
}
}
next_edge_in_bound(bnd, scanbeam);
}
if ((*bnd)->current_edge == (*bnd)->edges.end()) {
active_bounds.erase(bnd);
}
bnd = bnd_2;
}
}
template <typename T>
void insert_local_minima_into_ABL_hot_pixel(T top_y,
local_minimum_ptr_list<T>& minima_sorted,
local_minimum_ptr_list_itr<T>& lm,
active_bound_list<T>& active_bounds,
ring_manager<T>& rings,
scanbeam_list<T>& scanbeam) {
while (lm != minima_sorted.end() && (*lm)->y == top_y) {
add_to_hot_pixels((*lm)->left_bound.edges.front().bot, rings);
auto& left_bound = (*lm)->left_bound;
left_bound.current_edge = left_bound.edges.begin();
left_bound.current_x = static_cast<double>(left_bound.current_edge->bot.x);
auto lb_abl_itr = insert_bound_into_ABL(left_bound, active_bounds);
if (!current_edge_is_horizontal<T>(lb_abl_itr)) {
scanbeam.push((*lb_abl_itr)->current_edge->top.y);
}
auto& right_bound = (*lm)->right_bound;
right_bound.current_edge = right_bound.edges.begin();
right_bound.current_x = static_cast<double>(right_bound.current_edge->bot.x);
auto rb_abl_itr = insert_bound_into_ABL(right_bound, lb_abl_itr, active_bounds);
if (!current_edge_is_horizontal<T>(rb_abl_itr)) {
scanbeam.push((*rb_abl_itr)->current_edge->top.y);
}
++lm;
}
}
template <typename T>
void build_hot_pixels(local_minimum_list<T>& minima_list, ring_manager<T>& rings) {
active_bound_list<T> active_bounds;
scanbeam_list<T> scanbeam;
T scanline_y = std::numeric_limits<T>::max();
local_minimum_ptr_list<T> minima_sorted;
minima_sorted.reserve(minima_list.size());
for (auto& lm : minima_list) {
minima_sorted.push_back(&lm);
}
std::stable_sort(minima_sorted.begin(), minima_sorted.end(), local_minimum_sorter<T>());
local_minimum_ptr_list_itr<T> current_lm = minima_sorted.begin();
setup_scanbeam(minima_list, scanbeam);
// Estimate size for reserving hot pixels
std::size_t reserve = 0;
for (auto& lm : minima_list) {
reserve += lm.left_bound.edges.size() + 2;
reserve += lm.right_bound.edges.size() + 2;
}
rings.hot_pixels.reserve(reserve);
while (pop_from_scanbeam(scanline_y, scanbeam) || current_lm != minima_sorted.end()) {
process_hot_pixel_intersections(scanline_y, active_bounds, rings);
insert_local_minima_into_ABL_hot_pixel(scanline_y, minima_sorted, current_lm, active_bounds,
rings, scanbeam);
process_hot_pixel_edges_at_top_of_scanbeam(scanline_y, scanbeam, active_bounds, rings);
}
preallocate_point_memory(rings, rings.hot_pixels.size());
sort_hot_pixels(rings);
}
}
}
}

File diff suppressed because it is too large Load Diff

View File

@ -1,79 +0,0 @@
#pragma once
#include <cmath>
#include <mapbox/geometry/point.hpp>
#include <mapbox/geometry/polygon.hpp>
#include <mapbox/geometry/wagyu/point.hpp>
namespace mapbox {
namespace geometry {
namespace wagyu {
template <typename T>
double area(mapbox::geometry::linear_ring<T> const& poly) {
std::size_t size = poly.size();
if (size < 3) {
return 0.0;
}
double a = 0.0;
auto itr = poly.begin();
auto itr_prev = poly.end();
--itr_prev;
a += static_cast<double>(itr_prev->x + itr->x) * static_cast<double>(itr_prev->y - itr->y);
++itr;
itr_prev = poly.begin();
for (; itr != poly.end(); ++itr, ++itr_prev) {
a += static_cast<double>(itr_prev->x + itr->x) * static_cast<double>(itr_prev->y - itr->y);
}
return -a * 0.5;
}
inline bool value_is_zero(double val) {
return std::fabs(val) < std::numeric_limits<double>::epsilon();
}
inline bool values_are_equal(double x, double y) {
return value_is_zero(x - y);
}
inline bool values_near_equal(double x, double y) {
return std::fabs(x - y) < (5.0 * std::numeric_limits<double>::epsilon());
}
inline bool greater_than_or_equal(double x, double y) {
return x > y || values_are_equal(x, y);
}
template <typename T>
bool slopes_equal(mapbox::geometry::point<T> const& pt1,
mapbox::geometry::point<T> const& pt2,
mapbox::geometry::point<T> const& pt3) {
return (pt1.y - pt2.y) * (pt2.x - pt3.x) == (pt1.x - pt2.x) * (pt2.y - pt3.y);
}
template <typename T>
bool slopes_equal(mapbox::geometry::wagyu::point<T> const& pt1,
mapbox::geometry::wagyu::point<T> const& pt2,
mapbox::geometry::point<T> const& pt3) {
return (pt1.y - pt2.y) * (pt2.x - pt3.x) == (pt1.x - pt2.x) * (pt2.y - pt3.y);
}
template <typename T>
bool slopes_equal(mapbox::geometry::wagyu::point<T> const& pt1,
mapbox::geometry::wagyu::point<T> const& pt2,
mapbox::geometry::wagyu::point<T> const& pt3) {
return (pt1.y - pt2.y) * (pt2.x - pt3.x) == (pt1.x - pt2.x) * (pt2.y - pt3.y);
}
template <typename T>
bool slopes_equal(mapbox::geometry::point<T> const& pt1,
mapbox::geometry::point<T> const& pt2,
mapbox::geometry::point<T> const& pt3,
mapbox::geometry::point<T> const& pt4) {
return (pt1.y - pt2.y) * (pt3.x - pt4.x) == (pt1.x - pt2.x) * (pt3.y - pt4.y);
}
}
}
}

View File

@ -1,74 +0,0 @@
#pragma once
#include <algorithm>
#include <set>
#include <mapbox/geometry/wagyu/active_bound_list.hpp>
#include <mapbox/geometry/wagyu/config.hpp>
#include <mapbox/geometry/wagyu/intersect_util.hpp>
#include <mapbox/geometry/wagyu/local_minimum.hpp>
#include <mapbox/geometry/wagyu/local_minimum_util.hpp>
#include <mapbox/geometry/wagyu/process_horizontal.hpp>
#include <mapbox/geometry/wagyu/process_maxima.hpp>
#include <mapbox/geometry/wagyu/ring.hpp>
#include <mapbox/geometry/wagyu/ring_util.hpp>
#include <mapbox/geometry/wagyu/util.hpp>
namespace mapbox {
namespace geometry {
namespace wagyu {
template <typename T>
bool execute_vatti(local_minimum_list<T>& minima_list,
ring_manager<T>& rings,
clip_type cliptype,
fill_type subject_fill_type,
fill_type clip_fill_type) {
if (minima_list.empty()) {
return false;
}
active_bound_list<T> active_bounds;
scanbeam_list<T> scanbeam;
T scanline_y = std::numeric_limits<T>::max();
local_minimum_ptr_list<T> minima_sorted;
minima_sorted.reserve(minima_list.size());
for (auto& lm : minima_list) {
minima_sorted.push_back(&lm);
}
std::stable_sort(minima_sorted.begin(), minima_sorted.end(), local_minimum_sorter<T>());
local_minimum_ptr_list_itr<T> current_lm = minima_sorted.begin();
// std::clog << output_all_edges(minima_sorted) << std::endl;
setup_scanbeam(minima_list, scanbeam);
rings.current_hp_itr = rings.hot_pixels.begin();
while (pop_from_scanbeam(scanline_y, scanbeam) || current_lm != minima_sorted.end()) {
process_intersections(scanline_y, active_bounds, cliptype, subject_fill_type,
clip_fill_type, rings);
update_current_hp_itr(scanline_y, rings);
// First we process bounds that has already been added to the active bound list --
// if the active bound list is empty local minima that are at this scanline_y and
// have a horizontal edge at the local minima will be processed
process_edges_at_top_of_scanbeam(scanline_y, active_bounds, scanbeam, minima_sorted,
current_lm, rings, cliptype, subject_fill_type,
clip_fill_type);
// Next we will add local minima bounds to the active bounds list that are on the local
// minima queue at
// this current scanline_y
insert_local_minima_into_ABL(scanline_y, minima_sorted, current_lm, active_bounds, rings,
scanbeam, cliptype, subject_fill_type, clip_fill_type);
}
// std::clog << rings.rings << std::endl;
// std::clog << output_as_polygon(rings.all_rings[0]);
return true;
}
}
}
}

View File

@ -1,131 +0,0 @@
#pragma once
#include <list>
#include <mapbox/geometry/box.hpp>
#include <mapbox/geometry/line_string.hpp>
#include <mapbox/geometry/multi_polygon.hpp>
#include <mapbox/geometry/polygon.hpp>
#include <mapbox/geometry/wagyu/build_local_minima_list.hpp>
#include <mapbox/geometry/wagyu/build_result.hpp>
#include <mapbox/geometry/wagyu/config.hpp>
#include <mapbox/geometry/wagyu/local_minimum.hpp>
#include <mapbox/geometry/wagyu/snap_rounding.hpp>
#include <mapbox/geometry/wagyu/topology_correction.hpp>
#include <mapbox/geometry/wagyu/vatti.hpp>
namespace mapbox {
namespace geometry {
namespace wagyu {
template <typename T>
class wagyu {
private:
using value_type = T;
local_minimum_list<value_type> minima_list;
bool reverse_output;
wagyu(wagyu const&) = delete;
wagyu& operator=(wagyu const&) = delete;
public:
wagyu() : minima_list(), reverse_output(false) {
}
~wagyu() {
clear();
}
bool add_ring(mapbox::geometry::linear_ring<value_type> const& pg,
polygon_type p_type = polygon_type_subject) {
return add_linear_ring(pg, minima_list, p_type);
}
bool add_polygon(mapbox::geometry::polygon<value_type> const& ppg,
polygon_type p_type = polygon_type_subject) {
bool result = false;
for (auto const& r : ppg) {
if (add_ring(r, p_type)) {
result = true;
}
}
return result;
}
void reverse_rings(bool value) {
reverse_output = value;
}
void clear() {
minima_list.clear();
}
mapbox::geometry::box<value_type> get_bounds() {
mapbox::geometry::point<value_type> min = { 0, 0 };
mapbox::geometry::point<value_type> max = { 0, 0 };
if (minima_list.empty()) {
return mapbox::geometry::box<value_type>(min, max);
}
bool first_set = false;
for (auto const& lm : minima_list) {
if (!lm.left_bound.edges.empty()) {
if (!first_set) {
min = lm.left_bound.edges.front().top;
max = lm.left_bound.edges.back().bot;
first_set = true;
} else {
min.y = std::min(min.y, lm.left_bound.edges.front().top.y);
max.y = std::max(max.y, lm.left_bound.edges.back().bot.y);
max.x = std::max(max.x, lm.left_bound.edges.back().top.x);
min.x = std::min(min.x, lm.left_bound.edges.back().top.x);
}
for (auto const& e : lm.left_bound.edges) {
max.x = std::max(max.x, e.bot.x);
min.x = std::min(min.x, e.bot.x);
}
}
if (!lm.right_bound.edges.empty()) {
if (!first_set) {
min = lm.right_bound.edges.front().top;
max = lm.right_bound.edges.back().bot;
first_set = true;
} else {
min.y = std::min(min.y, lm.right_bound.edges.front().top.y);
max.y = std::max(max.y, lm.right_bound.edges.back().bot.y);
max.x = std::max(max.x, lm.right_bound.edges.back().top.x);
min.x = std::min(min.x, lm.right_bound.edges.back().top.x);
}
for (auto const& e : lm.right_bound.edges) {
max.x = std::max(max.x, e.bot.x);
min.x = std::min(min.x, e.bot.x);
}
}
}
return mapbox::geometry::box<value_type>(min, max);
}
bool execute(clip_type cliptype,
mapbox::geometry::multi_polygon<value_type>& solution,
fill_type subject_fill_type,
fill_type clip_fill_type) {
ring_manager<T> rings;
build_hot_pixels(minima_list, rings);
if (!execute_vatti(minima_list, rings, cliptype, subject_fill_type, clip_fill_type)) {
return false;
}
do_simple_polygons(rings);
build_result(solution, rings, reverse_output);
return true;
}
};
}
}
}

View File

@ -1,74 +0,0 @@
#ifndef MAPBOX_UTIL_OPTIONAL_HPP
#define MAPBOX_UTIL_OPTIONAL_HPP
#pragma message("This implementation of optional is deprecated. See https://github.com/mapbox/variant/issues/64.")
#include <type_traits>
#include <utility>
#include <mapbox/variant.hpp>
namespace mapbox {
namespace util {
template <typename T>
class optional
{
static_assert(!std::is_reference<T>::value, "optional doesn't support references");
struct none_type
{
};
variant<none_type, T> variant_;
public:
optional() = default;
optional(optional const& rhs)
{
if (this != &rhs)
{ // protect against invalid self-assignment
variant_ = rhs.variant_;
}
}
optional(T const& v) { variant_ = v; }
explicit operator bool() const noexcept { return variant_.template is<T>(); }
T const& get() const { return variant_.template get<T>(); }
T& get() { return variant_.template get<T>(); }
T const& operator*() const { return this->get(); }
T operator*() { return this->get(); }
optional& operator=(T const& v)
{
variant_ = v;
return *this;
}
optional& operator=(optional const& rhs)
{
if (this != &rhs)
{
variant_ = rhs.variant_;
}
return *this;
}
template <typename... Args>
void emplace(Args&&... args)
{
variant_ = T{std::forward<Args>(args)...};
}
void reset() { variant_ = none_type{}; }
}; // class optional
} // namespace util
} // namespace mapbox
#endif // MAPBOX_UTIL_OPTIONAL_HPP

View File

@ -1,122 +0,0 @@
#ifndef MAPBOX_UTIL_RECURSIVE_WRAPPER_HPP
#define MAPBOX_UTIL_RECURSIVE_WRAPPER_HPP
// Based on variant/recursive_wrapper.hpp from boost.
//
// Original license:
//
// Copyright (c) 2002-2003
// Eric Friedman, Itay Maman
//
// Distributed under the Boost Software License, Version 1.0. (See
// accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
#include <cassert>
#include <utility>
namespace mapbox {
namespace util {
template <typename T>
class recursive_wrapper
{
T* p_;
void assign(T const& rhs)
{
this->get() = rhs;
}
public:
using type = T;
/**
* Default constructor default initializes the internally stored value.
* For POD types this means nothing is done and the storage is
* uninitialized.
*
* @throws std::bad_alloc if there is insufficient memory for an object
* of type T.
* @throws any exception thrown by the default constructur of T.
*/
recursive_wrapper()
: p_(new T){}
~recursive_wrapper() noexcept { delete p_; }
recursive_wrapper(recursive_wrapper const& operand)
: p_(new T(operand.get())) {}
recursive_wrapper(T const& operand)
: p_(new T(operand)) {}
recursive_wrapper(recursive_wrapper&& operand)
: p_(new T(std::move(operand.get()))) {}
recursive_wrapper(T&& operand)
: p_(new T(std::move(operand))) {}
inline recursive_wrapper& operator=(recursive_wrapper const& rhs)
{
assign(rhs.get());
return *this;
}
inline recursive_wrapper& operator=(T const& rhs)
{
assign(rhs);
return *this;
}
inline void swap(recursive_wrapper& operand) noexcept
{
T* temp = operand.p_;
operand.p_ = p_;
p_ = temp;
}
recursive_wrapper& operator=(recursive_wrapper&& rhs) noexcept
{
swap(rhs);
return *this;
}
recursive_wrapper& operator=(T&& rhs)
{
get() = std::move(rhs);
return *this;
}
T& get()
{
assert(p_);
return *get_pointer();
}
T const& get() const
{
assert(p_);
return *get_pointer();
}
T* get_pointer() { return p_; }
const T* get_pointer() const { return p_; }
operator T const&() const { return this->get(); }
operator T&() { return this->get(); }
}; // class recursive_wrapper
template <typename T>
inline void swap(recursive_wrapper<T>& lhs, recursive_wrapper<T>& rhs) noexcept
{
lhs.swap(rhs);
}
} // namespace util
} // namespace mapbox
#endif // MAPBOX_UTIL_RECURSIVE_WRAPPER_HPP

File diff suppressed because it is too large Load Diff

View File

@ -1,45 +0,0 @@
#ifndef MAPBOX_UTIL_VARIANT_IO_HPP
#define MAPBOX_UTIL_VARIANT_IO_HPP
#include <iosfwd>
#include <mapbox/variant.hpp>
namespace mapbox {
namespace util {
namespace detail {
// operator<< helper
template <typename Out>
class printer
{
public:
explicit printer(Out& out)
: out_(out) {}
printer& operator=(printer const&) = delete;
// visitor
template <typename T>
void operator()(T const& operand) const
{
out_ << operand;
}
private:
Out& out_;
};
}
// operator<<
template <typename CharT, typename Traits, typename... Types>
VARIANT_INLINE std::basic_ostream<CharT, Traits>&
operator<<(std::basic_ostream<CharT, Traits>& out, variant<Types...> const& rhs)
{
detail::printer<std::basic_ostream<CharT, Traits>> visitor(out);
apply_visitor(visitor, rhs);
return out;
}
} // namespace util
} // namespace mapbox
#endif // MAPBOX_UTIL_VARIANT_IO_HPP

View File

@ -1,38 +0,0 @@
#ifndef MAPBOX_UTIL_VARIANT_VISITOR_HPP
#define MAPBOX_UTIL_VARIANT_VISITOR_HPP
namespace mapbox {
namespace util {
template <typename... Fns>
struct visitor;
template <typename Fn>
struct visitor<Fn> : Fn
{
using type = Fn;
using Fn::operator();
visitor(Fn fn) : Fn(fn) {}
};
template <typename Fn, typename... Fns>
struct visitor<Fn, Fns...> : Fn, visitor<Fns...>
{
using type = visitor;
using Fn::operator();
using visitor<Fns...>::operator();
visitor(Fn fn, Fns... fns) : Fn(fn), visitor<Fns...>(fns...) {}
};
template <typename... Fns>
visitor<Fns...> make_visitor(Fns... fns)
{
return visitor<Fns...>(fns...);
}
} // namespace util
} // namespace mapbox
#endif // MAPBOX_UTIL_VARIANT_VISITOR_HPP

View File

@ -5,9 +5,9 @@
#include <map>
#include <zlib.h>
#include "mvt.hpp"
#include "protozero/varint.hpp"
#include "protozero/pbf_reader.hpp"
#include "protozero/pbf_writer.hpp"
#include <protozero/varint.hpp>
#include <protozero/pbf_reader.hpp>
#include <protozero/pbf_writer.hpp>
mvt_geometry::mvt_geometry(int nop, long long nx, long long ny) {
this->op = nop;

View File

@ -13,6 +13,7 @@
#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 P_SIMPLIFY ((int) 's')
#define P_SIMPLIFY_LOW ((int) 'S')

View File

@ -1,71 +0,0 @@
#ifndef PROTOZERO_BYTESWAP_HPP
#define PROTOZERO_BYTESWAP_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 byteswap.hpp
*
* @brief Contains functions to swap bytes in values (for different endianness).
*/
#include <cstdint>
#include <cassert>
#include <protozero/config.hpp>
namespace protozero {
/**
* 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) {
#ifdef PROTOZERO_USE_BUILTIN_BSWAP
*reinterpret_cast<uint32_t*>(result) = __builtin_bswap32(*reinterpret_cast<const uint32_t*>(data));
#else
result[3] = data[0];
result[2] = data[1];
result[1] = data[2];
result[0] = data[3];
#endif
}
/**
* Swap 8 byte value (int64_t, uint64_t, double) between endianness formats.
*/
template <>
inline void byteswap<8>(const char* data, char* result) {
#ifdef PROTOZERO_USE_BUILTIN_BSWAP
*reinterpret_cast<uint64_t*>(result) = __builtin_bswap64(*reinterpret_cast<const uint64_t*>(data));
#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];
#endif
}
} // end namespace protozero
#endif // PROTOZERO_BYTESWAP_HPP

View File

@ -1,59 +0,0 @@
#ifndef PROTOZERO_CONFIG_HPP
#define PROTOZERO_CONFIG_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.
*****************************************************************************/
#include <cassert>
/**
* @file config.hpp
*
* @brief Contains macro checks for different configurations.
*/
#define PROTOZERO_LITTLE_ENDIAN 1234
#define PROTOZERO_BIG_ENDIAN 4321
// Find out which byte order the machine has.
#if defined(__BYTE_ORDER)
# if (__BYTE_ORDER == __LITTLE_ENDIAN)
# define PROTOZERO_BYTE_ORDER PROTOZERO_LITTLE_ENDIAN
# endif
# if (__BYTE_ORDER == __BIG_ENDIAN)
# define PROTOZERO_BYTE_ORDER PROTOZERO_BIG_ENDIAN
# endif
#else
// This probably isn't a very good default, but might do until we figure
// out something better.
# 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
#endif
// Wrapper for assert() used for testing
#ifndef protozero_assert
# define protozero_assert(x) assert(x)
#endif
#endif // PROTOZERO_CONFIG_HPP

View File

@ -1,68 +0,0 @@
#ifndef PROTOZERO_EXCEPTION_HPP
#define PROTOZERO_EXCEPTION_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 exception.hpp
*
* @brief Contains the exceptions used in the protozero library.
*/
#include <exception>
/**
* @brief All parts of the protozero header-only library are in this namespace.
*/
namespace protozero {
/**
* All exceptions explicitly thrown by the functions of the protozero library
* derive from this exception.
*/
struct exception : std::exception {
/// Returns the explanatory string.
const char *what() const noexcept override { return "pbf exception"; }
};
/**
* This exception is thrown when parsing a varint thats larger than allowed.
* This should never happen unless the data is corrupted.
*/
struct varint_too_long_exception : exception {
/// Returns the explanatory string.
const char *what() const noexcept override { return "varint too long exception"; }
};
/**
* This exception is thrown when the wire type of a pdf field is unknown.
* This should never happen unless the data is corrupted.
*/
struct unknown_pbf_wire_type_exception : exception {
/// Returns the explanatory string.
const char *what() const noexcept override { return "unknown pbf field type exception"; }
};
/**
* This exception is thrown when we are trying to read a field and there
* are not enough bytes left in the buffer to read it. Almost all functions
* of the pbf_reader class can throw this exception.
*
* This should never happen unless the data is corrupted or you have
* initialized the pbf_reader object with incomplete data.
*/
struct end_of_buffer_exception : exception {
/// Returns the explanatory string.
const char *what() const noexcept override { return "end of buffer exception"; }
};
} // end namespace protozero
#endif // PROTOZERO_EXCEPTION_HPP

View File

@ -1,139 +0,0 @@
#ifndef PROTOZERO_PBF_BUILDER_HPP
#define PROTOZERO_PBF_BUILDER_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 pbf_builder.hpp
*
* @brief Contains the pbf_builder template class.
*/
#include <type_traits>
#include <protozero/types.hpp>
#include <protozero/pbf_writer.hpp>
namespace protozero {
/**
* The pbf_builder is used to write PBF formatted messages into a buffer. It
* is based on the pbf_writer class and has all the same methods. The
* difference is that while the pbf_writer class takes an integer tag,
* this template class takes a tag of the template type T. The idea is that
* T will be an enumeration value and this helps reduce the possibility of
* programming errors.
*
* Almost all methods in this class can throw an std::bad_alloc exception if
* the std::string used as a buffer wants to resize.
*
* Read the tutorial to understand how this class is used.
*/
template <typename T>
class pbf_builder : public pbf_writer {
static_assert(std::is_same<pbf_tag_type, typename std::underlying_type<T>::type>::value,
"T must be enum with underlying type protozero::pbf_tag_type");
public:
using enum_type = T;
pbf_builder(std::string& data) noexcept :
pbf_writer(data) {
}
template <typename P>
pbf_builder(pbf_writer& parent_writer, P tag) noexcept :
pbf_writer(parent_writer, pbf_tag_type(tag)) {
}
/// @cond INTERNAL
#define PROTOZERO_WRITER_WRAP_ADD_SCALAR(name, type) \
inline void add_##name(T tag, type value) { \
pbf_writer::add_##name(pbf_tag_type(tag), value); \
}
PROTOZERO_WRITER_WRAP_ADD_SCALAR(bool, bool)
PROTOZERO_WRITER_WRAP_ADD_SCALAR(enum, int32_t)
PROTOZERO_WRITER_WRAP_ADD_SCALAR(int32, int32_t)
PROTOZERO_WRITER_WRAP_ADD_SCALAR(sint32, int32_t)
PROTOZERO_WRITER_WRAP_ADD_SCALAR(uint32, uint32_t)
PROTOZERO_WRITER_WRAP_ADD_SCALAR(int64, int64_t)
PROTOZERO_WRITER_WRAP_ADD_SCALAR(sint64, int64_t)
PROTOZERO_WRITER_WRAP_ADD_SCALAR(uint64, uint64_t)
PROTOZERO_WRITER_WRAP_ADD_SCALAR(fixed32, uint32_t)
PROTOZERO_WRITER_WRAP_ADD_SCALAR(sfixed32, int32_t)
PROTOZERO_WRITER_WRAP_ADD_SCALAR(fixed64, uint64_t)
PROTOZERO_WRITER_WRAP_ADD_SCALAR(sfixed64, int64_t)
PROTOZERO_WRITER_WRAP_ADD_SCALAR(float, float)
PROTOZERO_WRITER_WRAP_ADD_SCALAR(double, double)
#undef PROTOZERO_WRITER_WRAP_ADD_SCALAR
/// @endcond
inline 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) {
pbf_writer::add_bytes(pbf_tag_type(tag), value);
}
inline 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) {
pbf_writer::add_string(pbf_tag_type(tag), value);
}
inline void add_string(T tag, const char* value) {
pbf_writer::add_string(pbf_tag_type(tag), value);
}
inline 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) {
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) { \
pbf_writer::add_packed_##name(pbf_tag_type(tag), first, last); \
}
PROTOZERO_WRITER_WRAP_ADD_PACKED(bool)
PROTOZERO_WRITER_WRAP_ADD_PACKED(enum)
PROTOZERO_WRITER_WRAP_ADD_PACKED(int32)
PROTOZERO_WRITER_WRAP_ADD_PACKED(sint32)
PROTOZERO_WRITER_WRAP_ADD_PACKED(uint32)
PROTOZERO_WRITER_WRAP_ADD_PACKED(int64)
PROTOZERO_WRITER_WRAP_ADD_PACKED(sint64)
PROTOZERO_WRITER_WRAP_ADD_PACKED(uint64)
PROTOZERO_WRITER_WRAP_ADD_PACKED(fixed32)
PROTOZERO_WRITER_WRAP_ADD_PACKED(sfixed32)
PROTOZERO_WRITER_WRAP_ADD_PACKED(fixed64)
PROTOZERO_WRITER_WRAP_ADD_PACKED(sfixed64)
PROTOZERO_WRITER_WRAP_ADD_PACKED(float)
PROTOZERO_WRITER_WRAP_ADD_PACKED(double)
#undef PROTOZERO_WRITER_WRAP_ADD_PACKED
/// @endcond
};
} // end namespace protozero
#endif // PROTOZERO_PBF_BUILDER_HPP

View File

@ -1,94 +0,0 @@
#ifndef PROTOZERO_PBF_MESSAGE_HPP
#define PROTOZERO_PBF_MESSAGE_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 pbf_message.hpp
*
* @brief Contains the pbf_message class.
*/
#include <type_traits>
#include <protozero/pbf_reader.hpp>
#include <protozero/types.hpp>
namespace protozero {
/**
* This class represents a protobuf message. Either a top-level message or
* a nested sub-message. Top-level messages can be created from any buffer
* with a pointer and length:
*
* @code
* enum class Message : protozero::pbf_tag_type {
* ...
* };
*
* std::string buffer;
* // fill buffer...
* pbf_message<Message> message(buffer.data(), buffer.size());
* @endcode
*
* Sub-messages are created using get_message():
*
* @code
* enum class SubMessage : protozero::pbf_tag_type {
* ...
* };
*
* pbf_message<Message> message(...);
* message.next();
* pbf_message<SubMessage> submessage = message.get_message();
* @endcode
*
* All methods of the pbf_message class except get_bytes() and get_string()
* provide the strong exception guarantee, ie they either succeed or do not
* change the pbf_message object they are called on. Use the get_data() method
* instead of get_bytes() or get_string(), if you need this guarantee.
*
* This template class is based on the pbf_reader class and has all the same
* methods. The difference is that whereever the pbf_reader class takes an
* integer tag, this template class takes a tag of the template type T.
*
* Read the tutorial to understand how this class is used.
*/
template <typename T>
class pbf_message : public pbf_reader {
static_assert(std::is_same<pbf_tag_type, typename std::underlying_type<T>::type>::value, "T must be enum with underlying type protozero::pbf_tag_type");
public:
using enum_type = T;
template <typename... Args>
pbf_message(Args&&... args) noexcept :
pbf_reader(std::forward<Args>(args)...) {
}
inline bool next() {
return pbf_reader::next();
}
inline bool next(T tag) {
return pbf_reader::next(pbf_tag_type(tag));
}
inline T tag() const noexcept {
return T(pbf_reader::tag());
}
};
} // end namespace protozero
#endif // PROTOZERO_PBF_MESSAGE_HPP

File diff suppressed because it is too large Load Diff

View File

@ -1,837 +0,0 @@
#ifndef PROTOZERO_PBF_WRITER_HPP
#define PROTOZERO_PBF_WRITER_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 pbf_writer.hpp
*
* @brief Contains the pbf_writer class.
*/
#include <cstddef>
#include <cstdint>
#include <cstring>
#include <iterator>
#include <limits>
#include <string>
#include <protozero/config.hpp>
#include <protozero/types.hpp>
#include <protozero/varint.hpp>
#if PROTOZERO_BYTE_ORDER != PROTOZERO_LITTLE_ENDIAN
# include <protozero/byteswap.hpp>
#endif
namespace protozero {
namespace detail {
template <typename T> class packed_field_varint;
template <typename T> class packed_field_svarint;
template <typename T> class packed_field_fixed;
} // end namespace detail
/**
* The pbf_writer is used to write PBF formatted messages into a buffer.
*
* Almost all methods in this class can throw an std::bad_alloc exception if
* the std::string used as a buffer wants to resize.
*/
class pbf_writer {
// A pointer to a string buffer holding the data already written to the
// PBF message. For default constructed writers or writers that have been
// rolled back, this is a nullptr.
std::string* m_data;
// A pointer to a parent writer object if this is a submessage. If this
// is a top-level writer, it is a nullptr.
pbf_writer* m_parent_writer;
// This is usually 0. If there is an open submessage, this is set in the
// parent to the rollback position, ie. the last position before the
// submessage was started. This is the position where the header of the
// submessage starts.
std::size_t m_rollback_pos = 0;
// This is usually 0. If there is an open submessage, this is set in the
// 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) {
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) {
protozero_assert(((tag > 0 && tag < 19000) || (tag > 19999 && tag <= ((1 << 29) - 1))) && "tag out of range");
uint32_t b = (tag << 3) | uint32_t(type);
add_varint(b);
}
inline 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) {
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));
#endif
}
template <typename T, typename It>
inline void add_packed_fixed(pbf_tag_type tag, It first, It last, std::input_iterator_tag) {
if (first == last) {
return;
}
pbf_writer sw(*this, tag);
while (first != last) {
sw.add_fixed<T>(*first++);
}
}
template <typename T, typename It>
inline 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);
add_length_varint(tag, sizeof(T) * pbf_length_type(length));
reserve(sizeof(T) * std::size_t(length));
while (first != last) {
add_fixed<T>(*first++);
}
}
template <typename It>
inline void add_packed_varint(pbf_tag_type tag, It first, It last) {
if (first == last) {
return;
}
pbf_writer sw(*this, tag);
while (first != last) {
sw.add_varint(uint64_t(*first++));
}
}
template <typename It>
inline void add_packed_svarint(pbf_tag_type tag, It first, It last) {
if (first == last) {
return;
}
pbf_writer sw(*this, tag);
while (first != last) {
sw.add_varint(encode_zigzag64(*first++));
}
}
// 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;
// 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();
inline void open_submessage(pbf_tag_type tag, std::size_t size) {
protozero_assert(m_pos == 0);
protozero_assert(m_data);
if (size == 0) {
m_rollback_pos = m_data->size();
add_field(tag, pbf_wire_type::length_delimited);
m_data->append(std::size_t(reserve_bytes), '\0');
} else {
m_rollback_pos = size_is_known;
add_length_varint(tag, pbf_length_type(size));
reserve(size);
}
m_pos = m_data->size();
}
inline void rollback_submessage() {
protozero_assert(m_pos != 0);
protozero_assert(m_rollback_pos != size_is_known);
protozero_assert(m_data);
m_data->resize(m_rollback_pos);
m_pos = 0;
}
inline 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);
protozero_assert(m_data->size() >= m_pos - reserve_bytes);
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() {
protozero_assert(m_data);
if (m_pos == 0 || m_rollback_pos == size_is_known) {
return;
}
if (m_data->size() - m_pos == 0) {
rollback_submessage();
} else {
commit_submessage();
}
}
inline void add_length_varint(pbf_tag_type tag, pbf_length_type length) {
add_field(tag, pbf_wire_type::length_delimited);
add_varint(length);
}
public:
/**
* Create a writer using the given string as a data store. The pbf_writer
* 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 :
m_data(&data),
m_parent_writer(nullptr),
m_pos(0) {
}
/**
* Create a writer without a data store. In this form the writer can not
* be used!
*/
inline pbf_writer() noexcept :
m_data(nullptr),
m_parent_writer(nullptr),
m_pos(0) {
}
/**
* Construct a pbf_writer for a submessage from the pbf_writer of the
* parent message.
*
* @param parent_writer The pbf_writer
* @param tag Tag (field number) of the field that will be written
* @param size Optional size of the submessage in bytes (use 0 for unknown).
* 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) :
m_data(parent_writer.m_data),
m_parent_writer(&parent_writer),
m_pos(0) {
m_parent_writer->open_submessage(tag, size);
}
/// A pbf_writer object can be copied
pbf_writer(const pbf_writer&) noexcept = default;
/// A pbf_writer object can be copied
pbf_writer& operator=(const pbf_writer&) noexcept = default;
/// A pbf_writer object can be moved
inline pbf_writer(pbf_writer&&) noexcept = default;
/// A pbf_writer object can be moved
inline pbf_writer& operator=(pbf_writer&&) noexcept = default;
inline ~pbf_writer() {
if (m_parent_writer) {
m_parent_writer->close_submessage();
}
}
/**
* Reserve size bytes in the underlying message store in addition to
* whatever the message store already holds. So unlike
* the `std::string::reserve()` method this is not an absolute size,
* but additional memory that should be reserved.
*
* @param size Number of bytes to reserve in underlying message store.
*/
void reserve(std::size_t size) {
protozero_assert(m_data);
m_data->reserve(m_data->size() + size);
}
inline 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();
m_data = nullptr;
}
///@{
/**
* @name Scalar field writer functions
*/
/**
* Add "bool" field to data.
*
* @param tag Tag (field number) of the field
* @param value Value to be written
*/
inline 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);
m_data->append(1, value);
}
/**
* Add "enum" field to data.
*
* @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) {
add_tagged_varint(tag, uint64_t(value));
}
/**
* Add "int32" field to data.
*
* @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) {
add_tagged_varint(tag, uint64_t(value));
}
/**
* Add "sint32" field to data.
*
* @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) {
add_tagged_varint(tag, encode_zigzag32(value));
}
/**
* Add "uint32" field to data.
*
* @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) {
add_tagged_varint(tag, value);
}
/**
* Add "int64" field to data.
*
* @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) {
add_tagged_varint(tag, uint64_t(value));
}
/**
* Add "sint64" field to data.
*
* @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) {
add_tagged_varint(tag, encode_zigzag64(value));
}
/**
* Add "uint64" field to data.
*
* @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) {
add_tagged_varint(tag, value);
}
/**
* Add "fixed32" field to data.
*
* @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) {
add_field(tag, pbf_wire_type::fixed32);
add_fixed<uint32_t>(value);
}
/**
* Add "sfixed32" field to data.
*
* @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) {
add_field(tag, pbf_wire_type::fixed32);
add_fixed<int32_t>(value);
}
/**
* Add "fixed64" field to data.
*
* @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) {
add_field(tag, pbf_wire_type::fixed64);
add_fixed<uint64_t>(value);
}
/**
* Add "sfixed64" field to data.
*
* @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) {
add_field(tag, pbf_wire_type::fixed64);
add_fixed<int64_t>(value);
}
/**
* Add "float" field to data.
*
* @param tag Tag (field number) of the field
* @param value Value to be written
*/
inline void add_float(pbf_tag_type tag, float value) {
add_field(tag, pbf_wire_type::fixed32);
add_fixed<float>(value);
}
/**
* Add "double" field to data.
*
* @param tag Tag (field number) of the field
* @param value Value to be written
*/
inline void add_double(pbf_tag_type tag, double value) {
add_field(tag, pbf_wire_type::fixed64);
add_fixed<double>(value);
}
/**
* Add "bytes" field to data.
*
* @param tag Tag (field number) of the field
* @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) {
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());
add_length_varint(tag, pbf_length_type(size));
m_data->append(value, size);
}
/**
* Add "bytes" field to data.
*
* @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) {
add_bytes(tag, value.data(), value.size());
}
/**
* Add "string" field to data.
*
* @param tag Tag (field number) of the field
* @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) {
add_bytes(tag, value, size);
}
/**
* Add "string" field to data.
*
* @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) {
add_bytes(tag, value.data(), value.size());
}
/**
* Add "string" 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 value to be written
*/
inline void add_string(pbf_tag_type tag, const char* value) {
add_bytes(tag, value, std::strlen(value));
}
/**
* Add "message" field to data.
*
* @param tag Tag (field number) of the field
* @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) {
add_bytes(tag, 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.
*/
inline void add_message(pbf_tag_type tag, const std::string& value) {
add_bytes(tag, value.data(), value.size());
}
///@}
///@{
/**
* @name Repeated packed field writer functions
*/
/**
* Add "repeated packed bool" field to data.
*
* @tparam InputIterator An 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) {
add_packed_varint(tag, first, last);
}
/**
* Add "repeated packed enum" field to data.
*
* @tparam InputIterator An 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) {
add_packed_varint(tag, first, last);
}
/**
* Add "repeated packed int32" field to data.
*
* @tparam InputIterator An 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) {
add_packed_varint(tag, first, last);
}
/**
* Add "repeated packed sint32" field to data.
*
* @tparam InputIterator An 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) {
add_packed_svarint(tag, first, last);
}
/**
* Add "repeated packed uint32" field to data.
*
* @tparam InputIterator An 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) {
add_packed_varint(tag, first, last);
}
/**
* Add "repeated packed int64" field to data.
*
* @tparam InputIterator An 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) {
add_packed_varint(tag, first, last);
}
/**
* Add "repeated packed sint64" field to data.
*
* @tparam InputIterator An 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) {
add_packed_svarint(tag, first, last);
}
/**
* Add "repeated packed uint64" field to data.
*
* @tparam InputIterator An 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) {
add_packed_varint(tag, first, last);
}
/**
* Add "repeated packed fixed32" field to data.
*
* @tparam InputIterator An 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) {
add_packed_fixed<uint32_t, InputIterator>(tag, first, last,
typename std::iterator_traits<InputIterator>::iterator_category());
}
/**
* Add "repeated packed sfixed32" field to data.
*
* @tparam InputIterator An 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) {
add_packed_fixed<int32_t, InputIterator>(tag, first, last,
typename std::iterator_traits<InputIterator>::iterator_category());
}
/**
* Add "repeated packed fixed64" field to data.
*
* @tparam InputIterator An 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) {
add_packed_fixed<uint64_t, InputIterator>(tag, first, last,
typename std::iterator_traits<InputIterator>::iterator_category());
}
/**
* Add "repeated packed sfixed64" field to data.
*
* @tparam InputIterator An 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) {
add_packed_fixed<int64_t, InputIterator>(tag, first, last,
typename std::iterator_traits<InputIterator>::iterator_category());
}
/**
* Add "repeated packed float" field to data.
*
* @tparam InputIterator An 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) {
add_packed_fixed<float, InputIterator>(tag, first, last,
typename std::iterator_traits<InputIterator>::iterator_category());
}
/**
* Add "repeated packed double" field to data.
*
* @tparam InputIterator An 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) {
add_packed_fixed<double, InputIterator>(tag, first, last,
typename std::iterator_traits<InputIterator>::iterator_category());
}
///@}
template <typename T> friend class detail::packed_field_varint;
template <typename T> friend class detail::packed_field_svarint;
template <typename T> friend class detail::packed_field_fixed;
}; // class pbf_writer
namespace detail {
class packed_field {
protected:
pbf_writer m_writer;
public:
packed_field(pbf_writer& parent_writer, pbf_tag_type tag) :
m_writer(parent_writer, tag) {
}
packed_field(pbf_writer& parent_writer, pbf_tag_type tag, std::size_t size) :
m_writer(parent_writer, tag, size) {
}
void rollback() {
m_writer.rollback();
}
}; // class packed_field
template <typename T>
class packed_field_fixed : public packed_field {
public:
packed_field_fixed(pbf_writer& parent_writer, pbf_tag_type tag) :
packed_field(parent_writer, tag) {
}
packed_field_fixed(pbf_writer& parent_writer, pbf_tag_type tag, std::size_t size) :
packed_field(parent_writer, tag, size * sizeof(T)) {
}
void add_element(T value) {
m_writer.add_fixed<T>(value);
}
}; // class packed_field_fixed
template <typename T>
class packed_field_varint : public packed_field {
public:
packed_field_varint(pbf_writer& parent_writer, pbf_tag_type tag) :
packed_field(parent_writer, tag) {
}
void add_element(T value) {
m_writer.add_varint(uint64_t(value));
}
}; // class packed_field_varint
template <typename T>
class packed_field_svarint : public packed_field {
public:
packed_field_svarint(pbf_writer& parent_writer, pbf_tag_type tag) :
packed_field(parent_writer, tag) {
}
void add_element(T value) {
m_writer.add_varint(encode_zigzag64(value));
}
}; // class packed_field_svarint
} // end namespace detail
using packed_field_bool = detail::packed_field_varint<bool>;
using packed_field_enum = detail::packed_field_varint<int32_t>;
using packed_field_int32 = detail::packed_field_varint<int32_t>;
using packed_field_sint32 = detail::packed_field_svarint<int32_t>;
using packed_field_uint32 = detail::packed_field_varint<uint32_t>;
using packed_field_int64 = detail::packed_field_varint<int64_t>;
using packed_field_sint64 = detail::packed_field_svarint<int64_t>;
using packed_field_uint64 = detail::packed_field_varint<uint64_t>;
using packed_field_fixed32 = detail::packed_field_fixed<uint32_t>;
using packed_field_sfixed32 = detail::packed_field_fixed<int32_t>;
using packed_field_fixed64 = detail::packed_field_fixed<uint64_t>;
using packed_field_sfixed64 = detail::packed_field_fixed<int64_t>;
using packed_field_float = detail::packed_field_fixed<float>;
using packed_field_double = detail::packed_field_fixed<double>;
} // end namespace protozero
#endif // PROTOZERO_PBF_WRITER_HPP

View File

@ -1,49 +0,0 @@
#ifndef PROTOZERO_TYPES_HPP
#define PROTOZERO_TYPES_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 types.hpp
*
* @brief Contains the declaration of low-level types used in the pbf format.
*/
#include <cstdint>
namespace protozero {
/**
* The type used for field tags (field numbers).
*/
typedef uint32_t pbf_tag_type;
/**
* 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
};
/**
* The type used for length values, such as the length of a field.
*/
typedef uint32_t pbf_length_type;
} // end namespace protozero
#endif // PROTOZERO_TYPES_HPP

View File

@ -1,132 +0,0 @@
#ifndef PROTOZERO_VARINT_HPP
#define PROTOZERO_VARINT_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 varint.hpp
*
* @brief Contains low-level varint and zigzag encoding and decoding functions.
*/
#include <cstdint>
#include <protozero/exception.hpp>
namespace protozero {
/**
* The maximum length of a 64bit 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
/**
* Decode a 64bit 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.
* @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
* 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;
}
*data = reinterpret_cast<const char*>(p);
return val;
}
/**
* Varint-encode a 64bit integer.
*/
template <typename OutputIterator>
inline int write_varint(OutputIterator data, uint64_t value) {
int n=1;
while (value >= 0x80) {
*data++ = char((value & 0x7f) | 0x80);
value >>= 7;
++n;
}
*data++ = char(value);
return n;
}
/**
* ZigZag encodes a 32 bit integer.
*/
inline 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 {
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);
}
/**
* 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);
}
} // end namespace protozero
#endif // PROTOZERO_VARINT_HPP

View File

@ -1,22 +0,0 @@
#ifndef PROTOZERO_VERSION_HPP
#define PROTOZERO_VERSION_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.
*****************************************************************************/
#define PROTOZERO_VERSION_MAJOR 1
#define PROTOZERO_VERSION_MINOR 3
#define PROTOZERO_VERSION_PATCH 0
#define PROTOZERO_VERSION_CODE (PROTOZERO_VERSION_MAJOR * 10000 + PROTOZERO_VERSION_MINOR * 100 + PROTOZERO_VERSION_PATCH)
#define PROTOZERO_VERSION_STRING "1.3.0"
#endif // PROTOZERO_VERSION_HPP

View File

@ -7,7 +7,7 @@
#include <sqlite3.h>
#include <set>
#include <map>
#include "protozero/varint.hpp"
#include <protozero/varint.hpp>
#include "geometry.hpp"
#include "mbtiles.hpp"
#include "tile.hpp"

File diff suppressed because one or more lines are too long

View File

@ -12,7 +12,7 @@
}, "features": [
{ "type": "FeatureCollection", "properties": { "zoom": 0, "x": 0, "y": 0 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "boolean": true, "otherboolean": false, "stringify": "[\"yes\",27.00000000,27,1.4e27,{\"foo\":\"bar\"}]", "escape": "foo\u0001bar,ü\"\\/\u0008\u000c\u000a\u000d\u0009→", "prêt": "ready" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -187.031250, 50.457504 ], [ -185.976562, 47.279229 ], [ -177.539062, 44.339565 ], [ -164.882812, 43.389082 ], [ -153.281250, 46.619261 ], [ -144.492188, 51.179343 ], [ -143.789062, 57.183902 ], [ -148.007812, 61.100789 ], [ -158.554688, 63.860036 ], [ -169.453125, 64.510643 ], [ -177.890625, 62.593341 ], [ -180.000000, 61.689872 ], [ -185.976562, 58.859224 ], [ -187.031250, 56.992883 ], [ -187.031250, 65.730626 ], [ -182.460938, 67.339861 ], [ -180.000000, 67.542167 ], [ -169.101562, 68.269387 ], [ -156.093750, 68.138852 ], [ -144.492188, 66.089364 ], [ -134.648438, 62.431074 ], [ -131.835938, 55.379110 ], [ -133.593750, 48.690960 ], [ -146.250000, 38.616870 ], [ -169.453125, 34.957995 ], [ -180.000000, 36.527295 ], [ -184.218750, 37.160317 ], [ -187.031250, 38.891033 ], [ -187.031250, 50.457504 ] ] ], [ [ [ 187.031250, 63.743631 ], [ 182.109375, 62.593341 ], [ 180.000000, 61.689872 ], [ 174.023438, 58.859224 ], [ 171.562500, 54.418930 ], [ 174.023438, 47.279229 ], [ 182.460938, 44.339565 ], [ 187.031250, 44.024422 ], [ 187.031250, 35.460670 ], [ 175.781250, 37.160317 ], [ 161.718750, 45.336702 ], [ 156.796875, 55.028022 ], [ 163.476562, 62.431074 ], [ 170.507812, 64.811557 ], [ 177.539062, 67.339861 ], [ 180.000000, 67.542167 ], [ 187.031250, 68.007571 ], [ 187.031250, 63.743631 ] ] ] ] } }
{ "type": "Feature", "properties": { "boolean": true, "otherboolean": false, "stringify": "[\"yes\",27.00000000,27,1.4e27,{\"foo\":\"bar\"}]", "escape": "foo\u0001bar,ü\"\\/\u0008\u000c\u000a\u000d\u0009→", "prêt": "ready" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -187.031250, 56.992883 ], [ -187.031250, 65.730626 ], [ -182.460938, 67.339861 ], [ -180.000000, 67.542167 ], [ -169.101562, 68.269387 ], [ -156.093750, 68.138852 ], [ -144.492188, 66.089364 ], [ -134.648438, 62.431074 ], [ -131.835938, 55.379110 ], [ -133.593750, 48.690960 ], [ -146.250000, 38.616870 ], [ -169.453125, 34.957995 ], [ -180.000000, 36.527295 ], [ -184.218750, 37.160317 ], [ -187.031250, 38.891033 ], [ -187.031250, 50.457504 ], [ -185.976562, 47.279229 ], [ -177.539062, 44.339565 ], [ -164.882812, 43.389082 ], [ -153.281250, 46.619261 ], [ -144.492188, 51.179343 ], [ -143.789062, 57.183902 ], [ -148.007812, 61.100789 ], [ -158.554688, 63.860036 ], [ -169.453125, 64.510643 ], [ -177.890625, 62.593341 ], [ -180.000000, 61.689872 ], [ -185.976562, 58.859224 ], [ -187.031250, 56.992883 ] ] ], [ [ [ 187.031250, 44.024422 ], [ 187.031250, 35.460670 ], [ 175.781250, 37.160317 ], [ 161.718750, 45.336702 ], [ 156.796875, 55.028022 ], [ 163.476562, 62.431074 ], [ 170.507812, 64.811557 ], [ 177.539062, 67.339861 ], [ 180.000000, 67.542167 ], [ 187.031250, 68.007571 ], [ 187.031250, 63.743631 ], [ 182.109375, 62.593341 ], [ 180.000000, 61.689872 ], [ 174.023438, 58.859224 ], [ 171.562500, 54.418930 ], [ 174.023438, 47.279229 ], [ 182.460938, 44.339565 ], [ 187.031250, 44.024422 ] ] ] ] } }
,
{ "type": "Feature", "properties": { "zoom": "z0-2" }, "geometry": { "type": "LineString", "coordinates": [ [ -112.851562, 55.178868 ], [ -117.773438, 44.590467 ], [ -104.414062, 51.179343 ] ] } }
] }
@ -20,7 +20,7 @@
,
{ "type": "FeatureCollection", "properties": { "zoom": 1, "x": 0, "y": 0 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "boolean": true, "otherboolean": false, "stringify": "[\"yes\",27.00000000,27,1.4e27,{\"foo\":\"bar\"}]", "escape": "foo\u0001bar,ü\"\\/\u0008\u000c\u000a\u000d\u0009→", "prêt": "ready" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -183.515625, 46.437857 ], [ -177.539062, 44.339565 ], [ -164.882812, 43.357138 ], [ -153.281250, 46.589069 ], [ -144.492188, 51.179343 ], [ -143.789062, 57.160078 ], [ -148.007812, 61.100789 ], [ -158.554688, 63.860036 ], [ -169.453125, 64.491725 ], [ -177.890625, 62.593341 ], [ -180.000000, 61.669024 ], [ -183.515625, 60.020952 ], [ -183.515625, 66.981666 ], [ -182.460938, 67.339861 ], [ -180.000000, 67.525373 ], [ -169.101562, 68.269387 ], [ -156.093750, 68.138852 ], [ -144.492188, 66.089364 ], [ -134.648438, 62.431074 ], [ -131.835938, 55.379110 ], [ -133.593750, 48.690960 ], [ -146.250000, 38.582526 ], [ -169.453125, 34.921971 ], [ -183.515625, 37.055177 ], [ -183.515625, 46.437857 ] ] ] } }
{ "type": "Feature", "properties": { "boolean": true, "otherboolean": false, "stringify": "[\"yes\",27.00000000,27,1.4e27,{\"foo\":\"bar\"}]", "escape": "foo\u0001bar,ü\"\\/\u0008\u000c\u000a\u000d\u0009→", "prêt": "ready" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -183.515625, 60.020952 ], [ -183.515625, 66.981666 ], [ -182.460938, 67.339861 ], [ -180.000000, 67.525373 ], [ -169.101562, 68.269387 ], [ -156.093750, 68.138852 ], [ -144.492188, 66.089364 ], [ -134.648438, 62.431074 ], [ -131.835938, 55.379110 ], [ -133.593750, 48.690960 ], [ -146.250000, 38.582526 ], [ -169.453125, 34.921971 ], [ -183.515625, 37.055177 ], [ -183.515625, 46.437857 ], [ -177.539062, 44.339565 ], [ -164.882812, 43.357138 ], [ -153.281250, 46.589069 ], [ -144.492188, 51.179343 ], [ -143.789062, 57.160078 ], [ -148.007812, 61.100789 ], [ -158.554688, 63.860036 ], [ -169.453125, 64.491725 ], [ -177.890625, 62.593341 ], [ -180.000000, 61.669024 ], [ -183.515625, 60.020952 ] ] ] } }
,
{ "type": "Feature", "properties": { "zoom": "z0-2" }, "geometry": { "type": "LineString", "coordinates": [ [ -112.851562, 55.178868 ], [ -117.773438, 44.590467 ], [ -104.414062, 51.179343 ] ] } }
] }
@ -28,13 +28,13 @@
,
{ "type": "FeatureCollection", "properties": { "zoom": 1, "x": 1, "y": 0 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "boolean": true, "otherboolean": false, "stringify": "[\"yes\",27.00000000,27,1.4e27,{\"foo\":\"bar\"}]", "escape": "foo\u0001bar,ü\"\\/\u0008\u000c\u000a\u000d\u0009→", "prêt": "ready" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 183.515625, 62.935235 ], [ 182.109375, 62.593341 ], [ 180.000000, 61.669024 ], [ 174.023438, 58.836490 ], [ 171.562500, 54.393352 ], [ 174.023438, 47.279229 ], [ 182.460938, 44.339565 ], [ 183.515625, 44.276671 ], [ 183.515625, 35.995785 ], [ 175.781250, 37.160317 ], [ 161.718750, 45.336702 ], [ 156.796875, 55.002826 ], [ 163.476562, 62.431074 ], [ 170.507812, 64.792848 ], [ 177.539062, 67.339861 ], [ 180.000000, 67.525373 ], [ 183.515625, 67.776025 ], [ 183.515625, 62.935235 ] ] ] } }
{ "type": "Feature", "properties": { "boolean": true, "otherboolean": false, "stringify": "[\"yes\",27.00000000,27,1.4e27,{\"foo\":\"bar\"}]", "escape": "foo\u0001bar,ü\"\\/\u0008\u000c\u000a\u000d\u0009→", "prêt": "ready" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 183.515625, 44.276671 ], [ 183.515625, 35.995785 ], [ 175.781250, 37.160317 ], [ 161.718750, 45.336702 ], [ 156.796875, 55.002826 ], [ 163.476562, 62.431074 ], [ 170.507812, 64.792848 ], [ 177.539062, 67.339861 ], [ 180.000000, 67.525373 ], [ 183.515625, 67.776025 ], [ 183.515625, 62.935235 ], [ 182.109375, 62.593341 ], [ 180.000000, 61.669024 ], [ 174.023438, 58.836490 ], [ 171.562500, 54.393352 ], [ 174.023438, 47.279229 ], [ 182.460938, 44.339565 ], [ 183.515625, 44.276671 ] ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 2, "x": 0, "y": 1 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "boolean": true, "otherboolean": false, "stringify": "[\"yes\",27.00000000,27,1.4e27,{\"foo\":\"bar\"}]", "escape": "foo\u0001bar,ü\"\\/\u0008\u000c\u000a\u000d\u0009→", "prêt": "ready" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -181.757812, 45.828799 ], [ -177.539062, 44.339565 ], [ -164.882812, 43.341160 ], [ -153.281250, 46.573967 ], [ -144.492188, 51.179343 ], [ -143.789062, 57.148161 ], [ -148.007812, 61.100789 ], [ -158.554688, 63.860036 ], [ -169.453125, 64.482261 ], [ -177.890625, 62.593341 ], [ -180.000000, 61.658595 ], [ -181.757812, 60.844911 ], [ -181.757812, 67.204032 ], [ -150.688477, 67.204032 ], [ -146.821289, 66.513260 ], [ -144.492188, 66.089364 ], [ -134.648438, 62.431074 ], [ -131.835938, 55.379110 ], [ -133.593750, 48.690960 ], [ -146.250000, 38.565348 ], [ -169.453125, 34.903953 ], [ -180.000000, 36.527295 ], [ -181.757812, 36.791691 ], [ -181.757812, 45.828799 ] ] ] } }
{ "type": "Feature", "properties": { "boolean": true, "otherboolean": false, "stringify": "[\"yes\",27.00000000,27,1.4e27,{\"foo\":\"bar\"}]", "escape": "foo\u0001bar,ü\"\\/\u0008\u000c\u000a\u000d\u0009→", "prêt": "ready" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -181.757812, 60.844911 ], [ -181.757812, 67.204032 ], [ -150.688477, 67.204032 ], [ -146.821289, 66.513260 ], [ -144.492188, 66.089364 ], [ -134.648438, 62.431074 ], [ -131.835938, 55.379110 ], [ -133.593750, 48.690960 ], [ -146.250000, 38.565348 ], [ -169.453125, 34.903953 ], [ -180.000000, 36.527295 ], [ -181.757812, 36.791691 ], [ -181.757812, 45.828799 ], [ -177.539062, 44.339565 ], [ -164.882812, 43.341160 ], [ -153.281250, 46.573967 ], [ -144.492188, 51.179343 ], [ -143.789062, 57.148161 ], [ -148.007812, 61.100789 ], [ -158.554688, 63.860036 ], [ -169.453125, 64.482261 ], [ -177.890625, 62.593341 ], [ -180.000000, 61.658595 ], [ -181.757812, 60.844911 ] ] ] } }
,
{ "type": "Feature", "properties": { "zoom": "z0-2" }, "geometry": { "type": "LineString", "coordinates": [ [ -112.851562, 55.178868 ], [ -117.773438, 44.590467 ], [ -104.414062, 51.179343 ] ] } }
] }
@ -48,7 +48,7 @@
,
{ "type": "FeatureCollection", "properties": { "zoom": 2, "x": 3, "y": 1 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "boolean": true, "otherboolean": false, "stringify": "[\"yes\",27.00000000,27,1.4e27,{\"foo\":\"bar\"}]", "escape": "foo\u0001bar,ü\"\\/\u0008\u000c\u000a\u000d\u0009→", "prêt": "ready" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 181.757812, 62.441242 ], [ 180.000000, 61.658595 ], [ 174.023438, 58.825118 ], [ 171.562500, 54.380557 ], [ 174.023438, 47.279229 ], [ 181.757812, 44.590467 ], [ 181.757812, 36.261992 ], [ 175.781250, 37.160317 ], [ 161.718750, 45.336702 ], [ 156.796875, 54.990222 ], [ 163.476562, 62.431074 ], [ 170.507812, 64.783488 ], [ 175.187988, 66.513260 ], [ 177.143555, 67.204032 ], [ 181.757812, 67.204032 ], [ 181.757812, 62.441242 ] ] ] } }
{ "type": "Feature", "properties": { "boolean": true, "otherboolean": false, "stringify": "[\"yes\",27.00000000,27,1.4e27,{\"foo\":\"bar\"}]", "escape": "foo\u0001bar,ü\"\\/\u0008\u000c\u000a\u000d\u0009→", "prêt": "ready" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 181.757812, 44.590467 ], [ 181.757812, 36.261992 ], [ 175.781250, 37.160317 ], [ 161.718750, 45.336702 ], [ 156.796875, 54.990222 ], [ 163.476562, 62.431074 ], [ 170.507812, 64.783488 ], [ 175.187988, 66.513260 ], [ 177.143555, 67.204032 ], [ 181.757812, 67.204032 ], [ 181.757812, 62.441242 ], [ 180.000000, 61.658595 ], [ 174.023438, 58.825118 ], [ 171.562500, 54.380557 ], [ 174.023438, 47.279229 ], [ 181.757812, 44.590467 ] ] ] } }
] }
] }
,
@ -66,7 +66,7 @@
,
{ "type": "FeatureCollection", "properties": { "zoom": 3, "x": 0, "y": 2 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "boolean": true, "otherboolean": false, "stringify": "[\"yes\",27.00000000,27,1.4e27,{\"foo\":\"bar\"}]", "escape": "foo\u0001bar,ü\"\\/\u0008\u000c\u000a\u000d\u0009→", "prêt": "ready" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -180.878906, 45.521744 ], [ -177.539062, 44.339565 ], [ -164.882812, 43.333169 ], [ -153.281250, 46.566414 ], [ -144.492188, 51.179343 ], [ -143.789062, 57.142200 ], [ -148.007812, 61.100789 ], [ -158.554688, 63.860036 ], [ -169.453125, 64.477528 ], [ -177.890625, 62.593341 ], [ -180.000000, 61.653379 ], [ -180.878906, 61.249102 ], [ -180.878906, 66.861082 ], [ -148.754883, 66.861082 ], [ -146.821289, 66.513260 ], [ -144.492188, 66.089364 ], [ -135.000000, 62.573106 ], [ -134.648438, 62.431074 ], [ -134.121094, 61.217379 ], [ -134.121094, 48.305121 ], [ -135.000000, 47.650588 ], [ -144.195557, 40.313043 ], [ -180.878906, 40.313043 ], [ -180.878906, 45.521744 ] ] ] } }
{ "type": "Feature", "properties": { "boolean": true, "otherboolean": false, "stringify": "[\"yes\",27.00000000,27,1.4e27,{\"foo\":\"bar\"}]", "escape": "foo\u0001bar,ü\"\\/\u0008\u000c\u000a\u000d\u0009→", "prêt": "ready" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -180.878906, 61.249102 ], [ -180.878906, 66.861082 ], [ -148.754883, 66.861082 ], [ -146.821289, 66.513260 ], [ -144.492188, 66.089364 ], [ -135.000000, 62.573106 ], [ -134.648438, 62.431074 ], [ -134.121094, 61.217379 ], [ -134.121094, 48.305121 ], [ -135.000000, 47.650588 ], [ -144.195557, 40.313043 ], [ -180.878906, 40.313043 ], [ -180.878906, 45.521744 ], [ -177.539062, 44.339565 ], [ -164.882812, 43.333169 ], [ -153.281250, 46.566414 ], [ -144.492188, 51.179343 ], [ -143.789062, 57.142200 ], [ -148.007812, 61.100789 ], [ -158.554688, 63.860036 ], [ -169.453125, 64.477528 ], [ -177.890625, 62.593341 ], [ -180.000000, 61.653379 ], [ -180.878906, 61.249102 ] ] ] } }
] }
] }
,
@ -102,7 +102,7 @@
,
{ "type": "FeatureCollection", "properties": { "zoom": 3, "x": 7, "y": 2 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "boolean": true, "otherboolean": false, "stringify": "[\"yes\",27.00000000,27,1.4e27,{\"foo\":\"bar\"}]", "escape": "foo\u0001bar,ü\"\\/\u0008\u000c\u000a\u000d\u0009→", "prêt": "ready" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 180.878906, 62.047288 ], [ 180.000000, 61.653379 ], [ 174.023438, 58.819430 ], [ 171.562500, 54.374158 ], [ 174.023438, 47.279229 ], [ 180.878906, 44.902578 ], [ 180.878906, 40.313043 ], [ 170.562744, 40.313043 ], [ 169.420166, 40.979898 ], [ 161.718750, 45.336702 ], [ 156.796875, 54.983918 ], [ 163.476562, 62.431074 ], [ 170.507812, 64.778807 ], [ 175.187988, 66.513260 ], [ 176.165771, 66.861082 ], [ 180.878906, 66.861082 ], [ 180.878906, 62.047288 ] ] ] } }
{ "type": "Feature", "properties": { "boolean": true, "otherboolean": false, "stringify": "[\"yes\",27.00000000,27,1.4e27,{\"foo\":\"bar\"}]", "escape": "foo\u0001bar,ü\"\\/\u0008\u000c\u000a\u000d\u0009→", "prêt": "ready" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 180.878906, 44.902578 ], [ 180.878906, 40.313043 ], [ 170.562744, 40.313043 ], [ 169.420166, 40.979898 ], [ 161.718750, 45.336702 ], [ 156.796875, 54.983918 ], [ 163.476562, 62.431074 ], [ 170.507812, 64.778807 ], [ 175.187988, 66.513260 ], [ 176.165771, 66.861082 ], [ 180.878906, 66.861082 ], [ 180.878906, 62.047288 ], [ 180.000000, 61.653379 ], [ 174.023438, 58.819430 ], [ 171.562500, 54.374158 ], [ 174.023438, 47.279229 ], [ 180.878906, 44.902578 ] ] ] } }
] }
] }
,
@ -126,7 +126,7 @@
,
{ "type": "FeatureCollection", "properties": { "zoom": 4, "x": 0, "y": 4 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "boolean": true, "otherboolean": false, "stringify": "[\"yes\",27.00000000,27,1.4e27,{\"foo\":\"bar\"}]", "escape": "foo\u0001bar,ü\"\\/\u0008\u000c\u000a\u000d\u0009→", "prêt": "ready" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -157.060547, 66.687784 ], [ -157.060547, 63.484863 ], [ -157.500000, 63.597448 ], [ -158.554688, 63.860036 ], [ -169.453125, 64.475161 ], [ -177.890625, 62.593341 ], [ -180.000000, 61.650771 ], [ -180.439453, 61.451896 ], [ -180.439453, 66.687784 ], [ -157.060547, 66.687784 ] ] ] } }
{ "type": "Feature", "properties": { "boolean": true, "otherboolean": false, "stringify": "[\"yes\",27.00000000,27,1.4e27,{\"foo\":\"bar\"}]", "escape": "foo\u0001bar,ü\"\\/\u0008\u000c\u000a\u000d\u0009→", "prêt": "ready" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -157.060547, 63.484863 ], [ -157.500000, 63.597448 ], [ -158.554688, 63.860036 ], [ -169.453125, 64.475161 ], [ -177.890625, 62.593341 ], [ -180.000000, 61.650771 ], [ -180.439453, 61.451896 ], [ -180.439453, 66.687784 ], [ -157.060547, 66.687784 ], [ -157.060547, 63.484863 ] ] ] } }
] }
] }
,
@ -144,13 +144,13 @@
,
{ "type": "FeatureCollection", "properties": { "zoom": 4, "x": 1, "y": 5 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "boolean": true, "otherboolean": false, "stringify": "[\"yes\",27.00000000,27,1.4e27,{\"foo\":\"bar\"}]", "escape": "foo\u0001bar,ü\"\\/\u0008\u000c\u000a\u000d\u0009→", "prêt": "ready" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -134.560547, 56.022948 ], [ -134.560547, 47.978891 ], [ -135.000000, 47.650588 ], [ -143.800049, 40.647304 ], [ -157.939453, 40.647304 ], [ -157.939453, 45.286482 ], [ -157.500000, 45.406164 ], [ -153.281250, 46.562637 ], [ -144.492188, 51.179343 ], [ -143.959351, 55.776573 ], [ -143.931885, 56.022948 ], [ -134.560547, 56.022948 ] ] ] } }
{ "type": "Feature", "properties": { "boolean": true, "otherboolean": false, "stringify": "[\"yes\",27.00000000,27,1.4e27,{\"foo\":\"bar\"}]", "escape": "foo\u0001bar,ü\"\\/\u0008\u000c\u000a\u000d\u0009→", "prêt": "ready" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -157.939453, 45.286482 ], [ -157.500000, 45.406164 ], [ -153.281250, 46.562637 ], [ -144.492188, 51.179343 ], [ -143.959351, 55.776573 ], [ -143.931885, 56.022948 ], [ -134.560547, 56.022948 ], [ -134.560547, 47.978891 ], [ -135.000000, 47.650588 ], [ -143.800049, 40.647304 ], [ -157.939453, 40.647304 ], [ -157.939453, 45.286482 ] ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 4, "x": 1, "y": 4 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "boolean": true, "otherboolean": false, "stringify": "[\"yes\",27.00000000,27,1.4e27,{\"foo\":\"bar\"}]", "escape": "foo\u0001bar,ü\"\\/\u0008\u000c\u000a\u000d\u0009→", "prêt": "ready" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -147.782593, 66.687784 ], [ -146.815796, 66.513260 ], [ -144.492188, 66.089364 ], [ -135.000000, 62.570575 ], [ -134.648438, 62.431074 ], [ -134.560547, 62.232115 ], [ -134.560547, 55.528631 ], [ -143.992310, 55.528631 ], [ -143.959351, 55.776573 ], [ -143.789062, 57.139220 ], [ -148.007812, 61.100789 ], [ -157.500000, 63.597448 ], [ -157.939453, 63.707156 ], [ -157.939453, 66.687784 ], [ -147.782593, 66.687784 ] ] ] } }
{ "type": "Feature", "properties": { "boolean": true, "otherboolean": false, "stringify": "[\"yes\",27.00000000,27,1.4e27,{\"foo\":\"bar\"}]", "escape": "foo\u0001bar,ü\"\\/\u0008\u000c\u000a\u000d\u0009→", "prêt": "ready" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -157.939453, 63.707156 ], [ -157.939453, 66.687784 ], [ -147.782593, 66.687784 ], [ -146.815796, 66.513260 ], [ -144.492188, 66.089364 ], [ -135.000000, 62.570575 ], [ -134.648438, 62.431074 ], [ -134.560547, 62.232115 ], [ -134.560547, 55.528631 ], [ -143.992310, 55.528631 ], [ -143.959351, 55.776573 ], [ -143.789062, 57.139220 ], [ -148.007812, 61.100789 ], [ -157.500000, 63.597448 ], [ -157.939453, 63.707156 ] ] ] } }
] }
] }
,
@ -228,19 +228,19 @@
,
{ "type": "FeatureCollection", "properties": { "zoom": 5, "x": 0, "y": 11 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "boolean": true, "otherboolean": false, "stringify": "[\"yes\",27.00000000,27,1.4e27,{\"foo\":\"bar\"}]", "escape": "foo\u0001bar,ü\"\\/\u0008\u000c\u000a\u000d\u0009→", "prêt": "ready" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -168.530273, 43.622159 ], [ -168.530273, 40.813809 ], [ -180.219727, 40.813809 ], [ -180.219727, 45.290347 ], [ -177.539062, 44.339565 ], [ -168.750000, 43.640051 ], [ -168.530273, 43.622159 ] ] ] } }
{ "type": "Feature", "properties": { "boolean": true, "otherboolean": false, "stringify": "[\"yes\",27.00000000,27,1.4e27,{\"foo\":\"bar\"}]", "escape": "foo\u0001bar,ü\"\\/\u0008\u000c\u000a\u000d\u0009→", "prêt": "ready" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -180.219727, 45.290347 ], [ -177.539062, 44.339565 ], [ -168.750000, 43.640051 ], [ -168.530273, 43.622159 ], [ -168.530273, 40.813809 ], [ -180.219727, 40.813809 ], [ -180.219727, 45.290347 ] ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 5, "x": 0, "y": 9 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "boolean": true, "otherboolean": false, "stringify": "[\"yes\",27.00000000,27,1.4e27,{\"foo\":\"bar\"}]", "escape": "foo\u0001bar,ü\"\\/\u0008\u000c\u000a\u000d\u0009→", "prêt": "ready" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -179.868164, 61.710706 ], [ -180.219727, 61.551493 ], [ -180.219727, 61.710706 ], [ -179.868164, 61.710706 ] ] ] } }
{ "type": "Feature", "properties": { "boolean": true, "otherboolean": false, "stringify": "[\"yes\",27.00000000,27,1.4e27,{\"foo\":\"bar\"}]", "escape": "foo\u0001bar,ü\"\\/\u0008\u000c\u000a\u000d\u0009→", "prêt": "ready" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -180.219727, 61.551493 ], [ -180.219727, 61.710706 ], [ -179.868164, 61.710706 ], [ -180.219727, 61.551493 ] ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 5, "x": 0, "y": 8 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "boolean": true, "otherboolean": false, "stringify": "[\"yes\",27.00000000,27,1.4e27,{\"foo\":\"bar\"}]", "escape": "foo\u0001bar,ü\"\\/\u0008\u000c\u000a\u000d\u0009→", "prêt": "ready" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -168.530273, 66.600676 ], [ -168.530273, 64.423037 ], [ -168.750000, 64.434892 ], [ -169.453125, 64.473977 ], [ -177.890625, 62.593341 ], [ -180.000000, 61.650771 ], [ -180.219727, 61.551493 ], [ -180.219727, 66.600676 ], [ -168.530273, 66.600676 ] ] ] } }
{ "type": "Feature", "properties": { "boolean": true, "otherboolean": false, "stringify": "[\"yes\",27.00000000,27,1.4e27,{\"foo\":\"bar\"}]", "escape": "foo\u0001bar,ü\"\\/\u0008\u000c\u000a\u000d\u0009→", "prêt": "ready" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -168.530273, 64.423037 ], [ -168.750000, 64.434892 ], [ -169.453125, 64.473977 ], [ -177.890625, 62.593341 ], [ -180.000000, 61.650771 ], [ -180.219727, 61.551493 ], [ -180.219727, 66.600676 ], [ -168.530273, 66.600676 ], [ -168.530273, 64.423037 ] ] ] } }
] }
] }
,
@ -264,7 +264,7 @@
,
{ "type": "FeatureCollection", "properties": { "zoom": 5, "x": 1, "y": 8 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "boolean": true, "otherboolean": false, "stringify": "[\"yes\",27.00000000,27,1.4e27,{\"foo\":\"bar\"}]", "escape": "foo\u0001bar,ü\"\\/\u0008\u000c\u000a\u000d\u0009→", "prêt": "ready" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -157.280273, 66.600676 ], [ -157.280273, 63.541211 ], [ -157.500000, 63.596226 ], [ -158.554688, 63.860036 ], [ -168.750000, 64.434892 ], [ -168.969727, 64.447927 ], [ -168.969727, 66.600676 ], [ -157.280273, 66.600676 ] ] ] } }
{ "type": "Feature", "properties": { "boolean": true, "otherboolean": false, "stringify": "[\"yes\",27.00000000,27,1.4e27,{\"foo\":\"bar\"}]", "escape": "foo\u0001bar,ü\"\\/\u0008\u000c\u000a\u000d\u0009→", "prêt": "ready" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -168.969727, 64.447927 ], [ -168.969727, 66.600676 ], [ -157.280273, 66.600676 ], [ -157.280273, 63.541211 ], [ -157.500000, 63.596226 ], [ -158.554688, 63.860036 ], [ -168.750000, 64.434892 ], [ -168.969727, 64.447927 ] ] ] } }
] }
] }
,
@ -282,7 +282,7 @@
,
{ "type": "FeatureCollection", "properties": { "zoom": 5, "x": 2, "y": 11 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "boolean": true, "otherboolean": false, "stringify": "[\"yes\",27.00000000,27,1.4e27,{\"foo\":\"bar\"}]", "escape": "foo\u0001bar,ü\"\\/\u0008\u000c\u000a\u000d\u0009→", "prêt": "ready" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -146.030273, 49.066668 ], [ -146.030273, 40.813809 ], [ -157.719727, 40.813809 ], [ -157.719727, 45.346354 ], [ -157.500000, 45.408092 ], [ -153.281250, 46.560749 ], [ -148.889465, 48.922499 ], [ -148.614807, 49.066668 ], [ -146.030273, 49.066668 ] ] ] } }
{ "type": "Feature", "properties": { "boolean": true, "otherboolean": false, "stringify": "[\"yes\",27.00000000,27,1.4e27,{\"foo\":\"bar\"}]", "escape": "foo\u0001bar,ü\"\\/\u0008\u000c\u000a\u000d\u0009→", "prêt": "ready" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -157.719727, 45.346354 ], [ -157.500000, 45.408092 ], [ -153.281250, 46.560749 ], [ -148.889465, 48.922499 ], [ -148.614807, 49.066668 ], [ -146.030273, 49.066668 ], [ -146.030273, 40.813809 ], [ -157.719727, 40.813809 ], [ -157.719727, 45.346354 ] ] ] } }
] }
] }
,
@ -300,7 +300,7 @@
,
{ "type": "FeatureCollection", "properties": { "zoom": 5, "x": 2, "y": 8 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "boolean": true, "otherboolean": false, "stringify": "[\"yes\",27.00000000,27,1.4e27,{\"foo\":\"bar\"}]", "escape": "foo\u0001bar,ü\"\\/\u0008\u000c\u000a\u000d\u0009→", "prêt": "ready" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -147.296448, 66.600676 ], [ -146.813049, 66.513260 ], [ -146.250000, 66.411253 ], [ -146.030273, 66.371654 ], [ -146.030273, 61.501734 ], [ -149.482727, 61.501734 ], [ -149.869995, 61.606396 ], [ -157.500000, 63.597448 ], [ -157.719727, 63.652355 ], [ -157.719727, 66.600676 ], [ -147.296448, 66.600676 ] ] ] } }
{ "type": "Feature", "properties": { "boolean": true, "otherboolean": false, "stringify": "[\"yes\",27.00000000,27,1.4e27,{\"foo\":\"bar\"}]", "escape": "foo\u0001bar,ü\"\\/\u0008\u000c\u000a\u000d\u0009→", "prêt": "ready" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -157.719727, 63.652355 ], [ -157.719727, 66.600676 ], [ -147.296448, 66.600676 ], [ -146.813049, 66.513260 ], [ -146.250000, 66.411253 ], [ -146.030273, 66.371654 ], [ -146.030273, 61.501734 ], [ -149.482727, 61.501734 ], [ -149.869995, 61.606396 ], [ -157.500000, 63.597448 ], [ -157.719727, 63.652355 ] ] ] } }
] }
] }
,
@ -324,13 +324,13 @@
,
{ "type": "FeatureCollection", "properties": { "zoom": 5, "x": 3, "y": 10 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "boolean": true, "otherboolean": false, "stringify": "[\"yes\",27.00000000,27,1.4e27,{\"foo\":\"bar\"}]", "escape": "foo\u0001bar,ü\"\\/\u0008\u000c\u000a\u000d\u0009→", "prêt": "ready" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -134.780273, 55.899956 ], [ -134.780273, 48.777913 ], [ -146.469727, 48.777913 ], [ -146.469727, 50.178657 ], [ -146.250000, 50.291094 ], [ -144.492188, 51.179343 ], [ -143.962097, 55.776573 ], [ -143.945618, 55.899956 ], [ -134.780273, 55.899956 ] ] ] } }
{ "type": "Feature", "properties": { "boolean": true, "otherboolean": false, "stringify": "[\"yes\",27.00000000,27,1.4e27,{\"foo\":\"bar\"}]", "escape": "foo\u0001bar,ü\"\\/\u0008\u000c\u000a\u000d\u0009→", "prêt": "ready" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -146.469727, 50.178657 ], [ -146.250000, 50.291094 ], [ -144.492188, 51.179343 ], [ -143.962097, 55.776573 ], [ -143.945618, 55.899956 ], [ -134.780273, 55.899956 ], [ -134.780273, 48.777913 ], [ -146.469727, 48.777913 ], [ -146.469727, 50.178657 ] ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 5, "x": 3, "y": 9 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "boolean": true, "otherboolean": false, "stringify": "[\"yes\",27.00000000,27,1.4e27,{\"foo\":\"bar\"}]", "escape": "foo\u0001bar,ü\"\\/\u0008\u000c\u000a\u000d\u0009→", "prêt": "ready" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -134.780273, 61.710706 ], [ -134.780273, 55.652798 ], [ -143.975830, 55.652798 ], [ -143.959351, 55.776573 ], [ -143.789062, 57.137730 ], [ -146.250000, 59.506455 ], [ -146.469727, 59.709327 ], [ -146.469727, 61.710706 ], [ -134.780273, 61.710706 ] ] ] } }
{ "type": "Feature", "properties": { "boolean": true, "otherboolean": false, "stringify": "[\"yes\",27.00000000,27,1.4e27,{\"foo\":\"bar\"}]", "escape": "foo\u0001bar,ü\"\\/\u0008\u000c\u000a\u000d\u0009→", "prêt": "ready" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -146.469727, 59.709327 ], [ -146.469727, 61.710706 ], [ -134.780273, 61.710706 ], [ -134.780273, 55.652798 ], [ -143.975830, 55.652798 ], [ -143.959351, 55.776573 ], [ -143.789062, 57.137730 ], [ -146.250000, 59.506455 ], [ -146.469727, 59.709327 ] ] ] } }
] }
] }
,

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.164062, 9.557417 ], [ 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.164062, 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.164062, 9.557417 ], [ 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.164062, 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

@ -148,7 +148,7 @@
{ "type": "FeatureCollection", "properties": { "layer": "tabblock_06001420", "version": 2, "extent": 4096 }, "features": [
{ "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.301865, 37.898698 ], [ -122.300491, 37.897072 ], [ -122.301178, 37.897072 ], [ -122.301865, 37.898698 ] ] ] } }
,
{ "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.301865, 37.898698 ], [ -122.301178, 37.896530 ], [ -122.303238, 37.895989 ], [ -122.303238, 37.894905 ], [ -122.302551, 37.893821 ], [ -122.303238, 37.893821 ], [ -122.304611, 37.890570 ], [ -122.306671, 37.890028 ], [ -122.309418, 37.898156 ], [ -122.301865, 37.898698 ] ] ] } }
{ "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.303238, 37.893821 ], [ -122.304611, 37.890570 ], [ -122.306671, 37.890028 ], [ -122.309418, 37.898156 ], [ -122.301865, 37.898698 ], [ -122.301178, 37.896530 ], [ -122.303238, 37.895989 ], [ -122.303238, 37.894905 ], [ -122.302551, 37.893821 ], [ -122.303238, 37.893821 ] ] ] } }
,
{ "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.303238, 37.894905 ], [ -122.302551, 37.892196 ], [ -122.303238, 37.891654 ], [ -122.303238, 37.894905 ] ] ] } }
,
@ -406,7 +406,7 @@
,
{ "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.284698, 37.887318 ], [ -122.284012, 37.886235 ], [ -122.286072, 37.884067 ], [ -122.284698, 37.887318 ] ] ] } }
,
{ "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.283325, 37.886235 ], [ -122.284012, 37.885151 ], [ -122.284012, 37.886235 ], [ -122.283325, 37.886235 ] ] ] } }
{ "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.284012, 37.885151 ], [ -122.284012, 37.886235 ], [ -122.283325, 37.886235 ], [ -122.284012, 37.885151 ] ] ] } }
,
{ "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.282639, 37.885151 ], [ -122.283325, 37.882983 ], [ -122.286072, 37.882983 ], [ -122.286072, 37.884067 ], [ -122.282639, 37.885151 ] ] ] } }
,
@ -1280,7 +1280,7 @@
,
{ "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.291908, 37.892873 ], [ -122.291994, 37.890705 ], [ -122.292938, 37.890638 ], [ -122.292852, 37.892873 ], [ -122.291908, 37.892873 ] ] ] } }
,
{ "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.890570 ], [ -122.293625, 37.890434 ], [ -122.292767, 37.887793 ], [ -122.292767, 37.887657 ], [ -122.293625, 37.887657 ], [ -122.294569, 37.890502 ], [ -122.293711, 37.890570 ] ] ] } }
{ "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.293625, 37.887657 ], [ -122.294569, 37.890502 ], [ -122.293711, 37.890570 ], [ -122.293625, 37.890434 ], [ -122.292767, 37.887793 ], [ -122.292767, 37.887657 ], [ -122.293625, 37.887657 ] ] ] } }
,
{ "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.292938, 37.890570 ], [ -122.292166, 37.887860 ], [ -122.292509, 37.887793 ], [ -122.293196, 37.889825 ], [ -122.293711, 37.890570 ], [ -122.292938, 37.890570 ] ] ] } }
,
@ -1322,7 +1322,7 @@
,
{ "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.290192, 37.885219 ], [ -122.289848, 37.884541 ], [ -122.290363, 37.883051 ], [ -122.290449, 37.883254 ], [ -122.291222, 37.885015 ], [ -122.290192, 37.885219 ] ] ] } }
,
{ "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.289762, 37.884948 ], [ -122.288818, 37.884744 ], [ -122.289333, 37.883322 ], [ -122.290106, 37.883186 ], [ -122.290277, 37.883186 ], [ -122.289762, 37.884948 ] ] ] } }
{ "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.290277, 37.883186 ], [ -122.289762, 37.884948 ], [ -122.288818, 37.884744 ], [ -122.289333, 37.883322 ], [ -122.290106, 37.883186 ], [ -122.290277, 37.883186 ] ] ] } }
,
{ "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.296028, 37.883999 ], [ -122.295771, 37.883051 ], [ -122.296028, 37.883051 ], [ -122.296801, 37.883525 ], [ -122.296886, 37.883864 ], [ -122.296028, 37.883999 ] ] ] } }
,
@ -1352,7 +1352,7 @@
,
{ "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.889147 ], [ -122.282810, 37.889080 ], [ -122.282724, 37.888606 ], [ -122.283325, 37.886912 ], [ -122.284355, 37.887183 ], [ -122.283669, 37.889147 ] ] ] } }
,
{ "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.288218, 37.888606 ], [ -122.289333, 37.886031 ], [ -122.288303, 37.888606 ], [ -122.288218, 37.888606 ] ] ] } }
{ "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.289333, 37.886031 ], [ -122.288303, 37.888606 ], [ -122.288218, 37.888606 ], [ -122.289333, 37.886031 ] ] ] } }
,
{ "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.287102, 37.889012 ], [ -122.287273, 37.888267 ], [ -122.287703, 37.887657 ], [ -122.288818, 37.884744 ], [ -122.289677, 37.884880 ], [ -122.289333, 37.885896 ], [ -122.288218, 37.888606 ], [ -122.287102, 37.889012 ] ] ] } }
,
@ -1384,7 +1384,7 @@
,
{ "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.287016, 37.882915 ], [ -122.287188, 37.882577 ], [ -122.287188, 37.882712 ], [ -122.287102, 37.882915 ], [ -122.287016, 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.285728, 37.883660 ], [ -122.285728, 37.883593 ], [ -122.287016, 37.882915 ], [ -122.285728, 37.883660 ] ] ] } }
{ "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.287016, 37.882915 ], [ -122.285728, 37.883660 ], [ -122.285728, 37.883593 ], [ -122.287016, 37.882915 ] ] ] } }
,
{ "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.883593 ], [ -122.286072, 37.882509 ], [ -122.287188, 37.882577 ], [ -122.287016, 37.882915 ], [ -122.285728, 37.883593 ] ] ] } }
] }
@ -1978,7 +1978,7 @@
,
{ "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": "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": "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.290256, 37.883186 ], [ -122.290170, 37.883576 ], [ -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 ] ] ] } }
,
{ "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 ] ] ] } }
,

View File

@ -10,12 +10,6 @@
"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 ] ] ] } }
@ -78,7 +72,7 @@
{ "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.313538, 37.897614 ], [ -122.309418, 37.893279 ], [ -122.310791, 37.888944 ], [ -122.314911, 37.893279 ], [ -122.320404, 37.890028 ], [ -122.325897, 37.893279 ], [ -122.328644, 37.890028 ], [ -122.335510, 37.890028 ], [ -122.334137, 37.893279 ], [ -122.313538, 37.897614 ] ] ] } }
,
{ "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": "MultiPolygon", "coordinates": [ [ [ [ -122.309418, 37.891112 ], [ -122.309418, 37.888944 ], [ -122.310791, 37.888944 ], [ -122.309418, 37.891112 ] ] ], [ [ [ -122.320404, 37.890028 ], [ -122.314911, 37.893279 ], [ -122.310791, 37.888944 ], [ -122.320404, 37.890028 ] ] ], [ [ [ -122.323151, 37.890028 ], [ -122.328644, 37.890028 ], [ -122.328644, 37.892196 ], [ -122.324524, 37.893279 ], [ -122.323151, 37.890028 ] ] ] ] } }
{ "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": "MultiPolygon", "coordinates": [ [ [ [ -122.309418, 37.891112 ], [ -122.309418, 37.888944 ], [ -122.310791, 37.888944 ], [ -122.309418, 37.891112 ] ] ], [ [ [ -122.323151, 37.890028 ], [ -122.328644, 37.890028 ], [ -122.328644, 37.892196 ], [ -122.324524, 37.893279 ], [ -122.323151, 37.890028 ] ] ], [ [ [ -122.320404, 37.890028 ], [ -122.314911, 37.893279 ], [ -122.310791, 37.888944 ], [ -122.320404, 37.890028 ] ] ] ] } }
,
{ "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.312164, 37.898698 ], [ -122.309418, 37.897614 ], [ -122.309418, 37.891112 ], [ -122.312164, 37.898698 ] ] ] } }
,
@ -204,11 +198,11 @@
{ "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.312851, 37.897614 ], [ -122.309418, 37.892737 ], [ -122.310104, 37.888944 ], [ -122.314911, 37.892737 ], [ -122.316284, 37.891654 ], [ -122.320404, 37.890028 ], [ -122.323151, 37.890028 ], [ -122.324524, 37.892737 ], [ -122.325897, 37.892737 ], [ -122.325897, 37.891112 ], [ -122.327957, 37.891654 ], [ -122.327957, 37.890028 ], [ -122.334824, 37.890028 ], [ -122.333450, 37.893279 ], [ -122.312851, 37.897614 ] ] ] } }
,
{ "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": "MultiPolygon", "coordinates": [ [ [ [ -122.320404, 37.890028 ], [ -122.316284, 37.891654 ], [ -122.314911, 37.892737 ], [ -122.310104, 37.888944 ], [ -122.311478, 37.889486 ], [ -122.320404, 37.890028 ] ] ], [ [ [ -122.310104, 37.888944 ], [ -122.309418, 37.892737 ], [ -122.309418, 37.887860 ], [ -122.310104, 37.888944 ] ] ], [ [ [ -122.323151, 37.890028 ], [ -122.327957, 37.890028 ], [ -122.327957, 37.891654 ], [ -122.325897, 37.891112 ], [ -122.325897, 37.892737 ], [ -122.324524, 37.892737 ], [ -122.323151, 37.890028 ] ] ] ] } }
{ "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": "MultiPolygon", "coordinates": [ [ [ [ -122.323151, 37.890028 ], [ -122.327957, 37.890028 ], [ -122.327957, 37.891654 ], [ -122.325897, 37.891112 ], [ -122.325897, 37.892737 ], [ -122.324524, 37.892737 ], [ -122.323151, 37.890028 ] ] ], [ [ [ -122.320404, 37.890028 ], [ -122.316284, 37.891654 ], [ -122.314911, 37.892737 ], [ -122.310104, 37.888944 ], [ -122.311478, 37.889486 ], [ -122.320404, 37.890028 ] ] ], [ [ [ -122.309418, 37.892737 ], [ -122.309418, 37.887860 ], [ -122.310104, 37.888944 ], [ -122.309418, 37.892737 ] ] ] ] } }
,
{ "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.309418, 37.898156 ], [ -122.308044, 37.892196 ], [ -122.308731, 37.892196 ], [ -122.309418, 37.898156 ] ] ] } }
,
{ "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.312164, 37.897614 ], [ -122.309418, 37.894905 ], [ -122.308731, 37.891112 ], [ -122.312164, 37.897614 ] ] ] } }
{ "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.308731, 37.891112 ], [ -122.312164, 37.897614 ], [ -122.309418, 37.894905 ], [ -122.308731, 37.891112 ] ] ] } }
,
{ "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.311478, 37.898156 ], [ -122.309418, 37.897614 ], [ -122.308731, 37.891112 ], [ -122.311478, 37.898156 ] ] ] } }
,
@ -222,7 +216,7 @@
,
{ "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.301865, 37.898698 ], [ -122.300491, 37.897072 ], [ -122.301178, 37.897072 ], [ -122.301865, 37.898698 ] ] ] } }
,
{ "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.301865, 37.898698 ], [ -122.301178, 37.896530 ], [ -122.303238, 37.895989 ], [ -122.303238, 37.894905 ], [ -122.302551, 37.893821 ], [ -122.303238, 37.893821 ], [ -122.304611, 37.890570 ], [ -122.306671, 37.890028 ], [ -122.309418, 37.898156 ], [ -122.301865, 37.898698 ] ] ] } }
{ "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.303238, 37.893821 ], [ -122.304611, 37.890570 ], [ -122.306671, 37.890028 ], [ -122.309418, 37.898156 ], [ -122.301865, 37.898698 ], [ -122.301178, 37.896530 ], [ -122.303238, 37.895989 ], [ -122.303238, 37.894905 ], [ -122.302551, 37.893821 ], [ -122.303238, 37.893821 ] ] ] } }
,
{ "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.303238, 37.894905 ], [ -122.302551, 37.892196 ], [ -122.303238, 37.891654 ], [ -122.303238, 37.894905 ] ] ] } }
,
@ -522,7 +516,7 @@
,
{ "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.284698, 37.887318 ], [ -122.284012, 37.886235 ], [ -122.286072, 37.884067 ], [ -122.284698, 37.887318 ] ] ] } }
,
{ "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.283325, 37.886235 ], [ -122.284012, 37.885151 ], [ -122.284012, 37.886235 ], [ -122.283325, 37.886235 ] ] ] } }
{ "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.284012, 37.885151 ], [ -122.284012, 37.886235 ], [ -122.283325, 37.886235 ], [ -122.284012, 37.885151 ] ] ] } }
,
{ "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.282639, 37.885151 ], [ -122.283325, 37.882983 ], [ -122.286072, 37.882983 ], [ -122.286072, 37.884067 ], [ -122.282639, 37.885151 ] ] ] } }
,
@ -558,7 +552,7 @@
,
{ "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.309418, 37.897885 ], [ -122.308044, 37.894092 ], [ -122.308044, 37.892196 ], [ -122.308388, 37.892196 ], [ -122.309418, 37.897885 ] ] ] } }
,
{ "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.897885 ], [ -122.309418, 37.894634 ], [ -122.309418, 37.894092 ], [ -122.312164, 37.897614 ], [ -122.311478, 37.897885 ] ] ] } }
{ "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.309418, 37.894092 ], [ -122.312164, 37.897614 ], [ -122.311478, 37.897885 ], [ -122.309418, 37.894634 ], [ -122.309418, 37.894092 ] ] ] } }
,
{ "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.309761, 37.897885 ], [ -122.309418, 37.897343 ], [ -122.308388, 37.894634 ], [ -122.308388, 37.890841 ], [ -122.309418, 37.894634 ], [ -122.311478, 37.897885 ], [ -122.309761, 37.897885 ] ] ] } }
,
@ -618,7 +612,7 @@
,
{ "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.309074, 37.887589 ], [ -122.308731, 37.887318 ], [ -122.309074, 37.885151 ], [ -122.309074, 37.887589 ] ] ] } }
,
{ "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.309418, 37.887318 ], [ -122.309418, 37.886506 ], [ -122.309074, 37.885151 ], [ -122.309761, 37.886506 ], [ -122.309418, 37.887318 ] ] ] } }
{ "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.309074, 37.885151 ], [ -122.309761, 37.886506 ], [ -122.309418, 37.887318 ], [ -122.309418, 37.886506 ], [ -122.309074, 37.885151 ] ] ] } }
,
{ "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.307358, 37.887318 ], [ -122.308044, 37.882170 ], [ -122.308388, 37.882441 ], [ -122.308731, 37.883525 ], [ -122.309074, 37.885151 ], [ -122.308731, 37.887318 ], [ -122.307358, 37.887318 ] ] ] } }
,
@ -1806,7 +1800,7 @@
,
{ "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.291908, 37.890638 ], [ -122.292938, 37.890570 ], [ -122.292767, 37.890638 ], [ -122.291908, 37.890638 ] ] ] } }
,
{ "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.890570 ], [ -122.293625, 37.890434 ], [ -122.292767, 37.887793 ], [ -122.292767, 37.887657 ], [ -122.293625, 37.887657 ], [ -122.294569, 37.890502 ], [ -122.293711, 37.890570 ] ] ] } }
{ "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.293625, 37.887657 ], [ -122.294569, 37.890502 ], [ -122.293711, 37.890570 ], [ -122.293625, 37.890434 ], [ -122.292767, 37.887793 ], [ -122.292767, 37.887657 ], [ -122.293625, 37.887657 ] ] ] } }
,
{ "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.293625, 37.890367 ], [ -122.293196, 37.889825 ], [ -122.292509, 37.887725 ], [ -122.292767, 37.887657 ], [ -122.292767, 37.887793 ], [ -122.293625, 37.890367 ] ] ] } }
,
@ -1866,7 +1860,7 @@
,
{ "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.885896 ], [ -122.289677, 37.884880 ], [ -122.289762, 37.884948 ], [ -122.289333, 37.885896 ] ] ] } }
,
{ "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.289762, 37.884948 ], [ -122.288818, 37.884744 ], [ -122.289333, 37.883322 ], [ -122.290106, 37.883186 ], [ -122.290277, 37.883186 ], [ -122.289762, 37.884948 ] ] ] } }
{ "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.290277, 37.883186 ], [ -122.289762, 37.884948 ], [ -122.288818, 37.884744 ], [ -122.289333, 37.883322 ], [ -122.290106, 37.883186 ], [ -122.290277, 37.883186 ] ] ] } }
,
{ "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.296028, 37.883999 ], [ -122.295771, 37.883051 ], [ -122.296028, 37.883051 ], [ -122.296801, 37.883525 ], [ -122.296886, 37.883864 ], [ -122.296028, 37.883999 ] ] ] } }
,
@ -1922,7 +1916,7 @@
,
{ "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.889147 ], [ -122.282810, 37.889080 ], [ -122.282724, 37.888606 ], [ -122.283325, 37.886912 ], [ -122.284355, 37.887183 ], [ -122.283669, 37.889147 ] ] ] } }
,
{ "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.288218, 37.888606 ], [ -122.289333, 37.886031 ], [ -122.288303, 37.888606 ], [ -122.288218, 37.888606 ] ] ] } }
{ "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.289333, 37.886031 ], [ -122.288303, 37.888606 ], [ -122.288218, 37.888606 ], [ -122.289333, 37.886031 ] ] ] } }
,
{ "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.287102, 37.889012 ], [ -122.287273, 37.888267 ], [ -122.287703, 37.887657 ], [ -122.288818, 37.884744 ], [ -122.289677, 37.884880 ], [ -122.289333, 37.885896 ], [ -122.288218, 37.888606 ], [ -122.287102, 37.889012 ] ] ] } }
,
@ -1972,7 +1966,7 @@
,
{ "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.287016, 37.882915 ], [ -122.287188, 37.882577 ], [ -122.287188, 37.882712 ], [ -122.287102, 37.882915 ], [ -122.287016, 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.285728, 37.883660 ], [ -122.285728, 37.883593 ], [ -122.287016, 37.882915 ], [ -122.285728, 37.883660 ] ] ] } }
{ "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.287016, 37.882915 ], [ -122.285728, 37.883660 ], [ -122.285728, 37.883593 ], [ -122.287016, 37.882915 ] ] ] } }
,
{ "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.883593 ], [ -122.286072, 37.882509 ], [ -122.287188, 37.882577 ], [ -122.287016, 37.882915 ], [ -122.285728, 37.883593 ] ] ] } }
] }
@ -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

@ -124,7 +124,7 @@
{ "type": "FeatureCollection", "properties": { "layer": "tabblock_06001420", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420300", "BLOCKCE10": "3008", "GEOID10": "060014203003008", "NAME10": "Block 3008", "MTFCC10": "G5040", "UR10": "R", "FUNCSTAT10": "S", "ALAND10": 0, "AWATER10": 1111196, "INTPTLAT10": "+37.8928912", "INTPTLON10": "-122.3202957" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.313538, 37.897614 ], [ -122.309418, 37.893279 ], [ -122.310791, 37.888944 ], [ -122.314911, 37.893279 ], [ -122.320404, 37.890028 ], [ -122.325897, 37.893279 ], [ -122.328644, 37.890028 ], [ -122.335510, 37.890028 ], [ -122.334137, 37.893279 ], [ -122.313538, 37.897614 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420300", "BLOCKCE10": "3009", "GEOID10": "060014203003009", "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": "MultiPolygon", "coordinates": [ [ [ [ -122.309418, 37.891112 ], [ -122.309418, 37.888944 ], [ -122.310791, 37.888944 ], [ -122.309418, 37.891112 ] ] ], [ [ [ -122.320404, 37.890028 ], [ -122.314911, 37.893279 ], [ -122.310791, 37.888944 ], [ -122.320404, 37.890028 ] ] ], [ [ [ -122.323151, 37.890028 ], [ -122.328644, 37.890028 ], [ -122.328644, 37.892196 ], [ -122.324524, 37.893279 ], [ -122.323151, 37.890028 ] ] ] ] } }
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420300", "BLOCKCE10": "3009", "GEOID10": "060014203003009", "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": "MultiPolygon", "coordinates": [ [ [ [ -122.309418, 37.891112 ], [ -122.309418, 37.888944 ], [ -122.310791, 37.888944 ], [ -122.309418, 37.891112 ] ] ], [ [ [ -122.323151, 37.890028 ], [ -122.328644, 37.890028 ], [ -122.328644, 37.892196 ], [ -122.324524, 37.893279 ], [ -122.323151, 37.890028 ] ] ], [ [ [ -122.320404, 37.890028 ], [ -122.314911, 37.893279 ], [ -122.310791, 37.888944 ], [ -122.320404, 37.890028 ] ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420300", "BLOCKCE10": "3004", "GEOID10": "060014203003004", "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.312164, 37.898698 ], [ -122.309418, 37.897614 ], [ -122.309418, 37.891112 ], [ -122.312164, 37.898698 ] ] ] } }
,
@ -280,11 +280,11 @@
{ "type": "FeatureCollection", "properties": { "layer": "tabblock_06001420", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420300", "BLOCKCE10": "3008", "GEOID10": "060014203003008", "NAME10": "Block 3008", "MTFCC10": "G5040", "UR10": "R", "FUNCSTAT10": "S", "ALAND10": 0, "AWATER10": 1111196, "INTPTLAT10": "+37.8928912", "INTPTLON10": "-122.3202957" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.312851, 37.897614 ], [ -122.309418, 37.892737 ], [ -122.310104, 37.888944 ], [ -122.314911, 37.892737 ], [ -122.316284, 37.891654 ], [ -122.320404, 37.890028 ], [ -122.323151, 37.890028 ], [ -122.324524, 37.892737 ], [ -122.325897, 37.892737 ], [ -122.325897, 37.891112 ], [ -122.327957, 37.891654 ], [ -122.327957, 37.890028 ], [ -122.334824, 37.890028 ], [ -122.333450, 37.893279 ], [ -122.312851, 37.897614 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420300", "BLOCKCE10": "3009", "GEOID10": "060014203003009", "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": "MultiPolygon", "coordinates": [ [ [ [ -122.320404, 37.890028 ], [ -122.316284, 37.891654 ], [ -122.314911, 37.892737 ], [ -122.310104, 37.888944 ], [ -122.311478, 37.889486 ], [ -122.320404, 37.890028 ] ] ], [ [ [ -122.310104, 37.888944 ], [ -122.309418, 37.892737 ], [ -122.309418, 37.887860 ], [ -122.310104, 37.888944 ] ] ], [ [ [ -122.323151, 37.890028 ], [ -122.327957, 37.890028 ], [ -122.327957, 37.891654 ], [ -122.325897, 37.891112 ], [ -122.325897, 37.892737 ], [ -122.324524, 37.892737 ], [ -122.323151, 37.890028 ] ] ] ] } }
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420300", "BLOCKCE10": "3009", "GEOID10": "060014203003009", "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": "MultiPolygon", "coordinates": [ [ [ [ -122.323151, 37.890028 ], [ -122.327957, 37.890028 ], [ -122.327957, 37.891654 ], [ -122.325897, 37.891112 ], [ -122.325897, 37.892737 ], [ -122.324524, 37.892737 ], [ -122.323151, 37.890028 ] ] ], [ [ [ -122.320404, 37.890028 ], [ -122.316284, 37.891654 ], [ -122.314911, 37.892737 ], [ -122.310104, 37.888944 ], [ -122.311478, 37.889486 ], [ -122.320404, 37.890028 ] ] ], [ [ [ -122.309418, 37.892737 ], [ -122.309418, 37.887860 ], [ -122.310104, 37.888944 ], [ -122.309418, 37.892737 ] ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420300", "BLOCKCE10": "3003", "GEOID10": "060014203003003", "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.309418, 37.898156 ], [ -122.308044, 37.892196 ], [ -122.308731, 37.892196 ], [ -122.309418, 37.898156 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420300", "BLOCKCE10": "3005", "GEOID10": "060014203003005", "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.312164, 37.897614 ], [ -122.309418, 37.894905 ], [ -122.308731, 37.891112 ], [ -122.312164, 37.897614 ] ] ] } }
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420300", "BLOCKCE10": "3005", "GEOID10": "060014203003005", "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.308731, 37.891112 ], [ -122.312164, 37.897614 ], [ -122.309418, 37.894905 ], [ -122.308731, 37.891112 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420300", "BLOCKCE10": "3004", "GEOID10": "060014203003004", "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.311478, 37.898156 ], [ -122.309418, 37.897614 ], [ -122.308731, 37.891112 ], [ -122.311478, 37.898156 ] ] ] } }
,
@ -298,7 +298,7 @@
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420200", "BLOCKCE10": "1005", "GEOID10": "060014202001005", "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.301865, 37.898698 ], [ -122.300491, 37.897072 ], [ -122.301178, 37.897072 ], [ -122.301865, 37.898698 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420300", "BLOCKCE10": "2000", "GEOID10": "060014203002000", "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.301865, 37.898698 ], [ -122.301178, 37.896530 ], [ -122.303238, 37.895989 ], [ -122.303238, 37.894905 ], [ -122.302551, 37.893821 ], [ -122.303238, 37.893821 ], [ -122.304611, 37.890570 ], [ -122.306671, 37.890028 ], [ -122.309418, 37.898156 ], [ -122.301865, 37.898698 ] ] ] } }
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420300", "BLOCKCE10": "2000", "GEOID10": "060014203002000", "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.303238, 37.893821 ], [ -122.304611, 37.890570 ], [ -122.306671, 37.890028 ], [ -122.309418, 37.898156 ], [ -122.301865, 37.898698 ], [ -122.301178, 37.896530 ], [ -122.303238, 37.895989 ], [ -122.303238, 37.894905 ], [ -122.302551, 37.893821 ], [ -122.303238, 37.893821 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420300", "BLOCKCE10": "1008", "GEOID10": "060014203001008", "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.303238, 37.894905 ], [ -122.302551, 37.892196 ], [ -122.303238, 37.891654 ], [ -122.303238, 37.894905 ] ] ] } }
,
@ -598,7 +598,7 @@
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "1013", "GEOID10": "060014206001013", "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.284698, 37.887318 ], [ -122.284012, 37.886235 ], [ -122.286072, 37.884067 ], [ -122.284698, 37.887318 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "1029", "GEOID10": "060014206001029", "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.283325, 37.886235 ], [ -122.284012, 37.885151 ], [ -122.284012, 37.886235 ], [ -122.283325, 37.886235 ] ] ] } }
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "1029", "GEOID10": "060014206001029", "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.284012, 37.885151 ], [ -122.284012, 37.886235 ], [ -122.283325, 37.886235 ], [ -122.284012, 37.885151 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "1026", "GEOID10": "060014206001026", "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.282639, 37.885151 ], [ -122.283325, 37.882983 ], [ -122.286072, 37.882983 ], [ -122.286072, 37.884067 ], [ -122.282639, 37.885151 ] ] ] } }
,
@ -676,7 +676,7 @@
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420300", "BLOCKCE10": "3003", "GEOID10": "060014203003003", "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.309418, 37.897885 ], [ -122.308044, 37.894092 ], [ -122.308044, 37.892196 ], [ -122.308388, 37.892196 ], [ -122.309418, 37.897885 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420300", "BLOCKCE10": "3005", "GEOID10": "060014203003005", "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.897885 ], [ -122.309418, 37.894634 ], [ -122.309418, 37.894092 ], [ -122.312164, 37.897614 ], [ -122.311478, 37.897885 ] ] ] } }
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420300", "BLOCKCE10": "3005", "GEOID10": "060014203003005", "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.309418, 37.894092 ], [ -122.312164, 37.897614 ], [ -122.311478, 37.897885 ], [ -122.309418, 37.894634 ], [ -122.309418, 37.894092 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420300", "BLOCKCE10": "3004", "GEOID10": "060014203003004", "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.309761, 37.897885 ], [ -122.309418, 37.897343 ], [ -122.308388, 37.894634 ], [ -122.308388, 37.890841 ], [ -122.309418, 37.894634 ], [ -122.311478, 37.897885 ], [ -122.309761, 37.897885 ] ] ] } }
,
@ -736,7 +736,7 @@
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420400", "BLOCKCE10": "1009", "GEOID10": "060014204001009", "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.309074, 37.887589 ], [ -122.308731, 37.887318 ], [ -122.309074, 37.885151 ], [ -122.309074, 37.887589 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420400", "BLOCKCE10": "1010", "GEOID10": "060014204001010", "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.309418, 37.887318 ], [ -122.309418, 37.886506 ], [ -122.309074, 37.885151 ], [ -122.309761, 37.886506 ], [ -122.309418, 37.887318 ] ] ] } }
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420400", "BLOCKCE10": "1010", "GEOID10": "060014204001010", "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.309074, 37.885151 ], [ -122.309761, 37.886506 ], [ -122.309418, 37.887318 ], [ -122.309418, 37.886506 ], [ -122.309074, 37.885151 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420400", "BLOCKCE10": "1006", "GEOID10": "060014204001006", "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.307358, 37.887318 ], [ -122.308044, 37.882170 ], [ -122.308388, 37.882441 ], [ -122.308731, 37.883525 ], [ -122.309074, 37.885151 ], [ -122.308731, 37.887318 ], [ -122.307358, 37.887318 ] ] ] } }
,
@ -2112,7 +2112,7 @@
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "3004", "GEOID10": "060014206003004", "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.291908, 37.890638 ], [ -122.292938, 37.890570 ], [ -122.292767, 37.890638 ], [ -122.291908, 37.890638 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420500", "BLOCKCE10": "1006", "GEOID10": "060014205001006", "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.890570 ], [ -122.293625, 37.890434 ], [ -122.292767, 37.887793 ], [ -122.292767, 37.887657 ], [ -122.293625, 37.887657 ], [ -122.294569, 37.890502 ], [ -122.293711, 37.890570 ] ] ] } }
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420500", "BLOCKCE10": "1006", "GEOID10": "060014205001006", "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.293625, 37.887657 ], [ -122.294569, 37.890502 ], [ -122.293711, 37.890570 ], [ -122.293625, 37.890434 ], [ -122.292767, 37.887793 ], [ -122.292767, 37.887657 ], [ -122.293625, 37.887657 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420500", "BLOCKCE10": "1009", "GEOID10": "060014205001009", "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.293625, 37.890367 ], [ -122.293196, 37.889825 ], [ -122.292509, 37.887725 ], [ -122.292767, 37.887657 ], [ -122.292767, 37.887793 ], [ -122.293625, 37.890367 ] ] ] } }
,
@ -2172,7 +2172,7 @@
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "2016", "GEOID10": "060014206002016", "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.885896 ], [ -122.289677, 37.884880 ], [ -122.289762, 37.884948 ], [ -122.289333, 37.885896 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "1023", "GEOID10": "060014206001023", "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.289762, 37.884948 ], [ -122.288818, 37.884744 ], [ -122.289333, 37.883322 ], [ -122.290106, 37.883186 ], [ -122.290277, 37.883186 ], [ -122.289762, 37.884948 ] ] ] } }
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "1023", "GEOID10": "060014206001023", "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.290277, 37.883186 ], [ -122.289762, 37.884948 ], [ -122.288818, 37.884744 ], [ -122.289333, 37.883322 ], [ -122.290106, 37.883186 ], [ -122.290277, 37.883186 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420500", "BLOCKCE10": "2010", "GEOID10": "060014205002010", "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.296028, 37.883999 ], [ -122.295771, 37.883051 ], [ -122.296028, 37.883051 ], [ -122.296801, 37.883525 ], [ -122.296886, 37.883864 ], [ -122.296028, 37.883999 ] ] ] } }
,
@ -2228,7 +2228,7 @@
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "1014", "GEOID10": "060014206001014", "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.889147 ], [ -122.282810, 37.889080 ], [ -122.282724, 37.888606 ], [ -122.283325, 37.886912 ], [ -122.284355, 37.887183 ], [ -122.283669, 37.889147 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "2012", "GEOID10": "060014206002012", "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.288218, 37.888606 ], [ -122.289333, 37.886031 ], [ -122.288303, 37.888606 ], [ -122.288218, 37.888606 ] ] ] } }
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "2012", "GEOID10": "060014206002012", "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.289333, 37.886031 ], [ -122.288303, 37.888606 ], [ -122.288218, 37.888606 ], [ -122.289333, 37.886031 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "2011", "GEOID10": "060014206002011", "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.287102, 37.889012 ], [ -122.287273, 37.888267 ], [ -122.287703, 37.887657 ], [ -122.288818, 37.884744 ], [ -122.289677, 37.884880 ], [ -122.289333, 37.885896 ], [ -122.288218, 37.888606 ], [ -122.287102, 37.889012 ] ] ] } }
,
@ -2278,7 +2278,7 @@
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "1030", "GEOID10": "060014206001030", "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.287016, 37.882915 ], [ -122.287188, 37.882577 ], [ -122.287188, 37.882712 ], [ -122.287102, 37.882915 ], [ -122.287016, 37.882915 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "1024", "GEOID10": "060014206001024", "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.285728, 37.883660 ], [ -122.285728, 37.883593 ], [ -122.287016, 37.882915 ], [ -122.285728, 37.883660 ] ] ] } }
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "1024", "GEOID10": "060014206001024", "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.287016, 37.882915 ], [ -122.285728, 37.883660 ], [ -122.285728, 37.883593 ], [ -122.287016, 37.882915 ] ] ] } }
,
{ "type": "Feature", "id": 12345, "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "1031", "GEOID10": "060014206001031", "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.883593 ], [ -122.286072, 37.882509 ], [ -122.287188, 37.882577 ], [ -122.287016, 37.882915 ], [ -122.285728, 37.883593 ] ] ] } }
] }
@ -3284,7 +3284,7 @@
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420600", "BLOCKCE10": "2016", "GEOID10": "060014206002016", "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", "GEOID10": "060014206001023", "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": "420600", "BLOCKCE10": "1023", "GEOID10": "060014206001023", "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.290256, 37.883186 ], [ -122.290170, 37.883576 ], [ -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 ] ] ] } }
,
{ "type": "Feature", "properties": { "STATEFP10": "06", "COUNTYFP10": "001", "TRACTCE10": "420500", "BLOCKCE10": "2010", "GEOID10": "060014205002010", "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 ] ] ] } }
,

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

7
tests/wraparound/in.json Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -24,13 +24,13 @@
,
{ "type": "FeatureCollection", "properties": { "zoom": 9, "x": 423, "y": 303 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "data", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "id": 10959577660569731, "properties": { "country": "au", "text": "Wyalkatchem" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 117.492085, -31.341909 ], [ 117.491226, -31.344841 ], [ 117.486591, -31.353637 ], [ 117.485905, -31.354370 ], [ 117.485561, -31.357448 ], [ 117.485733, -31.438916 ], [ 117.484703, -31.448728 ], [ 117.481956, -31.458100 ], [ 117.477322, -31.466739 ], [ 117.470970, -31.474353 ], [ 117.463417, -31.480648 ], [ 117.454834, -31.485186 ], [ 117.445393, -31.488114 ], [ 117.435608, -31.488992 ], [ 117.411232, -31.488992 ], [ 117.408142, -31.489139 ], [ 117.408142, -31.439062 ], [ 117.421875, -31.438916 ], [ 117.435780, -31.438916 ], [ 117.435780, -31.353637 ], [ 117.436123, -31.351145 ], [ 117.436123, -31.341909 ], [ 117.492085, -31.341909 ] ] ] } }
{ "type": "Feature", "id": 10959577660569731, "properties": { "country": "au", "text": "Wyalkatchem" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 117.408142, -31.439062 ], [ 117.421875, -31.438916 ], [ 117.435780, -31.438916 ], [ 117.435780, -31.353637 ], [ 117.436123, -31.351145 ], [ 117.436123, -31.341909 ], [ 117.492085, -31.341909 ], [ 117.491226, -31.344841 ], [ 117.486591, -31.353637 ], [ 117.485905, -31.354370 ], [ 117.485561, -31.357448 ], [ 117.485733, -31.438916 ], [ 117.484703, -31.448728 ], [ 117.481956, -31.458100 ], [ 117.477322, -31.466739 ], [ 117.470970, -31.474353 ], [ 117.463417, -31.480648 ], [ 117.454834, -31.485186 ], [ 117.445393, -31.488114 ], [ 117.435608, -31.488992 ], [ 117.411232, -31.488992 ], [ 117.408142, -31.489139 ], [ 117.408142, -31.439062 ] ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 9, "x": 423, "y": 302 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "data", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "id": 10959577660569731, "properties": { "country": "au", "text": "Wyalkatchem" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 117.445564, -31.052640 ], [ 117.455349, -31.053669 ], [ 117.464619, -31.056463 ], [ 117.473373, -31.061022 ], [ 117.480927, -31.067345 ], [ 117.487106, -31.074844 ], [ 117.491741, -31.083518 ], [ 117.494659, -31.092926 ], [ 117.495518, -31.102628 ], [ 117.495689, -31.169482 ], [ 117.494659, -31.179763 ], [ 117.493458, -31.183434 ], [ 117.494659, -31.185637 ], [ 117.497406, -31.194889 ], [ 117.498264, -31.204433 ], [ 117.498436, -31.265786 ], [ 117.497578, -31.272976 ], [ 117.497578, -31.299675 ], [ 117.496204, -31.311262 ], [ 117.495003, -31.314488 ], [ 117.495003, -31.325780 ], [ 117.494144, -31.335458 ], [ 117.491226, -31.344841 ], [ 117.486591, -31.353637 ], [ 117.485905, -31.354370 ], [ 117.485561, -31.357448 ], [ 117.485561, -31.365364 ], [ 117.435608, -31.365364 ], [ 117.435780, -31.353637 ], [ 117.436123, -31.351145 ], [ 117.436123, -31.325633 ], [ 117.445049, -31.325780 ], [ 117.445049, -31.304662 ], [ 117.447624, -31.299675 ], [ 117.447624, -31.266520 ], [ 117.448311, -31.265786 ], [ 117.448311, -31.204433 ], [ 117.446766, -31.205167 ], [ 117.444191, -31.208103 ], [ 117.441788, -31.209131 ], [ 117.426510, -31.209425 ], [ 117.426510, -31.200175 ], [ 117.428570, -31.200175 ], [ 117.428570, -31.195329 ], [ 117.441273, -31.195329 ], [ 117.441273, -31.190924 ], [ 117.443333, -31.190924 ], [ 117.443333, -31.183728 ], [ 117.435265, -31.183728 ], [ 117.435265, -31.170216 ], [ 117.441444, -31.170069 ], [ 117.445736, -31.169629 ], [ 117.445564, -31.102628 ], [ 117.408142, -31.102628 ], [ 117.408142, -31.052640 ], [ 117.445564, -31.052640 ] ] ] } }
{ "type": "Feature", "id": 10959577660569731, "properties": { "country": "au", "text": "Wyalkatchem" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 117.408142, -31.102628 ], [ 117.408142, -31.052640 ], [ 117.445564, -31.052640 ], [ 117.455349, -31.053669 ], [ 117.464619, -31.056463 ], [ 117.473373, -31.061022 ], [ 117.480927, -31.067345 ], [ 117.487106, -31.074844 ], [ 117.491741, -31.083518 ], [ 117.494659, -31.092926 ], [ 117.495518, -31.102628 ], [ 117.495689, -31.169482 ], [ 117.494659, -31.179763 ], [ 117.493458, -31.183434 ], [ 117.494659, -31.185637 ], [ 117.497406, -31.194889 ], [ 117.498264, -31.204433 ], [ 117.498436, -31.265786 ], [ 117.497578, -31.272976 ], [ 117.497578, -31.299675 ], [ 117.496204, -31.311262 ], [ 117.495003, -31.314488 ], [ 117.495003, -31.325780 ], [ 117.494144, -31.335458 ], [ 117.491226, -31.344841 ], [ 117.486591, -31.353637 ], [ 117.485905, -31.354370 ], [ 117.485561, -31.357448 ], [ 117.485561, -31.365364 ], [ 117.435608, -31.365364 ], [ 117.435780, -31.353637 ], [ 117.436123, -31.351145 ], [ 117.436123, -31.325633 ], [ 117.445049, -31.325780 ], [ 117.445049, -31.304662 ], [ 117.447624, -31.299675 ], [ 117.447624, -31.266520 ], [ 117.448311, -31.265786 ], [ 117.448311, -31.204433 ], [ 117.446766, -31.205167 ], [ 117.444191, -31.208103 ], [ 117.441788, -31.209131 ], [ 117.426510, -31.209425 ], [ 117.426510, -31.200175 ], [ 117.428570, -31.200175 ], [ 117.428570, -31.195329 ], [ 117.441273, -31.195329 ], [ 117.441273, -31.190924 ], [ 117.443333, -31.190924 ], [ 117.443333, -31.183728 ], [ 117.435265, -31.183728 ], [ 117.435265, -31.170216 ], [ 117.441444, -31.170069 ], [ 117.445736, -31.169629 ], [ 117.445564, -31.102628 ], [ 117.408142, -31.102628 ] ] ] } }
] }
] }
,
@ -54,13 +54,13 @@
,
{ "type": "FeatureCollection", "properties": { "zoom": 10, "x": 846, "y": 606 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "data", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "id": 10959577660569731, "properties": { "country": "au", "text": "Wyalkatchem" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 117.489767, -31.347773 ], [ 117.486591, -31.353637 ], [ 117.485905, -31.354443 ], [ 117.485647, -31.357448 ], [ 117.485733, -31.438989 ], [ 117.484789, -31.448802 ], [ 117.481956, -31.458174 ], [ 117.477322, -31.466813 ], [ 117.471056, -31.474426 ], [ 117.463503, -31.480648 ], [ 117.454834, -31.485259 ], [ 117.445393, -31.488114 ], [ 117.435608, -31.488992 ], [ 117.415009, -31.488992 ], [ 117.415009, -31.438989 ], [ 117.435780, -31.438989 ], [ 117.435780, -31.407934 ], [ 117.435608, -31.407934 ], [ 117.435694, -31.354223 ], [ 117.435780, -31.353637 ], [ 117.436209, -31.351218 ], [ 117.436209, -31.347773 ], [ 117.489767, -31.347773 ] ] ] } }
{ "type": "Feature", "id": 10959577660569731, "properties": { "country": "au", "text": "Wyalkatchem" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 117.415009, -31.438989 ], [ 117.435780, -31.438989 ], [ 117.435780, -31.407934 ], [ 117.435608, -31.407934 ], [ 117.435694, -31.354223 ], [ 117.435780, -31.353637 ], [ 117.436209, -31.351218 ], [ 117.436209, -31.347773 ], [ 117.489767, -31.347773 ], [ 117.486591, -31.353637 ], [ 117.485905, -31.354443 ], [ 117.485647, -31.357448 ], [ 117.485733, -31.438989 ], [ 117.484789, -31.448802 ], [ 117.481956, -31.458174 ], [ 117.477322, -31.466813 ], [ 117.471056, -31.474426 ], [ 117.463503, -31.480648 ], [ 117.454834, -31.485259 ], [ 117.445393, -31.488114 ], [ 117.435608, -31.488992 ], [ 117.415009, -31.488992 ], [ 117.415009, -31.438989 ] ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 10, "x": 846, "y": 605 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "data", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "id": 10959577660569731, "properties": { "country": "au", "text": "Wyalkatchem" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 117.445650, -31.052713 ], [ 117.447710, -31.052934 ], [ 117.455349, -31.053669 ], [ 117.464705, -31.056463 ], [ 117.473373, -31.061096 ], [ 117.480927, -31.067345 ], [ 117.487192, -31.074917 ], [ 117.491827, -31.083518 ], [ 117.494659, -31.092926 ], [ 117.495604, -31.102628 ], [ 117.495775, -31.169555 ], [ 117.494659, -31.179836 ], [ 117.493544, -31.183434 ], [ 117.494659, -31.185711 ], [ 117.497406, -31.194889 ], [ 117.498350, -31.204433 ], [ 117.498436, -31.265786 ], [ 117.497663, -31.273049 ], [ 117.497663, -31.299748 ], [ 117.496290, -31.311335 ], [ 117.495089, -31.314488 ], [ 117.495089, -31.325780 ], [ 117.494144, -31.335531 ], [ 117.491312, -31.344914 ], [ 117.486591, -31.353637 ], [ 117.485905, -31.354443 ], [ 117.485647, -31.357448 ], [ 117.485647, -31.359501 ], [ 117.435608, -31.359501 ], [ 117.435694, -31.354223 ], [ 117.435780, -31.353637 ], [ 117.436209, -31.351218 ], [ 117.436123, -31.325707 ], [ 117.445135, -31.325780 ], [ 117.445135, -31.304662 ], [ 117.447710, -31.299675 ], [ 117.447710, -31.266520 ], [ 117.448397, -31.265786 ], [ 117.448397, -31.204506 ], [ 117.447624, -31.204800 ], [ 117.446766, -31.205240 ], [ 117.446079, -31.205901 ], [ 117.445049, -31.207296 ], [ 117.444191, -31.208103 ], [ 117.443075, -31.208764 ], [ 117.441874, -31.209204 ], [ 117.440672, -31.209278 ], [ 117.426510, -31.209498 ], [ 117.426510, -31.200248 ], [ 117.428656, -31.200248 ], [ 117.428656, -31.195403 ], [ 117.441273, -31.195403 ], [ 117.441273, -31.190997 ], [ 117.443419, -31.190997 ], [ 117.443419, -31.183728 ], [ 117.435350, -31.183728 ], [ 117.435350, -31.170290 ], [ 117.441444, -31.170143 ], [ 117.445736, -31.169629 ], [ 117.445650, -31.102701 ], [ 117.415009, -31.102701 ], [ 117.415009, -31.052713 ], [ 117.445650, -31.052713 ] ] ] } }
{ "type": "Feature", "id": 10959577660569731, "properties": { "country": "au", "text": "Wyalkatchem" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 117.415009, -31.102701 ], [ 117.415009, -31.052713 ], [ 117.445650, -31.052713 ], [ 117.447710, -31.052934 ], [ 117.455349, -31.053669 ], [ 117.464705, -31.056463 ], [ 117.473373, -31.061096 ], [ 117.480927, -31.067345 ], [ 117.487192, -31.074917 ], [ 117.491827, -31.083518 ], [ 117.494659, -31.092926 ], [ 117.495604, -31.102628 ], [ 117.495775, -31.169555 ], [ 117.494659, -31.179836 ], [ 117.493544, -31.183434 ], [ 117.494659, -31.185711 ], [ 117.497406, -31.194889 ], [ 117.498350, -31.204433 ], [ 117.498436, -31.265786 ], [ 117.497663, -31.273049 ], [ 117.497663, -31.299748 ], [ 117.496290, -31.311335 ], [ 117.495089, -31.314488 ], [ 117.495089, -31.325780 ], [ 117.494144, -31.335531 ], [ 117.491312, -31.344914 ], [ 117.486591, -31.353637 ], [ 117.485905, -31.354443 ], [ 117.485647, -31.357448 ], [ 117.485647, -31.359501 ], [ 117.435608, -31.359501 ], [ 117.435694, -31.354223 ], [ 117.435780, -31.353637 ], [ 117.436209, -31.351218 ], [ 117.436123, -31.325707 ], [ 117.445135, -31.325780 ], [ 117.445135, -31.304662 ], [ 117.447710, -31.299675 ], [ 117.447710, -31.266520 ], [ 117.448397, -31.265786 ], [ 117.448397, -31.204506 ], [ 117.447624, -31.204800 ], [ 117.446766, -31.205240 ], [ 117.446079, -31.205901 ], [ 117.445049, -31.207296 ], [ 117.444191, -31.208103 ], [ 117.443075, -31.208764 ], [ 117.441874, -31.209204 ], [ 117.440672, -31.209278 ], [ 117.426510, -31.209498 ], [ 117.426510, -31.200248 ], [ 117.428656, -31.200248 ], [ 117.428656, -31.195403 ], [ 117.441273, -31.195403 ], [ 117.441273, -31.190997 ], [ 117.443419, -31.190997 ], [ 117.443419, -31.183728 ], [ 117.435350, -31.183728 ], [ 117.435350, -31.170290 ], [ 117.441444, -31.170143 ], [ 117.445736, -31.169629 ], [ 117.445650, -31.102701 ], [ 117.415009, -31.102701 ] ] ] } }
] }
] }
,
@ -126,7 +126,7 @@
,
{ "type": "FeatureCollection", "properties": { "zoom": 11, "x": 1692, "y": 1210 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "data", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "id": 10959577660569731, "properties": { "country": "au", "text": "Wyalkatchem" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 117.445650, -31.052713 ], [ 117.447710, -31.052934 ], [ 117.455392, -31.053669 ], [ 117.464747, -31.056500 ], [ 117.473416, -31.061132 ], [ 117.480969, -31.067345 ], [ 117.487192, -31.074917 ], [ 117.491827, -31.083554 ], [ 117.494702, -31.092926 ], [ 117.495646, -31.102664 ], [ 117.495775, -31.169592 ], [ 117.494702, -31.179873 ], [ 117.493544, -31.183471 ], [ 117.494702, -31.185711 ], [ 117.497449, -31.194925 ], [ 117.498264, -31.203405 ], [ 117.498393, -31.204469 ], [ 117.498393, -31.206341 ], [ 117.448397, -31.206341 ], [ 117.448397, -31.204506 ], [ 117.447624, -31.204800 ], [ 117.446809, -31.205277 ], [ 117.446079, -31.205938 ], [ 117.445736, -31.206341 ], [ 117.426510, -31.206341 ], [ 117.426510, -31.203405 ], [ 117.426553, -31.200248 ], [ 117.428656, -31.200248 ], [ 117.428656, -31.195403 ], [ 117.441316, -31.195403 ], [ 117.441316, -31.190997 ], [ 117.443419, -31.190997 ], [ 117.443419, -31.183728 ], [ 117.435393, -31.183728 ], [ 117.435393, -31.170326 ], [ 117.441444, -31.170143 ], [ 117.445736, -31.169629 ], [ 117.445650, -31.102738 ], [ 117.418442, -31.102738 ], [ 117.418442, -31.052713 ], [ 117.445650, -31.052713 ] ] ] } }
{ "type": "Feature", "id": 10959577660569731, "properties": { "country": "au", "text": "Wyalkatchem" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 117.418442, -31.102738 ], [ 117.418442, -31.052713 ], [ 117.445650, -31.052713 ], [ 117.447710, -31.052934 ], [ 117.455392, -31.053669 ], [ 117.464747, -31.056500 ], [ 117.473416, -31.061132 ], [ 117.480969, -31.067345 ], [ 117.487192, -31.074917 ], [ 117.491827, -31.083554 ], [ 117.494702, -31.092926 ], [ 117.495646, -31.102664 ], [ 117.495775, -31.169592 ], [ 117.494702, -31.179873 ], [ 117.493544, -31.183471 ], [ 117.494702, -31.185711 ], [ 117.497449, -31.194925 ], [ 117.498264, -31.203405 ], [ 117.498393, -31.204469 ], [ 117.498393, -31.206341 ], [ 117.448397, -31.206341 ], [ 117.448397, -31.204506 ], [ 117.447624, -31.204800 ], [ 117.446809, -31.205277 ], [ 117.446079, -31.205938 ], [ 117.445736, -31.206341 ], [ 117.426510, -31.206341 ], [ 117.426510, -31.203405 ], [ 117.426553, -31.200248 ], [ 117.428656, -31.200248 ], [ 117.428656, -31.195403 ], [ 117.441316, -31.195403 ], [ 117.441316, -31.190997 ], [ 117.443419, -31.190997 ], [ 117.443419, -31.183728 ], [ 117.435393, -31.183728 ], [ 117.435393, -31.170326 ], [ 117.441444, -31.170143 ], [ 117.445736, -31.169629 ], [ 117.445650, -31.102738 ], [ 117.418442, -31.102738 ] ] ] } }
] }
] }
,
@ -174,7 +174,7 @@
,
{ "type": "FeatureCollection", "properties": { "zoom": 12, "x": 3382, "y": 2424 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "data", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "id": 10959577660569731, "properties": { "country": "au", "text": "Wyalkatchem" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 117.280190, -31.352171 ], [ 117.280190, -31.353270 ], [ 117.274911, -31.353270 ], [ 117.274890, -31.353637 ], [ 117.274890, -31.369669 ], [ 117.278044, -31.369669 ], [ 117.273452, -31.373352 ], [ 117.273452, -31.391652 ], [ 117.270298, -31.391652 ], [ 117.270298, -31.402532 ], [ 117.279932, -31.402532 ], [ 117.280319, -31.402696 ], [ 117.280319, -31.403722 ], [ 117.290339, -31.403722 ], [ 117.290339, -31.394656 ], [ 117.298794, -31.394656 ], [ 117.298794, -31.396433 ], [ 117.309372, -31.396414 ], [ 117.309372, -31.396597 ], [ 117.318707, -31.396597 ], [ 117.322011, -31.397989 ], [ 117.322633, -31.398301 ], [ 117.323170, -31.398685 ], [ 117.323663, -31.399125 ], [ 117.324049, -31.399620 ], [ 117.324350, -31.400151 ], [ 117.325058, -31.401653 ], [ 117.325423, -31.402147 ], [ 117.331688, -31.402147 ], [ 117.331710, -31.411212 ], [ 117.335701, -31.411212 ], [ 117.335701, -31.423152 ], [ 117.335143, -31.423152 ], [ 117.335143, -31.430128 ], [ 117.244377, -31.430128 ], [ 117.244377, -31.352171 ], [ 117.280190, -31.352171 ] ] ] } }
{ "type": "Feature", "id": 10959577660569731, "properties": { "country": "au", "text": "Wyalkatchem" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 117.335701, -31.411212 ], [ 117.335701, -31.423152 ], [ 117.335143, -31.423152 ], [ 117.335143, -31.430128 ], [ 117.244377, -31.430128 ], [ 117.244377, -31.352171 ], [ 117.280190, -31.352171 ], [ 117.280190, -31.353270 ], [ 117.274911, -31.353270 ], [ 117.274890, -31.353637 ], [ 117.274890, -31.369669 ], [ 117.278044, -31.369669 ], [ 117.273452, -31.373352 ], [ 117.273452, -31.391652 ], [ 117.270298, -31.391652 ], [ 117.270298, -31.402532 ], [ 117.279932, -31.402532 ], [ 117.280319, -31.402696 ], [ 117.280319, -31.403722 ], [ 117.290339, -31.403722 ], [ 117.290339, -31.394656 ], [ 117.298794, -31.394656 ], [ 117.298794, -31.396433 ], [ 117.309372, -31.396414 ], [ 117.309372, -31.396597 ], [ 117.318707, -31.396597 ], [ 117.322011, -31.397989 ], [ 117.322633, -31.398301 ], [ 117.323170, -31.398685 ], [ 117.323663, -31.399125 ], [ 117.324049, -31.399620 ], [ 117.324350, -31.400151 ], [ 117.325058, -31.401653 ], [ 117.325423, -31.402147 ], [ 117.331688, -31.402147 ], [ 117.331710, -31.411212 ], [ 117.335701, -31.411212 ] ] ] } }
] }
] }
,
@ -222,7 +222,7 @@
,
{ "type": "FeatureCollection", "properties": { "zoom": 12, "x": 3383, "y": 2420 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "data", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "id": 10959577660569731, "properties": { "country": "au", "text": "Wyalkatchem" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 117.423592, -31.052732 ], [ 117.423592, -31.102738 ], [ 117.421875, -31.102738 ], [ 117.378745, -31.102775 ], [ 117.376707, -31.103859 ], [ 117.362309, -31.103859 ], [ 117.359884, -31.102958 ], [ 117.346945, -31.102958 ], [ 117.346537, -31.103050 ], [ 117.346430, -31.103656 ], [ 117.346430, -31.112493 ], [ 117.332268, -31.112493 ], [ 117.332268, -31.055360 ], [ 117.335873, -31.054202 ], [ 117.336302, -31.054110 ], [ 117.346945, -31.052952 ], [ 117.359884, -31.052952 ], [ 117.368724, -31.053743 ], [ 117.369132, -31.053853 ], [ 117.369905, -31.053853 ], [ 117.377372, -31.052934 ], [ 117.378724, -31.052769 ], [ 117.423592, -31.052732 ] ] ] } }
{ "type": "Feature", "id": 10959577660569731, "properties": { "country": "au", "text": "Wyalkatchem" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 117.423592, -31.102738 ], [ 117.421875, -31.102738 ], [ 117.378745, -31.102775 ], [ 117.376707, -31.103859 ], [ 117.362309, -31.103859 ], [ 117.359884, -31.102958 ], [ 117.346945, -31.102958 ], [ 117.346537, -31.103050 ], [ 117.346430, -31.103656 ], [ 117.346430, -31.112493 ], [ 117.332268, -31.112493 ], [ 117.332268, -31.055360 ], [ 117.335873, -31.054202 ], [ 117.336302, -31.054110 ], [ 117.346945, -31.052952 ], [ 117.359884, -31.052952 ], [ 117.368724, -31.053743 ], [ 117.369132, -31.053853 ], [ 117.369905, -31.053853 ], [ 117.377372, -31.052934 ], [ 117.378724, -31.052769 ], [ 117.423592, -31.052732 ], [ 117.423592, -31.102738 ] ] ] } }
] }
] }
,
@ -264,7 +264,7 @@
,
{ "type": "FeatureCollection", "properties": { "zoom": 12, "x": 3384, "y": 2420 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "data", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "id": 10959577660569731, "properties": { "country": "au", "text": "Wyalkatchem" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 117.445650, -31.052732 ], [ 117.447710, -31.052934 ], [ 117.455392, -31.053688 ], [ 117.464769, -31.056519 ], [ 117.473416, -31.061132 ], [ 117.480991, -31.067345 ], [ 117.487214, -31.074917 ], [ 117.491848, -31.083554 ], [ 117.494702, -31.092926 ], [ 117.495668, -31.102664 ], [ 117.495689, -31.128199 ], [ 117.495711, -31.129669 ], [ 117.445693, -31.129669 ], [ 117.445693, -31.128199 ], [ 117.445672, -31.102738 ], [ 117.420158, -31.102738 ], [ 117.420158, -31.052732 ], [ 117.445650, -31.052732 ] ] ] } }
{ "type": "Feature", "id": 10959577660569731, "properties": { "country": "au", "text": "Wyalkatchem" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 117.420158, -31.102738 ], [ 117.420158, -31.052732 ], [ 117.445650, -31.052732 ], [ 117.447710, -31.052934 ], [ 117.455392, -31.053688 ], [ 117.464769, -31.056519 ], [ 117.473416, -31.061132 ], [ 117.480991, -31.067345 ], [ 117.487214, -31.074917 ], [ 117.491848, -31.083554 ], [ 117.494702, -31.092926 ], [ 117.495668, -31.102664 ], [ 117.495689, -31.128199 ], [ 117.495711, -31.129669 ], [ 117.445693, -31.129669 ], [ 117.445693, -31.128199 ], [ 117.445672, -31.102738 ], [ 117.420158, -31.102738 ] ] ] } }
] }
] }
,

View File

@ -449,7 +449,7 @@ void *partial_feature_worker(void *v) {
double area = 0;
if (t == VT_POLYGON) {
area = get_area(geom, 0, geom.size());
area = get_mp_area(geom);
}
if ((t == VT_LINE || t == VT_POLYGON) && !(prevent[P_SIMPLIFY] || (z == maxzoom && prevent[P_SIMPLIFY_LOW]) || (z < maxzoom && additional[A_GRID_LOW_ZOOMS]))) {
@ -488,10 +488,6 @@ void *partial_feature_worker(void *v) {
std::vector<drawvec> geoms;
geoms.push_back(geom);
if (t == VT_POLYGON && !prevent[P_POLYGON_SPLIT]) {
geoms = chop_polygon(geoms);
}
if (t == VT_POLYGON) {
// Scaling may have made the polygon degenerate.
// Give Clipper a chance to try to fix it.
@ -1455,7 +1451,9 @@ long long write_tile(FILE *geoms, long long *geompos_in, char *metabase, char *s
}
if (first_time && pass == 1) { /* only write out the next zoom once, even if we retry */
rewrite(geom, z, nextzoom, maxzoom, bbox, tx, ty, buffer, line_detail, within, geompos, geomfile, fname, t, layer, metastart, feature_minzoom, child_shards, max_zoom_increment, original_seq, tippecanoe_minzoom, tippecanoe_maxzoom, segment, initial_x, initial_y, m, metakeys, metavals, has_id, id, index, extent);
if (tippecanoe_maxzoom == -1 || tippecanoe_maxzoom >= nextzoom) {
rewrite(geom, z, nextzoom, maxzoom, bbox, tx, ty, buffer, line_detail, within, geompos, geomfile, fname, t, layer, metastart, feature_minzoom, child_shards, max_zoom_increment, original_seq, tippecanoe_minzoom, tippecanoe_maxzoom, segment, initial_x, initial_y, m, metakeys, metavals, has_id, id, index, extent);
}
}
if (z < minzoom) {
@ -1619,6 +1617,12 @@ long long write_tile(FILE *geoms, long long *geompos_in, char *metabase, char *s
}
auto l = layers.find(layername);
if (l == layers.end()) {
fprintf(stderr, "Internal error: couldn't find layer %s\n", layername.c_str());
fprintf(stderr, "segment %d\n", partials[i].segment);
fprintf(stderr, "layer %lld\n", partials[i].layer);
exit(EXIT_FAILURE);
}
l->second.push_back(c);
}
}

View File

@ -1,5 +1,5 @@
#define CATCH_CONFIG_MAIN
#include "catch/catch.hpp"
#include <catch.hpp>
#include "text.hpp"
TEST_CASE("UTF-8 enforcement", "[utf8]") {

View File

@ -1 +1 @@
#define VERSION "tippecanoe v1.16.4\n"
#define VERSION "tippecanoe v1.16.13\n"