alternate JAVA_HOME
# jvm options and output control
JAVA_OPTS environment variable, if unset uses "$java_opts"
SBT_OPTS environment variable, if unset uses "$default_sbt_opts"
.sbtopts if this file exists in the current directory, it is
prepended to the runner args
/etc/sbt/sbtopts if this file exists, it is prepended to the runner args
-Dkey=val pass -Dkey=val directly to the java runtime
-J-X pass option -X directly to the java runtime
(-J is stripped)
-S-X add -X to sbt's scalacOptions (-J is stripped)
-PmavenProfiles Enable a maven profile for the build.
In the case of duplicated or conflicting options, the order above
shows precedence: JAVA_OPTS lowest, command line options highest.
EOM
}
process_my_args () {
while [[ $# -gt 0 ]]; do
case "$1" in
-no-colors) addJava "-Dsbt.log.noformat=true" && shift ;;
-no-share) addJava "$noshare_opts" && shift ;;
-no-global) addJava "-Dsbt.global.base=$(pwd)/project/.sbtboot" && shift ;;
-sbt-boot) require_arg path "$1" "$2" && addJava "-Dsbt.boot.directory=$2" && shift 2 ;;
-sbt-dir) require_arg path "$1" "$2" && addJava "-Dsbt.global.base=$2" && shift 2 ;;
-debug-inc) addJava "-Dxsbt.inc.debug=true" && shift ;;
-batch) exec &2 "$@"
}
vlog () {
[[ $verbose || $debug ]] && echoerr "$@"
}
dlog () {
[[ $debug ]] && echoerr "$@"
}
acquire_sbt_jar () {
SBT_VERSION=`awk -F "=" '/sbt\\.version/ {print $2}' ./project/build.properties`
URL1=https://dl.bintray.com/typesafe/ivy-releases/org.scala-sbt/sbt-launch/${SBT_VERSION}/sbt-launch.jar
URL2=https://dl.bintray.com/typesafe/ivy-releases/org.scala-sbt/sbt-launch/${SBT_VERSION}/sbt-launch.jar
JAR=sbt/sbt-launch-${SBT_VERSION}.jar
sbt_jar=$JAR
if [[ ! -f "$sbt_jar" ]]; then
# Download sbt launch jar if it hasn't been downloaded yet
if [ ! -f "${JAR}" ]; then
# Download
printf "Attempting to fetch sbt\n"
JAR_DL="${JAR}.part"
if hash curl 2>/dev/null; then
(curl -L --silent ${URL1} > "${JAR_DL}" || curl -L --silent ${URL2} > "${JAR_DL}") && mv "${JAR_DL}" "${JAR}"
elif hash wget 2>/dev/null; then
(wget --quiet ${URL1} -O "${JAR_DL}" || wget --quiet ${URL2} -O "${JAR_DL}") && mv "${JAR_DL}" "${JAR}"
else
printf "You do not have curl or wget installed, please install sbt manually from http://www.scala-sbt.org/\n"
exit -1
fi
fi
if [ ! -f "${JAR}" ]; then
# We failed to download
printf "Our attempt to download sbt locally to ${JAR} failed. Please install sbt manually from http://www.scala-sbt.org/\n"
exit -1
fi
printf "Launching sbt from ${JAR}\n"
fi
}
execRunner () {
# print the arguments one to a line, quoting any containing spaces
[[ $verbose || $debug ]] && echo "# Executing command line:" && {
for arg; do
if printf "%s\n" "$arg" | grep -q ' '; then
printf "\"%s\"\n" "$arg"
else
printf "%s\n" "$arg"
fi
done
echo ""
}
exec "$@"
}
addJava () {
dlog "[addJava] arg = '$1'"
java_args=( "${java_args[@]}" "$1" )
}
enableProfile () {
dlog "[enableProfile] arg = '$1'"
maven_profiles=( "${maven_profiles[@]}" "$1" )
export SBT_MAVEN_PROFILES="${maven_profiles[@]}"
}
addSbt () {
dlog "[addSbt] arg = '$1'"
sbt_commands=( "${sbt_commands[@]}" "$1" )
}
addResidual () {
dlog "[residual] arg = '$1'"
residual_args=( "${residual_args[@]}" "$1" )
}
addDebugger () {
addJava "-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=$1"
}
# a ham-fisted attempt to move some memory settings in concert
# so they need not be dicked around with individually.
get_mem_opts () {
local mem=${1:-2048}
local perm=$(( $mem / 4 ))
(( $perm > 256 )) || perm=256
(( $perm < 4096 )) || perm=4096
local codecache=$(( $perm / 2 ))
echo "-Xms${mem}m -Xmx${mem}m -XX:MaxPermSize=${perm}m -XX:ReservedCodeCacheSize=${codecache}m"
}
require_arg () {
local type="$1"
local opt="$2"
local arg="$3"
if [[ -z "$arg" ]] || [[ "${arg:0:1}" == "-" ]]; then
die "$opt requires <$type> argument"
fi
}
is_function_defined() {
declare -f "$1" > /dev/null
}
process_args () {
while [[ $# -gt 0 ]]; do
case "$1" in
-h|-help) usage; exit 1 ;;
-v|-verbose) verbose=1 && shift ;;
-d|-debug) debug=1 && shift ;;
-ivy) require_arg path "$1" "$2" && addJava "-Dsbt.ivy.home=$2" && shift 2 ;;
-mem) require_arg integer "$1" "$2" && sbt_mem="$2" && shift 2 ;;
-jvm-debug) require_arg port "$1" "$2" && addDebugger $2 && shift 2 ;;
-batch) exec = xmax || otherymin >= ymax || otherymax <= ymin || otherxmax <= xmin)
}
def contains(other: BoundingBox): Boolean = {
val BoundingBox(otherxmin, otherymin, otherxmax, otherymax) = other
(xmin <= otherxmin && ymin <= otherymin && xmax >= otherxmax && ymax >= otherymax)
}
/**
* Checks if this bounding box is contained within the given circle.
*
* @param origin
* @param radius
* @return
*/
def withinCircle(origin: Point, radius: Double): Boolean = {
val vertices = Array(
Point(xmin, ymin),
Point(xmax, ymin),
Point(xmax, ymax),
Point(xmin, ymax)
)
!(vertices exists (vertex => !(vertex withinCircle(origin, radius))))
}
private [magellan] def disjoint(other: BoundingBox): Boolean = {
val BoundingBox(otherxmin, otherymin, otherxmax, otherymax) = other
(otherxmin > xmax || otherxmax < xmin || otherymin > ymax || otherymax < ymin)
}
def contains(point: Point): Boolean = {
val (x, y) = (point.getX(), point.getY())
(xmin <= x && ymin <= y && xmax >= x && ymax >= y)
}
private [magellan] def intersects(point: Point): Boolean = {
val lines = Array(
Line(Point(xmin, ymin), Point(xmax, ymin)),
Line(Point(xmin, ymin), Point(xmin, ymax)),
Line(Point(xmax, ymin), Point(xmax, ymax)),
Line(Point(xmin, ymax), Point(xmax, ymax)))
lines exists (_ contains point)
}
private [magellan] def disjoint(shape: Shape): Boolean = {
relate(shape) == Disjoint
}
private [magellan] def relate(shape: Shape): Relate = {
val vertices = Array(Point(xmin, ymin),
Point(xmax, ymin),
Point(xmax, ymax),
Point(xmin, ymax)
)
// include both edges and diagonals
// diagonals catch corner cases of bounding box in annulus
val lines = Array(
Line(Point(xmin, ymin), Point(xmax, ymin)),
Line(Point(xmin, ymin), Point(xmin, ymax)),
Line(Point(xmax, ymin), Point(xmax, ymax)),
Line(Point(xmin, ymax), Point(xmax, ymax)),
Line(Point(xmin, ymin), Point(xmax, ymax)),
Line(Point(xmin, ymax), Point(xmax, ymin))
)
// look for strict intersections between the edges of the bounding box and the shape
val lineIntersections = lines count (shape intersects (_, true))
val vertexContained = vertices count (shape contains _)
if (contains(shape.boundingBox)) {
Contains
} else if (lineIntersections == 0 && vertexContained == 4) {
Within
} else if (lineIntersections > 0 || vertexContained > 0) {
Intersects
} else {
Disjoint
}
}
}
================================================
FILE: src/main/scala/magellan/DefaultSource.scala
================================================
/**
* Copyright 2015 Ram Sriharsha
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package magellan
import org.apache.spark.sql.types.StructType
import org.apache.spark.sql.SQLContext
import org.apache.spark.sql.sources.{BaseRelation, SchemaRelationProvider, RelationProvider}
/**
* Provides access to Shapefile Formatted data from pure SQL statements.
*/
class DefaultSource extends RelationProvider
with SchemaRelationProvider {
override def createRelation(sqlContext: SQLContext,
parameters: Map[String, String]): BaseRelation = createRelation(sqlContext, parameters, null)
override def createRelation(sqlContext: SQLContext,
parameters: Map[String, String], schema: StructType): BaseRelation = {
val path = parameters.getOrElse("path", sys.error("'path' must be specified for Shapefiles."))
val t = parameters.getOrElse("type", "shapefile")
t match {
case "shapefile" => new ShapeFileRelation(path, parameters)(sqlContext)
case "geojson" => new GeoJSONRelation(path, parameters)(sqlContext)
case "osm" => new OsmFileRelation(path, parameters)(sqlContext)
case _ => ???
}
}
}
================================================
FILE: src/main/scala/magellan/DoubleArrayData.scala
================================================
/**
* Copyright 2015 Ram Sriharsha
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package magellan
import org.apache.spark.sql.catalyst.InternalRow
import org.apache.spark.sql.catalyst.util.{ArrayData, MapData}
import org.apache.spark.sql.types.{DataType, Decimal}
import org.apache.spark.unsafe.types.{CalendarInterval, UTF8String}
class DoubleArrayData(v: Array[Double]) extends ArrayData {
override def numElements(): Int = v.length
override def copy(): ArrayData = {
val a = new Array[Double](v.length)
Array.copy(v, 0, a, 0, v.length)
new DoubleArrayData(a)
}
def setNullAt(i: Int): Unit = ???
def update(i: Int,value: Any): Unit = ???
override val array: Array[Any] = v.map(_.asInstanceOf[Any])
override def getUTF8String(ordinal: Int): UTF8String = ???
override def get(ordinal: Int, dataType: DataType): AnyRef = ???
override def getBinary(ordinal: Int): Array[Byte] = ???
override def getDouble(ordinal: Int): Double = v(ordinal)
override def getArray(ordinal: Int): ArrayData = ???
override def getInterval(ordinal: Int): CalendarInterval = ???
override def getFloat(ordinal: Int): Float = ???
override def getLong(ordinal: Int): Long = ???
override def getMap(ordinal: Int): MapData = ???
override def getByte(ordinal: Int): Byte = ???
override def getDecimal(ordinal: Int, precision: Int, scale: Int): Decimal = ???
override def getBoolean(ordinal: Int): Boolean = ???
override def getShort(ordinal: Int): Short = ???
override def getStruct(ordinal: Int, numFields: Int): InternalRow = ???
override def getInt(ordinal: Int): Int = ???
override def isNullAt(ordinal: Int): Boolean = false
override def toDoubleArray() = v
}
================================================
FILE: src/main/scala/magellan/GeoJSONRelation.scala
================================================
/**
* Copyright 2015 Ram Sriharsha
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package magellan
import magellan.mapreduce.WholeFileInputFormat
import org.apache.hadoop.fs.FileSystem
import org.apache.hadoop.io.{NullWritable, Text}
import org.apache.spark.rdd.RDD
import org.apache.spark.sql.SQLContext
import org.json4s._
import org.json4s.jackson.JsonMethods._
/**
* A GeoJSON relation is the entry point for working with GeoJSON formats.
* GeoJSON is a format for encoding a variety of geographic data structures.
* A GeoJSON object may represent a geometry, a feature, or a collection of features.
* GeoJSON supports the following geometry types: Point, LineString, Polygon,
* MultiPoint, MultiLineString, MultiPolygon, and GeometryCollection.
* Features in GeoJSON contain a geometry object and additional properties,
* and a feature collection represents a list of features.
* A complete GeoJSON data structure is always an object (in JSON terms).
* In GeoJSON, an object consists of a collection of name/value pairs -- also called members.
* For each member, the name is always a string.
* Member values are either a string, number, object, array
* or one of the literals: true, false, and null.
* An array consists of elements where each element is a value as described above.
*/
case class GeoJSONRelation(
path: String,
parameters: Map[String, String])
(@transient val sqlContext: SQLContext)
extends SpatialRelation {
protected override def _buildScan(): RDD[Array[Any]] = {
val conf = sc.hadoopConfiguration
FileSystem.getLocal(conf)
sc.newAPIHadoopFile(
path,
classOf[WholeFileInputFormat],
classOf[NullWritable],
classOf[Text]).flatMap {
case (k, v) =>
val line = v.toString()
parseShapeWithMeta(line)
}.map {
case (shape: Shape, meta: Option[Map[String, String]]) =>
Array(shape, meta)
}
}
private def parseShapeWithMeta(line: String) = {
val tree = parse(line)
implicit val formats = org.json4s.DefaultFormats
val result = tree.extract[GeoJSON]
result.features.flatMap { f =>
f.geometry.shapes.map(shape => (shape, f.properties))
}
}
}
================================================
FILE: src/main/scala/magellan/IntegerArrayData.scala
================================================
/**
* Copyright 2015 Ram Sriharsha
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package magellan
import org.apache.spark.sql.catalyst.InternalRow
import org.apache.spark.sql.catalyst.util.{ArrayData, MapData}
import org.apache.spark.sql.types.{DataType, Decimal}
import org.apache.spark.unsafe.types.{CalendarInterval, UTF8String}
class IntegerArrayData(v: Array[Int]) extends ArrayData {
override def numElements(): Int = v.length
override def copy(): ArrayData = {
val a = new Array[Int](v.length)
Array.copy(v, 0, a, 0, v.length)
new IntegerArrayData(a)
}
def setNullAt(i: Int): Unit = ???
def update(i: Int,value: Any): Unit = ???
override val array: Array[Any] = v.map(_.asInstanceOf[Any])
override def getUTF8String(ordinal: Int): UTF8String = ???
override def get(ordinal: Int, dataType: DataType): AnyRef = ???
override def getBinary(ordinal: Int): Array[Byte] = ???
override def getDouble(ordinal: Int): Double = v(ordinal).toDouble
override def getArray(ordinal: Int): ArrayData = ???
override def getInterval(ordinal: Int): CalendarInterval = ???
override def getFloat(ordinal: Int): Float = ???
override def getLong(ordinal: Int): Long = ???
override def getMap(ordinal: Int): MapData = ???
override def getByte(ordinal: Int): Byte = ???
override def getDecimal(ordinal: Int, precision: Int, scale: Int): Decimal = ???
override def getBoolean(ordinal: Int): Boolean = ???
override def getShort(ordinal: Int): Short = ???
override def getStruct(ordinal: Int, numFields: Int): InternalRow = ???
override def getInt(ordinal: Int): Int = v(ordinal)
override def isNullAt(ordinal: Int): Boolean = false
override def toIntArray() = v
}
================================================
FILE: src/main/scala/magellan/Line.scala
================================================
/**
* Copyright 2015 Ram Sriharsha
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package magellan
import com.fasterxml.jackson.annotation.{JsonIgnore, JsonProperty}
import magellan.Shape.{area, ccw}
import org.apache.spark.sql.types._
/**
* Line segment between two points.
*/
@SQLUserDefinedType(udt = classOf[LineUDT])
class Line extends Shape {
private var start: Point = _
private var end: Point = _
def setStart(start: Point) { this.start = start }
def setEnd(end: Point) { this.end = end }
@JsonProperty
def getStart() = start
@JsonProperty
def getEnd() = end
@inline private [magellan] def contains(point: Point): Boolean = {
area(start, end, point) == 0 && {
val startX = start.getX()
val endX = end.getX()
val pointX = point.getX()
val (lower, upper) = if (startX < endX) (startX, endX) else (endX, startX)
lower <= pointX && pointX <= upper
}
}
@inline private [magellan] def collinear(line: Line): Boolean = {
val (lineStart, lineEnd) = (line.getStart(), line.getEnd())
area(start, end, line.getStart()) == 0 && area(start, end, line.getEnd()) == 0
}
@inline private [magellan] def contains(line: Line): Boolean = {
val c = collinear(line)
if (c) {
// check if both points of the line are within the start and end
val (lineStart, lineEnd) = (line.getStart(), line.getEnd())
val (leftX, rightX) = if (start.getX() < end.getX()) {
(start.getX(), end.getX())
} else {
(end.getX(), start.getX())
}
val (leftY, rightY) = if (start.getY() < end.getY()) {
(start.getY(), end.getY())
} else {
(end.getY(), start.getY())
}
val (lineStartX, lineEndX) = (lineStart.getX(), lineEnd.getX())
val (lineStartY, lineEndY) = (lineStart.getY(), lineEnd.getY())
(lineStartX <= rightX) && (lineStartX >= leftX) &&
(lineStartY <= rightY) && (lineStartY >= leftY) &&
(lineEndX <= rightX) && (lineEndX >= leftX) &&
(lineEndY <= rightY) && (lineEndY >= leftY)
} else {
false
}
}
@inline private [magellan] def touches(other: Line): Boolean = {
// test for degeneracy
if (start == end) {
area(start, other.start, other.end) == 0
} else if (other.start == other.end) {
area(start, end, other.start) == 0
} else if (start == other.start ||
end == other.end ||
start == other.end ||
end == other.start) {
true
} else if (
contains(other.start) ||
contains(other.end) ||
other.contains(this.start) ||
other.contains(this.end)) {
true
} else {
false
}
}
@inline private [magellan] def intersects(other: Line): Boolean = {
// test for degeneracy
if (this.touches(other)) {
true
} else {
ccw(start, other.start, other.end) != ccw(end, other.start, other.end) &&
ccw(start, end, other.start) != ccw(start, end, other.end)
}
}
@JsonIgnore @inline private [magellan] def getMid(): Point = {
Point(start.getX() + (end.getX() - start.getX())/ 2, start.getY() + (end.getY() - start.getY())/ 2)
}
override def getType(): Int = 2
/**
* Applies an arbitrary point wise transformation to a given shape.
*
* @param fn
* @return
*/
override def transform(fn: (Point) => Point): Shape = ???
override def boundingBox: BoundingBox = {
val (xmin, xmax) = if (start.getX() < end.getX()) {
(start.getX(), end.getX())
} else {
(end.getX(), start.getX())
}
val (ymin, ymax) = if (start.getY() < end.getY()) {
(start.getY(), end.getY())
} else {
(end.getY(), start.getY())
}
BoundingBox(xmin, ymin, xmax, ymax)
}
@JsonIgnore
override def isEmpty(): Boolean = start == null || end == null
def canEqual(other: Any): Boolean = other.isInstanceOf[Line]
override def equals(other: Any): Boolean = other match {
case that: Line =>
(that canEqual this) &&
start == that.start &&
end == that.end
case _ => false
}
override def hashCode(): Int = {
val state = Seq(start, end)
state.map(_.hashCode()).foldLeft(0)((a, b) => 31 * a + b)
}
override def toString = s"Line($start, $end)"
}
object Line {
def apply(start: Point, end: Point): Line = {
val line = new Line()
line.setStart(start)
line.setEnd(end)
line
}
}
================================================
FILE: src/main/scala/magellan/OsmFileRelation.scala
================================================
package magellan
import java.util.Objects
import magellan.io._
import magellan.mapreduce._
import org.apache.spark.Partitioner
import org.apache.spark.rdd.RDD
import org.apache.spark.sql.SQLContext
private[magellan] case class WayKey(val id: String, val index: Int)
private[magellan] object WayKey {
implicit def orderingByIdIndex[A <: WayKey]: Ordering[A] = {
Ordering.by(fk => (fk.id, fk.index))
}
}
private case class WayValue(val id: String, val index: Int, val tags: Map[String, String])
private class WayPartitioner(partitions: Int) extends Partitioner {
require(partitions >= 0, s"Number of partitions ($partitions) cannot be negative.")
override def numPartitions: Int = partitions
override def getPartition(key: Any): Int = {
val k = key.asInstanceOf[WayKey]
k.id.hashCode.abs % numPartitions
}
}
case class OsmFileRelation(
path: String,
parameters: Map[String, String])
(@transient val sqlContext: SQLContext)
extends SpatialRelation {
private def expandWayValues(way: OsmWay) : Seq[(String, WayValue)] = {
way.nodeIds.zipWithIndex.map({
case (nodeId, index) => (nodeId, WayValue(way.id, index, way.tags))
})
}
private def keyedPointsRdd(nodes: RDD[OsmNode]): RDD[(String, Point)] = {
nodes.map({ node => (node.id, node.point) })
}
private[magellan] def nodesRdd(osmRdd: RDD[(OsmKey, OsmShape)]): RDD[OsmNode] = {
osmRdd
.values
.filter({ shape => shape.isInstanceOf[OsmNode] })
.map({ shape => shape.asInstanceOf[OsmNode] })
}
private[magellan] def waysRdd(osmRdd: RDD[(OsmKey, OsmShape)]): RDD[OsmWay] = {
osmRdd
.values
.filter({ shape => shape.isInstanceOf[OsmWay] })
.map({ shape => shape.asInstanceOf[OsmWay] })
}
private[magellan] def joinedNodesWays(nodes: RDD[OsmNode], ways: RDD[OsmWay]) = {
val wayValueTuples = ways.flatMap({ way => expandWayValues(way) })
wayValueTuples
.join(keyedPointsRdd(nodes))
.values
.map({
case (wayValue, point) => (new WayKey(wayValue.id, wayValue.index), (point, wayValue.tags))
})
}
private def wayShapeIsArea(head: Point, tail: Point, tags: Map[String, String]) : Boolean = {
head == tail && {
tags.getOrElse("area", "no") == "yes" ||
!(tags.contains("barrier") ||
tags.contains("highway"))
}
}
private def createWayShape(currentPoints: List[Point], tags: Map[String, String]) : Shape = {
if (currentPoints.length == 0) {
NullShape
} else if (currentPoints.length == 1) {
currentPoints(0)
} else {
val reversedPoints = currentPoints.reverse
if (wayShapeIsArea(reversedPoints.head, currentPoints.head, tags)) {
Polygon(Array(), reversedPoints.toArray)
} else {
PolyLine(new Array[Int](reversedPoints.toArray.size), reversedPoints.toArray)
}
}
}
private def createWayShapes(
i: Iterator[(WayKey, (Point, Map[String, String]))],
currentId: String,
currentPoints: List[Point],
currentTags: Map[String, String]): Stream[(Shape, Map[String, String])] = {
if (i.hasNext) {
val (key: WayKey, (point: Point, tags: Map[String, String])) = i.next()
if (currentId == "" || key.id == currentId) {
createWayShapes(i, key.id, point :: currentPoints, tags)
} else {
(createWayShape(currentPoints, tags), tags) #::
createWayShapes(i, key.id, List(point), tags)
}
} else {
if (currentPoints.isEmpty) {
Stream.Empty
} else {
Stream((createWayShape(currentPoints, currentTags), currentTags))
}
}
}
private[magellan] def wayShapes(
nodes: RDD[OsmNode],
ways: RDD[OsmWay]): RDD[(Shape, Option[Map[String, String]])] = {
joinedNodesWays(nodes, ways)
.repartitionAndSortWithinPartitions(new WayPartitioner(sc.defaultParallelism))
.mapPartitions({ i => createWayShapes(i, "", List(), Map()).toIterator })
.map({ case (shape, tags) => (shape, Option(tags))})
}
protected override def _buildScan(): RDD[Array[Any]] = {
val osmRdd = sqlContext.sparkContext.newAPIHadoopFile(
path,
classOf[OsmInputFormat],
classOf[OsmKey],
classOf[OsmShape]
)
val nodes = nodesRdd(osmRdd).persist
val ways = waysRdd(osmRdd)
wayShapes(nodes, ways)
.union(nodes.map({ node => (node.point, Some(node.tags))}))
.map {
case (shape: Shape, meta: Option[Map[String, String]]) =>
Array(shape, meta)
}
}
override def hashCode(): Int = Objects.hash(path, schema)
}
================================================
FILE: src/main/scala/magellan/Point.scala
================================================
/**
* Copyright 2015 Ram Sriharsha
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package magellan
import com.fasterxml.jackson.annotation.{JsonIgnore, JsonProperty}
import org.apache.spark.sql.types._
import org.json4s.JsonAST.JValue
import org.json4s.JsonDSL._
/**
* A point is a zero dimensional shape.
* The coordinates of a point can be in linear units such as feet or meters,
* or they can be in angular units such as degrees or radians.
* The associated spatial reference specifies the units of the coordinates.
* In the case of a geographic coordinate system, the x-coordinate is the longitude
* and the y-coordinate is the latitude.
*/
@SQLUserDefinedType(udt = classOf[PointUDT])
class Point extends Shape {
private var x: Double = _
private var y: Double = _
def equalToTol(other: Point, eps: Double): Boolean = {
math.abs(x - other.x) < eps && math.abs(y - other.y) < eps
}
override def equals(other: Any): Boolean = {
other match {
case p: Point => x == p.x && y == p.y
case _ => false
}
}
override def hashCode(): Int = {
var code = 0
code = code * 41 + x.hashCode()
code = code * 41 + y.hashCode()
code
}
override def toString = s"Point($x, $y)"
def setX(x: Double): Unit = {
this.x = x
}
def setY(y: Double): Unit = {
this.y = y
}
@JsonProperty
def getX(): Double = x
@JsonProperty
def getY(): Double = y
/**
* Applies an arbitrary point wise transformation to a given shape.
*
* @param fn
* @return
*/
override def transform(fn: (Point) => Point): Point = fn(this)
def withinCircle(origin: Point, radius: Double): Boolean = {
val sqrdL2Norm = Math.pow((origin.getX() - getX()), 2) + Math.pow((origin.getY() - getY()), 2)
sqrdL2Norm <= Math.pow(radius, 2)
}
@JsonProperty
override def getType(): Int = 1
override def jsonValue: JValue =
("type" -> "udt") ~
("class" -> this.getClass.getName) ~
("pyClass" -> "magellan.types.PointUDT") ~
("x" -> x) ~
("y" -> y)
@JsonProperty
override def boundingBox = BoundingBox(x, y, x, y)
@JsonIgnore
override def isEmpty(): Boolean = true
}
object Point {
def apply(x: Double, y: Double) = {
val p = new Point()
p.setX(x)
p.setY(y)
p
}
}
================================================
FILE: src/main/scala/magellan/PolyLine.scala
================================================
/**
* Copyright 2015 Ram Sriharsha
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package magellan
import com.fasterxml.jackson.annotation.{JsonIgnore, JsonProperty}
import magellan.geometry.{Curve, R2Loop}
import org.apache.spark.sql.catalyst.InternalRow
import org.apache.spark.sql.catalyst.expressions.GenericInternalRow
import org.apache.spark.sql.types._
import scala.collection.mutable.ArrayBuffer
/**
* A PolyLine is an ordered set of vertices that consists of one or more parts.
* A part is a connected sequence of two or more points.
* Parts may or may not be connected to one another.
* Parts may or may not intersect one another
*/
@SQLUserDefinedType(udt = classOf[PolyLineUDT])
class PolyLine extends Shape {
private var indices: Array[Int] = _
private var xcoordinates: Array[Double] = _
private var ycoordinates: Array[Double] = _
@transient var curves = new ArrayBuffer[Curve]()
@JsonIgnore private var _boundingBox: BoundingBox = _
private[magellan] def init(
indices: Array[Int],
xcoordinates: Array[Double],
ycoordinates: Array[Double],
boundingBox: BoundingBox): Unit = {
this.indices = indices
this.xcoordinates = xcoordinates
this.ycoordinates = ycoordinates
this._boundingBox = boundingBox
// initialize the loops
val offsets = indices.zip(indices.drop(1) ++ Array(xcoordinates.length))
for ((start, end) <- offsets) {
curves += ({
val curve = new R2Loop()
curve.init(xcoordinates, ycoordinates, start, end - 1)
curve
})
}
}
override def getType(): Int = 3
def init(row: InternalRow): Unit = {
init(row.getArray(5).toIntArray(),
row.getArray(6).toDoubleArray(),
row.getArray(7).toDoubleArray(),
BoundingBox(row.getDouble(1), row.getDouble(2), row.getDouble(3), row.getDouble(4)))
}
def serialize(): InternalRow = {
val row = new GenericInternalRow(8)
val BoundingBox(xmin, ymin, xmax, ymax) = boundingBox
row.update(0, getType())
row.update(1, xmin)
row.update(2, ymin)
row.update(3, xmax)
row.update(4, ymax)
row.update(5, new IntegerArrayData(indices))
row.update(6, new DoubleArrayData(xcoordinates))
row.update(7, new DoubleArrayData(ycoordinates))
row
}
@JsonProperty
private def getXCoordinates(): Array[Double] = xcoordinates
@JsonProperty
private def getYCoordinates(): Array[Double] = ycoordinates
@JsonProperty
override def boundingBox = _boundingBox
private[magellan] def contains(point: Point): Boolean = {
val numLoops = curves.size
var touches = false
var i = 0
while (i < numLoops && !touches) {
touches |= curves(i).touches(point)
i += 1
}
touches
}
/**
* A polyline intersects a line iff it is a proper intersection
*
* @param line
* @return
*/
private [magellan] def intersects(line: Line, strict: Boolean): Boolean = {
curves exists (_.intersects(line))
}
@JsonIgnore
override def isEmpty(): Boolean = xcoordinates.length == 0
def length(): Int = xcoordinates.length
def getVertex(index: Int) = Point(xcoordinates(index), ycoordinates(index))
@JsonProperty
def getRings(): Array[Int] = indices
@JsonIgnore
def getNumRings(): Int = indices.length
def getRing(index: Int): Int = indices(index)
/**
* A polygon intersects a polyline iff any line intersects a polygon
*
* @param polygon
* @param strict is this a strict intersection?
* @return
*/
def intersects(polygon:Polygon, strict: Boolean):Boolean = {
curves exists (_.iterator().exists(line => polygon intersects (line, strict)))
}
def canEqual(other: Any): Boolean = other.isInstanceOf[PolyLine]
override def equals(other: Any): Boolean = other match {
case that: PolyLine =>
(that canEqual this) &&
getType() == that.getType() &&
indices.deep == that.indices.deep &&
xcoordinates.deep == that.xcoordinates.deep &&
ycoordinates.deep == that.ycoordinates.deep
case _ => false
}
override def hashCode(): Int = {
val state = Seq(getType(), indices, xcoordinates, ycoordinates)
state.map(_.hashCode()).foldLeft(0)((a, b) => 31 * a + b)
}
/**
* Applies an arbitrary point wise transformation to a given shape.
*
* @param fn
* @return
*/
override def transform(fn: (Point) => Point): PolyLine = {
/*val transformedPoints = points.map(point => point.transform(fn))
PolyLine(indices, transformedPoints)*/
???
}
def readResolve(): AnyRef = {
curves = new ArrayBuffer[Curve]()
this.init(indices, xcoordinates, ycoordinates, boundingBox)
this
}
}
object PolyLine {
def apply(indices: Array[Int], points: Array[Point]): PolyLine = {
// look for the extremities
var xmin: Double = Double.MaxValue
var ymin: Double = Double.MaxValue
var xmax: Double = Double.MinValue
var ymax: Double = Double.MinValue
val size = points.length
var i = 0
while (i < size) {
val point = points(i)
val (x, y) = (point.getX(), point.getY())
if (xmin > x) {
xmin = x
}
if (ymin > y) {
ymin = y
}
if (xmax < x) {
xmax = x
}
if (ymax < y) {
ymax = y
}
i += 1
}
val polyline = new PolyLine()
polyline.init(
indices,
points.map(_.getX()),
points.map(_.getY()),
BoundingBox(xmin, ymin, xmax, ymax))
polyline
}
}
================================================
FILE: src/main/scala/magellan/Polygon.scala
================================================
/**
* Copyright 2015 Ram Sriharsha
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package magellan
import com.fasterxml.jackson.annotation.{JsonIgnore, JsonProperty}
import com.fasterxml.jackson.core.JsonParser
import com.fasterxml.jackson.databind.node.ArrayNode
import com.fasterxml.jackson.databind.{DeserializationContext, JsonDeserializer, JsonNode}
import magellan.Relate.{Contains, Touches}
import magellan.geometry.R2Loop
import org.apache.spark.sql.catalyst.InternalRow
import org.apache.spark.sql.catalyst.expressions.GenericInternalRow
import org.apache.spark.sql.types._
import scala.collection.mutable.ArrayBuffer
/**
* A polygon consists of one or more rings. A ring is a connected sequence of four or more points
* that form a closed, non-self-intersecting loop. A polygon may contain multiple outer rings.
* The order of vertices or orientation for a ring indicates which side of the ring is the interior
* of the polygon. The neighborhood to the right of an observer walking along the ring
* in vertex order is the neighborhood inside the polygon.
* Vertices of rings defining holes in polygons are in a counterclockwise direction.
* Vertices for a single, ringed polygon are, therefore, always in clockwise order.
* The rings of a polygon are referred to as its parts.
*
*/
@SQLUserDefinedType(udt = classOf[PolygonUDT])
class Polygon extends Shape {
private var indices: Array[Int] = _
private var xcoordinates: Array[Double] = _
private var ycoordinates: Array[Double] = _
@transient var loops = new ArrayBuffer[R2Loop]()
@JsonIgnore private var _boundingBox: BoundingBox = _
private[magellan] def init(
indices: Array[Int],
xcoordinates: Array[Double],
ycoordinates: Array[Double],
boundingBox: BoundingBox): Unit = {
this.indices = indices
this.xcoordinates = xcoordinates
this.ycoordinates = ycoordinates
this._boundingBox = boundingBox
// initialize the loops
val offsets = indices.zip(indices.drop(1) ++ Array(xcoordinates.length))
for ((start, end) <- offsets) {
loops += ({
val loop = new R2Loop()
loop.init(xcoordinates, ycoordinates, start, end - 1)
loop
})
}
}
def init(row: InternalRow): Unit = {
init(row.getArray(5).toIntArray(),
row.getArray(6).toDoubleArray(),
row.getArray(7).toDoubleArray(),
BoundingBox(row.getDouble(1), row.getDouble(2), row.getDouble(3), row.getDouble(4)))
}
def serialize(): InternalRow = {
val row = new GenericInternalRow(8)
val BoundingBox(xmin, ymin, xmax, ymax) = boundingBox
row.update(0, getType())
row.update(1, xmin)
row.update(2, ymin)
row.update(3, xmax)
row.update(4, ymax)
row.update(5, new IntegerArrayData(indices))
row.update(6, new DoubleArrayData(xcoordinates))
row.update(7, new DoubleArrayData(ycoordinates))
row
}
@JsonProperty
private def getXCoordinates(): Array[Double] = xcoordinates
@JsonProperty
private def getYCoordinates(): Array[Double] = ycoordinates
@JsonProperty
override def boundingBox = _boundingBox
private[magellan] def contains(point: Point): Boolean = {
val numLoops = loops.size
var inside = false
var touches = false
var i = 0
while (i < numLoops && !touches) {
val c = loops(i).containsOrCrosses(point)
if (c == Touches)
touches |= true
else
inside ^= (c == Contains)
i += 1
}
!touches && inside
}
private [magellan] def touches(point: Point): Boolean = {
loops.exists(_.containsOrCrosses(point) == Touches)
}
/**
* A polygon intersects a line iff it is a proper intersection(strict),
* or if the interior of the polygon contains any part of the line.
*
* @param line
* @param strict
* @return
*/
private [magellan] def intersects(line: Line, strict: Boolean): Boolean = {
val interior = this.contains(line.getStart()) || this.contains(line.getEnd())
val strictIntersects = loops.exists(_.intersects(line))
strictIntersects || (!strict && interior)
}
/**
* A polygon intersects a polyline iff it is a proper intersection (strict),
* or if either vertex of the polyline touches the polygon.
*
* @param polyline
* @param strict
* @return
*/
private [magellan] def intersects(polyline: PolyLine, strict: Boolean): Boolean = {
polyline.intersects(this, strict)
}
/**
* A polygon intersects another polygon iff at least one edge of the
* other polygon intersects this polygon.
*
* @param polygon
* @return
*/
private [magellan] def intersects(polygon: Polygon, strict: Boolean): Boolean = {
val touches =
polygon.getVertexes().exists(other => this.contains(other)) ||
this.getVertexes().exists(vertex => polygon.contains(vertex))
val strictIntersects = polygon.loops
.exists(otherLoop => this.loops.exists(_.intersects(otherLoop)))
strictIntersects || (!strict && touches)
}
private [magellan] def contains(box: BoundingBox): Boolean = {
val BoundingBox(xmin, ymin, xmax, ymax) = box
val lines = Array(
Line(Point(xmin, ymin), Point(xmax, ymin)),
Line(Point(xmin, ymin), Point(xmin, ymax)),
Line(Point(xmax, ymin), Point(xmax, ymax)),
Line(Point(xmin, ymax), Point(xmax, ymax)))
!(lines exists (!contains(_)))
}
/**
* Checks if the polygon intersects the bounding box in a strict sense.
*
* @param box
* @return
*/
private [magellan] def intersects(box: BoundingBox): Boolean = {
val BoundingBox(xmin, ymin, xmax, ymax) = box
val lines = Array(
Line(Point(xmin, ymin), Point(xmax, ymin)),
Line(Point(xmin, ymin), Point(xmin, ymax)),
Line(Point(xmax, ymin), Point(xmax, ymax)),
Line(Point(xmin, ymax), Point(xmax, ymax)))
lines exists (intersects(_))
}
@JsonProperty
override def getType(): Int = 5
/**
* Applies an arbitrary point wise transformation to a given shape.
*
* @param fn
* @return
*/
override def transform(fn: (Point) => Point): Shape = ???
@JsonIgnore
override def isEmpty(): Boolean = xcoordinates.length == 0
def length(): Int = xcoordinates.length
def getVertex(index: Int) = Point(xcoordinates(index), ycoordinates(index))
@JsonProperty
def getRings(): Array[Int] = indices
@JsonIgnore
def getNumRings(): Int = indices.length
def getRing(index: Int): Int = indices(index)
private def getVertexes():Array[Point]={
var ring = 0
val vertexes = new ArrayBuffer[Point]()
while(ring < getNumRings()) {
var i = 0
var ringPolygon = getRingPolygon(ring)
while (i < ringPolygon.length() - 1) {
vertexes += ringPolygon.getVertex(i)
i += 1
}
ring += 1
}
vertexes.toArray
}
def getRingPolygon(index: Int): Polygon = {
var startindex = getRing(index)
if(indices.length==1){
this
}
else {
var endindex = {
if (startindex == indices.last) length
else getRing(index + 1)
}
val arrayPoints = new ArrayBuffer[Point]()
while (startindex < endindex) {
arrayPoints += getVertex(startindex)
startindex += 1
}
Polygon(Array(0), arrayPoints.toArray)
}
}
def canEqual(other: Any): Boolean = other.isInstanceOf[Polygon]
override def equals(other: Any): Boolean = other match {
case that: Polygon =>
(that canEqual this) &&
indices.deep == that.indices.deep &&
xcoordinates.deep == that.xcoordinates.deep &&
ycoordinates.deep == that.ycoordinates.deep
case _ => false
}
override def hashCode(): Int = {
val state = Seq(indices, xcoordinates, ycoordinates)
state.map(_.hashCode()).foldLeft(0)((a, b) => 31 * a + b)
}
def readResolve(): AnyRef = {
loops = new ArrayBuffer[R2Loop]()
this.init(indices, xcoordinates, ycoordinates, boundingBox)
this
}
}
object Polygon {
def apply(indices: Array[Int], points: Array[Point]): Polygon = {
// look for the extremities
var xmin: Double = Double.MaxValue
var ymin: Double = Double.MaxValue
var xmax: Double = Double.MinValue
var ymax: Double = Double.MinValue
val size = points.length
var i = 0
while (i < size) {
val point = points(i)
val (x, y) = (point.getX(), point.getY())
if (xmin > x) {
xmin = x
}
if (ymin > y) {
ymin = y
}
if (xmax < x) {
xmax = x
}
if (ymax < y) {
ymax = y
}
i += 1
}
val polygon = new Polygon()
polygon.init(
indices,
points.map(_.getX()),
points.map(_.getY()),
BoundingBox(xmin, ymin, xmax, ymax))
polygon
}
}
class PolygonDeserializer extends JsonDeserializer[Polygon] {
override def deserialize(p: JsonParser, ctxt: DeserializationContext): Polygon = {
def readDoubleArray(arrayNode: ArrayNode): Array[Double] = {
val len = arrayNode.size()
val array = Array.fill(len)(0.0)
var i = 0
while (i < len) {
array.update(i, arrayNode.get(i).asDouble())
i += 1
}
array
}
def readIntArray(arrayNode: ArrayNode): Array[Int] = {
val len = arrayNode.size()
val array = Array.fill(len)(0)
var i = 0
while (i < len) {
array.update(i, arrayNode.get(i).asInt())
i += 1
}
array
}
val polygon = new Polygon()
val node: JsonNode = p.getCodec.readTree(p)
val xcoordinates = readDoubleArray(node.get("xcoordinates").asInstanceOf[ArrayNode])
val ycoordinates = readDoubleArray(node.get("ycoordinates").asInstanceOf[ArrayNode])
val rings = readIntArray(node.get("rings").asInstanceOf[ArrayNode])
val boundingBox = node.get("boundingBox")
val xmin = boundingBox.get("xmin").asDouble()
val ymin = boundingBox.get("ymin").asDouble()
val xmax = boundingBox.get("xmax").asDouble()
val ymax = boundingBox.get("ymax").asDouble()
polygon.init(rings, xcoordinates, ycoordinates, BoundingBox(xmin, ymin, xmax, ymax))
polygon
}
}
================================================
FILE: src/main/scala/magellan/Relate.scala
================================================
/**
* Copyright 2015 Ram Sriharsha
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package magellan
sealed trait Relate {
def name() = toString
}
object Relate {
/**
* This geometry is within the other.
*/
case object Within extends Relate
/**
* The other geometry is within this.
*/
case object Contains extends Relate
/**
* This geometry intersects the other.
*/
case object Intersects extends Relate
/**
* This geometry touches the other.
*/
case object Touches extends Relate
/**
* This geometry has no overlap with the other.
*/
case object Disjoint extends Relate
val values = List(Within, Contains, Intersects, Touches, Disjoint)
def withValue(name: String) = values.find(_.name() == name).get
}
================================================
FILE: src/main/scala/magellan/Shape.scala
================================================
/**
* Copyright 2015 Ram Sriharsha
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package magellan
import com.esri.core.geometry.OperatorBuffer
import com.fasterxml.jackson.annotation.{JsonIgnore, JsonProperty}
import magellan.esri.ESRIUtil
import org.apache.spark.sql.catalyst.InternalRow
import org.apache.spark.sql.types._
/**
* An abstraction for a geometric shape.
*/
trait Shape extends DataType with Serializable {
override def defaultSize: Int = 4096
override def asNullable: DataType = this
@JsonIgnore
def getType(): Int
/**
* Applies an arbitrary point wise transformation to a given shape.
*
* @param fn
* @return
*/
def transform(fn: Point => Point): Shape
/**
* Tests whether this Shape
* is topologically valid, according to the OGC SFS specification.
*
* For validity rules see the Javadoc for the specific Shape subclass.
*
* @return true if this Shape is valid
*/
@JsonIgnore
def isValid(): Boolean = true
/**
* Tests whether this shape intersects the argument shape.
*
* A strict intersection is one where
*
* - The two geometries have at least one point in common
*
! (other.contains(this) || this.contains(other))
*
*
* @param other the Shape with which to compare this Shape
* @param strict is this intersection strict?
* @return true if the two Shapes intersect
*
* @see Shape#disjoint
*/
def intersects(other: Shape, strict: Boolean): Boolean = {
if (!boundingBox.disjoint(other.boundingBox)) {
(this, other) match {
case (p: Point, q: Point) => p.equals(q)
case (p: Point, q: Polygon) => q.touches(p)
case (p: Polygon, q: Point) => p.touches(q)
case (p: Polygon, q: Line) => p.intersects(q, strict)
case (p: Polygon, q: PolyLine) => p.intersects(q, strict)
case (p: Polygon, q: Polygon) => p.intersects(q, strict)
case (p: PolyLine, q: Line) => p.intersects(q, strict)
case (p: PolyLine, q: Polygon) => p.intersects(q, strict)
case (p: Line, q: Polygon) => q.intersects(p, strict)
case (p: Line, q: PolyLine) => q.intersects(p, strict)
case _ => ???
}
} else {
false
}
}
/**
* Computes the non strict intersection between two shapes.
*
* The intersects predicate has the following equivalent definitions:
*
* - The two geometries have at least one point in common
*
! other.disjoint(this) = true
*
(intersects is the inverse of disjoint)
*
*
*
* @param other
* @return
*/
def intersects(other: Shape): Boolean = this.intersects(other, false)
/**
* Tests whether this shape contains the
* argument shape.
*
* The contains predicate has the following equivalent definitions:
*
* - Every point of the other shape is a point of this shape,
* and the interiors of the two shapes have at least one point in common.
*
other.within(this) = true
*
(contains is the converse of {@link #within} )
*
* An implication of the definition is that "Shapes do not
* contain their boundary". In other words, if a shape A is a subset of
* the points in the boundary of a shape B, B.contains(A) = false.
* (As a concrete example, take A to be a Line which lies in the boundary of a Polygon B.)
* For a predicate with similar behaviour but avoiding
* this subtle limitation, see {@link #covers}.
*
* @param other
* @return true if this shape contains the other.
*/
def contains(other: Shape): Boolean = {
// check if the bounding box intersects other's bounding box.
// if not, no need to check further
if (boundingBox.contains(other.boundingBox)) {
(this, other) match {
case (p: Point, q: Point) => p.equals(q)
case (p: Point, q: Line) => false
case (p: Point, q: Polygon) => false
case (p: Point, q: PolyLine) => false
case (p: Polygon, q: Point) => p.contains(q)
case (p: Polygon, q: Line) => ???
case (p: Line, q: Point) => p.contains(q)
case (p: Line, q: Line) => p.contains(q)
case (p: PolyLine, q: Point) => p.contains(q)
case _ => ???
}
} else {
false
}
}
@JsonProperty
def boundingBox: BoundingBox
/**
* Tests whether this shape is within the
* specified shape.
*
* The within predicate has the following equivalent definitions:
*
* - Every point of this geometry is a point of the other geometry,
* and the interiors of the two geometries have at least one point in common.
*
other.contains(this) = true
*
(within is the converse of {@link #contains})
*
* An implication of the definition is that
* "The boundary of a Shape is not within the Shape".
* In other words, if a shape A is a subset of
* the points in the boundary of a shape B, A.within(B) = false
* (As a concrete example, take A to be a Line which lies in the boundary of a Polygon B.)
* For a predicate with similar behaviour but avoiding
* this subtle limitation, see {@link #coveredBy}.
*
* @param other the Shape with which to compare this Shape
* @return true if this Shape is within
* other
*
* @see Geometry#contains
*/
def within(other: Shape): Boolean = other.contains(this)
/**
* Tests whether the set of points covered by this Shape is
* empty.
*
* @return true if this Shape does not cover any points
*/
@JsonIgnore
def isEmpty(): Boolean
def buffer(distance: Double): Polygon = {
val esriGeometry = ESRIUtil.toESRIGeometry(this)
val bufferedEsriGeometry = OperatorBuffer.local()
.execute(esriGeometry, null, distance, null)
ESRIUtil.fromESRIGeometry(bufferedEsriGeometry).asInstanceOf[Polygon]
}
}
/**
* A null shape indicates an absence of geometric data.
*/
object NullShape extends Shape {
override def getType() = 0
override def isEmpty() = true
override def intersects(shape: Shape, strict: Boolean = false): Boolean = false
override def contains(shape: Shape): Boolean = false
override def transform(fn: (Point) => Point): Shape = this
override def boundingBox = BoundingBox(
Int.MinValue, Int.MinValue,
Int.MaxValue, Int.MaxValue
)
}
object Shape {
@inline final def area(a: Point, b: Point, c: Point) = {
((c.getY() - a.getY()) * (b.getX() - a.getX())) - ((b.getY() - a.getY()) * (c.getX() - a.getX()))
}
@inline final def ccw(a: Point, b: Point, c: Point) = {
area(a, b, c) > 0
}
}
================================================
FILE: src/main/scala/magellan/ShapefileRelation.scala
================================================
/**
* Copyright 2015 Ram Sriharsha
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package magellan
import java.util.Objects
import magellan.io._
import magellan.mapreduce._
import org.apache.hadoop.io.{ArrayWritable, LongWritable, MapWritable, Text}
import org.apache.spark.rdd.RDD
import org.apache.spark.sql.SQLContext
import scala.collection.JavaConversions._
import scala.util.Try
/**
* A Shapefile relation is the entry point for working with Shapefile formats.
*/
case class ShapeFileRelation(
path: String,
parameters: Map[String, String])
(@transient val sqlContext: SQLContext)
extends SpatialRelation {
protected override def _buildScan(): RDD[Array[Any]] = {
// read the shx files, if they exist
val fileNameToFileSplits = Try(sc.newAPIHadoopFile(
path + "/*.shx",
classOf[ShxInputFormat],
classOf[Text],
classOf[ArrayWritable]
).map { case (txt: Text, splits: ArrayWritable) =>
val fileName = txt.toString
val s = splits.get()
val size = s.length
var i = 0
val v = Array.fill(size)(0L)
while (i < size) {
v.update(i, s(i).asInstanceOf[LongWritable].get())
i += 1
}
(fileName, v)
}.collectAsMap())
fileNameToFileSplits.map(SplitInfos.SPLIT_INFO_MAP.set(_))
val shapefileRdd = sqlContext.sparkContext.newAPIHadoopFile(
path + "/*.shp",
classOf[ShapeInputFormat],
classOf[ShapeKey],
classOf[ShapeWritable]
)
val dbaseRdd = sqlContext.sparkContext.newAPIHadoopFile(
path + "/*.dbf",
classOf[DBInputFormat],
classOf[ShapeKey],
classOf[MapWritable]
)
val dataRdd = shapefileRdd.map { case (k, v) =>
((k.getFileNamePrefix(), k.getRecordIndex()), v.shape)
}
val metadataRdd = dbaseRdd.map { case (k, v) =>
val meta = v.entrySet().map { kv =>
val k = kv.getKey.asInstanceOf[Text].toString
val v = kv.getValue.asInstanceOf[Text].toString
(k, v)
}.toMap
((k.getFileNamePrefix(), k.getRecordIndex()), meta)
}
dataRdd.leftOuterJoin(metadataRdd).map(f => Array(f._2._1, f._2._2))
}
override def hashCode(): Int = Objects.hash(path, schema)
}
================================================
FILE: src/main/scala/magellan/SpatialRelation.scala
================================================
/**
* Copyright 2015 Ram Sriharsha
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package magellan
import magellan.index.{ZOrderCurve, ZOrderCurveIndexer}
import org.apache.spark.rdd.RDD
import org.apache.spark.sql.Row
import org.apache.spark.sql.catalyst.expressions.GenericInternalRow
import org.apache.spark.sql.catalyst.util.GenericArrayData
import org.apache.spark.sql.sources.{BaseRelation, Filter, PrunedFilteredScan}
import org.apache.spark.sql.types._
import scala.collection.mutable.ListBuffer
private[magellan] trait SpatialRelation extends BaseRelation with PrunedFilteredScan {
@transient val sc = sqlContext.sparkContext
val parameters: Map[String, String]
private val indexer = new ZOrderCurveIndexer()
private val autoIndex: Boolean = parameters.getOrElse("magellan.index", "false").toBoolean
private val precision = parameters.getOrElse("magellan.index.precision", "30").toInt
private val indexSchema = ArrayType(new StructType()
.add("curve", new ZOrderCurveUDT, false)
.add("relation", StringType, false))
override val schema = StructType(schemaWithHandlers().map(_._1))
protected def schemaWithHandlers(): List[(StructField, (Int, Array[Any]) => Option[Any])] = {
def extractShape = {
(fieldIndex: Int, row: Array[Any]) =>
val shape = row(0).asInstanceOf[Shape]
val shapeType = shape.getType()
val fieldSchema = schema(fieldIndex)
val expectedShapeType = fieldSchema.dataType.asInstanceOf[GeometricUDT].geometryType
if (expectedShapeType == shapeType) Some(shape) else None
}
def extractMetadata = {
(fieldIndex: Int, row: Array[Any]) =>
val meta = row(1).asInstanceOf[Option[Map[String, String]]]
Some(meta.fold(Map[String, String]())(identity))
}
def valid = {
(fieldIndex: Int, row: Array[Any]) =>
val shape = row(0).asInstanceOf[Shape]
Some(shape.isValid())
}
def index = {
(fieldIndex: Int, row: Array[Any]) =>
val shape = row(0).asInstanceOf[Shape]
Some(this.index(shape))
}
val base = List(
(StructField("point", new PointUDT(), true), extractShape),
(StructField("polyline", new PolyLineUDT(), true), extractShape),
(StructField("polygon", new PolygonUDT(), true), extractShape),
(StructField("metadata", MapType(StringType, StringType, true), true), extractMetadata),
(StructField("valid", BooleanType, true), valid)
)
if (autoIndex) {
base ++ List((StructField("index", indexSchema, false), index))
} else {
base
}
}
protected def _buildScan(): RDD[Array[Any]]
private def index(shape: Shape) = {
val indices = indexer.indexWithMeta(shape, precision) map {
case (index: ZOrderCurve, relation: Relate) => {
(index, relation.name())
}
}
indices
}
override def buildScan(requiredColumns: Array[String], filters: Array[Filter]) = {
val handlers = schemaWithHandlers()
val indices = requiredColumns.map(attr => schema.fieldIndex(attr))
val numFields = indices.size
_buildScan().mapPartitions { iter =>
val row = new Array[Any](numFields)
iter.flatMap { record =>
(0 until numFields).foreach(i => row(i) = null)
indices.zipWithIndex.foreach { case (index, i) =>
// get the appropriate handler
val handler = handlers(index)._2
val v = handler(index, record)
v.foreach(x => row(i) = x)
}
Some(Row.fromSeq(row))
}
}
}
}
================================================
FILE: src/main/scala/magellan/Utils.scala
================================================
/**
* Copyright 2015 Ram Sriharsha
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package magellan
import magellan.catalyst.{RangeQueryRewrite, SpatialJoin}
import org.apache.spark.sql.SparkSession
object Utils {
def injectRules(session: SparkSession): Unit = {
if (!session.experimental.extraOptimizations.exists(_.isInstanceOf[SpatialJoin])) {
session.experimental.extraOptimizations ++= (Seq(SpatialJoin(session), RangeQueryRewrite(session)))
}
}
}
================================================
FILE: src/main/scala/magellan/WKTParser.scala
================================================
/**
* Copyright 2015 Ram Sriharsha
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package magellan
import fastparse.all._
import fastparse.core.Parsed.{Failure, Success}
import scala.collection.mutable.ListBuffer
object WKTParser {
def whitespace: P[String] = P(" ") map {_.toString}
val posInt: P[String] = P(CharIn('0'to'9').rep(1).!)
val negInt: P[String] = P("-" ~ posInt) map {"-" + _}
val int: P[String] = P(posInt | negInt)
val float: P[String] = P(int ~ P(".") ~ posInt) map { case (x , y) => (x + "." + y)}
val number = P(float | int) map {_.toDouble}
def point0: P[String] = P("""POINT""") map {_.toString}
def empty0: P[String] = P("""EMPTY""") map {_.toString}
def comma: P[String] = P(",") map {_.toString}
def leftBrace: P[String] = P("(") map {_.toString}
def rightBrace: P[String] = P(")") map {_.toString}
def coords: P[Point] = P(number ~ whitespace ~ number) map {
case (x, _, y) => Point(x, y)
}
def ring: P[Array[Point]] = P(leftBrace ~ coords.rep(1, (comma ~ whitespace | comma)) ~ rightBrace) map {
case (_, x ,_) => x.toArray
}
def point: P[Point] = P(point0 ~ whitespace.? ~ leftBrace ~ coords ~ rightBrace) map {
case (_ , _, _, p, _) => p
}
def pointEmpty: P[Shape] = P(point0 ~ whitespace ~ empty0) map {_ => NullShape}
def linestring0: P[String] = P("""LINESTRING""") map {_.toString}
def linestring: P[PolyLine] = P(linestring0 ~ whitespace.? ~ ring) map {
case (_ , _, x) => PolyLine(Array(0), x)
}
def polygon0: P[String] = P("""POLYGON""") map {_.toString}
def polygonWithoutHoles: P[Polygon] =
P(polygon0 ~ whitespace.? ~ P("((") ~ coords.rep(1, (comma ~ whitespace | comma)) ~ P("))")) map {
case (_ , _, x ) => Polygon(Array(0), x.toArray)
}
def polygonWithHoles: P[Polygon] =
P(polygon0 ~ whitespace.? ~ P("(") ~ ring.rep(1, (comma ~ whitespace | comma)) ~ P(")")) map {
case (_ , _, x) =>
val indices = ListBuffer[Int]()
val points = ListBuffer[Point]()
var prev = 0
var i = 0
val numRings = x.size
while (i < numRings) {
indices.+= (prev)
prev += x(i).length
points.++=(x(i))
i += 1
}
Polygon(indices.toArray, points.toArray)
}
def expr: P[Shape] = P(point | pointEmpty | linestring | polygonWithoutHoles | polygonWithHoles ~ End)
def parseAll(text: String): Shape = {
expr.parse(text) match {
case Success(value, _) => value
case Failure(parser, index, stack) => throw new RuntimeException(stack.toString)
}
}
}
================================================
FILE: src/main/scala/magellan/catalyst/MagellanExpression.scala
================================================
/**
* Copyright 2015 Ram Sriharsha
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package magellan.catalyst
import magellan._
import org.apache.spark.sql.catalyst.InternalRow
import org.apache.spark.sql.types._
trait MagellanExpression {
private val SERIALIZERS = Map(
new Point().getType() -> new PointUDT,
new Line().getType() -> new LineUDT,
new PolyLine().getType() -> new PolyLineUDT,
new Polygon().getType() -> new PolygonUDT)
def newInstance(row: InternalRow): Shape = {
SERIALIZERS.get(row.getInt(0)).fold(NullShape.asInstanceOf[Shape])(_.deserialize(row))
}
def serialize(shape: Shape): Any = {
SERIALIZERS.get(shape.getType()).get.serialize(shape)
}
def sqlType(klass: Class[_ <: Shape]): DataType = {
SERIALIZERS.get(klass.newInstance().getType()).get
}
}
================================================
FILE: src/main/scala/magellan/catalyst/RangeQueryRewrite.scala
================================================
/**
* Copyright 2015 Ram Sriharsha
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package magellan.catalyst
import magellan.{BoundingBox, Point}
import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.catalyst.expressions._
import org.apache.spark.sql.catalyst.plans.logical.{Filter, LogicalPlan}
import org.apache.spark.sql.catalyst.rules.Rule
/**
* Performs the following Query Rewrites:
* 1) Rewrite point($x, $y) withinRange box -> ($x \in [Xmin, Xmax] and $y \in [Ymin, Ymax]
* This allows column pruning on $x and $y where possible, and min/ max pruning where possible
* 2) Rewrite point($x, $y) withinRange (point, radius) to first prune by the bounding box
* of the circle (thereby applying the pruning in step (1) followed by the actual filter.
*
* @param session
*/
private[magellan] case class RangeQueryRewrite(session: SparkSession) extends Rule[LogicalPlan] {
override def apply(plan: LogicalPlan): LogicalPlan = {
plan transformUp {
case p @ Filter(condition, child) =>
val transformedCondition = condition transformUp {
case WithinRange((PointConverter(xexpr, yexpr)), boundingBox) =>
prune(boundingBox, xexpr, yexpr)
case q @ WithinCircleRange((PointConverter(xexpr, yexpr)), point, radius) =>
val (x, y) = (point.getX(), point.getY())
val boundingBox = BoundingBox(x - radius, y - radius, x + radius, y + radius)
And(prune(boundingBox, xexpr, yexpr),
new WithinCircleRangePostOpt((PointConverter(xexpr, yexpr)), point, radius))
case q : WithinCircleRangePostOpt => q
}
Filter(transformedCondition, child)
}
}
private def prune(boundingBox: BoundingBox, xexpr: Expression, yexpr: Expression) = {
val xpredicate = And(LessThanOrEqual(xexpr, Literal(boundingBox.xmax)),
GreaterThanOrEqual(xexpr, Literal(boundingBox.xmin)))
val ypredicate = And(LessThanOrEqual(yexpr, Literal(boundingBox.ymax)),
GreaterThanOrEqual(yexpr, Literal(boundingBox.ymin)))
And(xpredicate, ypredicate)
}
}
private [magellan] class WithinCircleRangePostOpt(child: Expression, point: Point, radius: Double)
extends WithinCircleRange(child, point, radius)
================================================
FILE: src/main/scala/magellan/catalyst/SpatialJoin.scala
================================================
/**
* Copyright 2015 Ram Sriharsha
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package magellan.catalyst
import magellan.{Point, Polygon}
import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.catalyst.expressions._
import org.apache.spark.sql.catalyst.plans._
import org.apache.spark.sql.catalyst.plans.logical.{Generate, _}
import org.apache.spark.sql.catalyst.rules.Rule
import org.apache.spark.sql.types._
private[magellan] case class SpatialJoin(session: SparkSession)
extends Rule[LogicalPlan] with MagellanExpression {
private val indexerType = Indexer.dataType
private val curveType = new ZOrderCurveUDT().sqlType
private var prec: Option[Int] = None
override def apply(plan: LogicalPlan): LogicalPlan = {
plan transformUp {
case p@SpatialJoinHint(child, hints) =>
prec = hints.get("magellan.index.precision").map(_.toInt)
logDebug(s"Spatial Join Hint provided, precision $prec")
child
case p@Join(
Generate(Inline(_), _, _, _, _, _),
Generate(Inline(_), _, _, _, _, _), _, _) =>
p
case p@Join(l, r, joinType @ (Inner | LeftOuter), Some(cond)) =>
val trigger = matchesTrigger(cond)
if (trigger.isEmpty) p else {
/**
* Given a Logical Query Plan of the form
* 'Project [...]
* +- Filter Within(point, polygon)
* +- Join Inner
* :- Relation[point, ...]
* :- Relation[polygon,...]
* *
* Convert it into
* 'Project [...]
* +- Filter Or (('relation == "Within"), Within(point, polygon))
* +- Join Inner JoinKey = 'curve
* :- Generate(Inline(index ($"point" , precision)))
* :- Generate(Inline(index ($"point" , precision)))
*
*/
val Some(Within(a, b)) = trigger
// determine which is the left project and which is the right projection in Within
val (leftProjection, rightProjection) =
l.outputSet.find(a.references.contains(_)) match {
case Some(_) => (a, b)
case None => (b, a)
}
// left hand side attributes
val c1 = attr("curve", curveType)
val r1 = attr("relation", StringType)
// right hand side attributes
val c2 = attr("curve", curveType)
val r2 = attr("relation", StringType)
// if a curve is within the geometry on the right hand side then we shortcircuit
val shortcutRelation = EqualTo(r2, Literal("Within"))
val transformedCondition = cond transformUp {
case p @ Within(_, _) =>
Or(shortcutRelation, p)
}
// check if the precision is available as a hint, otherwise use default
val precision = prec.fold(30)(identity)
logDebug(s"Spatial Join Rule using precision $precision")
val leftIndexer = l.outputSet.find(_.dataType == indexerType)
.fold[Expression](Indexer(leftProjection, precision))(identity)
val rightIndexer = r.outputSet.find(_.dataType == indexerType)
.fold[Expression](Indexer(rightProjection, precision))(identity)
val join = Join(
Generate(Inline(leftIndexer), Nil, false, None, Seq(c1, r1), l),
Generate(Inline(rightIndexer), Nil, false, None, Seq(c2, r2), r),
joinType,
Some(And(EqualTo(c1, c2), transformedCondition)))
Project(p.outputSet.toSeq, join)
}
}
}
private def attr(name: String, dt: DataType): Attribute = {
// name: String, dataType: DataType, nullable: Boolean = true,
// metadata: Metadata = Metadata.empty), exprId: ExprId = NamedExpression.newExprId,
// qualifier: Option[String] = None,
// isGenerated: java.lang.Boolean = false
val klass = Class.forName("org.apache.spark.sql.catalyst.expressions.AttributeReference")
val ctor = klass.getConstructors.apply(0)
val nullable = true.asInstanceOf[AnyRef]
val metadata = Metadata.empty
val exprId = NamedExpression.newExprId
val qualifier = None
val isGenerated = false.asInstanceOf[AnyRef]
if (ctor.getParameterCount == 7) {
// prior to Spark 2.3
ctor.newInstance(name, dt, nullable, metadata, exprId, qualifier, isGenerated)
.asInstanceOf[Attribute]
} else {
// Spark 2.3 +
ctor.newInstance(name, dt, nullable, metadata, exprId, qualifier)
.asInstanceOf[Attribute]
}
}
private def matchesTrigger(cond: Expression) = cond find {
case p @ Within(left, _) =>
val pointType = sqlType(classOf[Point])
left.dataType == pointType
case _ => false
}
}
================================================
FILE: src/main/scala/magellan/catalyst/SpatialJoinHint.scala
================================================
/**
* Copyright 2015 Ram Sriharsha
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package magellan.catalyst
import org.apache.spark.sql.catalyst.expressions.Attribute
import org.apache.spark.sql.catalyst.plans.logical._
/**
* A Spatial Join Hint node.
*/
case class SpatialJoinHint(child: LogicalPlan, hints: Map[String, String])
extends UnaryNode {
override def output: Seq[Attribute] = child.output
override def doCanonicalize(): LogicalPlan = SpatialJoinHint(child, hints)
}
================================================
FILE: src/main/scala/magellan/dsl/package.scala
================================================
/**
* Copyright 2015 Ram Sriharsha
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.spark.sql.magellan
import magellan.catalyst.SpatialJoinHint
import magellan.{BoundingBox, Point}
import org.apache.spark.sql.catalyst.expressions._
import org.apache.spark.sql.{Column, Dataset}
package object dsl {
trait ExpressionConversions {
implicit class DslExpression(e: Expression) {
def expr: Expression = e
}
implicit class DslColumn(c: Column) {
def col: Column = c
def within(other: Column): Column = Column(Within(col.expr, other.expr))
def intersects(other: Column): Column = Column(Intersects(c.expr, other.expr))
def >?(other: Column): Column = Column(Within(other.expr, col.expr))
def transform(fn: Point => Point): Column = Column(Transformer(c.expr, fn))
def index(precision: Int): Column = Column(Indexer(c.expr, precision))
def wkt(): Column = Column(WKT(c.expr))
def withinRange(boundingBox: BoundingBox): Column = Column(WithinRange(c.expr, boundingBox))
def withinRange(origin: Point, radius: Double): Column = Column(WithinCircleRange(c.expr, origin, radius))
def asGeoJSON(): Column = Column(AsGeoJSON(c.expr))
def buffer(distance: Double): Column = Column(Buffer(c.expr, distance))
}
implicit def point(x: Column, y: Column) = Column(PointConverter(x.expr, y.expr))
implicit def wkt(x: Column) = Column(WKT(x.expr))
implicit def asGeoJSON(x: Column) = Column(AsGeoJSON(x.expr))
implicit def buffer(x: Column, distance: Double) = Column(Buffer(x.expr, distance))
implicit class DslDataset[T](c: Dataset[T]) {
def df: Dataset[T] = c
def index(precision: Int): Dataset[T] = {
Dataset[T](df.sparkSession,
SpatialJoinHint(df.logicalPlan, Map("magellan.index.precision" -> precision.toString)))(df.exprEnc)
}
}
}
object expressions extends ExpressionConversions // scalastyle:ignore
}
================================================
FILE: src/main/scala/magellan/encoders/Encoders.scala
================================================
package magellan.encoders
import magellan._
import org.apache.spark.sql.Encoder
import org.apache.spark.sql.catalyst.analysis.GetColumnByOrdinal
import org.apache.spark.sql.catalyst.encoders.ExpressionEncoder
import org.apache.spark.sql.catalyst.expressions._
import org.apache.spark.sql.types._
import scala.reflect._
object Encoders {
implicit def encoderForPoint: Encoder[Point] = {
val sqlType = new PointUDT().sqlType
ExpressionEncoder[Point](
schema = sqlType,
flat = true,
serializer = Seq(
MagellanSerializer(
BoundReference(0, ObjectType(classOf[Point]), nullable = true), sqlType)),
deserializer =
MagellanDeserializer(
GetColumnByOrdinal(0, sqlType), classOf[Point]),
clsTag = classTag[Point])
}
implicit def encoderForPolygon: Encoder[Polygon] = {
val sqlType = new PolygonUDT().sqlType
ExpressionEncoder[Polygon](
schema = sqlType,
flat = true,
serializer = Seq(
MagellanSerializer(
BoundReference(0, ObjectType(classOf[Polygon]), nullable = true), sqlType)),
deserializer =
MagellanDeserializer(
GetColumnByOrdinal(0, sqlType), classOf[Polygon]),
clsTag = classTag[Polygon])
}
implicit def encoderForPolyLine: Encoder[PolyLine] = {
val sqlType = new PolyLineUDT().sqlType
ExpressionEncoder[PolyLine](
schema = sqlType,
flat = true,
serializer = Seq(
MagellanSerializer(
BoundReference(0, ObjectType(classOf[PolyLine]), nullable = true), sqlType)),
deserializer =
MagellanDeserializer(
GetColumnByOrdinal(0, sqlType), classOf[PolyLine]),
clsTag = classTag[PolyLine])
}
}
================================================
FILE: src/main/scala/magellan/esri/ESRIUtil.scala
================================================
package magellan.esri
import com.esri.core.geometry.{Geometry => ESRIGeometry, Point => ESRIPoint, Polygon => ESRIPolygon, Polyline => ESRIPolyLine}
import magellan._
import scala.collection.mutable.ArrayBuffer
object ESRIUtil {
def fromESRIGeometry(geometry: ESRIGeometry): Shape = {
geometry match {
case esriPoint: ESRIPoint => fromESRI(esriPoint)
case esriPolyline: ESRIPolyLine => fromESRI(esriPolyline)
case esriPolygon: ESRIPolygon => fromESRI(esriPolygon)
}
}
def toESRIGeometry(shape: Shape): ESRIGeometry = {
shape match {
case point: Point => toESRI(point)
case polyline: PolyLine => toESRI(polyline)
case polygon: Polygon => toESRI(polygon)
}
}
/**
* Convert ESRI 2D Point to Magellan Point.
*
* @param esriPoint
* @return
*/
def fromESRI(esriPoint: ESRIPoint): Point = {
Point(esriPoint.getX, esriPoint.getY)
}
/**
* Convert Magellan Point to ESRI 2D Point
*
* @param point
* @return
*/
def toESRI(point: Point): ESRIPoint = {
val esriPoint = new ESRIPoint()
esriPoint.setXY(point.getX(), point.getY())
esriPoint
}
/**
* Convert ESRI PolyLine to Magellan PolyLine.
*
* @param esriPolyLine
* @return
*/
def fromESRI(esriPolyLine: ESRIPolyLine): PolyLine = {
val length = esriPolyLine.getPointCount
if (length == 0) {
PolyLine(Array[Int](), Array[Point]())
} else {
val indices = ArrayBuffer[Int]()
indices.+=(0)
val points = ArrayBuffer[Point]()
var start = esriPolyLine.getPoint(0)
var currentRingIndex = 0
points.+=(Point(start.getX(), start.getY()))
for (i <- (1 until length)) {
val p = esriPolyLine.getPoint(i)
val j = esriPolyLine.getPathEnd(currentRingIndex)
if (j < length) {
val end = esriPolyLine.getPoint(j)
if (p.getX == end.getX && p.getY == end.getY) {
indices.+=(i)
currentRingIndex += 1
// add start point
points.+= (Point(start.getX(), start.getY()))
start = end
}
}
points.+=(Point(p.getX(), p.getY()))
}
PolyLine(indices.toArray, points.toArray)
}
}
/**
* Convert Magellan PolyLine to ESRI PolyLine.
*
* @param polyline
* @return
*/
def toESRI(polyline: PolyLine): ESRIPolyLine = {
val l = new ESRIPolyLine()
val indices = polyline.getRings()
val length = polyline.length
if (length > 0) {
var startIndex = 0
var endIndex = 1
var currentRingIndex = 0
val startVertex = polyline.getVertex(startIndex)
l.startPath(
startVertex.getX(),
startVertex.getY())
while (endIndex < length) {
val endVertex = polyline.getVertex(endIndex)
l.lineTo(endVertex.getX(), endVertex.getY())
startIndex += 1
endIndex += 1
// if we reach a ring boundary skip it
val nextRingIndex = currentRingIndex + 1
if (nextRingIndex < indices.length) {
val nextRing = indices(nextRingIndex)
if (endIndex == nextRing) {
startIndex += 1
endIndex += 1
currentRingIndex = nextRingIndex
val startVertex = polyline.getVertex(startIndex)
l.startPath(
startVertex.getX(),
startVertex.getY())
}
}
}
}
l
}
/**
* Convert ESRI Polygon to Magellan Polygon.
*
* @param esriPolygon
* @return
*/
def fromESRI(esriPolygon: ESRIPolygon): Polygon = {
val length = esriPolygon.getPointCount
if (length == 0) {
Polygon(Array[Int](), Array[Point]())
} else {
val indices = ArrayBuffer[Int]()
indices.+=(0)
val points = ArrayBuffer[Point]()
var start = esriPolygon.getPoint(0)
var currentRingIndex = 0
points.+=(Point(start.getX(), start.getY()))
for (i <- (1 until length)) {
val p = esriPolygon.getPoint(i)
val j = esriPolygon.getPathEnd(currentRingIndex)
if (j < length) {
val end = esriPolygon.getPoint(j)
if (p.getX == end.getX && p.getY == end.getY) {
indices.+=(i)
currentRingIndex += 1
// add start point
points.+= (Point(start.getX(), start.getY()))
start = end
}
}
points.+=(Point(p.getX(), p.getY()))
}
Polygon(indices.toArray, points.toArray)
}
}
/**
* Convert Magellan Polygon to ESRI Polygon.
*
* @param polygon
* @return
*/
def toESRI(polygon: Polygon): ESRIPolygon = {
val p = new ESRIPolygon()
val indices = polygon.getRings()
val length = polygon.length
if (length > 0) {
var startIndex = 0
var endIndex = 1
var currentRingIndex = 0
val startVertex = polygon.getVertex(startIndex)
p.startPath(
startVertex.getX(),
startVertex.getY())
while (endIndex < length) {
val endVertex = polygon.getVertex(endIndex)
p.lineTo(endVertex.getX(), endVertex.getY())
startIndex += 1
endIndex += 1
// if we reach a ring boundary skip it
val nextRingIndex = currentRingIndex + 1
if (nextRingIndex < indices.length) {
val nextRing = indices(nextRingIndex)
if (endIndex == nextRing) {
startIndex += 1
endIndex += 1
currentRingIndex = nextRingIndex
val startVertex = polygon.getVertex(startIndex)
p.startPath(
startVertex.getX(),
startVertex.getY())
}
}
}
}
p
}
}
================================================
FILE: src/main/scala/magellan/geojson.scala
================================================
package magellan
import magellan.geometry.Curve
import org.json4s._
import org.json4s.JsonDSL._
import org.json4s.jackson.JsonMethods._
import scala.collection.mutable.ListBuffer
case class Geometry(`type`: String, coordinates: JValue) {
def coordinatesToPoint(coordinates: JValue) = {
coordinates match {
case JArray(List(JDouble(x), JDouble(y))) => Point(x, y)
case JArray(List(JDouble(x), JInt(y))) => Point(x, y.toDouble)
case JArray(List(JInt(x), JDouble(y))) => Point(x.toDouble, y)
case JArray(List(JInt(x), JInt(y))) => Point(x.toDouble, y.toDouble)
}
}
def extractPoints(p: List[JValue]) = p.map(coordinatesToPoint)
def extractPolygon(coordinates: JArray): Polygon = {
val JArray(p) = coordinates
val rings = p.map { case JArray(q) => extractPoints(q) }
val indices = rings.scanLeft(0)((running, current) => running + current.size).dropRight(1)
Polygon(indices.toArray, rings.flatten.toArray)
}
val shapes = {
`type` match {
case "Point" => { List(coordinatesToPoint(coordinates)) }
case "LineString" => {
val JArray(p) = coordinates.asInstanceOf[JArray]
val points = extractPoints(p)
//val indices = points.scanLeft(0)((running, current) => running + points.size-1).dropRight(1)
val indices = new Array[Int](points.size)
List(PolyLine(indices, points.toArray))
}
case "Polyline" | "MultiLineString" => {
val JArray(p) = coordinates.asInstanceOf[JArray]
val lineSegments = p.map { case JArray(q) => extractPoints(q) }
val indices = lineSegments.scanLeft(0)((running, current) => running + current.size).dropRight(1)
List(PolyLine(indices.toArray, lineSegments.flatten.toArray))
}
case "Polygon" => {
val p = coordinates.asInstanceOf[JArray]
List(extractPolygon(p))
}
case "MultiPolygon" => {
val JArray(p) = coordinates.asInstanceOf[JArray]
// array of polygon coordinates
p.map { case polygon @ JArray(q: List[JArray]) => extractPolygon(polygon)}
}
}
}
}
case class Feature(
`type`: String,
properties: Option[Map[String, String]],
geometry: Geometry)
case class CRS(`type`: String, properties: Option[Map[String, String]])
case class GeoJSON(`type`: String, crs: Option[CRS], features: List[Feature])
object GeoJSON {
def write(shape: Shape): Geometry = {
val (t, jvalue) = shape match {
case point: Point => ("Point", asJValue(point))
case polygon: Polygon =>
val coords: JValue = polygon.loops.map(asJValue(_)).toList
("Polygon", coords)
case polyline: PolyLine =>
val coords: JValue = polyline.curves.map(asJValue(_)).toList
("MultiLineString", coords)
}
Geometry(`type` = t, coordinates = jvalue)
}
def writeJson(shape: Shape): String = {
val geometry = write(shape)
val json =
("type" -> geometry.`type`) ~
("coordinates" -> geometry.coordinates)
compact(render(json))
}
private [magellan] def asJValue(point: Point): JValue = {
List(JDouble(point.getX()), JDouble(point.getY()))
}
private [magellan] def asJValue(curve: Curve): JValue = {
val iter = curve.iterator()
var end: Point = null
val coords = new ListBuffer[JValue]
while (iter.hasNext) {
val line = iter.next()
val start = line.getStart()
end = line.getEnd()
coords.append(asJValue(start))
}
coords.append(asJValue(end))
coords.toList
}
}
================================================
FILE: src/main/scala/magellan/geometry/Curve.scala
================================================
/**
* Copyright 2015 Ram Sriharsha
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package magellan.geometry
import magellan.{Line, Point, Relate}
/**
* A curve consists of a single chain of vertices represents a open curve on the plane.
*
* Curves are not allowed to have any duplicate vertices (whether adjacent or
* not), and non-adjacent edges are not allowed to intersect. Curves must have at
* least 2 vertices. Although these restrictions are not enforced in optimized
* code, you may get unexpected results if they are violated.
*/
trait Curve extends Serializable {
/**
* Returns true if the curve touches the point, false otherwise.
*
* @param point
* @return
*/
def touches(point: Point): Boolean
/**
* Returns true if the line intersects (properly or vertex touching) loop, false otherwise.
*
* @param line
* @return
*/
def intersects(line: Line): Boolean
/**
* Returns an iterator over the loop.
*
* @return
*/
def iterator(): Iterator[Line]
}
================================================
FILE: src/main/scala/magellan/geometry/Loop.scala
================================================
/**
* Copyright 2015 Ram Sriharsha
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package magellan.geometry
import magellan.Relate.Touches
import magellan.{Line, Point, Relate}
/**
*
* A Loop represents a closed curve. It consists of a single
* chain of vertices where the first vertex is explicitly connected to the last.
*
* Loops are not allowed to have any duplicate vertices (whether adjacent or
* not), and non-adjacent edges are not allowed to intersect. Loops must have at
* least 3 vertices. Although these restrictions are not enforced in optimized
* code, you may get unexpected results if they are violated.
*
* Point containment is defined such that if the plane is subdivided into
* faces (loops), every point is contained by exactly one face. This implies
* that loops do not necessarily contain all (or any) of their vertices.
*
*/
trait Loop extends Serializable with Curve {
override def touches(point: Point) = {
containsOrCrosses(point) == Touches
}
/**
* A loop contains the given point iff the point is properly contained within the
* interior of the loop.
*
* @param point
* @return
*/
def contains(point: Point): Boolean
/**
* Return Contains if loop contains point (i.e the interior of the loop contains the point),
* Disjoint if the point lies in the exterior region of the loop,
* and Touches if the point lies on the loop.
*
* @param point
* @return
*/
def containsOrCrosses(point: Point): Relate
/**
* Returns true if the two loops intersect (properly or vertex touching), false otherwise.
* @param loop
* @return
*/
def intersects(loop: Loop): Boolean = {
loop.iterator() exists (intersects(_))
}
}
================================================
FILE: src/main/scala/magellan/geometry/R2Loop.scala
================================================
/**
* Copyright 2015 Ram Sriharsha
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package magellan.geometry
import magellan.Relate.{Contains, Disjoint, Touches}
import magellan.{Line, Point, Relate}
class R2Loop extends Loop {
private var xcoordinates: Array[Double] = _
private var ycoordinates: Array[Double] = _
private var startIndex: Int = _
private var endIndex: Int = _
private [magellan] def init(
xcoordinates: Array[Double],
ycoordinates: Array[Double],
startIndex: Int,
endIndex: Int): Unit = {
this.xcoordinates = xcoordinates
this.ycoordinates = ycoordinates
this.startIndex = startIndex
this.endIndex = endIndex
}
/**
* A loop contains the given point iff the point is properly contained within the
* interior of the loop.
*
* @param point
* @return
*/
@inline override final def contains(point: Point): Boolean = {
containsOrCrosses(point) == Contains
}
@inline override final def containsOrCrosses(point: Point) = {
var inside = false
var touches = false
val loopIterator = new LoopIterator()
while (loopIterator.hasNext && !touches) {
val edge = loopIterator.next()
inside ^= R2Loop.intersects(point, edge)
touches |= edge.contains(point)
}
if (touches) Touches else if (inside) Contains else Disjoint
}
@inline override def intersects(line: Line): Boolean = {
var lineIntersects = false
val loopIterator = new LoopIterator()
while (loopIterator.hasNext && !lineIntersects) {
val edge = loopIterator.next()
lineIntersects = edge.intersects(line)
}
lineIntersects
}
override def iterator() = new LoopIterator()
override def toString = s"R2Loop(${xcoordinates.mkString(",")}," +
s" ${ycoordinates.mkString(",")}," +
s" $startIndex," +
s" $endIndex)"
class LoopIterator extends Iterator[Line] {
private val start: Point = new Point()
private val end: Point = new Point()
private val edge = new Line()
private var i = startIndex
private var j = startIndex + 1
@inline override final def hasNext: Boolean = i < endIndex
@inline override final def next(): Line = {
start.setX(xcoordinates(i))
start.setY(ycoordinates(i))
end.setX(xcoordinates(j))
end.setY(ycoordinates(j))
edge.setStart(start)
edge.setEnd(end)
i += 1
j += 1
edge
}
}
}
private [geometry] object R2Loop {
/**
* Checks if the ray from a given point out to infinity on Y axis intersects
* this line. This function checks for strict intersection:
* a ray that is collinear with the line is not considered to intersect the line.
*
* @param point
* @param line
* @return
*/
@inline def intersects(point: Point, line: Line): Boolean = {
val (start, end) = (line.getStart(), line.getEnd())
val slope = (end.getY() - start.getY())/ (end.getX() - start.getX())
val cond1 = (start.getX() <= point.getX()) && (point.getX() < end.getX())
val cond2 = (end.getX() <= point.getX()) && (point.getX() < start.getX())
val above = (point.getY() < slope * (point.getX() - start.getX()) + start.getY())
((cond1 || cond2) && above )
}
}
================================================
FILE: src/main/scala/magellan/index/Index.scala
================================================
/**
* Copyright 2015 Ram Sriharsha
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package magellan.index
import magellan.BoundingBox
import org.apache.spark.sql.types.DataType
/**
* An abstraction for a spatial curve based 2D Index.
* A spatial curve represents a two dimensional grid of a given precision.
*/
trait Index extends DataType with Serializable {
def precision(): Int
def code(): String
def bits(): Long
def boundingBox(): BoundingBox
def toBase32(): String
override def defaultSize: Int = 4096
override def asNullable: DataType = this
}
================================================
FILE: src/main/scala/magellan/index/Indexer.scala
================================================
/**
* Copyright 2015 Ram Sriharsha
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package magellan.index
import java.util
import magellan.{Point, Relate, Shape}
trait Indexer[T <: Index] extends Serializable {
/**
* Output the smallest spatial curve that covers given point at given precision
*
* @param point
* @param precision
* @return
*/
def index(point: Point, precision: Int): T
/**
* Output the set of all spatial curves that cover the given shape at given precision
*
* @param shape
* @param precision
* @return
*/
def index(shape: Shape, precision: Int): Seq[T]
/**
* Outputs the set of all spatial curves that cover the given shape at a given precision,
* along with metadata about the nature of the relation. A spatial index can either Contain
* the shape, Intersect the shape, or be Within the shape.
*
* @param shape
* @param precision
* @return
*/
def indexWithMeta(shape: Shape, precision: Int): Seq[(T, Relate)]
def indexWithMetaAsJava(shape: Shape, precision: Int): util.List[(T, String)] = {
val indices = new util.ArrayList[(T, String)]()
indexWithMeta(shape, precision) foreach {
case (index: T, relation: Relate) =>
indices.add((index, relation.name()))
}
indices
}
}
================================================
FILE: src/main/scala/magellan/index/ZOrderCurve.scala
================================================
/**
* Copyright 2015 Ram Sriharsha
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package magellan.index
import magellan.BoundingBox
import org.apache.spark.sql.types._
@SQLUserDefinedType(udt = classOf[ZOrderCurveUDT])
class ZOrderCurve(
override val boundingBox: BoundingBox,
override val precision: Int,
override val bits: Long) extends Index {
private val BoundingBox(xmin, ymin, xmax, ymax) = boundingBox
def children(): Seq[ZOrderCurve] = {
val (xmid, ymid) = (xmin + (xmax - xmin)/ 2.0, ymin + (ymax - ymin)/ 2.0)
val b:Long = bits >> (64 - precision)
val parts = Array(
(BoundingBox(xmin, ymin, xmid, ymid), {b << 2 | 0x0}),
(BoundingBox(xmin, ymid, xmid, ymax), {b << 2 | 0x1}),
(BoundingBox(xmid, ymin, xmax, ymid), {(b << 1 | 0x1) << 1}),
(BoundingBox(xmid, ymid, xmax, ymax), {((b << 1 | 0x1) << 1) | 0x1})
)
parts.map(v => new ZOrderCurve(v._1, precision + 2, v._2 << (62 - precision)))
}
def code(): String = {
val sb = new StringBuilder
var b = this.bits
var i = 0
val FLAG = 0x8000000000000000l
while (i < precision) {
if ((b & FLAG) == FLAG) {
sb.append('1')
} else {
sb.append('0')
}
b <<= 1
i += 1
}
sb.toString()
}
override def toBase32(): String = {
val BASE32 = Array('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'b', 'c', 'd', 'e', 'f',
'g', 'h', 'j', 'k', 'm', 'n', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z')
if (precision % 5 != 0) {
throw new IllegalStateException("Cannot convert a geohash to base32 if the precision is not a multiple of 5.")
}
val sb = new StringBuilder()
val firstFiveBitsMask = 0xf800000000000000l
var b = bits
val partialChunks = Math.ceil((precision / 5)).toInt
var i = 0
while (i < partialChunks) {
val pointer = ((b & firstFiveBitsMask) >>> 59).toInt
sb.append(BASE32(pointer))
b <<= 5
i += 1
}
return sb.toString()
}
override def toString = s"ZOrderCurve($xmin, $ymin, $xmax, $ymax, $precision, $bits, $code)"
def canEqual(other: Any): Boolean = other.isInstanceOf[ZOrderCurve]
override def equals(other: Any): Boolean = other match {
case that: ZOrderCurve =>
(that canEqual this) &&
precision == that.precision &&
bits == that.bits
case _ => false
}
override def hashCode(): Int = {
val state = Seq(precision, bits)
state.map(_.hashCode()).foldLeft(0)((a, b) => 31 * a + b)
}
}
================================================
FILE: src/main/scala/magellan/index/ZOrderCurveIndexer.scala
================================================
/**
* Copyright 2015 Ram Sriharsha
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package magellan.index
import magellan._
import magellan.Relate._
import scala.collection.mutable.ListBuffer
class ZOrderCurveIndexer(
boundingBox: BoundingBox)
extends Indexer[ZOrderCurve] {
def this() = this(BoundingBox(-180, -90, 180, 90))
private val BoundingBox(xmin, ymin, xmax, ymax) = boundingBox
override def index(point: Point, precision: Int): ZOrderCurve = {
var currentPrecision = 0
var evenBit = true
var xrange = Array(xmin, xmax)
var yrange = Array(ymin, ymax)
var bits = 0L
def encode(v: Double, range: Array[Double]): Unit = {
val mid = range(0) + (range(1) - range(0))/ 2.0
if (v < mid) {
// add off bit
bits <<= 1
range.update(1, mid)
} else {
// add on bit
bits <<= 1
bits = bits | 0x1
range.update(0, mid)
}
currentPrecision += 1
}
while (currentPrecision < precision) {
if (evenBit) {
encode(point.getX(), xrange)
} else {
encode(point.getY(), yrange)
}
evenBit = !evenBit
}
bits <<= (64 - precision)
new ZOrderCurve(BoundingBox(xrange(0), yrange(0), xrange(1), yrange(1)), precision, bits)
}
override def index(shape: Shape, precision: Int): Seq[ZOrderCurve] = {
indexWithMeta(shape, precision).map(_._1)
}
override def indexWithMeta(shape: Shape, precision: Int) = {
shape match {
case p: Point => ListBuffer((index(p, precision), Contains))
case _ => {
val candidates = cover(shape.boundingBox, precision)
val results = new ListBuffer[(ZOrderCurve, Relate)]
for (candidate <- candidates) {
// check if the candidate actually lies within the shape
val box = candidate.boundingBox
val relation = box.relate(shape)
if (relation != Disjoint) {
results.+= ((candidate, relation))
}
}
results
}
}
}
/**
* Returns the curves of a given precision that cover the bounding box.
*
* @param box
* @return
*/
def cover(box: BoundingBox, precision: Int): ListBuffer[ZOrderCurve] = {
val BoundingBox(xmin, ymin, xmax, ymax) = box
val leftBottom = index(Point(xmin, ymin), precision)
val BoundingBox(startX, startY, endX, endY) = leftBottom.boundingBox
val xdelta = Math.abs(endX - startX)
val ydelta = Math.abs(endY - startY)
val cover = new ListBuffer[ZOrderCurve]()
var i = startX
while (i <= xmax) {
var j = startY
while (j <= ymax) {
val candidate = index(Point(i, j), precision)
// check if the candidate intersects the box
if (box.intersects(candidate.boundingBox)) {
cover.+= (index(Point(i, j), precision))
}
j += ydelta
}
i += xdelta
}
cover
}
}
================================================
FILE: src/main/scala/magellan/io/OsmShape.scala
================================================
package magellan.io
import org.apache.spark.SerializableWritable
import java.io.{DataInput, DataOutput, ByteArrayOutputStream}
import org.apache.hadoop.io.{Writable, Text, FloatWritable, MapWritable, ArrayWritable}
import magellan.{Shape, Point}
import collection.JavaConversions._
case class OsmKey(val shapeType: String, val id: String) extends Serializable { }
abstract class OsmShape(val id: String, val tags: Map[String, String]) extends Serializable { }
case class OsmNode(
override val id: String,
val lat: Double,
val lon: Double,
override val tags: Map[String, String])
extends OsmShape(id, tags) {
def point: Point = Point(lon, lat)
}
case class OsmWay(
override val id: String,
val nodeIds: Seq[String],
override val tags: Map[String, String])
extends OsmShape(id, tags) { }
case class OsmRelation(
override val id: String,
val wayIds: Seq[String],
override val tags: Map[String, String])
extends OsmShape(id, tags) { }
================================================
FILE: src/main/scala/magellan/io/ShapeKey.scala
================================================
/**
* Copyright 2015 Ram Sriharsha
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package magellan.io
import java.io.{DataOutput, DataInput}
import org.apache.hadoop.io
import org.apache.hadoop.io.{Text, LongWritable, Writable}
private[magellan] class ShapeKey extends Writable {
var fileNamePrefix: Text = new Text()
var recordIndex: LongWritable = new io.LongWritable()
def setFileNamePrefix(fileNamePrefix: String) = {
val f = fileNamePrefix.getBytes()
this.fileNamePrefix.clear()
this.fileNamePrefix.append(f, 0, f.length)
}
def setRecordIndex(recordIndex: Long) = {
this.recordIndex.set(recordIndex)
}
def getRecordIndex(): Long = recordIndex.get()
def getFileNamePrefix(): String = fileNamePrefix.toString()
override def write(dataOutput: DataOutput): Unit = ???
override def readFields(dataInput: DataInput): Unit = ???
}
================================================
FILE: src/main/scala/magellan/io/ShapeReader.scala
================================================
/**
* Copyright 2015 Ram Sriharsha
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package magellan.io
import java.io.DataInput
import java.lang.{Double, Long}
import scala.collection.mutable.ArrayBuffer
import org.apache.commons.io.EndianUtils
import magellan._
private[magellan] trait ShapeReader {
def readFields(dataInput: DataInput): Shape
}
class NullShapeReader extends ShapeReader {
override def readFields(dataInput: DataInput): Shape = ???
}
private[magellan] class PointReader extends ShapeReader {
override def readFields(dataInput: DataInput): Shape = {
val x = EndianUtils.swapDouble(dataInput.readDouble())
val y = EndianUtils.swapDouble(dataInput.readDouble())
Point(x, y)
}
}
private[magellan] class PolygonReader extends ShapeReader {
override def readFields(dataInput: DataInput): Polygon = {
// extract bounding box.
val xmin = EndianUtils.swapDouble(dataInput.readDouble())
val ymin = EndianUtils.swapDouble(dataInput.readDouble())
val xmax = EndianUtils.swapDouble(dataInput.readDouble())
val ymax = EndianUtils.swapDouble(dataInput.readDouble())
val box = BoundingBox(xmin, ymin, xmax, ymax)
// numRings
val numRings = EndianUtils.swapInteger(dataInput.readInt())
val numPoints = EndianUtils.swapInteger(dataInput.readInt())
val indices = Array.fill(numRings)(-1)
def tryl2b(l: Integer): Int = {
if ((0 <= l) && (l < numRings)) {
l
} else {
EndianUtils.swapInteger(l)
}
}
for (ring <- 0 until numRings) {
val s = tryl2b(dataInput.readInt())
indices(ring) = s
}
val xcoordinates = Array.fill(numPoints)(0.0)
val ycoordinates = Array.fill(numPoints)(0.0)
for (index <- 0 until numPoints) {
val x = Double.longBitsToDouble(Long.reverseBytes(dataInput.readLong()))
val y = Double.longBitsToDouble(Long.reverseBytes(dataInput.readLong()))
xcoordinates.update(index, x)
ycoordinates.update(index, y)
}
val polygon = new Polygon()
polygon.init(indices, xcoordinates, ycoordinates, box)
polygon
}
}
private[magellan] class PolyLineReader extends ShapeReader {
def extract(dataInput: DataInput): (Array[Int], Array[Point]) = {
// extract bounding box.
(0 until 4).foreach { _ => EndianUtils.swapDouble(dataInput.readDouble())}
// numRings
val numRings = EndianUtils.swapInteger(dataInput.readInt())
val numPoints = EndianUtils.swapInteger(dataInput.readInt())
val indices = Array.fill(numRings)(-1)
def tryl2b(l: Integer): Int = {
if ((0 <= l) && (l < numRings)) {
l
} else {
EndianUtils.swapInteger(l)
}
}
for (ring <- 0 until numRings) {
val s = tryl2b(dataInput.readInt())
indices(ring) = s
}
val points = ArrayBuffer[Point]()
for (_ <- 0 until numPoints) {
points.+= {
val x = EndianUtils.swapDouble(dataInput.readDouble())
val y = EndianUtils.swapDouble(dataInput.readDouble())
Point(x, y)
}
}
(indices, points.toArray)
}
override def readFields(dataInput: DataInput): Shape = {
val (indices, points) = extract(dataInput)
PolyLine(indices, points)
}
}
private[magellan] class PolyLineZReader extends PolyLineReader {
override def readFields(dataInput: DataInput): Shape = {
val (indices, points) = extract(dataInput)
// throw away the Z and M values
val size = points.length
(0 until (4 + 2 * size)).foreach(_ => dataInput.readDouble())
if(indices.size != points.size)
PolyLine( new Array[Int](points.size), points)
else
PolyLine(indices, points)
}
}
================================================
FILE: src/main/scala/magellan/io/ShapeWritable.scala
================================================
/**
* Copyright 2015 Ram Sriharsha
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package magellan.io
import java.io.{DataInput, DataOutput}
import magellan.Shape
import org.apache.commons.io.EndianUtils
import org.apache.hadoop.io.Writable
private[magellan] class ShapeWritable extends Writable {
var shape: Shape = _
override def write(dataOutput: DataOutput): Unit = {
???
}
override def readFields(dataInput: DataInput): Unit = {
val shapeType = EndianUtils.swapInteger(dataInput.readInt())
val h = shapeType match {
case 0 => new NullShapeReader()
case 1 => new PointReader()
case 3 => new PolyLineReader()
case 5 => new PolygonReader()
case 13 => new PolyLineZReader()
case _ => ???
}
shape = h.readFields(dataInput)
}
}
================================================
FILE: src/main/scala/magellan/mapreduce/DBInputFormat.scala
================================================
/**
* Copyright 2015 Ram Sriharsha
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package magellan.mapreduce
import java.util
import scala.collection.JavaConversions.seqAsJavaList
import org.apache.hadoop.fs.Path
import org.apache.hadoop.io.MapWritable
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat
import org.apache.hadoop.mapreduce.{InputSplit, JobContext, TaskAttemptContext}
import magellan.io.ShapeKey
private[magellan] class DBInputFormat extends FileInputFormat[ShapeKey, MapWritable] {
override def createRecordReader(inputSplit: InputSplit,
taskAttemptContext: TaskAttemptContext) = {
new DBReader
}
override def isSplitable(context: JobContext, filename: Path): Boolean = false
override def getSplits(job: JobContext): util.List[InputSplit] = {
try {
super.getSplits(job)
}catch {
case e: Exception => seqAsJavaList(List[InputSplit]())
}
}
}
================================================
FILE: src/main/scala/magellan/mapreduce/DBReader.scala
================================================
/**
* Copyright 2015 Ram Sriharsha
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package magellan.mapreduce
import java.io.DataInputStream
import scala.collection.mutable.ListBuffer
import org.apache.commons.io.EndianUtils
import org.apache.hadoop.conf.Configuration
import org.apache.hadoop.io._
import org.apache.hadoop.mapreduce.lib.input.FileSplit
import org.apache.hadoop.mapreduce.{InputSplit, RecordReader, TaskAttemptContext}
import magellan.io.ShapeKey
private[magellan] class DBReader extends RecordReader[ShapeKey, MapWritable] {
private var key: ShapeKey = new ShapeKey()
private var value: MapWritable = new MapWritable()
private var dis: DataInputStream = _
private var numRecords: Int = _
private var currentByte: Byte = _
private var recordsRead: Int = 0
private var numBytesInRecord: Int = _
private var fieldDescriptors: ListBuffer[(Text, Byte, Int, Byte)] = _
override def getProgress: Float = recordsRead / numRecords.toFloat
override def nextKeyValue(): Boolean = {
// handle record deleted flag
if (recordsRead < numRecords) {
currentByte = dis.readByte()
while (currentByte == 0x2A) {
(0 until numBytesInRecord).foreach(_ => dis.readInt())
}
if (currentByte != 0x1A) {
extractKeyValue()
true
} else {
false
}
} else {
false
}
}
private def extractKeyValue(): Unit = {
value.clear()
for ((fieldName, fieldType, length, decimalCount) <- fieldDescriptors) {
val v = fieldType match {
case 'C' => {
val b = Array.fill[Byte](length)(0)
dis.readFully(b)
val fld = new Text()
fld.append(b, 0, length)
fld
}
case 'N' | 'F' => {
val b = Array.fill[Byte](length)(0)
dis.readFully(b)
val fld = new Text()
fld.clear()
fld.set(new String(b))
fld
}
case _ => ???
}
value.put(fieldName, v)
}
recordsRead += 1
key.setRecordIndex(key.getRecordIndex() + 1)
}
override def getCurrentValue: MapWritable = {
value
}
override def initialize(inputSplit: InputSplit,
taskAttemptContext: TaskAttemptContext): Unit = {
val split = inputSplit.asInstanceOf[FileSplit]
val job = MapReduceUtils.getConfigurationFromContext(taskAttemptContext)
val start = split.getStart()
val end = start + split.getLength()
val file = split.getPath()
val fs = file.getFileSystem(job)
val is = fs.open(split.getPath())
dis = new DataInputStream(is)
// version
dis.readByte()
// date in YYMMDD format
val date = Array.fill[Byte](3)(0)
dis.read(date)
numRecords = EndianUtils.swapInteger(dis.readInt())
val numBytesInHeader = EndianUtils.swapShort(dis.readShort())
numBytesInRecord = EndianUtils.swapShort(dis.readShort())
// skip the next 20 bytes
(0 until 20).foreach {_ => dis.readByte()}
// field descriptors
fieldDescriptors = new ListBuffer()
var first = dis.readByte()
while (first != 0x0d) {
// 48 byte field descriptor
val f = Array.fill[Byte](11)(0)
dis.readFully(f, 1, 10)
f(0) = first
val fieldName = new Text()
val terminalIndex = f.indexWhere(_ == 0)
fieldName.append(f, 0, if (terminalIndex == -1) f.length else terminalIndex)
val fieldType = dis.readByte()
dis.readInt()
val fieldLength = dis.readUnsignedByte()
val decimalCount = dis.readByte()
fieldDescriptors.+= ((fieldName, fieldType, fieldLength, decimalCount))
// drain 14 more bytes
(0 until 14).foreach {_ => dis.readByte()}
first = dis.readByte()
}
key.setFileNamePrefix(split.getPath.getName.split("\\.")(0))
}
override def getCurrentKey: ShapeKey = key
override def close(): Unit = dis.close()
}
================================================
FILE: src/main/scala/magellan/mapreduce/MapReduceUtils.scala
================================================
/**
* Copyright 2015 Databricks
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package magellan.mapreduce
import org.apache.hadoop.conf.Configuration
import org.apache.hadoop.mapreduce.TaskAttemptContext
private[magellan] object MapReduceUtils {
def getConfigurationFromContext(context: TaskAttemptContext): Configuration = {
// Use reflection to get the Configuration. This is necessary because TaskAttemptContext
// is a class in Hadoop 1.x and an interface in Hadoop 2.x.
val method = context.getClass.getMethod("getConfiguration")
method.invoke(context).asInstanceOf[Configuration]
}
}
================================================
FILE: src/main/scala/magellan/mapreduce/OsmInputFormat.scala
================================================
package magellan.mapreduce
import org.apache.hadoop.fs.Path
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat
import org.apache.hadoop.mapreduce.{InputSplit, JobContext, RecordReader, TaskAttemptContext}
import magellan.io.{OsmKey, OsmShape}
class OsmInputFormat extends FileInputFormat[OsmKey, OsmShape] {
override def createRecordReader(
split: InputSplit,
context: TaskAttemptContext) : RecordReader[OsmKey, OsmShape] = {
new OsmRecordReader
}
override def isSplitable(context: JobContext, filename: Path): Boolean = false
}
================================================
FILE: src/main/scala/magellan/mapreduce/OsmRecordReader.scala
================================================
package magellan.mapreduce
import magellan.io.{OsmKey, OsmShape, OsmNode, OsmWay, OsmRelation}
import org.apache.hadoop.mapreduce.lib.input.FileSplit
import org.apache.hadoop.mapreduce.{InputSplit, RecordReader, TaskAttemptContext}
import scala.xml.{XML, Elem, Node}
private[magellan] class OsmRecordReader
extends RecordReader[OsmKey, OsmShape] {
val definedNodeLabels = Set("node", "way", "relation")
var nodes : Seq[Node] = _
var current : Int = 0
lazy val total = nodes.length
override def initialize(genericSplit: InputSplit, context: TaskAttemptContext) : Unit = {
val split: FileSplit = genericSplit.asInstanceOf[FileSplit]
val job = MapReduceUtils.getConfigurationFromContext(context)
val file = split.getPath()
val fs = file.getFileSystem(job)
val fileIn = fs.open(file)
val doc = XML.load(fileIn)
fileIn.close()
nodes = doc.child.filter(n => definedNodeLabels contains n.label)
}
override def nextKeyValue() : Boolean = {
if (!nodes.isEmpty) {
if (current != 0) nodes = nodes.tail
current += 1
}
!nodes.isEmpty
}
override def getCurrentKey() : OsmKey = {
val current = nodes.head
new OsmKey(current.label, (current \ "@id").text)
}
def getTags(shape: Node) = {
(shape \ "tag").map(t => (t \ "@k").text -> (t \ "@v").text).toMap
}
def getOsmNode(shape: Node) = {
new OsmNode(
(shape \ "@id").text,
(shape \ "@lat").text.toDouble,
(shape \ "@lon").text.toDouble,
getTags(shape))
}
def getOsmWay(shape: Node) = {
new OsmWay((shape \ "@id").text, (shape \ "nd").map(w => (w \ "@ref").text), getTags(shape))
}
def getOsmRelation(shape: Node) = {
new OsmRelation(
(shape \ "@id").text,
(shape \ "member").map(r => (r \ "@ref").text), getTags(shape)
)
}
override def getCurrentValue() : OsmShape = {
val current = nodes.head
current.label match {
case "node" => getOsmNode(current)
case "way" => getOsmWay(current)
case "relation" => getOsmRelation(current)
}
}
override def getProgress() : Float = {
current.toFloat / total
}
override def close() : Unit = { }
}
================================================
FILE: src/main/scala/magellan/mapreduce/ShapeInputFormat.scala
================================================
/**
* Copyright 2015 Ram Sriharsha
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package magellan.mapreduce
import com.google.common.base.Stopwatch
import magellan.io.{ShapeKey, ShapeWritable}
import org.apache.commons.logging.LogFactory
import org.apache.hadoop.fs.{LocatedFileStatus, Path}
import org.apache.hadoop.mapreduce.lib.input._
import org.apache.hadoop.mapreduce.{InputSplit, JobContext, TaskAttemptContext}
import scala.collection.JavaConversions._
import scala.collection.mutable.ListBuffer
private[magellan] class ShapeInputFormat
extends FileInputFormat[ShapeKey, ShapeWritable] {
private val log = LogFactory.getLog(classOf[ShapeInputFormat])
override def createRecordReader(inputSplit: InputSplit,
taskAttemptContext: TaskAttemptContext) = {
new ShapefileReader
}
override def isSplitable(context: JobContext, filename: Path): Boolean = true
override def getSplits(job: JobContext): java.util.List[InputSplit] = {
val splitInfos = SplitInfos.SPLIT_INFO_MAP.get()
computeSplits(job, splitInfos)
}
private def computeSplits(
job: JobContext,
splitInfos: scala.collection.Map[String, Array[Long]]) = {
val sw = new Stopwatch().start
val splits = ListBuffer[InputSplit]()
val files = listStatus(job)
for (file <- files) {
val path = file.getPath
val length = file.getLen
val blkLocations = if (file.isInstanceOf[LocatedFileStatus]) {
file.asInstanceOf[LocatedFileStatus].getBlockLocations
} else {
val fs = path.getFileSystem(job.getConfiguration)
fs.getFileBlockLocations(file, 0, length)
}
val key = path.getName.split("\\.shp$")(0)
if (splitInfos == null || !splitInfos.containsKey(key)) {
val blkIndex = getBlockIndex(blkLocations, 0)
splits.+= (makeSplit(path, 0, length, blkLocations(blkIndex).getHosts,
blkLocations(blkIndex).getCachedHosts))
} else {
val s = splitInfos(key).toSeq
val start = s
val end = s.drop(1) ++ Seq(length)
start.zip(end).foreach { case (startOffset: Long, endOffset: Long) =>
val blkIndex = getBlockIndex(blkLocations, startOffset)
splits.+=(makeSplit(path, startOffset, endOffset - startOffset, blkLocations(blkIndex).getHosts,
blkLocations(blkIndex).getCachedHosts))
}
}
}
sw.stop
if (log.isDebugEnabled) {
log.debug("Total # of splits generated by getSplits: " + splits.size + ", TimeTaken: " + sw.elapsedMillis)
}
splits
}
}
object SplitInfos {
// TODO: Can we get rid of this hack to pass split calculation to the Shapefile Reader?
val SPLIT_INFO_MAP = new ThreadLocal[scala.collection.Map[String, Array[Long]]]
}
================================================
FILE: src/main/scala/magellan/mapreduce/ShapefileReader.scala
================================================
/**
* Copyright 2015 Ram Sriharsha
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package magellan.mapreduce
import java.io.DataInputStream
import org.apache.commons.io.EndianUtils
import org.apache.hadoop.mapreduce.lib.input.FileSplit
import org.apache.hadoop.mapreduce.{InputSplit, RecordReader, TaskAttemptContext}
import magellan.io.{ShapeKey, ShapeWritable}
private[magellan] class ShapefileReader extends RecordReader[ShapeKey, ShapeWritable] {
private val key: ShapeKey = new ShapeKey()
private var value: ShapeWritable = _
private var dis: DataInputStream = _
private var remaining: BigInt = _
override def getProgress: Float = 0
override def nextKeyValue(): Boolean = {
if (remaining <= 0) {
false
} else {
// record header has fixed length of 8 bytes
// byte 0 = record #, byte 4 = content length
val recordNumber = dis.readInt()
// record numbers begin at 1
require(recordNumber > 0)
val contentLength = 2 * (dis.readInt() + 4)
value.readFields(dis)
remaining -= contentLength
key.setRecordIndex(key.getRecordIndex() + 1)
true
}
}
override def getCurrentValue: ShapeWritable = value
override def initialize(inputSplit: InputSplit, taskAttemptContext: TaskAttemptContext) {
val split = inputSplit.asInstanceOf[FileSplit]
val job = MapReduceUtils.getConfigurationFromContext(taskAttemptContext)
val path = split.getPath()
val fs = path.getFileSystem(job)
val is = fs.open(path)
val (start, end) = {
val v = split.getStart
if (v == 0) {
is.seek(24)
(100L, 2 * is.readInt().toLong)
} else {
(v, v + split.getLength)
}
}
is.seek(start)
dis = new DataInputStream(is)
key.setFileNamePrefix(split.getPath.getName.split("\\.")(0))
value = new ShapeWritable()
remaining = (end - start)
}
override def getCurrentKey: ShapeKey = key
override def close(): Unit = dis.close()
}
================================================
FILE: src/main/scala/magellan/mapreduce/ShxInputFormat.scala
================================================
/**
* Copyright 2015 Ram Sriharsha
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package magellan.mapreduce
import java.io.DataInputStream
import org.apache.commons.io.EndianUtils
import org.apache.hadoop.fs.Path
import org.apache.hadoop.io._
import org.apache.hadoop.mapreduce.lib.input.{FileInputFormat, FileSplit}
import org.apache.hadoop.mapreduce.{InputSplit, JobContext, RecordReader, TaskAttemptContext}
import scala.collection.mutable.ListBuffer
class ShxInputFormat extends FileInputFormat[Text, ArrayWritable] {
override def createRecordReader(
split: InputSplit,
context: TaskAttemptContext): RecordReader[Text, ArrayWritable] = {
new ShxReader()
}
override def isSplitable(context: JobContext, filename: Path): Boolean = false
}
class ShxReader extends RecordReader[Text, ArrayWritable] {
private var dis: DataInputStream = _
override def getProgress: Float = ???
private var done: Boolean = false
private var splits:ArrayWritable = _
private var key: Text = new Text()
private val MAX_SPLIT_SIZE = "mapreduce.input.fileinputformat.split.maxsize"
private val MIN_SPLIT_SIZE = "mapreduce.input.fileinputformat.split.minsize"
override def nextKeyValue(): Boolean = if (done) false else {
done = true
true
}
override def getCurrentValue: ArrayWritable = {
splits
}
override def initialize(inputSplit: InputSplit, context: TaskAttemptContext): Unit = {
val split = inputSplit.asInstanceOf[FileSplit]
val job = MapReduceUtils.getConfigurationFromContext(context)
val start = split.getStart()
val end = start + split.getLength()
val path = split.getPath()
val fs = path.getFileSystem(job)
key.set(split.getPath.getName.split("\\.")(0))
val is = fs.open(path)
dis = new DataInputStream(is)
require(is.readInt() == 9994)
// skip the next 20 bytes which should all be zero
0 until 5 foreach {_ => require(is.readInt() == 0)}
// file length in bits
val len = is.readInt()
val numRecords = (2 * len - 100) / 8
val version = EndianUtils.swapInteger(is.readInt())
require(version == 1000)
// shape type: all the shapes in a given split have the same type
is.readInt()
// skip the next 64 bytes
0 until 8 foreach {_ => is.readDouble()}
// iterate over the offset and content length of each record
var j = 0
val minSplitSize = job.getLong(MIN_SPLIT_SIZE, 1L)
val maxSplitSize = job.getLong(MAX_SPLIT_SIZE, Long.MaxValue)
val shpFileName = path.getName.replace("\\.shx$", "\\.shp")
val blockSize = fs.getFileStatus(new Path(path.getParent, shpFileName)).getBlockSize
val splitSize = Math.max(minSplitSize, Math.min(maxSplitSize, blockSize))
// num bytes
val v = new ListBuffer[Writable]()
var startOffset: Long = Long.MinValue
while (j < numRecords) {
val offset = dis.readInt()
// skip the next 4 bytes (the content length)
dis.readInt()
if (startOffset == Long.MinValue) {
startOffset = offset
}
else if (offset - startOffset > splitSize) {
v.+= (new LongWritable(startOffset * 2))
startOffset = offset
}
j += 1
}
// if empty add starting offset
if (v.isEmpty) {
v.+= (new LongWritable(startOffset * 2))
}
splits = new ArrayWritable(classOf[LongWritable], v.toArray)
}
override def getCurrentKey: Text = key
override def close() {}
}
================================================
FILE: src/main/scala/magellan/mapreduce/WholeFileInputFormat.scala
================================================
/**
* Copyright 2015 Ram Sriharsha
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package magellan.mapreduce
import org.apache.hadoop.fs.Path
import org.apache.hadoop.io.{NullWritable, Text}
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat
import org.apache.hadoop.mapreduce.{InputSplit, JobContext, TaskAttemptContext}
class WholeFileInputFormat extends FileInputFormat[NullWritable, Text] {
override def createRecordReader(inputSplit: InputSplit,
taskAttemptContext: TaskAttemptContext) = {
new WholeFileReader()
}
override def isSplitable(context: JobContext, filename: Path): Boolean = false
}
================================================
FILE: src/main/scala/magellan/mapreduce/WholeFileReader.scala
================================================
/**
* Copyright 2015 Ram Sriharsha
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package magellan.mapreduce
import java.io.InputStream
import org.apache.commons.io.IOUtils
import org.apache.hadoop.conf.Configuration
import org.apache.hadoop.fs.{FSDataInputStream, FileSystem, Path}
import org.apache.hadoop.io.compress.{CodecPool, CompressionCodecFactory, Decompressor}
import org.apache.hadoop.io.{NullWritable, Text}
import org.apache.hadoop.mapreduce.lib.input.FileSplit
import org.apache.hadoop.mapreduce.{InputSplit, RecordReader, TaskAttemptContext}
class WholeFileReader extends RecordReader[NullWritable, Text] {
private val key = NullWritable.get()
private val value = new Text()
private var split: FileSplit = _
private var conf: Configuration = _
private var path: Path = _
private var done: Boolean = false
override def getProgress: Float = ???
override def nextKeyValue(): Boolean = {
if (done){
false
} else {
val fs = path.getFileSystem(conf)
var is: FSDataInputStream = null
var in: InputStream = null
var decompressor: Decompressor = null
try {
is = fs.open(split.getPath)
val codec = new CompressionCodecFactory(conf).getCodec(path)
if (codec != null) {
decompressor = CodecPool.getDecompressor(codec)
in = codec.createInputStream(is, decompressor)
} else {
in = is
}
val result = IOUtils.toByteArray(in)
value.clear()
value.set(result)
done = true
true
} finally {
if (in != null) {
IOUtils.closeQuietly(in)
}
if (decompressor != null) {
CodecPool.returnDecompressor(decompressor)
}
}
}
}
override def getCurrentValue: Text = value
override def initialize(inputSplit: InputSplit,
taskAttemptContext: TaskAttemptContext): Unit = {
this.split = inputSplit.asInstanceOf[FileSplit]
this.conf = MapReduceUtils.getConfigurationFromContext(taskAttemptContext)
this.path = this.split.getPath
}
override def getCurrentKey: NullWritable = key
override def close() {}
}
================================================
FILE: src/main/scala/org/apache/spark/sql/catalyst/expressions/functions.scala
================================================
/**
* Copyright 2015 Ram Sriharsha
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.spark.sql.catalyst.expressions
import magellan.catalyst.MagellanExpression
import magellan.index.{ZOrderCurve, ZOrderCurveIndexer}
import magellan.{GeoJSON, Point, Relate, Shape}
import org.apache.spark.sql.catalyst.InternalRow
import org.apache.spark.sql.catalyst.expressions.codegen._
import org.apache.spark.sql.catalyst.util.GenericArrayData
import org.apache.spark.sql.types._
import org.apache.spark.unsafe.types.UTF8String
import scala.collection.mutable.ListBuffer
/**
* Convert x and y coordinates to a `Point`
*
* @param left
* @param right
*/
case class PointConverter(
override val left: Expression,
override val right: Expression) extends BinaryExpression {
override def nullable: Boolean = false
override val dataType = new PointUDT
override def nullSafeEval(leftEval: Any, rightEval: Any): Any = {
val x = leftEval.asInstanceOf[Double]
val y = rightEval.asInstanceOf[Double]
dataType.serialize(x, y)
}
override protected def doGenCode(ctx: CodegenContext, ev: ExprCode): ExprCode = {
val pnt = ctx.addMutableState(classOf[PointUDT].getName, "pointUDT", v => s"$v = new org.apache.spark.sql.types.PointUDT();")
defineCodeGen(ctx, ev, (c1, c2) => s"$pnt.serialize($c1, $c2)")
}
}
case class Transformer(
override val child: Expression,
fn: Point => Point)
extends UnaryExpression with MagellanExpression {
protected override def nullSafeEval(input: Any): Any = {
val shape = newInstance(input.asInstanceOf[InternalRow])
serialize(shape.transform(fn))
}
override def nullable: Boolean = child.nullable
override def dataType: DataType = child.dataType
override protected def doGenCode(ctx: CodegenContext, ev: ExprCode): ExprCode = {
val serializersVar = ctx.addMutableState(classOf[java.util.HashMap[Integer, UserDefinedType[Shape]]].getName, "serializers",
v =>s"$v = new java.util.HashMap>() ;" +
s"$v.put(1, new org.apache.spark.sql.types.PointUDT());" +
s"$v.put(2, new org.apache.spark.sql.types.LineUDT());" +
s"$v.put(3, new org.apache.spark.sql.types.PolyLineUDT());" +
s"$v.put(5, new org.apache.spark.sql.types.PolygonUDT());" +
"")
val shapeVar = ctx.freshName("shape")
val childTypeVar = ctx.freshName("childType")
val childShapeVar = ctx.freshName("childShape")
val serializerVar = ctx.freshName("serializer")
val idx = ctx.references.length
ctx.addReferenceObj("fn", fn);
nullSafeCodeGen(ctx, ev, (c1) => {
s"" +
s"Integer $childTypeVar = $c1.getInt(0); \n" +
s"org.apache.spark.sql.types.UserDefinedType $serializerVar = " +
s"((org.apache.spark.sql.types.UserDefinedType)" +
s"$serializersVar.get($childTypeVar)); \n" +
s"magellan.Shape $childShapeVar = (magellan.Shape)" +
s"$serializerVar.deserialize($c1); \n" +
s"magellan.Shape $shapeVar = $childShapeVar.transform((scala.Function1)references[$idx]); \n" +
s"${ev.value} = (org.apache.spark.sql.catalyst.InternalRow)$serializerVar.serialize($shapeVar); \n"
})
}
}
/**
* Extracts shapes from WKT Text.
*
* @param child
*/
case class WKT(override val child: Expression)
extends UnaryExpression with MagellanExpression {
override protected def doGenCode(ctx: CodegenContext, ev: ExprCode): ExprCode = {
val serializersVar = ctx.addMutableState(classOf[java.util.HashMap[Integer, UserDefinedType[Shape]]].getName, "serializers",
v => s"$v = new java.util.HashMap>() ;" +
s"$v.put(1, new org.apache.spark.sql.types.PointUDT());" +
s"$v.put(2, new org.apache.spark.sql.types.LineUDT());" +
s"$v.put(3, new org.apache.spark.sql.types.PolyLineUDT());" +
s"$v.put(5, new org.apache.spark.sql.types.PolygonUDT());" +
"")
val childTypeVar = ctx.freshName("childType")
val childShapeVar = ctx.freshName("childShape")
val serializerVar = ctx.freshName("serializer")
val indexVar = ctx.freshName("index")
val resultVar = ctx.freshName("result")
val idx = ctx.references.length
nullSafeCodeGen(ctx, ev, (c1) => {
s"" +
s"String text = ${c1}.toString();\n" +
s"magellan.Shape $childShapeVar = (magellan.Shape) " +
s"magellan.WKTParser.parseAll(text);\n" +
s"Integer $childTypeVar = $childShapeVar.getType();\n" +
s"org.apache.spark.sql.types.UserDefinedType $serializerVar =" +
s" (org.apache.spark.sql.types.UserDefinedType) $serializersVar.get($childTypeVar);\n" +
s"Integer $indexVar = -1; \n" +
s"if ($childTypeVar == 1) {$indexVar = 0;}\n" +
s"else if ($childTypeVar == 2 || $childTypeVar == 3) {$indexVar = 1;} \n" +
s"else {$indexVar = 2;} \n" +
s"org.apache.spark.sql.catalyst.expressions.GenericInternalRow $resultVar = " +
s" new org.apache.spark.sql.catalyst.expressions.GenericInternalRow(3);\n" +
s"$resultVar.update($indexVar, $serializerVar.serialize($childShapeVar)); \n" +
s"${ev.value} = $resultVar; \n"
})
}
override def dataType: DataType = {
StructType(List(StructField("point", new PointUDT(), true),
StructField("polyline", new PolyLineUDT(), true),
StructField("polygon", new PolygonUDT(), true)))
}
}
/**
* Geohash Indexes a given shape expression to a specified precision.
*
* @param child
* @param precision
*/
case class Indexer(
override val child: Expression,
precision: Int)
extends UnaryExpression with MagellanExpression {
private val indexer = new ZOrderCurveIndexer()
private val indexUDT = Indexer.indexUDT
assert(precision % 5 == 0)
protected override def nullSafeEval(input: Any): Any = {
val shape = newInstance(input.asInstanceOf[InternalRow])
val rows = ListBuffer[InternalRow]()
indexer.indexWithMeta(shape, precision) foreach {
case (index: ZOrderCurve, relation: Relate) => {
val row = new GenericInternalRow(2)
row.update(0, indexUDT.serialize(index))
row.update(1, UTF8String.fromString(relation.name()))
rows.+= (row)
}
}
new GenericArrayData(rows)
}
override def nullable: Boolean = false
override def dataType: DataType = Indexer.dataType
override protected def doGenCode(ctx: CodegenContext, ev: ExprCode): ExprCode = {
val childTypeVar = ctx.freshName("childType")
val childShapeVar = ctx.freshName("childShape")
val shapeSerializerVar = ctx.freshName("shapeSerializer")
val indexerVar = ctx.freshName("indexer")
val precisionVar = ctx.freshName("precision")
val resultsVar = ctx.freshName("results")
val indexSerializerVar = ctx.freshName("indexSerializer")
val indexVar = ctx.freshName("v")
val serializersVar = ctx.addMutableState(classOf[java.util.HashMap[Integer, UserDefinedType[Shape]]].getName, "serializers",
v => s"$v = new java.util.HashMap>() ;" +
s"$v.put(1, new org.apache.spark.sql.types.PointUDT());" +
s"$v.put(2, new org.apache.spark.sql.types.LineUDT());" +
s"$v.put(3, new org.apache.spark.sql.types.PolyLineUDT());" +
s"$v.put(5, new org.apache.spark.sql.types.PolygonUDT());" +
"")
val idx = ctx.references.length
ctx.addReferenceObj(s"$indexerVar", indexer)
ctx.addReferenceObj(s"$precisionVar", precision)
ctx.addReferenceObj(s"$indexSerializerVar", new ZOrderCurveUDT)
nullSafeCodeGen(ctx, ev, (c1) => {
s"" +
s"magellan.index.ZOrderCurveIndexer $indexerVar = (magellan.index.ZOrderCurveIndexer)references[$idx]; \n" +
s"Integer $childTypeVar = $c1.getInt(0); \n" +
s"Integer $precisionVar = (Integer) references[$idx + 1]; \n" +
s"org.apache.spark.sql.types.ZOrderCurveUDT $indexSerializerVar = " +
s" (org.apache.spark.sql.types.ZOrderCurveUDT) references[$idx + 2]; \n" +
s"org.apache.spark.sql.types.UserDefinedType $shapeSerializerVar = " +
s"((org.apache.spark.sql.types.UserDefinedType)" +
s"$serializersVar.get($childTypeVar)); \n" +
s"magellan.Shape $childShapeVar = (magellan.Shape)" +
s"$shapeSerializerVar.deserialize($c1); \n" +
s"java.util.List> $indexVar =" +
s" $indexerVar.indexWithMetaAsJava($childShapeVar, $precisionVar); \n" +
s"java.util.List $resultsVar = new java.util.ArrayList($indexVar.size()); \n" +
s"for(scala.Tuple2 i : $indexVar) { \n" +
s" org.apache.spark.sql.catalyst.expressions.GenericInternalRow row =\n" +
s" new org.apache.spark.sql.catalyst.expressions.GenericInternalRow(2);\n" +
s" row.update(0, $indexSerializerVar.serialize(i._1()));\n" +
s" row.update(1, org.apache.spark.unsafe.types.UTF8String.fromString((String)i._2())); \n" +
s" $resultsVar.add(row); \n" +
s"}\n" +
s"${ev.value} = new org.apache.spark.sql.catalyst.util.GenericArrayData($resultsVar); \n"
})
}
}
case class AsGeoJSON(override val child: Expression)
extends UnaryExpression with MagellanExpression {
override def nullable: Boolean = false
override def dataType: DataType = StringType
override protected def nullSafeEval(input: Any): Any = {
val shape = newInstance(input.asInstanceOf[InternalRow])
val json = GeoJSON.writeJson(shape)
org.apache.spark.unsafe.types.UTF8String.fromString(json)
}
override protected def doGenCode(ctx: CodegenContext, ev: ExprCode): ExprCode = {
val childTypeVar = ctx.freshName("childType")
val childShapeVar = ctx.freshName("childShape")
val shapeSerializerVar = ctx.freshName("shapeSerializer")
val resultVar = ctx.freshName("result")
val serializersVar = ctx.addMutableState(classOf[java.util.HashMap[Integer, UserDefinedType[Shape]]].getName, "serializers",
v => s"$v = new java.util.HashMap>() ;" +
s"$v.put(1, new org.apache.spark.sql.types.PointUDT());" +
s"$v.put(2, new org.apache.spark.sql.types.LineUDT());" +
s"$v.put(3, new org.apache.spark.sql.types.PolyLineUDT());" +
s"$v.put(5, new org.apache.spark.sql.types.PolygonUDT());" +
"")
nullSafeCodeGen(ctx, ev, (c1) => {
s"" +
s"Integer $childTypeVar = $c1.getInt(0); \n" +
s"org.apache.spark.sql.types.UserDefinedType $shapeSerializerVar = " +
s"((org.apache.spark.sql.types.UserDefinedType)" +
s"$serializersVar.get($childTypeVar)); \n" +
s"magellan.Shape $childShapeVar = (magellan.Shape)" +
s"$shapeSerializerVar.deserialize($c1); \n" +
s"java.lang.String $resultVar = magellan.GeoJSON.writeJson($childShapeVar); \n" +
s"${ev.value} = org.apache.spark.unsafe.types.UTF8String.fromString($resultVar); \n"
})
}
}
case class Buffer(override val child: Expression, distance: Double)
extends UnaryExpression with MagellanExpression {
override def nullable: Boolean = false
override def dataType: DataType = new PolygonUDT()
override protected def nullSafeEval(input: Any): Any = {
val shape = newInstance(input.asInstanceOf[InternalRow])
val bufferedShape = shape.buffer(distance)
serialize(bufferedShape)
}
override protected def doGenCode(ctx: CodegenContext, ev: ExprCode): ExprCode = {
val childTypeVar = ctx.freshName("childType")
val childShapeVar = ctx.freshName("childShape")
val shapeSerializerVar = ctx.freshName("shapeSerializer")
val resultSerializerVar = ctx.freshName("resultSerializer")
val distanceVar = ctx.freshName("distance")
val resultVar = ctx.freshName("result")
val resultTypeVar = ctx.freshName("resultType")
val idx = ctx.references.length
ctx.addReferenceObj("distance", distance);
val serializersVar = ctx.addMutableState(classOf[java.util.HashMap[Integer, UserDefinedType[Shape]]].getName, "serializers",
v => s"$v = new java.util.HashMap>() ;" +
s"$v.put(1, new org.apache.spark.sql.types.PointUDT());" +
s"$v.put(2, new org.apache.spark.sql.types.LineUDT());" +
s"$v.put(3, new org.apache.spark.sql.types.PolyLineUDT());" +
s"$v.put(5, new org.apache.spark.sql.types.PolygonUDT());" +
"")
nullSafeCodeGen(ctx, ev, (c1) => {
s"" +
s"Integer $childTypeVar = $c1.getInt(0); \n" +
s"Double $distanceVar = (Double) references[$idx]; \n" +
s"org.apache.spark.sql.types.UserDefinedType $shapeSerializerVar = " +
s"((org.apache.spark.sql.types.UserDefinedType)" +
s"$serializersVar.get($childTypeVar)); \n" +
s"magellan.Shape $childShapeVar = (magellan.Shape)" +
s"$shapeSerializerVar.deserialize($c1); \n" +
s"magellan.Shape $resultVar = $childShapeVar.buffer($distanceVar); \n" +
s"Integer $resultTypeVar = $resultVar.getType(); \n" +
s"org.apache.spark.sql.types.UserDefinedType $resultSerializerVar = " +
s"((org.apache.spark.sql.types.UserDefinedType)" +
s"$serializersVar.get($resultTypeVar)); \n" +
s"${ev.value} = (org.apache.spark.sql.catalyst.InternalRow)$resultSerializerVar.serialize($resultVar); \n"
})
}
}
object Indexer {
val indexUDT = new ZOrderCurveUDT()
val dataType = ArrayType(new StructType()
.add("curve", indexUDT)
.add("relation", StringType))
}
================================================
FILE: src/main/scala/org/apache/spark/sql/catalyst/expressions/predicates.scala
================================================
/**
* Copyright 2015 Ram Sriharsha
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.spark.sql.catalyst.expressions
import magellan._
import magellan.catalyst._
import org.apache.spark.sql.catalyst.InternalRow
import org.apache.spark.sql.catalyst.expressions.codegen._
import org.apache.spark.sql.types.{BooleanType, DataType, UserDefinedType}
/**
* A function that returns the intersection between the left and right shapes.
* @param left
* @param right
*/
case class Intersects(left: Expression, right: Expression)
extends BinaryExpression with MagellanExpression {
override def toString: String = s"$nodeName($left, $right)"
override def dataType: DataType = BooleanType
override def nullable: Boolean = left.nullable || right.nullable
override protected def nullSafeEval(leftEval: Any, rightEval: Any): Any = {
val leftRow = leftEval.asInstanceOf[InternalRow]
val rightRow = rightEval.asInstanceOf[InternalRow]
// check if the right bounding box intersects left bounding box.
val ((lxmin, lymin), (lxmax, lymax)) = (
(leftRow.getDouble(1), leftRow.getDouble(2)),
(leftRow.getDouble(3), leftRow.getDouble(4))
)
val ((rxmin, rymin), (rxmax, rymax)) = (
(rightRow.getDouble(1), rightRow.getDouble(2)),
(rightRow.getDouble(3), rightRow.getDouble(4))
)
if (!(rxmax < lxmin || rxmin > lxmax) &&
!(rymax < lymin || rymin > lymax)) {
val leftShape = newInstance(leftRow)
val rightShape = newInstance(rightRow)
rightShape.intersects(leftShape)
} else {
false
}
}
override protected def doGenCode(ctx: CodegenContext, ev: ExprCode): ExprCode = {
val serializersVar = ctx.addMutableState(classOf[java.util.HashMap[Integer, UserDefinedType[Shape]]].getName, "serializers",
v => s"$v = new java.util.HashMap>() ;" +
s"$v.put(1, new org.apache.spark.sql.types.PointUDT());" +
s"$v.put(2, new org.apache.spark.sql.types.LineUDT());" +
s"$v.put(3, new org.apache.spark.sql.types.PolyLineUDT());" +
s"$v.put(5, new org.apache.spark.sql.types.PolygonUDT());" +
"")
val lxminVar = ctx.freshName("lxmin")
val lyminVar = ctx.freshName("lymin")
val lxmaxVar = ctx.freshName("lxmax")
val lymaxVar = ctx.freshName("lymax")
val rxminVar = ctx.freshName("rxmin")
val ryminVar = ctx.freshName("rymin")
val rxmaxVar = ctx.freshName("rxmax")
val rymaxVar = ctx.freshName("rymax")
val ltypeVar = ctx.freshName("ltype")
val rtypeVar = ctx.freshName("rtype")
val leftShapeVar = ctx.freshName("leftShape")
val rightShapeVar = ctx.freshName("rightShape")
nullSafeCodeGen(ctx, ev, (c1, c2) => {
s"" +
s"Double $lxminVar = $c1.getDouble(1);" +
s"Double $lyminVar = $c1.getDouble(2);" +
s"Double $lxmaxVar = $c1.getDouble(3);" +
s"Double $lymaxVar = $c1.getDouble(4);" +
s"Double $rxminVar = $c2.getDouble(1);" +
s"Double $ryminVar = $c2.getDouble(2);" +
s"Double $rxmaxVar = $c2.getDouble(3);" +
s"Double $rymaxVar = $c2.getDouble(4);" +
s"Boolean intersects = false;" +
s"if(!($rxmaxVar < $lxminVar || $rxminVar > $lxmaxVar) && !($rymaxVar < $lyminVar || $ryminVar > $lymaxVar)) {" +
s"Integer $ltypeVar = $c1.getInt(0);" +
s"Integer $rtypeVar = $c2.getInt(0);" +
s"magellan.Shape $leftShapeVar = (magellan.Shape)" +
s"((org.apache.spark.sql.types.UserDefinedType)" +
s"$serializersVar.get($ltypeVar)).deserialize($c1);" +
s"magellan.Shape $rightShapeVar = (magellan.Shape)" +
s"((org.apache.spark.sql.types.UserDefinedType)" +
s"$serializersVar.get($rtypeVar)).deserialize($c2);" +
s"intersects = $rightShapeVar.intersects($leftShapeVar);" +
s"}" +
s"${ev.value} = intersects;"
})
}
}
/**
* A function that returns true if the shape `left` is within the shape `right`.
*/
case class Within(left: Expression, right: Expression)
extends BinaryExpression with MagellanExpression {
override def toString: String = s"$nodeName($left, $right)"
override def dataType: DataType = BooleanType
override def nullSafeEval(leftEval: Any, rightEval: Any): Any = {
val leftRow = leftEval.asInstanceOf[InternalRow]
val rightRow = rightEval.asInstanceOf[InternalRow]
// check if the right bounding box contains left bounding box.
val ((lxmin, lymin), (lxmax, lymax)) = (
(leftRow.getDouble(1), leftRow.getDouble(2)),
(leftRow.getDouble(3), leftRow.getDouble(4))
)
val ((rxmin, rymin), (rxmax, rymax)) = (
(rightRow.getDouble(1), rightRow.getDouble(2)),
(rightRow.getDouble(3), rightRow.getDouble(4))
)
if (rxmin <= lxmin && rymin <= lymin && rxmax >= lxmax && rymax >= lymax) {
val leftShape = newInstance(leftRow)
val rightShape = newInstance(rightRow)
rightShape.contains(leftShape)
} else {
false
}
}
override def nullable: Boolean = left.nullable || right.nullable
override protected def doGenCode(ctx: CodegenContext, ev: ExprCode): ExprCode = {
val serializersVar = ctx.addMutableState(classOf[java.util.HashMap[Integer, UserDefinedType[Shape]]].getName, "serializers",
v => s"$v = new java.util.HashMap>() ;" +
s"$v.put(1, new org.apache.spark.sql.types.PointUDT());" +
s"$v.put(2, new org.apache.spark.sql.types.LineUDT());" +
s"$v.put(3, new org.apache.spark.sql.types.PolyLineUDT());" +
s"$v.put(5, new org.apache.spark.sql.types.PolygonUDT());" +
"")
val lxminVar = ctx.freshName("lxmin")
val lyminVar = ctx.freshName("lymin")
val lxmaxVar = ctx.freshName("lxmax")
val lymaxVar = ctx.freshName("lymax")
val rxminVar = ctx.freshName("rxmin")
val ryminVar = ctx.freshName("rymin")
val rxmaxVar = ctx.freshName("rxmax")
val rymaxVar = ctx.freshName("rymax")
val ltypeVar = ctx.freshName("ltype")
val rtypeVar = ctx.freshName("rtype")
val leftShapeVar = ctx.freshName("leftShape")
val rightShapeVar = ctx.freshName("rightShape")
nullSafeCodeGen(ctx, ev, (c1, c2) => {
s"" +
s"Double $lxminVar = $c1.getDouble(1);" +
s"Double $lyminVar = $c1.getDouble(2);" +
s"Double $lxmaxVar = $c1.getDouble(3);" +
s"Double $lymaxVar = $c1.getDouble(4);" +
s"Double $rxminVar = $c2.getDouble(1);" +
s"Double $ryminVar = $c2.getDouble(2);" +
s"Double $rxmaxVar = $c2.getDouble(3);" +
s"Double $rymaxVar = $c2.getDouble(4);" +
s"Boolean within = false;" +
s"if ($rxminVar <= $lxminVar && $ryminVar <= $lyminVar && $rxmaxVar >= $lxmaxVar && $rymaxVar >= $lymaxVar) {" +
s"Integer $ltypeVar = $c1.getInt(0);" +
s"Integer $rtypeVar = $c2.getInt(0);" +
s"magellan.Shape $leftShapeVar = (magellan.Shape)" +
s"((org.apache.spark.sql.types.UserDefinedType)" +
s"$serializersVar.get($ltypeVar)).deserialize($c1);" +
s"magellan.Shape $rightShapeVar = (magellan.Shape)" +
s"((org.apache.spark.sql.types.UserDefinedType)" +
s"$serializersVar.get($rtypeVar)).deserialize($c2);" +
s"within = $rightShapeVar.contains($leftShapeVar);" +
s"}" +
s"${ev.value} = within;"
})
}
}
/**
* A function that returns true if the Shape defined by the child expression
* lies within the bounding box.
*
* @param child
* @param boundingBox
*/
case class WithinRange(child: Expression, boundingBox: BoundingBox)
extends UnaryExpression with MagellanExpression {
override def dataType: DataType = BooleanType
override def nullable: Boolean = child.nullable
override def nullSafeEval(leftEval: Any): Any = {
val leftRow = leftEval.asInstanceOf[InternalRow]
// check if the bounding box contains the child's bounding box.
val ((lxmin, lymin), (lxmax, lymax)) = (
(leftRow.getDouble(1), leftRow.getDouble(2)),
(leftRow.getDouble(3), leftRow.getDouble(4))
)
val childBoundingBox = BoundingBox(lxmin, lymin, lxmax, lymax)
boundingBox.contains(childBoundingBox)
}
override protected def doGenCode(ctx: CodegenContext, ev: ExprCode): ExprCode = {
val lxminVar = ctx.freshName("lxmin")
val lyminVar = ctx.freshName("lymin")
val lxmaxVar = ctx.freshName("lxmax")
val lymaxVar = ctx.freshName("lymax")
val ltypeVar = ctx.freshName("ltype")
val idx = ctx.references.length
ctx.addReferenceObj("boundingBox", boundingBox)
val boundingBoxVar = ctx.freshName("boundingBox")
val otherBoundingBoxVar = ctx.freshName("boundingBox")
nullSafeCodeGen(ctx, ev, c1 => {
s"" +
s"Double $lxminVar = $c1.getDouble(1);" +
s"Double $lyminVar = $c1.getDouble(2);" +
s"Double $lxmaxVar = $c1.getDouble(3);" +
s"Double $lymaxVar = $c1.getDouble(4);" +
s"magellan.BoundingBox $boundingBoxVar = (magellan.BoundingBox)references[$idx];" +
s"magellan.BoundingBox $otherBoundingBoxVar = new magellan.BoundingBox($lxminVar, $lyminVar, $lxmaxVar, $lymaxVar);" +
s"${ev.value} = $boundingBoxVar.contains($otherBoundingBoxVar);"
})
}
}
/**
* An Expression that returns true if the shape is within a circle of
* prescribed radius around the given point.
*
* @param child
* @param point
* @param radius
*/
case class WithinCircleRange(child: Expression, point: Point, radius: Double)
extends UnaryExpression with MagellanExpression {
override def dataType: DataType = BooleanType
override def nullable: Boolean = child.nullable
override def nullSafeEval(leftEval: Any): Any = {
val leftRow = leftEval.asInstanceOf[InternalRow]
// check if the bounding box intersects the given circle.
val ((lxmin, lymin), (lxmax, lymax)) = (
(leftRow.getDouble(1), leftRow.getDouble(2)),
(leftRow.getDouble(3), leftRow.getDouble(4))
)
val childBoundingBox = BoundingBox(lxmin, lymin, lxmax, lymax)
childBoundingBox.withinCircle(point, radius)
}
override protected def doGenCode(ctx: CodegenContext, ev: ExprCode): ExprCode = {
val lxminVar = ctx.freshName("lxmin")
val lyminVar = ctx.freshName("lymin")
val lxmaxVar = ctx.freshName("lxmax")
val lymaxVar = ctx.freshName("lymax")
val ltypeVar = ctx.freshName("ltype")
val idx = ctx.references.length
ctx.addReferenceObj("point", point)
ctx.addReferenceObj("radius", radius)
val originVar = ctx.freshName("origin")
val radiusVar = ctx.freshName("radius")
val otherBoundingBoxVar = ctx.freshName("boundingBox")
nullSafeCodeGen(ctx, ev, c1 => {
s"" +
s"Double $lxminVar = $c1.getDouble(1);" +
s"Double $lyminVar = $c1.getDouble(2);" +
s"Double $lxmaxVar = $c1.getDouble(3);" +
s"Double $lymaxVar = $c1.getDouble(4);" +
s"magellan.Point $originVar = (magellan.Point)references[$idx];" +
s"Double $radiusVar = (Double)references[$idx + 1];" +
s"magellan.BoundingBox $otherBoundingBoxVar = new magellan.BoundingBox($lxminVar, $lyminVar, $lxmaxVar, $lymaxVar);" +
s"${ev.value} = $otherBoundingBoxVar.withinCircle($originVar, $radiusVar);"
})
}
}
================================================
FILE: src/main/scala/org/apache/spark/sql/catalyst/expressions/serdes.scala
================================================
package org.apache.spark.sql.catalyst.expressions
import magellan._
import magellan.catalyst.MagellanExpression
import org.apache.spark.sql.catalyst.InternalRow
import org.apache.spark.sql.catalyst.expressions.codegen.CodegenFallback
import org.apache.spark.sql.types._
case class MagellanSerializer(
override val child: Expression,
_dataType: DataType)
extends UnaryExpression
with MagellanExpression
with CodegenFallback
with NonSQLExpression {
override def nullable: Boolean = false
override protected def nullSafeEval(input: Any): Any = {
val shape = input.asInstanceOf[Shape]
serialize(shape)
}
override def dataType: DataType = _dataType
}
case class MagellanDeserializer(
override val child: Expression, klass: Class[_ <: Shape])
extends UnaryExpression
with MagellanExpression
with CodegenFallback
with NonSQLExpression {
override def nullable: Boolean = false
override protected def nullSafeEval(input: Any): Any = {
newInstance(input.asInstanceOf[InternalRow])
}
override def dataType: DataType = ObjectType(klass)
}
================================================
FILE: src/main/scala/org/apache/spark/sql/types/GeometricUDT.scala
================================================
/**
* Copyright 2015 Ram Sriharsha
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.spark.sql.types
import magellan.Shape
import org.apache.spark.sql.catalyst.InternalRow
trait GeometricUDT {
def serialize(shape: Shape): InternalRow
val geometryType: Int
}
================================================
FILE: src/main/scala/org/apache/spark/sql/types/LineUDT.scala
================================================
package org.apache.spark.sql.types
import magellan._
import org.apache.spark.sql.catalyst.InternalRow
import org.apache.spark.sql.catalyst.expressions.GenericInternalRow
class LineUDT extends UserDefinedType[Line] with GeometricUDT {
override def sqlType: DataType = StructType(
Seq(
StructField("type", IntegerType, nullable = false),
StructField("xmin", DoubleType, nullable = false),
StructField("ymin", DoubleType, nullable = false),
StructField("xmax", DoubleType, nullable = false),
StructField("ymax", DoubleType, nullable = false),
StructField("startX", DoubleType, nullable = false),
StructField("startY", DoubleType, nullable = false),
StructField("endX", DoubleType, nullable = false),
StructField("endY", DoubleType, nullable = false)
))
override def serialize(line: Line): InternalRow = {
val row = new GenericInternalRow(9)
row.setInt(0, 2)
val BoundingBox(xmin, ymin, xmax, ymax) = line.boundingBox
row.setDouble(1, xmin)
row.setDouble(2, ymin)
row.setDouble(3, xmax)
row.setDouble(4, ymax)
row.setDouble(5, line.getStart().getX())
row.setDouble(6, line.getStart().getY())
row.setDouble(7, line.getEnd().getX())
row.setDouble(8, line.getEnd().getY())
row
}
override def serialize(shape: Shape) = serialize(shape.asInstanceOf[Line])
override def userClass: Class[Line] = classOf[Line]
override def deserialize(datum: Any): Line = {
val row = datum.asInstanceOf[InternalRow]
val startX = row.getDouble(5)
val startY = row.getDouble(6)
val endX = row.getDouble(7)
val endY = row.getDouble(8)
val line = new Line()
val start = Point(startX, startY)
val end = Point(endX, endY)
line.setStart(start)
line.setEnd(end)
line
}
override def pyUDT: String = "magellan.types.LineUDT"
override val geometryType = new Line().getType()
}
================================================
FILE: src/main/scala/org/apache/spark/sql/types/PointUDT.scala
================================================
package org.apache.spark.sql.types
import magellan._
import org.apache.spark.sql.catalyst.InternalRow
import org.apache.spark.sql.catalyst.expressions.GenericInternalRow
class PointUDT extends UserDefinedType[Point] with GeometricUDT {
override val sqlType: StructType = StructType(
Seq(
StructField("type", IntegerType, nullable = false),
StructField("xmin", DoubleType, nullable = false),
StructField("ymin", DoubleType, nullable = false),
StructField("xmax", DoubleType, nullable = false),
StructField("ymax", DoubleType, nullable = false),
StructField("x", DoubleType, nullable = false),
StructField("y", DoubleType, nullable = false)
))
override def serialize(point: Point): InternalRow = {
val row = new GenericInternalRow(7)
row.setInt(0, point.getType())
row.setDouble(1, point.getX())
row.setDouble(2, point.getY())
row.setDouble(3, point.getX())
row.setDouble(4, point.getY())
row.setDouble(5, point.getX())
row.setDouble(6, point.getY())
row
}
override def serialize(shape: Shape) = serialize(shape.asInstanceOf[Point])
override def userClass: Class[Point] = classOf[Point]
override def deserialize(datum: Any): Point = {
val row = datum.asInstanceOf[InternalRow]
require(row.numFields == 7)
Point(row.getDouble(5), row.getDouble(6))
}
override def pyUDT: String = "magellan.types.PointUDT"
def serialize(x: Double, y: Double): InternalRow = {
val row = new GenericInternalRow(7)
row.setInt(0, 1)
row.setDouble(1, x)
row.setDouble(2, y)
row.setDouble(3, x)
row.setDouble(4, y)
row.setDouble(5, x)
row.setDouble(6, y)
row
}
override val geometryType = new Point().getType()
}
================================================
FILE: src/main/scala/org/apache/spark/sql/types/PolyLineUDT.scala
================================================
package org.apache.spark.sql.types
import magellan._
import org.apache.spark.sql.catalyst.InternalRow
import org.apache.spark.sql.catalyst.expressions.GenericInternalRow
class PolyLineUDT extends UserDefinedType[PolyLine] with GeometricUDT {
override val sqlType: StructType = StructType(
Seq(
StructField("type", IntegerType, nullable = false),
StructField("xmin", DoubleType, nullable = false),
StructField("ymin", DoubleType, nullable = false),
StructField("xmax", DoubleType, nullable = false),
StructField("ymax", DoubleType, nullable = false),
StructField("indices", ArrayType(IntegerType, containsNull = false), nullable = true),
StructField("xcoordinates", ArrayType(DoubleType, containsNull = false), nullable = true),
StructField("ycoordinates", ArrayType(DoubleType, containsNull = false), nullable = true)
))
override def serialize(polyLine: PolyLine): InternalRow = {
polyLine.serialize()
}
override def serialize(shape: Shape) = serialize(shape.asInstanceOf[PolyLine])
override def userClass: Class[PolyLine] = classOf[PolyLine]
override def deserialize(datum: Any): PolyLine = {
val row = datum.asInstanceOf[InternalRow]
val polyline = new PolyLine()
polyline.init(row)
polyline
}
override def pyUDT: String = "magellan.types.PolyLineUDT"
override val geometryType = new PolyLine().getType()
}
================================================
FILE: src/main/scala/org/apache/spark/sql/types/PolygonUDT.scala
================================================
package org.apache.spark.sql.types
import magellan._
import org.apache.spark.sql.catalyst.InternalRow
import org.apache.spark.sql.catalyst.expressions.GenericInternalRow
class PolygonUDT extends UserDefinedType[Polygon] with GeometricUDT {
override val sqlType: StructType = StructType(Seq(
StructField("type", IntegerType, nullable = false),
StructField("xmin", DoubleType, nullable = false),
StructField("ymin", DoubleType, nullable = false),
StructField("xmax", DoubleType, nullable = false),
StructField("ymax", DoubleType, nullable = false),
StructField("indices", ArrayType(IntegerType, containsNull = false), nullable = true),
StructField("xcoordinates", ArrayType(DoubleType, containsNull = false), nullable = true),
StructField("ycoordinates", ArrayType(DoubleType, containsNull = false), nullable = true)
))
override def serialize(polygon: Polygon): InternalRow = {
polygon.serialize()
}
override def serialize(shape: Shape) = serialize(shape.asInstanceOf[Polygon])
override def userClass: Class[Polygon] = classOf[Polygon]
override def deserialize(datum: Any): Polygon = {
val row = datum.asInstanceOf[InternalRow]
val polygon = new Polygon()
polygon.init(row)
polygon
}
override val geometryType = new Polygon().getType()
}
================================================
FILE: src/main/scala/org/apache/spark/sql/types/ZOrderCurveUDT.scala
================================================
/**
* Copyright 2015 Ram Sriharsha
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.spark.sql.types
import magellan.BoundingBox
import magellan.index.ZOrderCurve
import org.apache.spark.sql.catalyst.InternalRow
import org.apache.spark.sql.catalyst.expressions.GenericInternalRow
class ZOrderCurveUDT extends UserDefinedType[ZOrderCurve] {
override def sqlType: DataType = StructType(
Seq(
StructField("xmin", DoubleType, nullable = false),
StructField("ymin", DoubleType, nullable = false),
StructField("xmax", DoubleType, nullable = false),
StructField("ymax", DoubleType, nullable = false),
StructField("precision", IntegerType, nullable = false),
StructField("bits", LongType, nullable = false)
))
override def serialize(obj: ZOrderCurve): Any = {
val row = new GenericInternalRow(6)
val BoundingBox(xmin, ymin, xmax, ymax) = obj.boundingBox
row.setDouble(0, xmin)
row.setDouble(1, ymin)
row.setDouble(2, xmax)
row.setDouble(3, ymax)
row.setInt(4, obj.precision)
row.setLong(5, obj.bits)
row
}
override def deserialize(datum: Any): ZOrderCurve = {
val row = datum.asInstanceOf[InternalRow]
val boundingBox = BoundingBox(row.getDouble(0),
row.getDouble(1),
row.getDouble(2),
row.getDouble(3))
new ZOrderCurve(boundingBox, row.getInt(4), row.getLong(5))
}
override def userClass: Class[ZOrderCurve] = classOf[ZOrderCurve]
}
================================================
FILE: src/test/resources/geojson/linestring/example.geojson
================================================
{
"type": "FeatureCollection",
"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } },
"features": [
{ "type": "Feature", "properties": { "id": 1.0, "osm_id": 4338517.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.04864044239585, 37.408617050391001 ], [ -122.047741818556602, 37.408915362324983 ] ] } },
{ "type": "Feature", "properties": { "id": 2.0, "osm_id": 4338521.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.051969063784099, 37.426104634077063 ], [ -122.051549717168342, 37.42613866460399 ], [ -122.051163479070084, 37.426115362913173 ], [ -122.050830801333149, 37.426021653235672 ], [ -122.050276506076287, 37.425567856997866 ] ] } },
{ "type": "Feature", "properties": { "id": 3.0, "osm_id": 4338528.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.054632413517481, 37.416753196163498 ], [ -122.053074133898505, 37.417260133667426 ], [ -122.051241346950562, 37.417861283763024 ], [ -122.049256344641037, 37.418512138544486 ], [ -122.047023070359486, 37.419241364120552 ] ] } },
{ "type": "Feature", "properties": { "id": 4.0, "osm_id": 4338515.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.050928366686094, 37.426848025069567 ], [ -122.050901712233966, 37.426739730880563 ], [ -122.050909758861025, 37.426641746432445 ], [ -122.050941945369232, 37.426541666508555 ], [ -122.05100363617656, 37.426469163046093 ], [ -122.051094831283109, 37.426405292943919 ], [ -122.051215363050758, 37.426353828058467 ], [ -122.051969063784099, 37.426104634077063 ] ] } },
{ "type": "Feature", "properties": { "id": 5.0, "osm_id": 4338523.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.0488120199538, 37.423891560182184 ], [ -122.048578751588465, 37.42344849278043 ], [ -122.048567938933374, 37.423412282958736 ], [ -122.048567938933374, 37.423376073137021 ], [ -122.048600125441553, 37.423329134479225 ], [ -122.048656535649926, 37.423269539147682 ], [ -122.048723507056266, 37.423222684308953 ], [ -122.049015951658021, 37.423122520566011 ] ] } },
{ "type": "Feature", "properties": { "id": 6.0, "osm_id": 4338513.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.054473324995243, 37.428666478963052 ], [ -122.052690578009262, 37.429246422843626 ], [ -122.05258320582962, 37.429265533582871 ], [ -122.052465272451968, 37.429254972384875 ], [ -122.052333844210196, 37.429210129202858 ], [ -122.052202332149406, 37.429142068149126 ], [ -122.052095043788782, 37.429061098964432 ], [ -122.052017343546368, 37.428958839745754 ] ] } },
{ "type": "Feature", "properties": { "id": 7.0, "osm_id": 4338522.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.049327004084773, 37.423721072271647 ], [ -122.0488120199538, 37.423891560182184 ], [ -122.048713700229584, 37.423922992319078 ], [ -122.048425865674616, 37.42401502561593 ] ] } },
{ "type": "Feature", "properties": { "id": 8.0, "osm_id": 4338519.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.054523113500082, 37.422036728828914 ], [ -122.053543017562006, 37.422338728800263 ] ] } },
{ "type": "Feature", "properties": { "id": 9.0, "osm_id": 4338514.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.041497635968469, 37.408482856121218 ], [ -122.042312105499832, 37.40632895846273 ], [ -122.042406904824745, 37.405894272964161 ] ] } },
{ "type": "Feature", "properties": { "id": 10.0, "osm_id": 4338518.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.053248477484516, 37.417590380652484 ], [ -122.054523113500082, 37.422036728828914 ], [ -122.054628809299132, 37.422332358553838 ], [ -122.05461816428209, 37.422707281082779 ], [ -122.054500147085406, 37.423039539724577 ], [ -122.054190100487048, 37.423597439199845 ] ] } },
{ "type": "Feature", "properties": { "id": 11.0, "osm_id": 4338516.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.045671237015668, 37.404677639718493 ], [ -122.045582640299088, 37.404598766009634 ], [ -122.045515668892776, 37.404573285024 ], [ -122.04543780101227, 37.404566830958579 ], [ -122.045352054142796, 37.404583846222003 ], [ -122.044853163265927, 37.404745784591306 ], [ -122.044775379204467, 37.404794734905863 ], [ -122.044716370606125, 37.404860868121872 ], [ -122.044681418069885, 37.404926833699854 ], [ -122.044670773052871, 37.405001432638109 ], [ -122.04467873586087, 37.405080390165971 ], [ -122.045256416627609, 37.406217730607644 ] ] } },
{ "type": "Feature", "properties": { "id": 12.0, "osm_id": 4338529.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.04909633410945, 37.409507627603219 ], [ -122.047256925458001, 37.410109951165261 ], [ -122.045273850986206, 37.41075963248025 ], [ -122.043039906152387, 37.411493216645972 ] ] } },
{ "type": "Feature", "properties": { "id": 13.0, "osm_id": 4338473.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.04259734166483, 37.405549022372441 ], [ -122.042723237850495, 37.405794193040244 ], [ -122.045273850986206, 37.41075963248025 ], [ -122.049256344641037, 37.418512138544486 ], [ -122.052285564447942, 37.424408220693799 ], [ -122.052985872458095, 37.425771453425952 ], [ -122.054473324995243, 37.428666478963052 ], [ -122.054584133755213, 37.428882145331677 ] ] } },
{ "type": "Feature", "properties": { "id": 14.0, "osm_id": 8141139.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.04520185043792, 37.406111531894403 ], [ -122.045256416627609, 37.406217730607644 ], [ -122.047256925458001, 37.410109951165261 ], [ -122.051241346950562, 37.417861283763024 ], [ -122.053543017562006, 37.422338728800263 ], [ -122.054190100487048, 37.423597439199845 ], [ -122.054976742099853, 37.425127555624144 ], [ -122.055021333824754, 37.425214224502959 ] ] } },
{ "type": "Feature", "properties": { "id": 15.0, "osm_id": 10497697.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.407259055577242, 38.665386955553934 ], [ -121.406797045074299, 38.665786939973394 ], [ -121.406711046747745, 38.665846954400124 ], [ -121.406672070897997, 38.665868998805458 ], [ -121.406551036216158, 38.66592892941317 ], [ -121.406395048998093, 38.665982992688633 ], [ -121.40087405701577, 38.667163919026748 ], [ -121.400595023459118, 38.66719895538202 ] ] } },
{ "type": "Feature", "properties": { "id": 16.0, "osm_id": 10548118.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.272946960660633, 37.087696357558634 ], [ -122.273166063609594, 37.087927362810085 ], [ -122.273365552905148, 37.088167923431172 ], [ -122.273750282260806, 37.088677291687041 ], [ -122.274130150112626, 37.089180289696451 ], [ -122.274465510058633, 37.089704745378071 ] ] } },
{ "type": "Feature", "properties": { "id": 17.0, "osm_id": 22567191.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.357168407567158, 37.613539747014826 ], [ -122.357292543553157, 37.613591882452589 ], [ -122.358902120419572, 37.61426712857223 ], [ -122.359937704556643, 37.614701646432749 ], [ -122.364526125991901, 37.616626634315573 ], [ -122.366946735809393, 37.617642185704064 ], [ -122.370575177874144, 37.619164255501346 ], [ -122.376343938914275, 37.621584362404647 ], [ -122.380542769490035, 37.623345735537548 ], [ -122.381858057736039, 37.623897516223437 ], [ -122.382513857840337, 37.624172694104651 ], [ -122.383698556034858, 37.624669657143791 ], [ -122.388359648570628, 37.626624819878039 ], [ -122.38958650773813, 37.627139468732892 ], [ -122.389663537428305, 37.62717173906011 ], [ -122.390313302562305, 37.627446749303253 ], [ -122.391579975769901, 37.627975647393484 ], [ -122.392378100590065, 37.628310420606233 ], [ -122.392483125836819, 37.628354425597884 ], [ -122.393372948677722, 37.628727755565237 ] ] } },
{ "type": "Feature", "properties": { "id": 18.0, "osm_id": 23012037.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.117663654830054, 37.463761172274424 ], [ -122.11761051356396, 37.463707695732161 ], [ -122.11549726813584, 37.461576261574209 ], [ -122.114460259075202, 37.460530367696194 ], [ -122.112485063592359, 37.458538156949913 ], [ -122.112430665040776, 37.458483255484119 ] ] } },
{ "type": "Feature", "properties": { "id": 19.0, "osm_id": 23012050.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.11761051356396, 37.463707695732161 ], [ -122.117872867133258, 37.463541817868368 ], [ -122.117915782477525, 37.463490772078053 ] ] } },
{ "type": "Feature", "properties": { "id": 20.0, "osm_id": 23365562.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.370115514304132, 37.627215241137584 ], [ -122.370461938362283, 37.626692880931799 ], [ -122.376497914475607, 37.617612932861988 ], [ -122.37679773515211, 37.617160142452569 ], [ -122.377165113968204, 37.616581958771675 ], [ -122.379293782098159, 37.61337093548493 ], [ -122.381314156039096, 37.610323024033931 ], [ -122.38220154812808, 37.608984266459075 ] ] } },
{ "type": "Feature", "properties": { "id": 21.0, "osm_id": 23365564.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.380813672600624, 37.606696677444951 ], [ -122.379971542788752, 37.607936444743338 ], [ -122.376623726842254, 37.613021493941623 ], [ -122.376193232295222, 37.613656171649922 ], [ -122.373797265273055, 37.617273130507336 ], [ -122.371294345166461, 37.621023193987185 ], [ -122.369501372258611, 37.623727028312885 ], [ -122.368171918596261, 37.625731728094891 ], [ -122.367974440957468, 37.626029537114668 ], [ -122.366847577894845, 37.627728884164064 ], [ -122.366789575124855, 37.627816391233182 ] ] } },
{ "type": "Feature", "properties": { "id": 22.0, "osm_id": 23457020.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.222801722010914, 37.740282421082519 ], [ -122.221442764049385, 37.736406377597987 ], [ -122.220833651145767, 37.734668892889168 ], [ -122.220690152963442, 37.734259772195244 ], [ -122.219704944064461, 37.731449236242113 ], [ -122.219671667908827, 37.731354353098226 ] ] } },
{ "type": "Feature", "properties": { "id": 23.0, "osm_id": 23482076.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.219901834969974, 37.715310719871844 ], [ -122.220437522401809, 37.715675835574089 ], [ -122.220535339211835, 37.715773652384136 ], [ -122.220578254556074, 37.715867026785482 ], [ -122.220591665601134, 37.715977332631262 ], [ -122.220567441900982, 37.716083447525399 ], [ -122.220524526556744, 37.716174642631927 ], [ -122.220436013659224, 37.716259551311083 ], [ -122.218601466511643, 37.717547430733717 ], [ -122.218529046868213, 37.717615324149399 ], [ -122.218067623098491, 37.718050261105098 ] ] } },
{ "type": "Feature", "properties": { "id": 24.0, "osm_id": 23457014.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.225264576620361, 37.728497968134725 ], [ -122.224257071858929, 37.728732577604561 ], [ -122.221856075694902, 37.729289638889476 ], [ -122.21991943696662, 37.729729353529983 ], [ -122.219003965502026, 37.729947534469567 ], [ -122.218056978081478, 37.730166385961432 ], [ -122.215704680774863, 37.730713640419644 ] ] } },
{ "type": "Feature", "properties": { "id": 25.0, "osm_id": 23476654.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.218186981399697, 37.706613824777079 ], [ -122.218276332487534, 37.706535621620482 ], [ -122.218393343855837, 37.706454149521619 ], [ -122.218560646643155, 37.706365971900247 ], [ -122.218725267221529, 37.706304867826098 ], [ -122.218859461491334, 37.706267735995041 ], [ -122.219071858917744, 37.70623345401107 ], [ -122.219267576356842, 37.706226329393367 ], [ -122.219705363159605, 37.706249295808071 ], [ -122.220204840769696, 37.706310232244114 ], [ -122.220718735253271, 37.706409222520584 ], [ -122.221211255883716, 37.706537046543986 ], [ -122.221688605269463, 37.706698230542024 ], [ -122.222153633257534, 37.70688665572537 ], [ -122.222597957944771, 37.707112045101702 ], [ -122.222989560461031, 37.707334836088052 ], [ -122.223348305916858, 37.707546730600299 ] ] } },
{ "type": "Feature", "properties": { "id": 26.0, "osm_id": 23365560.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.393121910677706, 37.626287196818204 ], [ -122.39056467583849, 37.625224622952885 ], [ -122.389820279017641, 37.624912229421646 ], [ -122.389176800311034, 37.624642332139416 ], [ -122.388065359950218, 37.624176046865919 ], [ -122.385463701024165, 37.623084471615584 ], [ -122.384866238965955, 37.622833768891688 ], [ -122.383394125311611, 37.622216190265839 ], [ -122.382907639651407, 37.622011923285534 ], [ -122.382217976658296, 37.62172257998796 ], [ -122.378142108602091, 37.620012420283487 ], [ -122.374296072330935, 37.618398568646469 ], [ -122.371783010121462, 37.617344041408202 ], [ -122.368161273579204, 37.615824318543787 ], [ -122.365701352635853, 37.61479217098703 ], [ -122.358501046352714, 37.611770578712012 ], [ -122.358372719415129, 37.611716766893622 ] ] } },
{ "type": "Feature", "properties": { "id": 27.0, "osm_id": 23457050.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.217818429117173, 37.726088590067498 ], [ -122.219000528921725, 37.729432382700516 ], [ -122.219403447007267, 37.7305970481465 ], [ -122.219704944064461, 37.731449236242113 ] ] } },
{ "type": "Feature", "properties": { "id": 28.0, "osm_id": 23457060.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.209206358882511, 37.726265951138664 ], [ -122.209500815140984, 37.726841787886677 ], [ -122.209621430727637, 37.727070027110102 ], [ -122.209844054075944, 37.72750613753221 ] ] } },
{ "type": "Feature", "properties": { "id": 29.0, "osm_id": 23456987.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.222176851129333, 37.730459165839299 ], [ -122.222046763992083, 37.730417088685336 ], [ -122.21991943696662, 37.729729353529983 ], [ -122.219000528921725, 37.729432382700516 ], [ -122.214356367830391, 37.727930848566018 ], [ -122.212838572803733, 37.727440255773296 ], [ -122.209933405163781, 37.726501063522683 ], [ -122.209206358882511, 37.726265951138664 ], [ -122.204828071759806, 37.724850499149767 ], [ -122.204702259393187, 37.724809763100346 ] ] } },
{ "type": "Feature", "properties": { "id": 30.0, "osm_id": 23481809.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.24054813886697, 37.720807320515959 ], [ -122.239246513123163, 37.719939877356509 ], [ -122.238183771619802, 37.719231438900295 ], [ -122.238099114397727, 37.719177291805813 ], [ -122.238011439690538, 37.719131191338356 ], [ -122.237805412510539, 37.719026920462881 ], [ -122.236791872778795, 37.718538087869788 ], [ -122.234305967935583, 37.717338888982752 ], [ -122.234195913546898, 37.717280970031815 ], [ -122.234090972119176, 37.717214836815806 ], [ -122.230673167281168, 37.714936719352245 ], [ -122.226365539602227, 37.712065582239184 ], [ -122.225851226023508, 37.711722762399397 ], [ -122.225383934921595, 37.711411290877486 ], [ -122.224941957167246, 37.711116666980907 ], [ -122.224115082419146, 37.710565473028247 ], [ -122.218186981399697, 37.706613824777079 ], [ -122.217390952055311, 37.706083250306207 ], [ -122.21430196927875, 37.704024068153572 ], [ -122.214184203539176, 37.703930945209287 ], [ -122.214108682591601, 37.703842348492749 ], [ -122.214036682043343, 37.703709076232286 ], [ -122.213599314335724, 37.702741720787024 ] ] } },
{ "type": "Feature", "properties": { "id": 31.0, "osm_id": 23481810.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.225426012075502, 37.712020319962036 ], [ -122.225468005410391, 37.71197505768491 ], [ -122.225505221060502, 37.711926191189413 ], [ -122.225539167768346, 37.711864835658197 ], [ -122.225563056192399, 37.711796858423433 ], [ -122.225568252972366, 37.711712285020425 ], [ -122.225550734794737, 37.711627795436449 ], [ -122.225510417840468, 37.711542048566997 ], [ -122.225452415070507, 37.711468623095165 ], [ -122.225383934921595, 37.711411290877486 ] ] } },
{ "type": "Feature", "properties": { "id": 32.0, "osm_id": 23476686.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.229235251791764, 37.711470970028074 ], [ -122.229833803497343, 37.711947565042507 ], [ -122.230118117653006, 37.71220421891767 ], [ -122.23032682704202, 37.712409994640588 ], [ -122.230508714340871, 37.712617362925108 ], [ -122.230707868360298, 37.712857755908132 ], [ -122.230881122298911, 37.713103261852069 ], [ -122.231035265498278, 37.713356395327892 ], [ -122.231170046501276, 37.713607852423131 ], [ -122.231266270749728, 37.713824524620172 ], [ -122.231336846374447, 37.71400565754773 ], [ -122.231408511646592, 37.714211349451624 ], [ -122.231464167483651, 37.714406061062348 ], [ -122.231498449467608, 37.714543272817295 ], [ -122.231504819714019, 37.714638072142151 ], [ -122.231480260737754, 37.714733625838342 ], [ -122.231422425605842, 37.714829347172596 ], [ -122.231340031497623, 37.714904616663098 ], [ -122.23123626353636, 37.714964798727884 ], [ -122.231118581615789, 37.715002098197019 ], [ -122.230969719015448, 37.715015593061125 ], [ -122.230852037094891, 37.715001595282828 ], [ -122.230745000191334, 37.714971168974294 ], [ -122.230673167281168, 37.714936719352245 ] ] } },
{ "type": "Feature", "properties": { "id": 33.0, "osm_id": 23476687.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.226365539602227, 37.712065582239184 ], [ -122.226250456071654, 37.712010094040188 ], [ -122.226177449695015, 37.711982936673884 ], [ -122.226098659805189, 37.71195929970694 ], [ -122.226024312324043, 37.711944799014454 ], [ -122.225935631788474, 37.711935578920972 ], [ -122.225855836070238, 37.711933399626155 ], [ -122.225766149706288, 37.711937255301599 ], [ -122.225681911579386, 37.711948151775715 ], [ -122.225592309034468, 37.711966843419788 ], [ -122.225504801965343, 37.711996431538019 ], [ -122.225434142521564, 37.712029288598451 ], [ -122.225358370116922, 37.712067761534016 ] ] } },
{ "type": "Feature", "properties": { "id": 34.0, "osm_id": 23456965.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.225897075033856, 37.728702654210238 ], [ -122.225811328164411, 37.728674993929779 ], [ -122.225264576620361, 37.728497968134725 ], [ -122.224290431833566, 37.728182724756387 ], [ -122.217818429117173, 37.726088590067498 ], [ -122.215661933068688, 37.725390796628332 ], [ -122.214136426691127, 37.724897186350432 ], [ -122.20724490972087, 37.722667097192087 ], [ -122.20612374635239, 37.722304244603698 ], [ -122.206005729155677, 37.722266023125243 ] ] } },
{ "type": "Feature", "properties": { "id": 35.0, "osm_id": 23624172.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.507047146050496, 37.518453258119656 ], [ -122.506993501870184, 37.518406487099966 ], [ -122.501240247350893, 37.513508941075678 ], [ -122.495328658680691, 37.508466555764556 ], [ -122.495277612890376, 37.508421880220631 ] ] } },
{ "type": "Feature", "properties": { "id": 36.0, "osm_id": 23718250.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.381601068584729, 37.605371330915169 ], [ -122.381671141295257, 37.605271921543519 ], [ -122.381763509868222, 37.60520285466135 ], [ -122.381885801835537, 37.605155496908452 ], [ -122.382015218420534, 37.605134625969555 ], [ -122.382168439610552, 37.60514619299591 ], [ -122.382298610566849, 37.605184246836316 ], [ -122.382652745975918, 37.605333025617647 ], [ -122.382765314935526, 37.605409552393624 ], [ -122.382851145624031, 37.60550728538464 ], [ -122.383881113885991, 37.606807653842971 ] ] } },
{ "type": "Feature", "properties": { "id": 37.0, "osm_id": 23718290.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.364190514588827, 37.618044097961246 ], [ -122.364059673080291, 37.617954076321155 ], [ -122.363968477973771, 37.61786489287141 ], [ -122.363920114392457, 37.617750060797896 ], [ -122.36391483379343, 37.617626846821274 ], [ -122.363967807421517, 37.617510757462284 ], [ -122.363877282867236, 37.617614190147471 ], [ -122.363753817433491, 37.617686358333806 ], [ -122.363625155219765, 37.617716030271033 ], [ -122.363474951514931, 37.617716030271033 ], [ -122.363300021195656, 37.617667918146822 ] ] } },
{ "type": "Feature", "properties": { "id": 38.0, "osm_id": 23718493.0, "name": "West Superbay Line", "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.377212639359186, 37.62792485306025 ], [ -122.379138716889457, 37.62503142008476 ], [ -122.379495450688495, 37.624463546144746 ] ] } },
{ "type": "Feature", "properties": { "id": 39.0, "osm_id": 23718479.0, "name": "Plot 41 East Line", "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.378794723583212, 37.62953258590796 ], [ -122.381349360032431, 37.625676156076864 ], [ -122.381392275376669, 37.625572052839416 ], [ -122.381397639794699, 37.625478678438078 ], [ -122.381373583732596, 37.625378766152267 ], [ -122.381317173524252, 37.625287487226707 ], [ -122.381202173812724, 37.625175253543226 ] ] } },
{ "type": "Feature", "properties": { "id": 40.0, "osm_id": 23718497.0, "name": "East Superbay Line", "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.374758501929009, 37.626607050243337 ], [ -122.376581146774114, 37.623888631406068 ], [ -122.376901754570497, 37.623375826569919 ] ] } },
{ "type": "Feature", "properties": { "id": 41.0, "osm_id": 23718478.0, "name": "Plot 41 West Line", "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.381368973685852, 37.628825069461101 ], [ -122.383049042357953, 37.626293818521745 ], [ -122.383119617982672, 37.626229864600518 ], [ -122.383190277426436, 37.62618745217042 ], [ -122.383314413412407, 37.626150236520346 ], [ -122.383442656530974, 37.626141854617202 ], [ -122.383573078944337, 37.626172029468613 ] ] } },
{ "type": "Feature", "properties": { "id": 42.0, "osm_id": 23718228.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.374648447540324, 37.613021326303532 ], [ -122.374874339830896, 37.61274447204174 ], [ -122.375131831896368, 37.612544647470095 ], [ -122.375405333396927, 37.61241296777122 ], [ -122.375707249549237, 37.612326550349493 ], [ -122.376055517626099, 37.612275253102084 ], [ -122.376342849266862, 37.612274917825935 ], [ -122.376614171472625, 37.612306433781882 ], [ -122.376861018521097, 37.612370387703088 ], [ -122.376661529225544, 37.612238959461344 ], [ -122.376462123749022, 37.612072997778512 ], [ -122.376317368281221, 37.611907287552739 ], [ -122.376172445175357, 37.611682065814499 ], [ -122.37609734332294, 37.611431363090567 ], [ -122.376075969469824, 37.611180576547611 ], [ -122.376108155978017, 37.610921324282465 ], [ -122.376225502622447, 37.610650169714788 ] ] } },
{ "type": "Feature", "properties": { "id": 43.0, "osm_id": 23718353.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.359937704556643, 37.614701646432749 ], [ -122.359612738170625, 37.614620174333893 ], [ -122.359365974941184, 37.614588323101842 ], [ -122.359164809265039, 37.61459477716727 ], [ -122.358990465679, 37.614609529316859 ], [ -122.358832215347093, 37.614662670583009 ], [ -122.358706151523364, 37.614728552341923 ], [ -122.358590816535681, 37.6148050791179 ], [ -122.358499621429175, 37.614887976140324 ], [ -122.358413706921667, 37.615002640575689 ], [ -122.358352351390423, 37.615151167899946 ], [ -122.358333408289241, 37.615306652203813 ], [ -122.358367522635135, 37.615433638036905 ], [ -122.358442373030499, 37.615552996338067 ], [ -122.358531556480258, 37.615640335769172 ], [ -122.358651836790813, 37.615718371287691 ] ] } },
{ "type": "Feature", "properties": { "id": 44.0, "osm_id": 23718601.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.366604418883782, 37.625188748407332 ], [ -122.366564940119801, 37.625291678178314 ], [ -122.366562760825005, 37.625379771980683 ], [ -122.366578351164918, 37.625465854126212 ], [ -122.366615902091127, 37.625550846624421 ], [ -122.366658817435365, 37.625606083366321 ], [ -122.366742049733887, 37.625669869649478 ], [ -122.366841207648406, 37.625718652325936 ], [ -122.366935168782987, 37.62574849190127 ], [ -122.367065675015425, 37.625767435002452 ] ] } },
{ "type": "Feature", "properties": { "id": 45.0, "osm_id": 23718429.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.376343938914275, 37.621584362404647 ], [ -122.376754652169822, 37.621709923314185 ], [ -122.377118762043665, 37.621815535294168 ], [ -122.377421851662419, 37.621885775642767 ], [ -122.377773723957617, 37.621946292983687 ], [ -122.378184856308309, 37.621996919678828 ], [ -122.381234863235065, 37.622297327088582 ], [ -122.381381462721578, 37.62230227241146 ], [ -122.382079339979811, 37.622278048711294 ], [ -122.383394125311611, 37.622216190265839 ], [ -122.385007557853456, 37.622163384275879 ], [ -122.385536120667595, 37.622146033736328 ], [ -122.385933255239962, 37.622143351527306 ], [ -122.386145065933164, 37.622162462266537 ], [ -122.386335502773264, 37.622217363732311 ] ] } },
{ "type": "Feature", "properties": { "id": 46.0, "osm_id": 23718492.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.380737481100752, 37.62498263740828 ], [ -122.380873603208315, 37.624992276596913 ], [ -122.381025231836688, 37.624967717620621 ], [ -122.381177363379308, 37.624902674052009 ], [ -122.381296721680499, 37.624776023495059 ], [ -122.381858057736039, 37.623897516223437 ], [ -122.382541266663722, 37.622896297889362 ], [ -122.382652745975918, 37.622653474154419 ], [ -122.382727847828335, 37.622487763928703 ], [ -122.382907639651407, 37.622011923285534 ], [ -122.383014341278809, 37.621735488118865 ], [ -122.38313084973295, 37.621433571966584 ], [ -122.383218524440124, 37.621206590028606 ], [ -122.383426311819775, 37.620668052749714 ], [ -122.383444081454513, 37.620622119920313 ], [ -122.383457408680556, 37.620569062473265 ], [ -122.383465539126661, 37.620509550960705 ], [ -122.383457408680556, 37.620450123267211 ], [ -122.383427904381392, 37.620377871261844 ], [ -122.383390269636166, 37.620313665883565 ], [ -122.383342157511933, 37.620250466333623 ], [ -122.383262864707902, 37.620186177136269 ] ] } },
{ "type": "Feature", "properties": { "id": 47.0, "osm_id": 23718455.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.379691671041812, 37.616548850254112 ], [ -122.379555632753295, 37.616661670670823 ], [ -122.379397382421388, 37.616751021758681 ], [ -122.379209879247384, 37.616789494694238 ], [ -122.379001253677416, 37.616786896304255 ], [ -122.378701600638948, 37.616753452510586 ], [ -122.378202877400142, 37.616697796673542 ], [ -122.378031551299244, 37.616678685934268 ], [ -122.377165113968204, 37.616581958771675 ], [ -122.375482614544197, 37.616429240495826 ], [ -122.37318547016045, 37.616202929110131 ], [ -122.373044067453932, 37.616186165303795 ], [ -122.372580715846496, 37.616131431476092 ] ] } },
{ "type": "Feature", "properties": { "id": 48.0, "osm_id": 23718305.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.366752024198647, 37.619114718453616 ], [ -122.366591678390961, 37.619029055403161 ], [ -122.366468212957187, 37.618918581919353 ], [ -122.36639311110477, 37.618765696005475 ], [ -122.366382466087728, 37.618612642453492 ], [ -122.366414652595935, 37.618446932227769 ], [ -122.366259000653983, 37.618570146204426 ], [ -122.366076610440928, 37.618650947751014 ], [ -122.365867481956769, 37.618680619688242 ], [ -122.36561200154803, 37.618636782334661 ] ] } },
{ "type": "Feature", "properties": { "id": 49.0, "osm_id": 23718485.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.382800183652733, 37.625849577653518 ], [ -122.383001433147939, 37.625881177428496 ], [ -122.38322154192528, 37.625880171600123 ], [ -122.383409380375369, 37.625843961778372 ], [ -122.38357006145921, 37.625781348961702 ], [ -122.383717666774089, 37.625681436675862 ], [ -122.383839120551073, 37.625561324003378 ], [ -122.385463701024165, 37.623084471615584 ], [ -122.385771400689677, 37.622634698691314 ], [ -122.385915234148158, 37.622424480559729 ], [ -122.386118746757177, 37.622127090635146 ], [ -122.386303064807976, 37.62184411758399 ], [ -122.386500542446726, 37.621541027965243 ] ] } },
{ "type": "Feature", "properties": { "id": 50.0, "osm_id": 23718523.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.389142518327034, 37.628508987892396 ], [ -122.389076720387109, 37.628465318176886 ], [ -122.389017544150747, 37.628403292093424 ], [ -122.38896674981747, 37.628327268231608 ], [ -122.388939760089286, 37.628248226884686 ], [ -122.388945208326348, 37.628170023728089 ], [ -122.388971946597465, 37.628088886905367 ], [ -122.389120725378774, 37.627864670995478 ], [ -122.38958650773813, 37.627139468732892 ] ] } },
{ "type": "Feature", "properties": { "id": 51.0, "osm_id": 23718273.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.374296072330935, 37.618398568646469 ], [ -122.374799237978451, 37.61857442097503 ], [ -122.375244400856005, 37.618710375444515 ], [ -122.375612114948211, 37.618802660198462 ], [ -122.376003801283517, 37.618881785364437 ], [ -122.376388279182095, 37.618932244421522 ], [ -122.376784910840243, 37.618970968814168 ], [ -122.377180117574895, 37.618980691821861 ], [ -122.378271441368071, 37.618952696265239 ], [ -122.378581236509376, 37.61894733184721 ], [ -122.379664346037458, 37.618912798406143 ], [ -122.379863332418807, 37.61891623498645 ], [ -122.380047818107641, 37.618942470343363 ], [ -122.380321906341408, 37.618988486991803 ], [ -122.380736642910449, 37.619126788394176 ] ] } },
{ "type": "Feature", "properties": { "id": 52.0, "osm_id": 23718504.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.390979915321722, 37.624156181755382 ], [ -122.391101955831886, 37.624237486216145 ], [ -122.391189714358134, 37.624319293591142 ], [ -122.391260038525758, 37.624407974126697 ], [ -122.391380737931456, 37.624577959123073 ], [ -122.391488026292095, 37.624749955776188 ], [ -122.391784913302502, 37.625310788917517 ], [ -122.392756124423201, 37.627094793188988 ], [ -122.392827957333395, 37.627220186460463 ] ] } },
{ "type": "Feature", "properties": { "id": 53.0, "osm_id": 23718376.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.373644463178252, 37.624873085933793 ], [ -122.373516471516794, 37.624987918007271 ], [ -122.373360819574842, 37.625067881363577 ], [ -122.373175914790835, 37.625120854991593 ], [ -122.372973408010168, 37.625126470866725 ], [ -122.372764866259232, 37.625096631291449 ], [ -122.369501372258611, 37.623727028312885 ], [ -122.368688579107854, 37.623386555405972 ], [ -122.368502165581276, 37.623332827406642 ], [ -122.368303263019001, 37.623318578171236 ], [ -122.368128751794899, 37.623341041671772 ], [ -122.367961868102725, 37.62338647158694 ], [ -122.36782063303427, 37.62345897504941 ], [ -122.367726420442565, 37.62353231670216 ], [ -122.367643104325055, 37.623608927297184 ] ] } },
{ "type": "Feature", "properties": { "id": 54.0, "osm_id": 23718500.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.383698556034858, 37.624669657143791 ], [ -122.384119411393215, 37.624797481167185 ], [ -122.384430547639028, 37.624878198894727 ], [ -122.384769008889165, 37.624943158644335 ], [ -122.385050724654818, 37.624989929664039 ], [ -122.385420869498972, 37.625023960190937 ], [ -122.385686324372458, 37.625030246618337 ], [ -122.385903667121752, 37.62502815114253 ], [ -122.387880455166183, 37.624979368466043 ], [ -122.388124536186609, 37.624943158644335 ], [ -122.388285468727531, 37.624883730950835 ], [ -122.388435672432422, 37.624811478945475 ], [ -122.388575147301211, 37.624722295495722 ], [ -122.38867925053863, 37.624629675465641 ], [ -122.389004971295947, 37.624141597243835 ], [ -122.389139668479942, 37.623939761015457 ], [ -122.389217452541374, 37.623823084923266 ], [ -122.389373858854626, 37.623588643091523 ] ] } },
{ "type": "Feature", "properties": { "id": 55.0, "osm_id": 23718235.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.376623726842254, 37.613021493941623 ], [ -122.377019855586212, 37.612573732674086 ], [ -122.377264523339846, 37.612334764614609 ], [ -122.377477758956587, 37.612140723556173 ], [ -122.377844551039459, 37.611859259247559 ], [ -122.378167505768715, 37.611658931761738 ], [ -122.38001873290365, 37.61048797988839 ], [ -122.380260131715033, 37.610377422585515 ], [ -122.380506978763492, 37.610309445350801 ], [ -122.380769835246994, 37.610266949101707 ], [ -122.381005869640362, 37.610262674331075 ], [ -122.381314156039096, 37.610323024033931 ], [ -122.381633422730971, 37.610411453112405 ], [ -122.382163829563822, 37.610644134744526 ], [ -122.38292515782905, 37.610950828581636 ], [ -122.382998834757942, 37.611001874371965 ], [ -122.383065722345265, 37.611079658433397 ], [ -122.383100674881533, 37.611151826619739 ], [ -122.383119450344623, 37.611221983149299 ], [ -122.383122048734592, 37.611300689220108 ], [ -122.383097573577317, 37.611424573749012 ] ] } },
{ "type": "Feature", "properties": { "id": 56.0, "osm_id": 23718603.0, "name": "S4", "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.392827957333395, 37.627220186460463 ], [ -122.392862574593465, 37.627328061554323 ], [ -122.392872549058268, 37.627429566401759 ], [ -122.392837428883965, 37.627535681295917 ], [ -122.392753861309359, 37.627664762604759 ], [ -122.392657050327685, 37.627769033480241 ], [ -122.392522939876898, 37.627887972686295 ], [ -122.392353876889899, 37.627973216641557 ], [ -122.392163523868831, 37.628021831679966 ], [ -122.391981133655776, 37.628045133370797 ], [ -122.391793462843737, 37.628032476697015 ], [ -122.391579975769901, 37.627975647393484 ] ] } },
{ "type": "Feature", "properties": { "id": 57.0, "osm_id": 23718518.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.389663537428305, 37.62717173906011 ], [ -122.389787505776241, 37.627197220045772 ], [ -122.389891944289786, 37.627213648575989 ], [ -122.389993868232352, 37.627211553100196 ], [ -122.390093277603981, 37.627195040750934 ], [ -122.390189669490482, 37.627162770423716 ], [ -122.390275500179001, 37.627118094879805 ], [ -122.390342555404374, 37.62705866718629 ], [ -122.390393517375685, 37.626990689951562 ], [ -122.391674942732834, 37.625053799766242 ], [ -122.391731939674443, 37.624981044846677 ], [ -122.391820452571949, 37.624893956872697 ], [ -122.391898236633352, 37.624840731787558 ], [ -122.391994879976977, 37.624800498652334 ], [ -122.392102252156619, 37.62477124581023 ], [ -122.392214737297223, 37.624751548337791 ], [ -122.392327557713926, 37.624752135071006 ], [ -122.392434175522311, 37.624770072343793 ] ] } },
{ "type": "Feature", "properties": { "id": 58.0, "osm_id": 23718797.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.252505342839171, 37.514480738929628 ], [ -122.25116423833137, 37.513295370182796 ], [ -122.25045387203744, 37.512667230359007 ], [ -122.2500528817896, 37.512312759673776 ], [ -122.249134560477913, 37.511501056170445 ], [ -122.249031714525998, 37.511410196340066 ], [ -122.248652014312228, 37.511074584937006 ], [ -122.246591155778944, 37.509252694463193 ], [ -122.246510773327515, 37.509181532105252 ] ] } },
{ "type": "Feature", "properties": { "id": 59.0, "osm_id": 23718221.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.358501046352714, 37.611770578712012 ], [ -122.359092138164485, 37.610870362311175 ], [ -122.359253154524495, 37.610713117807641 ], [ -122.359473011844713, 37.610585629060367 ], [ -122.359719858893143, 37.610513460874031 ], [ -122.359955809467493, 37.61048797988839 ], [ -122.360186563261877, 37.610500636562179 ], [ -122.360406420582095, 37.610560148074732 ], [ -122.367466078530001, 37.613522061199134 ], [ -122.367868326063302, 37.613717527181137 ], [ -122.368227742071397, 37.613942748919428 ], [ -122.36901631152196, 37.614529146865458 ], [ -122.369322167168747, 37.614728887618057 ], [ -122.369648809935427, 37.614899543166707 ], [ -122.370963008533991, 37.615449898929029 ], [ -122.372226077523209, 37.615980724857039 ], [ -122.372580715846496, 37.616131431476092 ], [ -122.372918758001475, 37.616272918001677 ], [ -122.375066872146789, 37.617170871288621 ], [ -122.375391419437676, 37.617277070001855 ], [ -122.376497914475607, 37.617612932861988 ], [ -122.377762659845459, 37.618011157081781 ], [ -122.378919111026306, 37.618371076004038 ], [ -122.380736642910449, 37.619126788394176 ] ] } },
{ "type": "Feature", "properties": { "id": 60.0, "osm_id": 23718801.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.247032379161979, 37.5090622576231 ], [ -122.247539400484982, 37.509509683614496 ], [ -122.247668230336728, 37.509623258402492 ], [ -122.249148642075284, 37.510932679316262 ], [ -122.249212512177436, 37.510989257162684 ], [ -122.249271856051905, 37.511041644057528 ], [ -122.249793378067366, 37.511502816370097 ], [ -122.249958669197952, 37.511649918770829 ], [ -122.250050870132867, 37.511728121927405 ], [ -122.250528219518571, 37.512152749142203 ], [ -122.250596867305603, 37.512213685578246 ], [ -122.250660737407742, 37.51227009578664 ], [ -122.251119143692321, 37.512674271157628 ], [ -122.251231125918721, 37.512773177615102 ], [ -122.251644521383227, 37.513137538946062 ], [ -122.251702440334142, 37.513188668555394 ], [ -122.251771507216347, 37.513250191724701 ], [ -122.252416578484556, 37.513823597720823 ], [ -122.252794267041537, 37.514159376761917 ], [ -122.25283307525325, 37.514192485279466 ], [ -122.252850425792815, 37.514203130296494 ], [ -122.252869117436887, 37.514211679837743 ], [ -122.252883953405515, 37.514214948779987 ], [ -122.252934244824516, 37.514220480836073 ], [ -122.252939609242574, 37.514221067569302 ], [ -122.252959977267295, 37.514223330683166 ], [ -122.252978668911382, 37.514227437815698 ], [ -122.252993253422915, 37.514234394795345 ], [ -122.253936301348915, 37.515067053056598 ] ] } },
{ "type": "Feature", "properties": { "id": 61.0, "osm_id": 23718807.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.251118221682944, 37.510866965195355 ], [ -122.250279360813352, 37.511465684539068 ], [ -122.250242061344238, 37.511493428638538 ], [ -122.250165283111158, 37.511550425580154 ], [ -122.250082721364905, 37.511609937092679 ], [ -122.250071908709813, 37.511617732262614 ], [ -122.250051959780265, 37.511629969841245 ], [ -122.250029412460734, 37.511639692848959 ], [ -122.250001165447031, 37.51164589545732 ], [ -122.249958669197952, 37.511649918770829 ], [ -122.249708134112069, 37.511651846608551 ], [ -122.249445109990489, 37.511653942084365 ], [ -122.249387107220542, 37.511651427513399 ], [ -122.249344610971448, 37.511640782496364 ], [ -122.249303455826862, 37.51162183939519 ], [ -122.24927504117511, 37.511600381723049 ], [ -122.249228018698332, 37.511567189386497 ], [ -122.249134560477913, 37.511501056170445 ], [ -122.249215864938719, 37.511580935707684 ], [ -122.249245453056929, 37.511614630958441 ], [ -122.249260959577768, 37.51163617244962 ], [ -122.249277052831872, 37.51166777222457 ], [ -122.249282165792806, 37.511726529365816 ], [ -122.249280070316999, 37.511800373932793 ], [ -122.249272442785141, 37.51196323431143 ], [ -122.249268670928672, 37.51215442552283 ], [ -122.249269341480954, 37.512169932043705 ], [ -122.249273113337381, 37.51218292399362 ], [ -122.249279567402809, 37.512193820467729 ], [ -122.249297672313659, 37.512215278139863 ] ] } },
{ "type": "Feature", "properties": { "id": 62.0, "osm_id": 23718806.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.250226554823385, 37.510251565864365 ], [ -122.249506214064638, 37.510787923848468 ], [ -122.249472267356794, 37.510811225539285 ], [ -122.249394567114365, 37.510864534443428 ], [ -122.249303874922035, 37.510926476707908 ], [ -122.249212512177436, 37.510989257162684 ], [ -122.249125675660579, 37.511052959626817 ], [ -122.24903473201114, 37.511115153348356 ], [ -122.248992235762003, 37.511134096449503 ], [ -122.248946554389718, 37.511146836942324 ], [ -122.248898861360686, 37.511153542464889 ], [ -122.248848653760675, 37.511152955731681 ], [ -122.248800960731614, 37.511144825285562 ], [ -122.248765505281185, 37.511132587706932 ], [ -122.24872686470755, 37.511115656262525 ], [ -122.248652014312228, 37.511074584937006 ] ] } },
{ "type": "Feature", "properties": { "id": 63.0, "osm_id": 23718811.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.249437482458603, 37.514871251798439 ], [ -122.249434716430557, 37.514860522962401 ], [ -122.249434045878303, 37.514846860460224 ], [ -122.249436979544413, 37.514831773034508 ], [ -122.249441841048252, 37.514814171037862 ], [ -122.249452821341421, 37.514801765821154 ], [ -122.24946422072972, 37.514793048641856 ], [ -122.25067146624383, 37.513933065376278 ], [ -122.250746819553342, 37.513878499186582 ], [ -122.250888222259888, 37.51377607232979 ], [ -122.250907332999105, 37.513762242189571 ], [ -122.250987044898295, 37.513704574695758 ], [ -122.25103985088829, 37.513667359045648 ], [ -122.251165663254909, 37.513575828662987 ], [ -122.251188378212518, 37.513549844763133 ], [ -122.251210254979796, 37.513512377655971 ], [ -122.251222073463282, 37.513474742910724 ], [ -122.251225761500677, 37.513432079023545 ], [ -122.25121930743525, 37.513385140365813 ], [ -122.251206650761446, 37.513348930544097 ], [ -122.25116423833137, 37.513295370182796 ], [ -122.251207740408844, 37.513312888360431 ], [ -122.251246548620529, 37.513331244728398 ], [ -122.251286111203513, 37.513343230849934 ], [ -122.251316202235941, 37.513350774562809 ], [ -122.251361715970148, 37.513353624409866 ], [ -122.251401865286354, 37.513353624409866 ], [ -122.251452575800556, 37.513345326325734 ], [ -122.251512757865342, 37.513326550862622 ], [ -122.251630355966867, 37.513241139269269 ], [ -122.251702440334142, 37.513188668555394 ], [ -122.251787013737157, 37.513128989404827 ], [ -122.251800508601292, 37.513119350216144 ], [ -122.25187837648177, 37.513064448750356 ], [ -122.25196026767577, 37.513011056027175 ], [ -122.251973259625686, 37.51300259030495 ], [ -122.252197978449772, 37.51284987202915 ] ] } },
{ "type": "Feature", "properties": { "id": 64.0, "osm_id": 23718809.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.24879635068487, 37.513502151734109 ], [ -122.249552314532082, 37.512949616676877 ], [ -122.249625572365815, 37.512899241438838 ], [ -122.24969723763796, 37.512849788210104 ], [ -122.249768148538791, 37.512800251162346 ], [ -122.249800251227967, 37.5127778714809 ], [ -122.249876526546828, 37.512724562576715 ], [ -122.249938049716121, 37.512683155975026 ], [ -122.250057743293439, 37.512602438247463 ], [ -122.250090516534883, 37.51256773716829 ], [ -122.250110633102466, 37.512529683327919 ], [ -122.250119601738874, 37.512483666679493 ], [ -122.250119601738874, 37.512438739678458 ], [ -122.250110633102466, 37.512398338905186 ], [ -122.25009127090614, 37.512358273408019 ], [ -122.2500528817896, 37.512312759673776 ], [ -122.250117757720162, 37.512344778543891 ], [ -122.250159667236019, 37.512363134911858 ], [ -122.250191183191973, 37.512371768272118 ], [ -122.250231751603337, 37.512377970880479 ], [ -122.250276259509192, 37.512379982537247 ], [ -122.250314229530574, 37.512377467966282 ], [ -122.250363179845081, 37.51236564948281 ], [ -122.250415315282822, 37.512344778543891 ], [ -122.250526543137951, 37.512264479911515 ], [ -122.250596867305603, 37.512213685578246 ], [ -122.250666856197057, 37.51216079576924 ], [ -122.250695857582073, 37.512138751363906 ], [ -122.250707676065517, 37.51212408303337 ], [ -122.250717650530305, 37.5121092470647 ], [ -122.25072276349124, 37.512088795220961 ], [ -122.250722176758003, 37.512070941767213 ], [ -122.250720500377383, 37.512054261779923 ], [ -122.250706837875214, 37.512026517680432 ], [ -122.250697031048503, 37.512005898198588 ], [ -122.250695103210774, 37.511994666448359 ], [ -122.250694181201439, 37.511976477718441 ], [ -122.250697366324644, 37.511961641749842 ], [ -122.250703401294913, 37.511947895428612 ], [ -122.250712537569385, 37.511934316745496 ], [ -122.250726619166713, 37.511922079166865 ], [ -122.250764840645175, 37.51189383215317 ], [ -122.251738231060713, 37.51119729599943 ] ] } },
{ "type": "Feature", "properties": { "id": 65.0, "osm_id": 23718372.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.380736642910449, 37.619126788394176 ], [ -122.380505721478016, 37.619078424812855 ], [ -122.380272201655615, 37.619091416762764 ], [ -122.380068353770412, 37.619148832799546 ], [ -122.379882443158039, 37.619266263263007 ], [ -122.379669542817439, 37.619409761445304 ], [ -122.379275761006326, 37.619696673990916 ], [ -122.379047018868746, 37.619857774169937 ], [ -122.377257147265055, 37.621119082959481 ], [ -122.375449673664704, 37.62239682027927 ], [ -122.375291507151829, 37.622515759485289 ], [ -122.375131748077351, 37.622659760581811 ], [ -122.374981544372488, 37.622836199643594 ], [ -122.374824216049916, 37.62308111885433 ], [ -122.373644463178252, 37.624873085933793 ], [ -122.373144315015878, 37.625629636514262 ], [ -122.372193471919857, 37.6270602597479 ], [ -122.372109066154906, 37.627139971647082 ], [ -122.371999682318474, 37.627193280551289 ], [ -122.371846628766534, 37.627219851184357 ], [ -122.371673039551837, 37.627199650797706 ], [ -122.370461938362283, 37.626692880931799 ], [ -122.368171918596261, 37.625731728094891 ], [ -122.367065675015425, 37.625767435002452 ], [ -122.366559156606641, 37.625778582933641 ], [ -122.366417083347827, 37.625801968443504 ], [ -122.366274842450991, 37.625852930414787 ], [ -122.366164955700384, 37.625910262632488 ], [ -122.36608985384791, 37.625969774144998 ], [ -122.365985331515361, 37.626088797170098 ] ] } },
{ "type": "Feature", "properties": { "id": 66.0, "osm_id": 23931269.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.821573428139843, 37.335415878319957 ], [ -121.82053650289825, 37.33432103412747 ], [ -121.8192923770102, 37.333007338443061 ], [ -121.818254362121237, 37.331911320784108 ], [ -121.817022054716645, 37.330610197954471 ] ] } },
{ "type": "Feature", "properties": { "id": 67.0, "osm_id": 23931305.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.822530976758401, 37.336426735842693 ], [ -121.821573428139843, 37.335415878319957 ] ] } },
{ "type": "Feature", "properties": { "id": 68.0, "osm_id": 23931321.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.817072010859562, 37.329295664079758 ], [ -121.81785437770175, 37.330122371189788 ] ] } },
{ "type": "Feature", "properties": { "id": 69.0, "osm_id": 23931323.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.816256367861769, 37.329801679574338 ], [ -121.817022054716645, 37.330610197954471 ] ] } },
{ "type": "Feature", "properties": { "id": 70.0, "osm_id": 23931331.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.823354834021316, 37.335934299031251 ], [ -121.822397453040836, 37.33492268713723 ] ] } },
{ "type": "Feature", "properties": { "id": 71.0, "osm_id": 23931434.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.817072010859562, 37.329295664079758 ], [ -121.816256367861769, 37.329801679574338 ], [ -121.815836769788859, 37.330061853848854 ] ] } },
{ "type": "Feature", "properties": { "id": 72.0, "osm_id": 23931389.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.823186609224635, 37.338490360404009 ], [ -121.822702470497333, 37.337972191149831 ], [ -121.822670367808144, 37.337921061540442 ], [ -121.82265385545891, 37.337854844505394 ], [ -121.822639438585469, 37.337797344649616 ], [ -121.822616639808814, 37.337740850622247 ] ] } },
{ "type": "Feature", "properties": { "id": 73.0, "osm_id": 23931273.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.822397453040836, 37.33492268713723 ], [ -121.822254625410764, 37.33477172906106 ], [ -121.821359354332799, 37.333825831287953 ], [ -121.82041454620709, 37.332826540791601 ], [ -121.820117826834732, 37.332514063441316 ], [ -121.819078722298315, 37.331416117944592 ], [ -121.81785437770175, 37.330122371189788 ] ] } },
{ "type": "Feature", "properties": { "id": 74.0, "osm_id": 23953584.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.820117826834732, 37.332514063441316 ], [ -121.8192923770102, 37.333007338443061 ], [ -121.81886976145222, 37.333259885185683 ], [ -121.818540436476511, 37.333456692272179 ] ] } },
{ "type": "Feature", "properties": { "id": 75.0, "osm_id": 23953571.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.815836769788859, 37.330061853848854 ], [ -121.816314538269751, 37.330565690048594 ], [ -121.817831578925151, 37.332165124812178 ], [ -121.81886976145222, 37.333259885185683 ], [ -121.820116150454098, 37.334574083784261 ], [ -121.822111378685548, 37.33667769002372 ] ] } },
{ "type": "Feature", "properties": { "id": 76.0, "osm_id": 23953585.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.821359354332799, 37.333825831287953 ], [ -121.820954340771451, 37.334069577032224 ], [ -121.82053650289825, 37.33432103412747 ], [ -121.820116150454098, 37.334574083784261 ], [ -121.819789926782605, 37.334770471775578 ] ] } },
{ "type": "Feature", "properties": { "id": 77.0, "osm_id": 23994875.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.44603902025689, 37.691114931437944 ], [ -121.445181048648081, 37.690491736936998 ], [ -121.444304720671241, 37.689876169967967 ], [ -121.439456460237622, 37.686469932156299 ], [ -121.436447524636407, 37.684342940406971 ] ] } },
{ "type": "Feature", "properties": { "id": 78.0, "osm_id": 23994883.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.44603902025689, 37.691114931437944 ], [ -121.445540380837116, 37.691548192013009 ], [ -121.444041277454517, 37.690496179345672 ], [ -121.443168637515114, 37.689885641518515 ], [ -121.439002244904671, 37.686952059226826 ], [ -121.436326406135564, 37.685058084385744 ], [ -121.43532024247861, 37.684345874073095 ], [ -121.435667504727093, 37.684036330388906 ], [ -121.435815612956162, 37.683905824156511 ], [ -121.436447524636407, 37.684342940406971 ] ] } },
{ "type": "Feature", "properties": { "id": 79.0, "osm_id": 23994907.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.43995954206612, 37.685960480081413 ], [ -121.439542961478395, 37.68635778229185 ], [ -121.439456460237622, 37.686469932156299 ], [ -121.439336934298396, 37.686621141689542 ], [ -121.439002244904671, 37.686952059226826 ], [ -121.438815160825811, 37.687122044223173 ] ] } },
{ "type": "Feature", "properties": { "id": 80.0, "osm_id": 23994879.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.436426569878464, 37.690545716393451 ], [ -121.435482683762103, 37.690541860718 ], [ -121.435467009603173, 37.689949427801679 ] ] } },
{ "type": "Feature", "properties": { "id": 81.0, "osm_id": 23994903.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.439555701971216, 37.685592430713086 ], [ -121.436400753616724, 37.683388828368713 ], [ -121.435815612956162, 37.683905824156511 ] ] } },
{ "type": "Feature", "properties": { "id": 82.0, "osm_id": 23994874.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.448277826594534, 37.690468686703277 ], [ -121.445181048648081, 37.690491736936998 ], [ -121.444041277454517, 37.690496179345672 ], [ -121.436426569878464, 37.690545716393451 ] ] } },
{ "type": "Feature", "properties": { "id": 83.0, "osm_id": 24064084.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.106089060287744, 37.418433097197536 ], [ -121.106930100452161, 37.419435153721913 ] ] } },
{ "type": "Feature", "properties": { "id": 84.0, "osm_id": 24078433.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.627334556758115, 37.824123664861091 ], [ -121.626991234004123, 37.823554198359439 ] ] } },
{ "type": "Feature", "properties": { "id": 85.0, "osm_id": 24078461.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.624356215103461, 37.825337280621575 ], [ -121.623987159906733, 37.824754151617775 ] ] } },
{ "type": "Feature", "properties": { "id": 86.0, "osm_id": 24078656.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.624012808530438, 37.828537155977088 ], [ -121.623291964857515, 37.82910653865963 ] ] } },
{ "type": "Feature", "properties": { "id": 87.0, "osm_id": 24078642.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.625643675430922, 37.829370987704785 ], [ -121.625369000463905, 37.829567543334164 ] ] } },
{ "type": "Feature", "properties": { "id": 88.0, "osm_id": 24078198.0, "name": "05\/23", "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.629969575658791, 37.82236095062369 ], [ -121.626991234004123, 37.823554198359439 ], [ -121.623987159906733, 37.824754151617775 ], [ -121.620897255120838, 37.826015125131207 ] ] } },
{ "type": "Feature", "properties": { "id": 89.0, "osm_id": 24078777.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.623188951267522, 37.827404928496392 ], [ -121.623197416989711, 37.827832070282113 ] ] } },
{ "type": "Feature", "properties": { "id": 90.0, "osm_id": 24078226.0, "name": "12\/30", "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.620605481071379, 37.826950796982473 ], [ -121.620828523514831, 37.827120279064637 ], [ -121.623291964857515, 37.82910653865963 ], [ -121.626089927955874, 37.831336963094124 ], [ -121.628802228003792, 37.833506283454483 ], [ -121.631059558347445, 37.835302692942619 ], [ -121.631480162248707, 37.835655068152029 ] ] } },
{ "type": "Feature", "properties": { "id": 91.0, "osm_id": 24078805.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.623515007300966, 37.827655882677426 ], [ -121.62291427630052, 37.827601567944868 ] ] } },
{ "type": "Feature", "properties": { "id": 92.0, "osm_id": 24078551.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.620897255120838, 37.826015125131207 ], [ -121.621489436580077, 37.826503370991048 ], [ -121.62291427630052, 37.827601567944868 ], [ -121.623094403399733, 37.827750765821314 ], [ -121.623197416989711, 37.827832070282113 ], [ -121.624012808530438, 37.828537155977088 ], [ -121.625369000463905, 37.829567543334164 ], [ -121.626776657282861, 37.830740339226232 ], [ -121.628021118447066, 37.831696295283166 ], [ -121.629531705036982, 37.832936733133813 ], [ -121.631617457822671, 37.834584028564514 ], [ -121.631574542478432, 37.835160284407721 ], [ -121.631402964920454, 37.835295819782004 ], [ -121.631265501708427, 37.835316187806718 ], [ -121.631059558347445, 37.835302692942619 ] ] } },
{ "type": "Feature", "properties": { "id": 93.0, "osm_id": 24078593.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.629531705036982, 37.832936733133813 ], [ -121.628802228003792, 37.833506283454483 ] ] } },
{ "type": "Feature", "properties": { "id": 94.0, "osm_id": 24078749.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.623188951267522, 37.825825358843346 ], [ -121.623197416989711, 37.826591464793417 ], [ -121.623188951267522, 37.827404928496392 ], [ -121.623515007300966, 37.827655882677426 ], [ -121.625643675430922, 37.829370987704785 ] ] } },
{ "type": "Feature", "properties": { "id": 95.0, "osm_id": 24078625.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.62909400205325, 37.828876120141416 ], [ -121.626776657282861, 37.830740339226232 ], [ -121.626089927955874, 37.831336963094124 ] ] } },
{ "type": "Feature", "properties": { "id": 96.0, "osm_id": 24078717.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.629969575658791, 37.82236095062369 ], [ -121.630106871232755, 37.822442255084432 ], [ -121.630338630855519, 37.822821955298203 ], [ -121.630330081314284, 37.822950785149992 ], [ -121.627334556758115, 37.824123664861091 ], [ -121.624356215103461, 37.825337280621575 ], [ -121.623188951267522, 37.825825358843346 ], [ -121.621489436580077, 37.826503370991048 ], [ -121.620905804662101, 37.826754157534012 ], [ -121.62080287489114, 37.826910060933024 ], [ -121.620828523514831, 37.827120279064637 ] ] } },
{ "type": "Feature", "properties": { "id": 97.0, "osm_id": 24298349.0, "name": "B", "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.811342225669179, 37.69481059636621 ], [ -121.811344824059148, 37.694480181743096 ] ] } },
{ "type": "Feature", "properties": { "id": 98.0, "osm_id": 24298359.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.813611206858241, 37.689745244640363 ], [ -121.813586228786789, 37.691747429851446 ], [ -121.813583378939697, 37.692024535570333 ] ] } },
{ "type": "Feature", "properties": { "id": 99.0, "osm_id": 24298398.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.814397429375902, 37.689741891879102 ], [ -121.814369433819337, 37.691755057383318 ] ] } },
{ "type": "Feature", "properties": { "id": 100.0, "osm_id": 24298395.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.814012616201239, 37.689735856908818 ], [ -121.813986213206206, 37.691752291355286 ] ] } },
{ "type": "Feature", "properties": { "id": 101.0, "osm_id": 24298405.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.815514737068966, 37.689725044253748 ], [ -121.815490848644913, 37.691761679086852 ] ] } },
{ "type": "Feature", "properties": { "id": 102.0, "osm_id": 24298357.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.814767909496197, 37.689724457520519 ], [ -121.81474754147149, 37.691755895573642 ], [ -121.814750810413713, 37.692034090939956 ] ] } },
{ "type": "Feature", "properties": { "id": 103.0, "osm_id": 24298408.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.818108014091791, 37.691815323267136 ], [ -121.818099967464747, 37.692472464475948 ] ] } },
{ "type": "Feature", "properties": { "id": 104.0, "osm_id": 24298404.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.815142412929973, 37.689719344559578 ], [ -121.815115507020792, 37.691761846724901 ] ] } },
{ "type": "Feature", "properties": { "id": 105.0, "osm_id": 24298362.0, "name": "C", "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.815892760902074, 37.689726133901139 ], [ -121.815867447554496, 37.691762517277148 ], [ -121.815867447554496, 37.691794619966309 ], [ -121.815868369563859, 37.692042389024117 ], [ -121.815859736203592, 37.692452934641544 ], [ -121.815846576615598, 37.693826477114598 ], [ -121.815832159742115, 37.694512452070335 ], [ -121.815822855829595, 37.694854182262695 ] ] } },
{ "type": "Feature", "properties": { "id": 106.0, "osm_id": 24298453.0, "name": "East", "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.820499119610091, 37.69489156555084 ], [ -121.820503226742645, 37.694549248625258 ], [ -121.820502304733296, 37.693865536783377 ] ] } },
{ "type": "Feature", "properties": { "id": 107.0, "osm_id": 24298456.0, "name": "F", "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.822636756376454, 37.69490774262399 ], [ -121.822645976469957, 37.69456668298384 ] ] } },
{ "type": "Feature", "properties": { "id": 108.0, "osm_id": 24298411.0, "name": "R", "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.822756282315709, 37.691845162842469 ], [ -121.822750917897679, 37.692506327364768 ] ] } },
{ "type": "Feature", "properties": { "id": 109.0, "osm_id": 24298386.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.813158416448829, 37.689749267953893 ], [ -121.81313444420573, 37.691744580004375 ] ] } },
{ "type": "Feature", "properties": { "id": 110.0, "osm_id": 24298383.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.812424413187884, 37.689714147779611 ], [ -121.812402955515779, 37.691743238899861 ], [ -121.812404045163177, 37.692013974372344 ] ] } },
{ "type": "Feature", "properties": { "id": 111.0, "osm_id": 24298366.0, "name": "K", "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.815868369563859, 37.692042389024117 ], [ -121.814750810413713, 37.692034090939956 ], [ -121.813583378939697, 37.692024535570333 ], [ -121.812404045163177, 37.692013974372344 ], [ -121.811371981425438, 37.69201112452528 ] ] } },
{ "type": "Feature", "properties": { "id": 112.0, "osm_id": 24298316.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.829397431838146, 37.693933597837152 ], [ -121.829016558157932, 37.693930580352024 ], [ -121.825009337888758, 37.693898645300941 ], [ -121.820502304733296, 37.693865536783377 ], [ -121.818401548340944, 37.693844330568353 ], [ -121.815846576615598, 37.693826477114598 ], [ -121.811350775210428, 37.693789429102573 ], [ -121.81123887680306, 37.693789261464524 ] ] } },
{ "type": "Feature", "properties": { "id": 113.0, "osm_id": 24298438.0, "name": "L", "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.829016558157932, 37.693930580352024 ], [ -121.829275810423098, 37.693764199574012 ], [ -121.829339848163329, 37.693690774102215 ], [ -121.82935560614132, 37.693622461591339 ], [ -121.829362311663843, 37.693255334232347 ], [ -121.829374549242473, 37.692673043418885 ], [ -121.82934605077169, 37.692595091719376 ], [ -121.829290143477508, 37.69252988051268 ], [ -121.828571562918455, 37.691945158947291 ], [ -121.828483133839981, 37.691906518373663 ], [ -121.828359165492046, 37.691894448433104 ], [ -121.825052756147187, 37.691867123428764 ], [ -121.822756282315709, 37.691845162842469 ], [ -121.820422760472212, 37.691823872808357 ], [ -121.818108014091791, 37.691815323267136 ], [ -121.815867447554496, 37.691794619966309 ] ] } },
{ "type": "Feature", "properties": { "id": 114.0, "osm_id": 24298906.0, "name": "B", "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.811344824059148, 37.694480181743096 ], [ -121.811350775210428, 37.693789429102573 ], [ -121.811371981425438, 37.69201112452528 ], [ -121.811373406348977, 37.69180031966048 ], [ -121.811373909263168, 37.69165321725977 ] ] } },
{ "type": "Feature", "properties": { "id": 115.0, "osm_id": 24298413.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.812402955515779, 37.691743238899861 ], [ -121.81313444420573, 37.691744580004375 ], [ -121.813586228786789, 37.691747429851446 ], [ -121.813986213206206, 37.691752291355286 ], [ -121.814369433819337, 37.691755057383318 ], [ -121.81474754147149, 37.691755895573642 ], [ -121.815115507020792, 37.691761846724901 ], [ -121.815490848644913, 37.691761679086852 ], [ -121.815867447554496, 37.691762517277148 ] ] } },
{ "type": "Feature", "properties": { "id": 116.0, "osm_id": 24298451.0, "name": "D", "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.818387634381693, 37.694876226668065 ], [ -121.818395513370675, 37.694533825923394 ], [ -121.818401548340944, 37.693844330568353 ] ] } },
{ "type": "Feature", "properties": { "id": 117.0, "osm_id": 24298320.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.825103382842343, 37.692525354284953 ], [ -121.825044960977237, 37.692525354284953 ], [ -121.822750917897679, 37.692506327364768 ], [ -121.820422760472212, 37.692488222453925 ], [ -121.818099967464747, 37.692472464475948 ], [ -121.815859736203592, 37.692452934641544 ], [ -121.815761081203206, 37.69245218027028 ] ] } },
{ "type": "Feature", "properties": { "id": 118.0, "osm_id": 24298410.0, "name": "Q", "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.820422760472212, 37.691823872808357 ], [ -121.820422760472212, 37.692488222453925 ] ] } },
{ "type": "Feature", "properties": { "id": 119.0, "osm_id": 24298418.0, "name": "G", "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.825052756147187, 37.691867123428764 ], [ -121.825044960977237, 37.692525354284953 ], [ -121.825030879379923, 37.693707621727604 ], [ -121.825009337888758, 37.693898645300941 ], [ -121.825001542718809, 37.694098553691596 ], [ -121.824995256291416, 37.694586380456293 ], [ -121.824994753377226, 37.694802717377193 ], [ -121.824981007056024, 37.694841777046008 ], [ -121.824950580747483, 37.694881591086087 ] ] } },
{ "type": "Feature", "properties": { "id": 120.0, "osm_id": 24298912.0, "name": "J", "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.824950580747483, 37.694881591086087 ], [ -121.824895679281738, 37.694914196689417 ], [ -121.824817308487027, 37.694927356277418 ], [ -121.822636756376454, 37.69490774262399 ], [ -121.820499119610091, 37.69489156555084 ], [ -121.818387634381693, 37.694876226668065 ], [ -121.815822855829595, 37.694854182262695 ], [ -121.812485265804966, 37.694815625508099 ], [ -121.811342225669179, 37.69481059636621 ], [ -121.809554449541267, 37.694795257483392 ], [ -121.807891479951692, 37.694778326038985 ], [ -121.807617978451106, 37.694774051268361 ] ] } },
{ "type": "Feature", "properties": { "id": 121.0, "osm_id": 24305646.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.70523521048149, 37.720131990577251 ], [ -121.703389850678818, 37.72028806161434 ] ] } },
{ "type": "Feature", "properties": { "id": 122.0, "osm_id": 24389096.0, "name": "K", "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.409469782539233, 38.655372760556439 ], [ -121.40081806590257, 38.659878620245436 ], [ -121.400587982660468, 38.659999571108223 ] ] } },
{ "type": "Feature", "properties": { "id": 123.0, "osm_id": 24389101.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.411710349076529, 38.669172558303245 ], [ -121.411212044932896, 38.669547564651246 ], [ -121.400569039559286, 38.669648063670287 ] ] } },
{ "type": "Feature", "properties": { "id": 124.0, "osm_id": 24388964.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.400586222460802, 38.649648423603118 ], [ -121.400612038722571, 38.653080477676532 ] ] } },
{ "type": "Feature", "properties": { "id": 125.0, "osm_id": 24389061.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.400594855821069, 38.653113921470222 ], [ -121.400594939640087, 38.659688183405322 ], [ -121.400587982660468, 38.65982715535992 ], [ -121.400587982660468, 38.659999571108223 ], [ -121.400569039559286, 38.669648063670287 ], [ -121.400551940476831, 38.682111450775103 ] ] } },
{ "type": "Feature", "properties": { "id": 126.0, "osm_id": 24389068.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.412173449226884, 38.669567681218851 ], [ -121.411710349076529, 38.669172558303245 ], [ -121.40081806590257, 38.659878620245436 ], [ -121.400594939640087, 38.659688183405322 ], [ -121.395647018377716, 38.655465967319707 ] ] } },
{ "type": "Feature", "properties": { "id": 127.0, "osm_id": 24389090.0, "name": "A", "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.400551940476831, 38.682111450775103 ], [ -121.39880070944676, 38.682120670868585 ], [ -121.398533326735532, 38.682106589271264 ], [ -121.398289245715105, 38.682039534045906 ], [ -121.398074920450966, 38.681924031420152 ], [ -121.397925052022217, 38.681775755552991 ], [ -121.397838466962455, 38.681618762506574 ], [ -121.39780837593004, 38.681414160250107 ], [ -121.397801251312345, 38.678728598473299 ], [ -121.397794713427857, 38.676282842946293 ], [ -121.397827067574127, 38.673255048062956 ], [ -121.397749618788808, 38.66575525637942 ], [ -121.397755318482965, 38.661453998946904 ], [ -121.397760347624882, 38.660839856901362 ], [ -121.39776780751869, 38.659918266647438 ], [ -121.397768310432909, 38.659855821468803 ], [ -121.397770573546765, 38.659582739063403 ], [ -121.397775351231559, 38.659235979729125 ], [ -121.39784114917147, 38.654463324062121 ] ] } },
{ "type": "Feature", "properties": { "id": 128.0, "osm_id": 24552376.0, "name": "E", "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.394492243577517, 38.663080423438679 ], [ -121.397755318482965, 38.661453998946904 ], [ -121.400587982660468, 38.659999571108223 ] ] } },
{ "type": "Feature", "properties": { "id": 129.0, "osm_id": 24552370.0, "name": "J", "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.400594855821069, 38.653113921470222 ], [ -121.402933658263578, 38.654712518043453 ], [ -121.403165417886328, 38.654846544675216 ], [ -121.403508740640305, 38.654886777810418 ], [ -121.408641482867637, 38.654873366765358 ], [ -121.408993355162892, 38.654920389242172 ], [ -121.409469782539233, 38.655372760556439 ] ] } },
{ "type": "Feature", "properties": { "id": 130.0, "osm_id": 24954850.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.234636777203818, 37.890142635559833 ], [ -121.233271281357844, 37.891598572141113 ] ] } },
{ "type": "Feature", "properties": { "id": 131.0, "osm_id": 24954880.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.237158472773572, 37.892142976752197 ], [ -121.237879316446509, 37.891466221889957 ] ] } },
{ "type": "Feature", "properties": { "id": 132.0, "osm_id": 24954955.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.248033237769917, 37.895610989190224 ], [ -121.247854451775254, 37.898697876490978 ] ] } },
{ "type": "Feature", "properties": { "id": 133.0, "osm_id": 24955050.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.238661934745821, 37.894887882403481 ], [ -121.239055381280792, 37.894242727316197 ], [ -121.239312873346265, 37.893883730403239 ], [ -121.239819224116985, 37.893531522831928 ], [ -121.240359940690709, 37.89313195750762 ], [ -121.240050983739721, 37.888573291828649 ], [ -121.240085265723707, 37.888532639598274 ], [ -121.240145363969475, 37.888464830001595 ], [ -121.240351307330457, 37.888370030676683 ], [ -121.240832009477458, 37.888254863327099 ], [ -121.241029403297162, 37.888227789779869 ], [ -121.241750414608163, 37.888126117294362 ] ] } },
{ "type": "Feature", "properties": { "id": 134.0, "osm_id": 24955326.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.244609481780643, 37.89444456354461 ], [ -121.243535676165081, 37.896051290563925 ] ] } },
{ "type": "Feature", "properties": { "id": 135.0, "osm_id": 24954972.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.249374007001578, 37.898159255393068 ], [ -121.246091653718821, 37.897617532990957 ] ] } },
{ "type": "Feature", "properties": { "id": 136.0, "osm_id": 24954888.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.244737305804065, 37.894242727316197 ], [ -121.243552859066583, 37.89604441740331 ] ] } },
{ "type": "Feature", "properties": { "id": 137.0, "osm_id": 24954785.0, "name": "11R\/29L", "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.237158472773572, 37.892142976752197 ], [ -121.243535676165081, 37.896051290563925 ], [ -121.246091653718821, 37.897617532990957 ], [ -121.247854451775254, 37.898697876490978 ], [ -121.249260516032592, 37.899559536137218 ] ] } },
{ "type": "Feature", "properties": { "id": 138.0, "osm_id": 24954759.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.251482810021017, 37.902710293540153 ], [ -121.238661934745821, 37.894887882403481 ], [ -121.233271281357844, 37.891598572141113 ], [ -121.22443281591849, 37.886205236544093 ], [ -121.221338133447759, 37.884316626121027 ] ] } },
{ "type": "Feature", "properties": { "id": 139.0, "osm_id": 24955055.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.240359940690709, 37.89313195750762 ], [ -121.2409435726087, 37.892711940339616 ] ] } },
{ "type": "Feature", "properties": { "id": 140.0, "osm_id": 24955079.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.233207746531775, 37.889559338918012 ], [ -121.233682329889461, 37.888701954042389 ], [ -121.233965554397699, 37.888295599376519 ], [ -121.234368975397459, 37.887943224167103 ], [ -121.234841044184179, 37.887753625517341 ], [ -121.236403179478643, 37.887347187032425 ], [ -121.236986811396619, 37.887211735477145 ], [ -121.237347233233081, 37.887143925880508 ], [ -121.237587626216083, 37.887211735477145 ], [ -121.237913766068559, 37.887164293905187 ] ] } },
{ "type": "Feature", "properties": { "id": 141.0, "osm_id": 24954822.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.22443281591849, 37.886205236544093 ], [ -121.224548905277445, 37.886083196033873 ], [ -121.225030529433781, 37.885572486673524 ], [ -121.225339570203772, 37.885504677076845 ], [ -121.22561424517076, 37.885491182212739 ], [ -121.226026215711755, 37.885606265743306 ], [ -121.231107409234582, 37.888701954042389 ], [ -121.233207746531775, 37.889559338918012 ], [ -121.234636777203818, 37.890142635559833 ], [ -121.237879316446509, 37.891466221889957 ], [ -121.244737305804065, 37.894242727316197 ], [ -121.248033237769917, 37.895610989190224 ], [ -121.248325011819432, 37.895787092975908 ], [ -121.248531038999431, 37.896071490950597 ], [ -121.2487541652619, 37.89654565521311 ], [ -121.249374007001578, 37.898159255393068 ], [ -121.249586739704128, 37.898712963916743 ], [ -121.249560923442345, 37.899004151232965 ], [ -121.249355063900396, 37.89925477013783 ], [ -121.246968903704982, 37.901665824585699 ], [ -121.246737144082218, 37.901767497071198 ], [ -121.246488201557952, 37.901679487087847 ], [ -121.242797565771653, 37.899505389042695 ], [ -121.242505707903149, 37.899478231676454 ], [ -121.242265314920118, 37.899654335462117 ], [ -121.240128264887005, 37.901882664420803 ] ] } },
{ "type": "Feature", "properties": { "id": 142.0, "osm_id": 25006345.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.856883871638914, 38.58754254440089 ], [ -121.857038350114408, 38.571184086891357 ] ] } },
{ "type": "Feature", "properties": { "id": 143.0, "osm_id": 25027050.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.939996728031687, 37.37021586391576 ], [ -121.941717113658058, 37.371784537094676 ], [ -121.941773104771272, 37.371850670310721 ], [ -121.941802106156246, 37.371914037498698 ], [ -121.941821971266734, 37.371979751619591 ], [ -121.941830856084124, 37.372066252860343 ] ] } },
{ "type": "Feature", "properties": { "id": 144.0, "osm_id": 25203646.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.786408159203788, 38.535774066382594 ], [ -121.786931273780823, 38.535776748591601 ] ] } },
{ "type": "Feature", "properties": { "id": 145.0, "osm_id": 25203653.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.78707410141088, 38.527147746912497 ], [ -121.786540341816817, 38.527145399979617 ] ] } },
{ "type": "Feature", "properties": { "id": 146.0, "osm_id": 25203667.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.787062534384518, 38.527846546180101 ], [ -121.78847941129699, 38.529924168519713 ], [ -121.788659035481956, 38.530189288117121 ], [ -121.789100007407953, 38.530889260851119 ], [ -121.789315673776613, 38.531211377390065 ] ] } },
{ "type": "Feature", "properties": { "id": 147.0, "osm_id": 25203630.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.786409751765376, 38.535825782725162 ], [ -121.786408159203788, 38.535774066382594 ], [ -121.786429868332988, 38.533414057725047 ], [ -121.78646976619207, 38.531217328541324 ], [ -121.786540341816817, 38.527145399979617 ], [ -121.78654118000712, 38.527093096903826 ] ] } },
{ "type": "Feature", "properties": { "id": 148.0, "osm_id": 25203650.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.78646976619207, 38.531217328541324 ], [ -121.787012159146471, 38.531226716272869 ], [ -121.787360343404288, 38.531229398481912 ] ] } },
{ "type": "Feature", "properties": { "id": 149.0, "osm_id": 25203648.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.787612051956572, 38.533428139322389 ], [ -121.786970249630571, 38.533419422143069 ], [ -121.786429868332988, 38.533414057725047 ] ] } },
{ "type": "Feature", "properties": { "id": 150.0, "osm_id": 25203635.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.786931273780823, 38.535776748591601 ], [ -121.786970249630571, 38.533419422143069 ], [ -121.787012159146471, 38.531226716272869 ], [ -121.787062534384518, 38.527846546180101 ], [ -121.78707410141088, 38.527147746912497 ] ] } },
{ "type": "Feature", "properties": { "id": 151.0, "osm_id": 25241521.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.281841225125135, 38.562975772932532 ], [ -121.283832681500144, 38.565101591215409 ], [ -121.283958745323872, 38.565210555956675 ], [ -121.28410090240169, 38.565296554283265 ], [ -121.284264517151669, 38.565359418557051 ], [ -121.284436178528622, 38.565397220940376 ], [ -121.284578335606454, 38.565416164041537 ], [ -121.284733903729361, 38.565411973089951 ], [ -121.286643636548419, 38.565304936186429 ], [ -121.288250279748723, 38.565218937859854 ], [ -121.288411212289645, 38.565200078577718 ], [ -121.288561415994479, 38.565164455489239 ], [ -121.28868747981825, 38.565116259545952 ], [ -121.288821506450006, 38.565044929549977 ] ] } },
{ "type": "Feature", "properties": { "id": 152.0, "osm_id": 25241573.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.282504820399382, 38.56259313905268 ], [ -121.275753867945369, 38.561775232941017 ], [ -121.275568879342345, 38.561735418900938 ], [ -121.275397134146331, 38.561668279856534 ], [ -121.275244248232426, 38.561582365348983 ], [ -121.275128913244757, 38.561481698691892 ], [ -121.271993410905637, 38.5581237406425 ] ] } },
{ "type": "Feature", "properties": { "id": 153.0, "osm_id": 25241418.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.303914380399391, 38.561353623211389 ], [ -121.302511501265229, 38.56021485784624 ], [ -121.300411415425103, 38.55850754798881 ], [ -121.300293482047437, 38.558427836089649 ] ] } },
{ "type": "Feature", "properties": { "id": 154.0, "osm_id": 25241424.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.305386913148936, 38.56053789639455 ], [ -121.304953317297702, 38.55573992737996 ] ] } },
{ "type": "Feature", "properties": { "id": 155.0, "osm_id": 25241210.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.287955907309268, 38.562853816241379 ], [ -121.28804006161711, 38.562805368841047 ], [ -121.298340330969978, 38.556869053556461 ], [ -121.304897829098735, 38.553089569596516 ], [ -121.305009308410931, 38.553025364218165 ] ] } },
{ "type": "Feature", "properties": { "id": 156.0, "osm_id": 25241455.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.310212207167851, 38.553565829334801 ], [ -121.309697223036835, 38.553003738908004 ] ] } },
{ "type": "Feature", "properties": { "id": 157.0, "osm_id": 25241214.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.281663444958824, 38.56307828360837 ], [ -121.281841225125135, 38.562975772932532 ], [ -121.282504820399382, 38.56259313905268 ], [ -121.286314814486914, 38.560396326049954 ], [ -121.295884265702057, 38.554878519190808 ], [ -121.304561463324376, 38.549874858272339 ], [ -121.305954451812795, 38.549071536672209 ], [ -121.313333376452547, 38.544816128250048 ], [ -121.313517359227205, 38.544710097174885 ] ] } },
{ "type": "Feature", "properties": { "id": 158.0, "osm_id": 25290990.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.580072776619105, 38.707150877763418 ], [ -121.580075458828091, 38.706990448136665 ], [ -121.580207138526973, 38.699163846048428 ], [ -121.580246449652847, 38.69682697144362 ], [ -121.580314929801759, 38.692751941577754 ], [ -121.580468234810823, 38.68363762770494 ], [ -121.580470414105633, 38.683507289110608 ] ] } },
{ "type": "Feature", "properties": { "id": 159.0, "osm_id": 25290984.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.601487449579992, 38.683853042616526 ], [ -121.598859136201895, 38.683822532488932 ] ] } },
{ "type": "Feature", "properties": { "id": 160.0, "osm_id": 25303287.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.601270525925884, 38.697043643640662 ], [ -121.598639614157761, 38.697018581750186 ] ] } },
{ "type": "Feature", "properties": { "id": 161.0, "osm_id": 25303345.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.601101211481762, 38.707338632394503 ], [ -121.601103306957569, 38.70720653360047 ], [ -121.601200620853405, 38.70129628603479 ], [ -121.601270525925884, 38.697043643640662 ], [ -121.60129642600667, 38.695470947148216 ], [ -121.601376808458127, 38.69058337558868 ], [ -121.601487449579992, 38.683853042616526 ], [ -121.601489628874845, 38.683721195279567 ] ] } },
{ "type": "Feature", "properties": { "id": 162.0, "osm_id": 25303501.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.589186252301602, 38.696188521878916 ], [ -121.586150662248286, 38.696156838284921 ], [ -121.586019317825546, 38.696156419189762 ], [ -121.582886078600268, 38.696119371177694 ] ] } },
{ "type": "Feature", "properties": { "id": 163.0, "osm_id": 25303503.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.583923842032164, 38.693989026667154 ], [ -121.582921701688747, 38.693981566773331 ] ] } },
{ "type": "Feature", "properties": { "id": 164.0, "osm_id": 25303504.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.589186252301602, 38.696188521878916 ], [ -121.589171835428118, 38.69692252513979 ] ] } },
{ "type": "Feature", "properties": { "id": 165.0, "osm_id": 25303472.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.580207138526973, 38.699163846048428 ], [ -121.582775437478375, 38.702740990865763 ] ] } },
{ "type": "Feature", "properties": { "id": 166.0, "osm_id": 25303288.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.582714836318416, 38.706367337454736 ], [ -121.582676447201877, 38.706525168691527 ], [ -121.582636130247593, 38.70662055474962 ], [ -121.582565638441935, 38.706723149244453 ], [ -121.582453823853584, 38.706827168662848 ], [ -121.582327340934725, 38.706909562771045 ], [ -121.582193481941033, 38.70696236876104 ], [ -121.582105304319668, 38.706990699593767 ], [ -121.581998351235114, 38.707007631038202 ], [ -121.581849404815756, 38.707003691543711 ], [ -121.580075458828091, 38.706990448136665 ] ] } },
{ "type": "Feature", "properties": { "id": 167.0, "osm_id": 25303810.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.598326801531343, 38.683818760632505 ], [ -121.598340464033498, 38.681835267065551 ] ] } },
{ "type": "Feature", "properties": { "id": 168.0, "osm_id": 25303346.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.601200620853405, 38.70129628603479 ], [ -121.59856895471404, 38.701268374297221 ] ] } },
{ "type": "Feature", "properties": { "id": 169.0, "osm_id": 25303804.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.595955980218704, 38.683428080125623 ], [ -121.595955980218704, 38.683623378469562 ], [ -121.595977437890838, 38.683690349875903 ], [ -121.596028483681124, 38.683742736770768 ], [ -121.59610081950558, 38.683788753419144 ], [ -121.596219004340284, 38.683802332102296 ], [ -121.598326801531343, 38.683818760632505 ], [ -121.598859136201895, 38.683822532488932 ] ] } },
{ "type": "Feature", "properties": { "id": 170.0, "osm_id": 25303806.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.598824854217895, 38.685883391022209 ], [ -121.598119852341995, 38.685870650529381 ], [ -121.597994123794379, 38.685899735733429 ] ] } },
{ "type": "Feature", "properties": { "id": 171.0, "osm_id": 25303473.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.580314929801759, 38.692751941577754 ], [ -121.580967712420943, 38.691858598337504 ], [ -121.581506165880796, 38.691134485722372 ], [ -121.583001916502099, 38.689178484797793 ] ] } },
{ "type": "Feature", "properties": { "id": 172.0, "osm_id": 25303801.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.601376808458127, 38.69058337558868 ], [ -121.598747070156463, 38.690560660631093 ], [ -121.597718778275109, 38.69055026707116 ] ] } },
{ "type": "Feature", "properties": { "id": 173.0, "osm_id": 25303502.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.586139765774121, 38.696891344460013 ], [ -121.586152338628892, 38.696261863531653 ], [ -121.586150662248286, 38.696156838284921 ] ] } },
{ "type": "Feature", "properties": { "id": 174.0, "osm_id": 25304964.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.493863226098838, 38.506845771597888 ], [ -121.493925755096555, 38.511282648223769 ], [ -121.49395308010088, 38.51339723475639 ], [ -121.493957103414374, 38.513507540602134 ], [ -121.493998426197052, 38.516437183399368 ] ] } },
{ "type": "Feature", "properties": { "id": 175.0, "osm_id": 25304968.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.493925755096555, 38.511282648223769 ], [ -121.495663155986335, 38.511336543861155 ], [ -121.497306679560594, 38.511372586044821 ], [ -121.497934567927345, 38.511397480297241 ] ] } },
{ "type": "Feature", "properties": { "id": 176.0, "osm_id": 25304966.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.490773572770081, 38.519235481773819 ], [ -121.494723125545448, 38.514482272122173 ], [ -121.495478418840406, 38.513569985780784 ], [ -121.495624683050778, 38.513381225321325 ], [ -121.497306679560594, 38.511372586044821 ], [ -121.49934465549822, 38.508907635959552 ], [ -121.501229242607749, 38.506634128542764 ] ] } },
{ "type": "Feature", "properties": { "id": 177.0, "osm_id": 25304965.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.495054126901749, 38.518361919825075 ], [ -121.494977348668669, 38.518305341978653 ], [ -121.489102053639229, 38.513975083161142 ], [ -121.485281749810795, 38.51115926660907 ] ] } },
{ "type": "Feature", "properties": { "id": 178.0, "osm_id": 25304967.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.485281749810795, 38.51115926660907 ], [ -121.484097554530436, 38.510292074906729 ] ] } },
{ "type": "Feature", "properties": { "id": 179.0, "osm_id": 25304963.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.500708307325496, 38.505257065670392 ], [ -121.498176469652932, 38.508308832796821 ], [ -121.497463169692864, 38.509163619282447 ], [ -121.496792282162872, 38.509970545100991 ], [ -121.496436638011204, 38.510398525077036 ], [ -121.496018548680894, 38.510906384590314 ], [ -121.495663155986335, 38.511336543861155 ], [ -121.495479759944899, 38.511552126410798 ], [ -121.495111375300439, 38.511995948183831 ], [ -121.494805519653639, 38.512365925389915 ], [ -121.494524809716339, 38.512704973373303 ], [ -121.494254577158031, 38.513024659160322 ], [ -121.49395308010088, 38.51339723475639 ], [ -121.493854508919554, 38.513510138992118 ], [ -121.493610763175255, 38.513803840879355 ], [ -121.493318402392589, 38.514159652669036 ], [ -121.493008607251284, 38.514532982636403 ], [ -121.492607868460553, 38.515008571822449 ], [ -121.492101350051811, 38.515622294772811 ], [ -121.49166004284973, 38.51615286924369 ], [ -121.491121254113693, 38.516802299101606 ], [ -121.490253643316223, 38.51785414413083 ] ] } },
{ "type": "Feature", "properties": { "id": 180.0, "osm_id": 25332932.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.957077705594827, 38.38312879693779 ], [ -121.958829439539031, 38.381055952282978 ], [ -121.961619272191314, 38.377754739718107 ], [ -121.963291629512511, 38.375775772378852 ], [ -121.966107110788485, 38.372443798229291 ] ] } },
{ "type": "Feature", "properties": { "id": 181.0, "osm_id": 25349263.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.945533645630064, 38.254446299018674 ], [ -121.943693734064425, 38.252849462645074 ] ] } },
{ "type": "Feature", "properties": { "id": 182.0, "osm_id": 25349265.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.956874109166733, 38.243377157687711 ], [ -121.958724749568404, 38.244980196669658 ], [ -121.963203451891104, 38.247038959727121 ], [ -121.963460608680464, 38.247778243587049 ], [ -121.964039127637506, 38.248228267968443 ] ] } },
{ "type": "Feature", "properties": { "id": 183.0, "osm_id": 25349269.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.9230565664419, 38.263960932587054 ], [ -121.926570427890297, 38.266981519033727 ] ] } },
{ "type": "Feature", "properties": { "id": 184.0, "osm_id": 25349268.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.917365002729994, 38.261695639435395 ], [ -121.919537675851586, 38.263565725852423 ], [ -121.921388735348458, 38.265158119817329 ], [ -121.922510317812083, 38.266091780011806 ], [ -121.924885916809544, 38.268194548060976 ] ] } },
{ "type": "Feature", "properties": { "id": 185.0, "osm_id": 25349270.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.924723726983117, 38.262764332089994 ], [ -121.928233313660911, 38.265793887173047 ] ] } },
{ "type": "Feature", "properties": { "id": 186.0, "osm_id": 25349260.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.898192656506026, 38.281805585348302 ], [ -121.921388735348458, 38.265158119817329 ], [ -121.9230565664419, 38.263960932587054 ], [ -121.924723726983117, 38.262764332089994 ], [ -121.92634914564654, 38.261597654987277 ], [ -121.926506054873926, 38.261485086027655 ] ] } },
{ "type": "Feature", "properties": { "id": 187.0, "osm_id": 25349266.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.963203451891104, 38.247038959727121 ], [ -121.964135603343038, 38.246878278643308 ], [ -121.964907073711117, 38.247038959727121 ] ] } },
{ "type": "Feature", "properties": { "id": 188.0, "osm_id": 25349347.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.92634914564654, 38.261597654987277 ], [ -121.925878417964299, 38.261110163498714 ], [ -121.924558771128659, 38.259964441153905 ], [ -121.919537675851586, 38.263565725852423 ] ] } },
{ "type": "Feature", "properties": { "id": 189.0, "osm_id": 25349262.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.958724749568404, 38.244980196669658 ], [ -121.955770380156821, 38.247095286116483 ], [ -121.951350770251523, 38.250245289148118 ], [ -121.950699831651065, 38.250767565534836 ], [ -121.945717628404736, 38.254303387569557 ], [ -121.945533645630064, 38.254446299018674 ], [ -121.944624712049915, 38.255042671429472 ], [ -121.937778205899733, 38.259928398970267 ] ] } },
{ "type": "Feature", "properties": { "id": 190.0, "osm_id": 25349264.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.950699831651065, 38.250767565534836 ], [ -121.949086147652082, 38.248974257350881 ] ] } },
{ "type": "Feature", "properties": { "id": 191.0, "osm_id": 25349346.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.949086147652082, 38.248974257350881 ], [ -121.946569481224216, 38.248863029495752 ], [ -121.927404175798955, 38.26249175259877 ], [ -121.922510317812083, 38.266091780011806 ] ] } },
{ "type": "Feature", "properties": { "id": 192.0, "osm_id": 25349345.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.947992057830817, 38.252624324725872 ], [ -121.948864949227342, 38.24913326205408 ] ] } },
{ "type": "Feature", "properties": { "id": 193.0, "osm_id": 25349344.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.934073739973158, 38.262427463401451 ], [ -121.930399532717075, 38.262402317691944 ], [ -121.927404175798955, 38.26249175259877 ], [ -121.92634914564654, 38.261597654987277 ] ] } },
{ "type": "Feature", "properties": { "id": 194.0, "osm_id": 25349261.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.928657102685349, 38.263654238749929 ], [ -121.930399532717075, 38.262402317691944 ], [ -121.943693734064425, 38.252849462645074 ], [ -121.948864949227342, 38.24913326205408 ], [ -121.949086147652082, 38.248974257350881 ], [ -121.956874109166733, 38.243377157687711 ], [ -121.956965220454222, 38.243311778842973 ] ] } },
{ "type": "Feature", "properties": { "id": 195.0, "osm_id": 25561462.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -123.429410630546144, 38.702411749709086 ], [ -123.429717156745198, 38.702131961781156 ] ] } },
{ "type": "Feature", "properties": { "id": 196.0, "osm_id": 25561455.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -123.435427328282159, 38.706249739353218 ], [ -123.429717156745198, 38.702131961781156 ], [ -123.428758350841193, 38.701440454769369 ] ] } },
{ "type": "Feature", "properties": { "id": 197.0, "osm_id": 25561466.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -123.428406478545938, 38.701775479439185 ], [ -123.428758350841193, 38.701440454769369 ] ] } },
{ "type": "Feature", "properties": { "id": 198.0, "osm_id": 25771741.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.958147320258803, 38.380701733054863 ], [ -121.958829439539031, 38.381055952282978 ] ] } },
{ "type": "Feature", "properties": { "id": 199.0, "osm_id": 25771731.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.965429769193037, 38.372057392493005 ], [ -121.966107110788485, 38.372443798229291 ] ] } },
{ "type": "Feature", "properties": { "id": 200.0, "osm_id": 25771736.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.960935225073328, 38.377392641500997 ], [ -121.961619272191314, 38.377754739718107 ] ] } },
{ "type": "Feature", "properties": { "id": 201.0, "osm_id": 25771748.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.956422240766656, 38.382749348181115 ], [ -121.957077705594827, 38.38312879693779 ] ] } },
{ "type": "Feature", "properties": { "id": 202.0, "osm_id": 25771766.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.962596015368106, 38.375421134055564 ], [ -121.963291629512511, 38.375775772378852 ] ] } },
{ "type": "Feature", "properties": { "id": 203.0, "osm_id": 25771730.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.956331716212375, 38.382856720360778 ], [ -121.956422240766656, 38.382749348181115 ], [ -121.958147320258803, 38.380701733054863 ], [ -121.960935225073328, 38.377392641500997 ], [ -121.962596015368106, 38.375421134055564 ], [ -121.965429769193037, 38.372057392493005 ] ] } },
{ "type": "Feature", "properties": { "id": 204.0, "osm_id": 25852140.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.747583938075351, 38.611952658098957 ], [ -121.747446558682327, 38.618692546440769 ] ] } },
{ "type": "Feature", "properties": { "id": 205.0, "osm_id": 26432994.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.926192236419126, 37.35638773533622 ], [ -121.926251664112598, 37.356441966249761 ], [ -121.929832916062509, 37.359709064468746 ], [ -121.931813224506314, 37.361515448421656 ], [ -121.936553945122199, 37.365839839906926 ] ] } },
{ "type": "Feature", "properties": { "id": 206.0, "osm_id": 26741633.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.389004971295947, 37.624141597243835 ], [ -122.388993068993429, 37.624211167040215 ], [ -122.388998936325649, 37.624271852019163 ], [ -122.389020310178751, 37.624335638302334 ], [ -122.389176800311034, 37.624642332139416 ], [ -122.390411706105567, 37.626945427674421 ], [ -122.391015454591141, 37.628041529152441 ], [ -122.391870911629056, 37.62965177657108 ], [ -122.392528639571054, 37.630874528606022 ] ] } },
{ "type": "Feature", "properties": { "id": 207.0, "osm_id": 27189803.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.392528639571054, 37.630874528606022 ], [ -122.392582283751381, 37.631027582157962 ], [ -122.392587648169396, 37.631180468071889 ], [ -122.392533920170067, 37.631324972082602 ], [ -122.392415902973369, 37.631469392274255 ], [ -122.392249606014417, 37.631571316216863 ] ] } },
{ "type": "Feature", "properties": { "id": 208.0, "osm_id": 27189860.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.390800542593766, 37.62408107990295 ], [ -122.390682441578079, 37.624004217850846 ], [ -122.390595521242147, 37.6239214884665 ], [ -122.390530058578364, 37.623815625029437 ], [ -122.390500973374373, 37.623706492650122 ], [ -122.390495608956343, 37.623553774374294 ], [ -122.390519832656494, 37.623470961170938 ], [ -122.390559730515591, 37.6233823644544 ], [ -122.390618739113961, 37.62330164672683 ], [ -122.390699540660563, 37.623226628693438 ], [ -122.390785036072927, 37.623169883208938 ], [ -122.390904729650231, 37.623116155209601 ] ] } },
{ "type": "Feature", "properties": { "id": 209.0, "osm_id": 27189802.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.393735382170973, 37.63153108308164 ], [ -122.393582412438022, 37.631363277380075 ], [ -122.393373200134818, 37.631271998454537 ], [ -122.39312375469639, 37.631229418386397 ], [ -122.392933317856304, 37.631195471678581 ], [ -122.392796525196502, 37.631152975429444 ], [ -122.392702647880967, 37.631099834163336 ], [ -122.392614134983418, 37.631012746189363 ], [ -122.392528639571054, 37.630874528606022 ] ] } },
{ "type": "Feature", "properties": { "id": 210.0, "osm_id": 27194437.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.129807942881087, 37.662043473747048 ], [ -122.129683723076027, 37.661987063538703 ], [ -122.126050419507408, 37.66032954218614 ], [ -122.124400022772562, 37.659578858937941 ], [ -122.123473906290911, 37.659156075741883 ], [ -122.123165200797047, 37.659015175949484 ], [ -122.122636805620957, 37.658773860957133 ], [ -122.122097765427895, 37.658528774108341 ], [ -122.120849280950182, 37.657958972330626 ], [ -122.119375407096143, 37.657283642391931 ], [ -122.118286178778746, 37.656789445380838 ], [ -122.115075071673004, 37.655321522678044 ], [ -122.1147413042886, 37.655172324801569 ] ] } },
{ "type": "Feature", "properties": { "id": 211.0, "osm_id": 27194436.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.12725800029763, 37.662469944980565 ], [ -122.124877120701214, 37.661382141586692 ], [ -122.123811780807841, 37.660895488288432 ], [ -122.122947941866769, 37.660500784467985 ], [ -122.121845637780424, 37.659997199725346 ], [ -122.119540446769633, 37.658943929772548 ], [ -122.118031368922288, 37.658254434417493 ], [ -122.117976802732613, 37.658229540165053 ] ] } },
{ "type": "Feature", "properties": { "id": 212.0, "osm_id": 27285965.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.787574165754208, 36.939503219803477 ], [ -121.791804847562034, 36.934096221704344 ], [ -121.793888337233895, 36.931451144519862 ], [ -121.795770912686649, 36.929077138084025 ] ] } },
{ "type": "Feature", "properties": { "id": 213.0, "osm_id": 27285960.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.793930582025851, 36.938297734489069 ], [ -121.786058130927245, 36.937206494514896 ], [ -121.780815669587369, 36.936479783509782 ] ] } },
{ "type": "Feature", "properties": { "id": 214.0, "osm_id": 27286059.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.793930582025851, 36.938297734489069 ], [ -121.793964947828854, 36.938146776412921 ], [ -121.79391348294341, 36.938023227160151 ], [ -121.793475612321615, 36.937508745943347 ], [ -121.793243936517868, 36.937371534188394 ], [ -121.788529283620832, 36.936711626951549 ] ] } },
{ "type": "Feature", "properties": { "id": 215.0, "osm_id": 27286461.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.598964580543836, 37.085459395239674 ], [ -121.5989373393585, 37.08541572552415 ], [ -121.597458604000636, 37.08272572133869 ], [ -121.59607634434829, 37.08021089892955 ], [ -121.594721828795457, 37.077746619396507 ], [ -121.594694419972072, 37.077698255815186 ] ] } },
{ "type": "Feature", "properties": { "id": 216.0, "osm_id": 27286064.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.787574165754208, 36.939503219803477 ], [ -121.787575171582617, 36.939496765738021 ], [ -121.787398816339831, 36.939141540681533 ], [ -121.787192872978878, 36.938537876014976 ], [ -121.787244337864337, 36.938345762794278 ], [ -121.788331722163051, 36.936962832589657 ], [ -121.788529283620832, 36.936711626951549 ], [ -121.789487251334535, 36.935493233506236 ], [ -121.79091795838724, 36.933673773784363 ], [ -121.792038954117643, 36.932250358987439 ], [ -121.793003627353897, 36.93102542765768 ], [ -121.794351102108081, 36.929303365650682 ], [ -121.794462749058368, 36.929220971542456 ], [ -121.794600044632318, 36.929166153895721 ], [ -121.795243774796063, 36.929056350964153 ], [ -121.79543991133032, 36.929059116992207 ], [ -121.795770912686649, 36.929077138084025 ] ] } },
{ "type": "Feature", "properties": { "id": 217.0, "osm_id": 27374278.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.791804847562034, 36.934096221704344 ], [ -121.79091795838724, 36.933673773784363 ], [ -121.790497354485979, 36.933454167921219 ] ] } },
{ "type": "Feature", "properties": { "id": 218.0, "osm_id": 27374276.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.793003627353897, 36.93102542765768 ], [ -121.793888337233895, 36.931451144519862 ] ] } },
{ "type": "Feature", "properties": { "id": 219.0, "osm_id": 27374285.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.788331722163051, 36.936962832589657 ], [ -121.786201545290524, 36.936629819576609 ], [ -121.781266280701956, 36.935978042785813 ], [ -121.780884317374358, 36.936205276180857 ], [ -121.780815669587369, 36.936479783509782 ] ] } },
{ "type": "Feature", "properties": { "id": 220.0, "osm_id": 27767384.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.417936426753826, 36.901309988345965 ], [ -121.417910442854009, 36.901281322237146 ], [ -121.412999150508512, 36.89626207097875 ], [ -121.410672082730443, 36.893858057329545 ], [ -121.408014265053168, 36.891155480289321 ], [ -121.404604339204113, 36.887648994915715 ] ] } },
{ "type": "Feature", "properties": { "id": 221.0, "osm_id": 27767388.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.410827567034318, 36.889681941711409 ], [ -121.411101739087115, 36.890331455388328 ] ] } },
{ "type": "Feature", "properties": { "id": 222.0, "osm_id": 27767394.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.409054459236984, 36.893554632434657 ], [ -121.409109612159867, 36.893527558887406 ], [ -121.409177673213634, 36.893527558887406 ], [ -121.410264722236178, 36.893858057329545 ], [ -121.410429175176503, 36.893900972673769 ], [ -121.410532440223591, 36.893910025129209 ], [ -121.410626149901049, 36.893890160018707 ], [ -121.410672082730443, 36.893858057329545 ] ] } },
{ "type": "Feature", "properties": { "id": 223.0, "osm_id": 27778161.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.59607634434829, 37.08021089892955 ], [ -121.596932807214543, 37.07990948569141 ], [ -121.597594642289124, 37.079676552602201 ] ] } },
{ "type": "Feature", "properties": { "id": 224.0, "osm_id": 27767392.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.412186105900687, 36.896761464769824 ], [ -121.412999150508512, 36.89626207097875 ] ] } },
{ "type": "Feature", "properties": { "id": 225.0, "osm_id": 27778181.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.597458604000636, 37.08272572133869 ], [ -121.598314983047871, 37.082419446596724 ], [ -121.598979835607608, 37.082181652003676 ] ] } },
{ "type": "Feature", "properties": { "id": 226.0, "osm_id": 27778207.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.5989373393585, 37.08541572552415 ], [ -121.599798663728606, 37.085113641733798 ], [ -121.600286825769444, 37.084942483270979 ] ] } },
{ "type": "Feature", "properties": { "id": 227.0, "osm_id": 27767396.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.402336280024386, 36.88775904930435 ], [ -121.402385146519876, 36.88783792301323 ], [ -121.402766606933284, 36.888225334577896 ], [ -121.404736773274237, 36.890248642184972 ], [ -121.404784466303298, 36.890341094576982 ], [ -121.404797039158083, 36.890549720146979 ], [ -121.404820508486964, 36.890640328520242 ], [ -121.404835428274566, 36.890697996014119 ] ] } },
{ "type": "Feature", "properties": { "id": 228.0, "osm_id": 27767387.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.403177152550768, 36.892412849584375 ], [ -121.402083062729517, 36.892705294186086 ], [ -121.402001339173594, 36.8927229800018 ], [ -121.401938810175906, 36.892724488744385 ], [ -121.40188885403299, 36.89270755729995 ], [ -121.40183973608039, 36.892682160133312 ], [ -121.40180428062996, 36.892647542873242 ], [ -121.401780140748826, 36.892602951148376 ], [ -121.40176957955083, 36.892561460727649 ], [ -121.401778212911097, 36.892523742163355 ], [ -121.401790701946823, 36.892490633645835 ], [ -121.401823475188209, 36.892438330570016 ], [ -121.40227903162571, 36.891995766082481 ], [ -121.402389337471462, 36.891922340610662 ], [ -121.402508360496554, 36.891868444973248 ], [ -121.405280758790212, 36.891140476682637 ] ] } },
{ "type": "Feature", "properties": { "id": 229.0, "osm_id": 27767385.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.413444900119302, 36.88971613987637 ], [ -121.411101739087115, 36.890331455388328 ], [ -121.408014265053168, 36.891155480289321 ], [ -121.406974406145451, 36.891418923506052 ], [ -121.405810914165912, 36.891718492725481 ], [ -121.403177152550768, 36.892412849584375 ] ] } },
{ "type": "Feature", "properties": { "id": 230.0, "osm_id": 28611726.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.812961969088434, 38.514389652092127 ], [ -122.813095325167893, 38.514539352882814 ], [ -122.813206972118209, 38.51457966983704 ], [ -122.818571306330199, 38.514519236315202 ], [ -122.820691341099888, 38.514512530792658 ] ] } },
{ "type": "Feature", "properties": { "id": 231.0, "osm_id": 28611732.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.818571306330199, 38.514519236315202 ], [ -122.81850265854321, 38.5108321209282 ] ] } },
{ "type": "Feature", "properties": { "id": 232.0, "osm_id": 28611661.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.82093173408289, 38.503168630675681 ], [ -122.819858850476692, 38.504666476772798 ], [ -122.812961969088434, 38.514389652092127 ], [ -122.812769269134492, 38.514660219926562 ] ] } },
{ "type": "Feature", "properties": { "id": 233.0, "osm_id": 28611804.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.819858850476692, 38.504666476772798 ], [ -122.819918864903443, 38.504471681343006 ], [ -122.819867400017927, 38.504370930866891 ], [ -122.819764470246966, 38.504256769345652 ], [ -122.818262349379239, 38.503094786108726 ], [ -122.818133603346482, 38.503047679812902 ], [ -122.817996223953472, 38.503034268767827 ], [ -122.808168610120589, 38.503094786108726 ], [ -122.808065680349628, 38.503121524379829 ], [ -122.807919751415355, 38.503141724766458 ], [ -122.806385444039478, 38.503670622856738 ], [ -122.806288968333931, 38.503759638668427 ], [ -122.80620313764544, 38.503907495440437 ], [ -122.806168855661468, 38.504095585347621 ], [ -122.806204478749962, 38.506258367823506 ], [ -122.806228953907208, 38.507742635237491 ], [ -122.806263235891208, 38.507836680191062 ], [ -122.806314700776667, 38.507910524758046 ], [ -122.807919751415355, 38.510930692109511 ], [ -122.809044183726115, 38.513041758242814 ], [ -122.809104281971855, 38.513095486242143 ], [ -122.809207211742844, 38.513122392151317 ], [ -122.809301675791616, 38.513129097673854 ], [ -122.809876758168315, 38.513108981106235 ] ] } },
{ "type": "Feature", "properties": { "id": 234.0, "osm_id": 28611839.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.805979759925847, 38.502913485543097 ], [ -122.805756801301442, 38.502711816952726 ], [ -122.805568040841976, 38.502611150295614 ], [ -122.805276182973458, 38.502564043999783 ], [ -122.804898578235495, 38.502631266863219 ], [ -122.804563721203749, 38.502765544952041 ], [ -122.804486523875511, 38.502852968202149 ], [ -122.80447797433429, 38.503014152200166 ], [ -122.804520805859454, 38.503121524379829 ], [ -122.806204478749962, 38.506258367823506 ], [ -122.806761037120665, 38.507285989152571 ], [ -122.808726509595843, 38.510928931909838 ], [ -122.809876758168315, 38.513108981106235 ], [ -122.8103745593978, 38.514069295752854 ], [ -122.810443123365758, 38.514143140319817 ], [ -122.810623418103035, 38.514243890795903 ], [ -122.811679118807717, 38.51473414831257 ], [ -122.811859329725976, 38.514747559357637 ], [ -122.812005342479253, 38.514680420313219 ], [ -122.812082539807477, 38.51457966983704 ], [ -122.812142638053203, 38.514411780316514 ] ] } },
{ "type": "Feature", "properties": { "id": 235.0, "osm_id": 28611680.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.812580341036977, 38.515231195170749 ], [ -122.812142638053203, 38.514411780316514 ], [ -122.811986734654198, 38.514121179733472 ], [ -122.810273138369425, 38.510925662967608 ], [ -122.806385444039478, 38.503670622856738 ], [ -122.805979759925847, 38.502913485543097 ], [ -122.805688153514467, 38.502369248570027 ] ] } },
{ "type": "Feature", "properties": { "id": 236.0, "osm_id": 28611779.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.820193539870388, 38.510798593315485 ], [ -122.81850265854321, 38.5108321209282 ], [ -122.815455752920627, 38.510859026837373 ], [ -122.810273138369425, 38.510925662967608 ], [ -122.808726509595843, 38.510928931909838 ], [ -122.807919751415355, 38.510930692109511 ], [ -122.806821135366405, 38.510932955223367 ] ] } },
{ "type": "Feature", "properties": { "id": 237.0, "osm_id": 28678638.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.899796977223488, 38.653539889789485 ], [ -122.899583825425765, 38.654001565016259 ] ] } },
{ "type": "Feature", "properties": { "id": 238.0, "osm_id": 28678645.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.896505320028211, 38.649701229593099 ], [ -122.896122015596092, 38.649914129933713 ] ] } },
{ "type": "Feature", "properties": { "id": 239.0, "osm_id": 28678637.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.898292174146746, 38.651785054541072 ], [ -122.897877940491895, 38.651987393683683 ] ] } },
{ "type": "Feature", "properties": { "id": 240.0, "osm_id": 28678651.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.900525113152156, 38.655774756632631 ], [ -122.900507259698401, 38.655091631523995 ] ] } },
{ "type": "Feature", "properties": { "id": 241.0, "osm_id": 28678636.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.896396774382097, 38.649574579036155 ], [ -122.896505320028211, 38.649701229593099 ], [ -122.898292174146746, 38.651785054541072 ], [ -122.899796977223488, 38.653539889789485 ], [ -122.900696355433993, 38.654588633514578 ], [ -122.900851336823678, 38.654769347346949 ] ] } },
{ "type": "Feature", "properties": { "id": 242.0, "osm_id": 28678635.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.901254757823423, 38.656699783466863 ], [ -122.901598080577415, 38.656719816215478 ], [ -122.901778375314649, 38.656693077944318 ], [ -122.901795474397147, 38.65661252785484 ] ] } },
{ "type": "Feature", "properties": { "id": 243.0, "osm_id": 28678646.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.900851336823678, 38.654769347346949 ], [ -122.900424362675992, 38.654993898532972 ] ] } },
{ "type": "Feature", "properties": { "id": 244.0, "osm_id": 28879018.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.901795474397147, 38.65661252785484 ], [ -122.900507259698401, 38.655091631523995 ], [ -122.900424362675992, 38.654993898532972 ], [ -122.899583825425765, 38.654001565016259 ], [ -122.897877940491895, 38.651987393683683 ], [ -122.896122015596092, 38.649914129933713 ], [ -122.896010452464822, 38.649782366415828 ] ] } },
{ "type": "Feature", "properties": { "id": 245.0, "osm_id": 28968683.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.505601435391114, 37.519438299380617 ], [ -122.506993501870184, 37.518406487099966 ] ] } },
{ "type": "Feature", "properties": { "id": 246.0, "osm_id": 28968686.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.49464436010561, 37.513649840868027 ], [ -122.494692556048861, 37.513571972987549 ], [ -122.495005201037245, 37.513066292769068 ], [ -122.495095222677307, 37.512998399353386 ], [ -122.495880104090503, 37.511704149684348 ] ] } },
{ "type": "Feature", "properties": { "id": 247.0, "osm_id": 28968689.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.492217212403645, 37.51079412645683 ], [ -122.493471061299402, 37.509854934206203 ], [ -122.493987805630042, 37.50946869610798 ], [ -122.495328658680691, 37.508466555764556 ] ] } },
{ "type": "Feature", "properties": { "id": 248.0, "osm_id": 28968681.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.508546500890176, 37.521944236972388 ], [ -122.507406645877609, 37.520969924547515 ], [ -122.506371229378558, 37.520097787522303 ], [ -122.505601435391114, 37.519438299380617 ], [ -122.505201870066855, 37.519089360751494 ], [ -122.504000240427899, 37.518066098012078 ], [ -122.503184848887173, 37.517370316229652 ], [ -122.503080242735578, 37.517295968748492 ], [ -122.502980917182953, 37.517236373416914 ], [ -122.50259845094115, 37.517030849151098 ], [ -122.501518107441129, 37.516450318537309 ], [ -122.501159781080432, 37.516257786221438 ], [ -122.500178008761736, 37.515732240892476 ], [ -122.499609464269454, 37.515428061626295 ], [ -122.49923940324436, 37.515229997254274 ], [ -122.497792267661438, 37.51445517412494 ], [ -122.495210641484007, 37.513072830653527 ], [ -122.495095222677307, 37.512998399353386 ], [ -122.494738572697287, 37.512728166795071 ], [ -122.492217212403645, 37.51079412645683 ], [ -122.490961938584405, 37.509834650000542 ], [ -122.490752726281187, 37.509700539549762 ], [ -122.489964240649641, 37.509304829900927 ], [ -122.489537769416188, 37.509087738608734 ] ] } },
{ "type": "Feature", "properties": { "id": 249.0, "osm_id": 30025124.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.381601068584729, 37.605371330915169 ], [ -122.381416834352962, 37.605710378898507 ], [ -122.381190522967273, 37.60611053095603 ], [ -122.380984160511161, 37.606431474028518 ], [ -122.380957422240044, 37.606472964449239 ], [ -122.380813672600624, 37.606696677444951 ] ] } },
{ "type": "Feature", "properties": { "id": 250.0, "osm_id": 30025125.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.366847577894845, 37.627728884164064 ], [ -122.366309711168213, 37.627509865034135 ], [ -122.366175600717398, 37.627441887799414 ], [ -122.366065630147787, 37.62735907459605 ], [ -122.3659798832783, 37.627252875882839 ], [ -122.365912744233896, 37.627127566430417 ], [ -122.365824231336362, 37.626908631119505 ], [ -122.365781315992123, 37.626732359695765 ], [ -122.365778633783123, 37.626551897320446 ], [ -122.365824231336362, 37.626366992536433 ], [ -122.365910062024867, 37.626201282310653 ], [ -122.365985331515361, 37.626088797170098 ], [ -122.366604418883782, 37.625188748407332 ], [ -122.367643104325055, 37.623608927297184 ], [ -122.368335533346226, 37.622557249905988 ], [ -122.369608744438253, 37.620657994465901 ], [ -122.369968663360524, 37.620113925130916 ], [ -122.370575177874144, 37.619164255501346 ], [ -122.371783010121462, 37.617344041408202 ], [ -122.37239505669119, 37.616438460589301 ], [ -122.372946502100973, 37.615585350484324 ], [ -122.373465509545468, 37.614801893994724 ], [ -122.374648447540324, 37.613021326303532 ], [ -122.376225502622447, 37.610650169714788 ], [ -122.378142946792423, 37.607745337350984 ], [ -122.378656254542761, 37.607003119824974 ], [ -122.378902933953185, 37.606726936115393 ], [ -122.379203341362896, 37.606471958620887 ], [ -122.379503832591666, 37.60625947737541 ], [ -122.379836342690552, 37.606059736622782 ], [ -122.380498680679366, 37.605739380283516 ], [ -122.380576213283703, 37.605686658112532 ], [ -122.380634635148809, 37.605610298974639 ], [ -122.380678723959505, 37.605516756935209 ], [ -122.380683753101422, 37.605447019500794 ], [ -122.380708731172874, 37.605347023395936 ], [ -122.380796741156189, 37.605166644839649 ], [ -122.380889947919485, 37.605084753645649 ], [ -122.380995308442394, 37.605043766139104 ], [ -122.381121036989967, 37.605018033696375 ], [ -122.38126302642975, 37.605023817209585 ], [ -122.381394370852448, 37.605070588229289 ], [ -122.381488918720265, 37.605129177732486 ], [ -122.38155463284113, 37.60520285466135 ], [ -122.381587741358672, 37.605286757512111 ], [ -122.381601068584729, 37.605371330915169 ] ] } },
{ "type": "Feature", "properties": { "id": 251.0, "osm_id": 30639606.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.114460259075202, 37.460530367696194 ], [ -122.114844653154748, 37.460288717427723 ] ] } },
{ "type": "Feature", "properties": { "id": 252.0, "osm_id": 30639607.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.115879902015706, 37.461336120048259 ], [ -122.11549726813584, 37.461576261574209 ] ] } },
{ "type": "Feature", "properties": { "id": 253.0, "osm_id": 31394847.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.557311659182403, 38.141774158170335 ], [ -122.556018834436898, 38.140023430054448 ], [ -122.555307462314587, 38.139066049073982 ] ] } },
{ "type": "Feature", "properties": { "id": 254.0, "osm_id": 31394868.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.554173558453257, 38.141542230909508 ], [ -122.553795869896263, 38.141056248163494 ] ] } },
{ "type": "Feature", "properties": { "id": 255.0, "osm_id": 31394886.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.551349611455066, 38.140462222685592 ], [ -122.551624370241086, 38.140840246518742 ] ] } },
{ "type": "Feature", "properties": { "id": 256.0, "osm_id": 31394827.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.558190334092075, 38.141765021895857 ], [ -122.557246280337637, 38.142176824798767 ], [ -122.557186182091868, 38.142183530321297 ], [ -122.557091718043125, 38.142129550864873 ], [ -122.557040253157624, 38.142048581680207 ], [ -122.556945872927926, 38.142014886429443 ], [ -122.556799943993639, 38.142035086816101 ] ] } },
{ "type": "Feature", "properties": { "id": 257.0, "osm_id": 31394858.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.556173312912392, 38.138983822603841 ], [ -122.556860042239421, 38.138673273091278 ] ] } },
{ "type": "Feature", "properties": { "id": 258.0, "osm_id": 31394780.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.55068878220888, 38.140873941769463 ], [ -122.551006372520121, 38.140644445260584 ], [ -122.551143668094113, 38.140556770553374 ], [ -122.551349611455066, 38.140462222685592 ], [ -122.551753032454798, 38.140279916291554 ], [ -122.552001974979092, 38.14015846251457 ], [ -122.552207918340031, 38.140104483058153 ], [ -122.552722902471018, 38.13987498654928 ], [ -122.553152139732532, 38.13982762879629 ], [ -122.55344391378199, 38.13982092327376 ], [ -122.553529744470495, 38.139841123660439 ], [ -122.553658574322299, 38.139908681800009 ], [ -122.553752954551996, 38.139928966005684 ], [ -122.55384733478175, 38.139915471141599 ], [ -122.554019079977763, 38.139834418137916 ], [ -122.554139108831208, 38.13982092327376 ], [ -122.554250755781467, 38.13982762879629 ], [ -122.554352512086012, 38.139885044833058 ] ] } },
{ "type": "Feature", "properties": { "id": 259.0, "osm_id": 31394877.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.553152139732532, 38.13982762879629 ], [ -122.553092041486821, 38.139854618524545 ], [ -122.553040576601305, 38.139922176664115 ], [ -122.553023309880729, 38.139976156120568 ], [ -122.553031943241024, 38.140036924918554 ], [ -122.553426730880489, 38.140563476075947 ] ] } },
{ "type": "Feature", "properties": { "id": 260.0, "osm_id": 31394859.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.554352512086012, 38.139885044833058 ], [ -122.554324516529405, 38.139789658774937 ], [ -122.55432795310972, 38.139712880541865 ], [ -122.55437095227299, 38.139638616879765 ], [ -122.554422417158477, 38.139591342945877 ], [ -122.554664737979238, 38.139479276900438 ], [ -122.55486012014218, 38.139388836165182 ], [ -122.5549459508307, 38.139334856708757 ], [ -122.554992973307492, 38.139272076253974 ], [ -122.555031865338222, 38.139220024635279 ], [ -122.555117612207709, 38.139152550314748 ], [ -122.555307462314587, 38.139066049073982 ], [ -122.55563980477541, 38.138914588083658 ], [ -122.555872905502667, 38.138808389370432 ], [ -122.556001651535425, 38.138747536753371 ], [ -122.556087566042933, 38.13868006243284 ], [ -122.556671114141864, 38.138410081331628 ] ] } },
{ "type": "Feature", "properties": { "id": 261.0, "osm_id": 31394835.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.558645219977308, 38.142048581680207 ], [ -122.55919456991127, 38.141805590307222 ] ] } },
{ "type": "Feature", "properties": { "id": 262.0, "osm_id": 31394901.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.558465009059049, 38.144613695508383 ], [ -122.558017583067652, 38.144836989408951 ] ] } },
{ "type": "Feature", "properties": { "id": 263.0, "osm_id": 31394845.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.557643582548081, 38.141619847332869 ], [ -122.556353607649669, 38.13987498654928 ], [ -122.55563980477541, 38.138914588083658 ] ] } },
{ "type": "Feature", "properties": { "id": 264.0, "osm_id": 31394857.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.556706653411325, 38.139712377627674 ], [ -122.556353607649669, 38.13987498654928 ], [ -122.556018834436898, 38.140023430054448 ], [ -122.555701160306626, 38.140172041197715 ], [ -122.555572581911946, 38.14022593683513 ], [ -122.555452301601406, 38.140232642357681 ], [ -122.555357921371694, 38.140266421427462 ], [ -122.55528131077665, 38.140310677876208 ] ] } },
{ "type": "Feature", "properties": { "id": 265.0, "osm_id": 31394800.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.556001651535425, 38.138747536753371 ], [ -122.556173312912392, 38.138983822603841 ], [ -122.556706653411325, 38.139712377627674 ], [ -122.557984306912076, 38.141461261724857 ], [ -122.558190334092075, 38.141765021895857 ], [ -122.558276248599597, 38.141859569763653 ], [ -122.55837926218959, 38.141906843697555 ], [ -122.558576656009322, 38.141987896701238 ], [ -122.558645219977308, 38.142048581680207 ], [ -122.558662402878809, 38.142102561136625 ], [ -122.558628120894838, 38.142210520049503 ], [ -122.558550839747554, 38.14225787780245 ], [ -122.557512321944358, 38.142723660161785 ] ] } },
{ "type": "Feature", "properties": { "id": 266.0, "osm_id": 31394881.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.552207918340031, 38.140104483058153 ], [ -122.552619972700043, 38.140664729466252 ] ] } },
{ "type": "Feature", "properties": { "id": 267.0, "osm_id": 31394887.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.553830151880248, 38.141657062982979 ], [ -122.553744321191729, 38.141636862596314 ], [ -122.553692856306284, 38.141589588662434 ], [ -122.553409631798033, 38.14119128062363 ] ] } },
{ "type": "Feature", "properties": { "id": 268.0, "osm_id": 31394786.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.559801671158141, 38.147247373304559 ], [ -122.559941313665007, 38.147300263113564 ], [ -122.560070059697765, 38.147313757977699 ], [ -122.560164439927476, 38.147279978907903 ], [ -122.560233171533511, 38.147225999451472 ], [ -122.560267453517497, 38.147131451583668 ], [ -122.560258903976248, 38.147023492670783 ], [ -122.558465009059049, 38.144613695508383 ], [ -122.556645465518145, 38.142149835070569 ], [ -122.55528131077665, 38.140310677876208 ], [ -122.554664737979238, 38.139479276900438 ] ] } },
{ "type": "Feature", "properties": { "id": 269.0, "osm_id": 31394794.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.557984306912076, 38.141461261724857 ], [ -122.557643582548081, 38.141619847332869 ], [ -122.557311659182403, 38.141774158170335 ], [ -122.556997337813399, 38.141920338561661 ], [ -122.556799943993639, 38.142035086816101 ], [ -122.556645465518145, 38.142149835070569 ], [ -122.556490903223633, 38.14225787780245 ], [ -122.556370706732125, 38.142311857258882 ], [ -122.556218072275342, 38.142405566936382 ] ] } },
{ "type": "Feature", "properties": { "id": 270.0, "osm_id": 31394805.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.558971443648815, 38.14154902025107 ], [ -122.558447826157547, 38.141792095443115 ], [ -122.558387727911807, 38.141859569763653 ], [ -122.55837926218959, 38.141906843697555 ], [ -122.558276248599597, 38.142028381293549 ], [ -122.558216150353829, 38.142089066272526 ], [ -122.557460857058885, 38.14242668933236 ], [ -122.55733202720711, 38.142453679060559 ], [ -122.557263463239138, 38.14242668933236 ], [ -122.557203364993399, 38.142359047373752 ], [ -122.557126000027111, 38.142210520049503 ], [ -122.557091718043125, 38.142129550864873 ], [ -122.557040253157624, 38.142035086816101 ], [ -122.557023070256108, 38.141974318018086 ], [ -122.556997337813399, 38.141920338561661 ], [ -122.555701160306626, 38.140172041197715 ], [ -122.555220625797659, 38.139523868625339 ], [ -122.555117612207709, 38.139422699053988 ], [ -122.555031865338222, 38.139328151186206 ], [ -122.554992973307492, 38.139272076253974 ], [ -122.55487730304371, 38.139105360199856 ], [ -122.554868753502475, 38.139017517854612 ], [ -122.554885852584945, 38.138936548669953 ], [ -122.554937317470433, 38.138869074349422 ], [ -122.556508002306117, 38.138160216798042 ] ] } },
{ "type": "Feature", "properties": { "id": 271.0, "osm_id": 31394866.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.55384733478175, 38.139915471141599 ], [ -122.553744321191729, 38.139982945462123 ], [ -122.553718672568053, 38.140043630441092 ], [ -122.553710039207786, 38.140117977922259 ], [ -122.553744321191729, 38.140205652629461 ], [ -122.554516881207249, 38.141238554557539 ], [ -122.554525430748456, 38.141319523742162 ], [ -122.554473965862996, 38.141400576745852 ], [ -122.554173558453257, 38.141542230909508 ], [ -122.553950348371757, 38.141643568118873 ], [ -122.553830151880248, 38.141657062982979 ], [ -122.553624124700221, 38.141697547575305 ], [ -122.553461180502538, 38.141751527031737 ], [ -122.553349533552293, 38.14177851675997 ], [ -122.553263619044742, 38.14177851675997 ], [ -122.5532122379783, 38.141738032167623 ], [ -122.552980478355536, 38.141414071609987 ] ] } },
{ "type": "Feature", "properties": { "id": 272.0, "osm_id": 31394766.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.553953533494962, 38.139345837001898 ], [ -122.554352512086012, 38.139885044833058 ], [ -122.556218072275342, 38.142405566936382 ], [ -122.558017583067652, 38.144836989408951 ], [ -122.559801671158141, 38.147247373304559 ], [ -122.560154800738843, 38.14772463887126 ] ] } },
{ "type": "Feature", "properties": { "id": 273.0, "osm_id": 31394884.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.551753032454798, 38.140279916291554 ], [ -122.552079256126305, 38.14071879274173 ] ] } },
{ "type": "Feature", "properties": { "id": 274.0, "osm_id": 31450095.0, "name": "A; B", "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.811344824059148, 37.694480181743096 ], [ -121.815832159742115, 37.694512452070335 ], [ -121.818395513370675, 37.694533825923394 ], [ -121.820503226742645, 37.694549248625258 ], [ -121.822645976469957, 37.69456668298384 ], [ -121.824995256291416, 37.694586380456293 ], [ -121.829074141832749, 37.694615381841302 ], [ -121.829174221756631, 37.69459928858717 ], [ -121.829241360801078, 37.694564671327093 ], [ -121.829292658048473, 37.694511194784859 ], [ -121.829321156519285, 37.694425867010516 ], [ -121.829318977224432, 37.694180947799815 ], [ -121.829283773231126, 37.694113892574414 ], [ -121.829222669156977, 37.694068378840186 ], [ -121.829016558157932, 37.693930580352024 ] ] } },
{ "type": "Feature", "properties": { "id": 275.0, "osm_id": 31486557.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.208932354467734, 37.721055424849894 ], [ -122.209476339983723, 37.72088602658674 ] ] } },
{ "type": "Feature", "properties": { "id": 276.0, "osm_id": 31486494.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.224089349976438, 37.735011042176673 ], [ -122.223072625121489, 37.734818342222738 ], [ -122.221983648261201, 37.734608375548227 ], [ -122.221608138998988, 37.734527741639695 ], [ -122.221372272243713, 37.734465967013328 ], [ -122.221143278649024, 37.734398073597589 ], [ -122.220690152963442, 37.734259772195244 ] ] } },
{ "type": "Feature", "properties": { "id": 277.0, "osm_id": 31486667.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.212686441261113, 37.719800486306738 ], [ -122.211127574908929, 37.718652668486179 ] ] } },
{ "type": "Feature", "properties": { "id": 278.0, "osm_id": 31486718.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.218107772414726, 37.710917848237663 ], [ -122.218094109912556, 37.710932348930164 ], [ -122.21772337833518, 37.71132872913121 ], [ -122.21734107973144, 37.711737598368011 ], [ -122.216961463336688, 37.71214345011969 ], [ -122.21691787744021, 37.712195250281297 ], [ -122.216887367312651, 37.712252666318001 ], [ -122.216865322907282, 37.712311339640252 ], [ -122.21685643808992, 37.71237671848499 ], [ -122.216861551050854, 37.712453748175143 ], [ -122.216963139717336, 37.712916680687421 ], [ -122.216972778905998, 37.712979461142211 ], [ -122.216967330668936, 37.713039559387944 ], [ -122.216952913795481, 37.713104686775637 ], [ -122.216923660953412, 37.713165539392641 ], [ -122.216872363705946, 37.713236031198342 ], [ -122.216452765633093, 37.713680020609466 ], [ -122.21641471179268, 37.713723774144029 ], [ -122.216385375131566, 37.713768365868901 ], [ -122.21636173816465, 37.713824692258221 ], [ -122.216343968529912, 37.713892753311981 ], [ -122.216344471444103, 37.71397497978213 ], [ -122.216360648517224, 37.714040777722033 ], [ -122.21638462076028, 37.714100792148763 ], [ -122.216419238020407, 37.714153849595832 ], [ -122.216486628521935, 37.714221240097352 ], [ -122.21793485375224, 37.715516830870911 ], [ -122.217982462962283, 37.715559327119976 ] ] } },
{ "type": "Feature", "properties": { "id": 279.0, "osm_id": 31486490.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.222778168862973, 37.740215365857132 ], [ -122.223036666756869, 37.740172618150922 ], [ -122.223229701986938, 37.740128194064134 ], [ -122.223428269273128, 37.740072957322177 ], [ -122.223589117995033, 37.740013529628719 ], [ -122.223755414953985, 37.739939349785615 ], [ -122.223919113522982, 37.73985879969613 ], [ -122.224061270600785, 37.739776070311798 ], [ -122.224192615023512, 37.739695436403274 ], [ -122.22432412708433, 37.739602145820932 ], [ -122.224436779862984, 37.739504580468029 ], [ -122.224557479268654, 37.739381534129421 ], [ -122.224651356584246, 37.739279777824905 ], [ -122.224747916108768, 37.739163017913697 ], [ -122.224836429006288, 37.739037876099324 ], [ -122.224914213067734, 37.738906364038534 ], [ -122.224973221666076, 37.738774851977752 ], [ -122.225026865846402, 37.738626324653474 ], [ -122.225416959620077, 37.73743802224061 ], [ -122.225492061472522, 37.737189834087594 ], [ -122.22554034123479, 37.73702236366222 ], [ -122.225569845533983, 37.736846259876565 ], [ -122.225580574370014, 37.736663869663474 ], [ -122.225548304042817, 37.736453819169945 ], [ -122.225494743681537, 37.736258688464076 ], [ -122.225411511383015, 37.736069928004596 ], [ -122.225288129768273, 37.735876892774527 ], [ -122.225140608272483, 37.735709338530086 ], [ -122.22496894689543, 37.735556536435219 ], [ -122.224711538649004, 37.735363585024167 ], [ -122.22434944043188, 37.735094190656163 ], [ -122.22427987063557, 37.735036523162343 ], [ -122.224215413800167, 37.734977179287853 ], [ -122.224161769619855, 37.734919847070174 ], [ -122.224092032185425, 37.734815995289843 ], [ -122.224027659169082, 37.734699235378635 ], [ -122.222670377588202, 37.73165132392765 ] ] } },
{ "type": "Feature", "properties": { "id": 280.0, "osm_id": 31486558.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.209476339983723, 37.72088602658674 ], [ -122.212263741884072, 37.72001816433216 ], [ -122.212410760465758, 37.719957479353191 ], [ -122.212573201749251, 37.71987282213113 ], [ -122.212686441261113, 37.719800486306738 ], [ -122.214580583740243, 37.718467176968943 ], [ -122.215702250022943, 37.717677517870968 ], [ -122.216180353779947, 37.71734106827757 ], [ -122.216875129733992, 37.716851984227397 ], [ -122.217945247312159, 37.716098618770175 ], [ -122.218304076587032, 37.715846155846585 ], [ -122.218667851184748, 37.715589921066545 ], [ -122.219118881394522, 37.715272582212435 ], [ -122.219881131669098, 37.714735888952205 ], [ -122.221456007456396, 37.713627298438489 ], [ -122.221780554747269, 37.713398891576993 ], [ -122.222140222212474, 37.7131455904631 ], [ -122.222183305194761, 37.713111559936209 ], [ -122.222537943518049, 37.712779552751492 ], [ -122.224218179828213, 37.711187661700805 ] ] } },
{ "type": "Feature", "properties": { "id": 281.0, "osm_id": 31486488.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.212432301956895, 37.728346255687285 ], [ -122.213222547788092, 37.728917566207606 ], [ -122.213682211358147, 37.729249992487489 ], [ -122.215704680774863, 37.730713640419644 ], [ -122.215836025197603, 37.730813468886446 ], [ -122.215905846451037, 37.730904663992945 ], [ -122.215959406812303, 37.731000050051051 ], [ -122.216927768085952, 37.733778986229204 ], [ -122.216965235193129, 37.733863894908353 ], [ -122.217026926000472, 37.733955090014909 ], [ -122.218038118799342, 37.735174740745677 ], [ -122.219749451970259, 37.737257727503305 ], [ -122.221616269445093, 37.739527379244649 ], [ -122.221694053506525, 37.739646150812625 ], [ -122.221803940257161, 37.739870953455743 ], [ -122.221952132305233, 37.740045883774954 ], [ -122.222051457857859, 37.740086787462424 ], [ -122.222148520296599, 37.74009726484141 ], [ -122.222201242467548, 37.740084859624716 ], [ -122.22257683554875, 37.740002465516532 ], [ -122.22261522466529, 37.739946390584286 ], [ -122.222619331797858, 37.739864667028343 ], [ -122.222630731186186, 37.739796019241354 ] ] } },
{ "type": "Feature", "properties": { "id": 282.0, "osm_id": 31540794.0, "name": "14L\/32R", "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.05232160663158, 37.986102854041803 ], [ -122.053387700896209, 37.987793819188028 ], [ -122.054505679141485, 37.9895704473847 ], [ -122.054903651904183, 37.990202694341065 ], [ -122.055916521083645, 37.991829035013829 ], [ -122.056929474082182, 37.993435259118989 ], [ -122.057101303097241, 37.993704150572782 ], [ -122.057299702745354, 37.994014616266348 ], [ -122.058405946326204, 37.995761488706727 ] ] } },
{ "type": "Feature", "properties": { "id": 283.0, "osm_id": 31540803.0, "name": "1R\/19L", "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.061331062895704, 37.981981891346571 ], [ -122.061009952185103, 37.982556889904281 ], [ -122.060922277477914, 37.982720588473256 ], [ -122.060119710249083, 37.984182392386693 ], [ -122.059948803243344, 37.98449369627059 ], [ -122.059734142703064, 37.984877671254928 ], [ -122.05890114916572, 37.986406362755744 ], [ -122.057914431524111, 37.988193971245551 ], [ -122.057182859015114, 37.989524849831426 ], [ -122.056822772454794, 37.990174531146408 ], [ -122.056462769713491, 37.990827816679747 ], [ -122.055916521083645, 37.991829035013829 ], [ -122.055251417066856, 37.993019684359638 ] ] } },
{ "type": "Feature", "properties": { "id": 284.0, "osm_id": 31736803.0, "name": "1L\/19R", "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.058363533896127, 37.983945771260117 ], [ -122.056697630640414, 37.986975493981198 ], [ -122.056320361178564, 37.987653841405056 ], [ -122.056180718671698, 37.987903789757674 ], [ -122.055452666562047, 37.989231399401334 ], [ -122.054903651904183, 37.990202694341065 ], [ -122.054572063814646, 37.990822452261718 ] ] } },
{ "type": "Feature", "properties": { "id": 285.0, "osm_id": 31736813.0, "name": "14R\/32L", "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.056108382847299, 37.989041046380237 ], [ -122.056129756700415, 37.989073819621673 ], [ -122.056822772454794, 37.990174531146408 ], [ -122.057829271387874, 37.991773295357731 ], [ -122.058958313745322, 37.99356827992235 ], [ -122.060378878695204, 37.995842290253307 ], [ -122.060399749634072, 37.995871962190556 ] ] } },
{ "type": "Feature", "properties": { "id": 286.0, "osm_id": 32988366.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.442274731991702, 38.223300571749405 ], [ -122.453080849201058, 38.223287160704338 ] ] } },
{ "type": "Feature", "properties": { "id": 287.0, "osm_id": 32988384.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.453020750955289, 38.227211316313095 ], [ -122.453080849201058, 38.223287160704338 ], [ -122.453089482561325, 38.2228218812592 ] ] } },
{ "type": "Feature", "properties": { "id": 288.0, "osm_id": 33723133.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.27795615363523, 38.223192864293665 ], [ -122.277984568286968, 38.223133771876292 ], [ -122.279991028268654, 38.218953130030428 ], [ -122.282077367787551, 38.214606191225606 ], [ -122.284491439720583, 38.209575792036027 ], [ -122.285085549017509, 38.208337868756303 ], [ -122.285262407174471, 38.20796914883573 ] ] } },
{ "type": "Feature", "properties": { "id": 289.0, "osm_id": 33723116.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.288475777394098, 38.207707717275731 ], [ -122.288385755754007, 38.207724481082089 ], [ -122.285085549017509, 38.208337868756303 ], [ -122.279793131534703, 38.209321652731809 ], [ -122.276671962249992, 38.209901848069457 ], [ -122.275394224930224, 38.210139391205388 ], [ -122.271596803697463, 38.210845147452616 ], [ -122.271513403760878, 38.210860653973484 ] ] } },
{ "type": "Feature", "properties": { "id": 290.0, "osm_id": 33761816.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.342382705919078, 36.871720696677009 ], [ -121.332228952233677, 36.871720696677009 ] ] } },
{ "type": "Feature", "properties": { "id": 291.0, "osm_id": 33853699.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.845949343672942, 36.907822978568888 ], [ -121.83932847835618, 36.904402659159885 ] ] } },
{ "type": "Feature", "properties": { "id": 292.0, "osm_id": 33853891.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.70752120693399, 38.195221782851384 ], [ -121.706482521492717, 38.192969397830574 ], [ -121.704953327077703, 38.189653349297117 ] ] } },
{ "type": "Feature", "properties": { "id": 293.0, "osm_id": 33847318.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.610750482865129, 38.260898352805498 ], [ -122.610290651657039, 38.260640944559043 ], [ -122.607826036847896, 38.259261199477677 ], [ -122.605256732068113, 38.257822781074061 ], [ -122.602692624068297, 38.256387044879475 ], [ -122.600193475818088, 38.254987853782708 ], [ -122.599978563820713, 38.25486757347219 ] ] } },
{ "type": "Feature", "properties": { "id": 294.0, "osm_id": 33854085.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.278294111971164, 38.21851475649445 ], [ -122.278324957374835, 38.218450634935159 ], [ -122.279886757393172, 38.215195522837732 ], [ -122.281364570741673, 38.212115257240505 ], [ -122.281384016757045, 38.212074688829127 ] ] } },
{ "type": "Feature", "properties": { "id": 295.0, "osm_id": 33853697.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.427793041971697, 38.31049038584581 ], [ -121.427813158539337, 38.3104238335346 ], [ -121.429972169158759, 38.303678496955726 ], [ -121.430563931522798, 38.301829281477559 ] ] } },
{ "type": "Feature", "properties": { "id": 296.0, "osm_id": 33853892.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.709481482629158, 38.193451524901143 ], [ -121.705919341418479, 38.193661323937597 ], [ -121.701075523393541, 38.193946643921592 ], [ -121.695057316914955, 38.194301030787756 ] ] } },
{ "type": "Feature", "properties": { "id": 297.0, "osm_id": 33853696.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.434527482076462, 38.30262438881261 ], [ -121.430563931522798, 38.301829281477559 ], [ -121.430064873007836, 38.301728195725303 ], [ -121.424322263505616, 38.300564536107743 ] ] } },
{ "type": "Feature", "properties": { "id": 298.0, "osm_id": 33868254.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.396703665541779, 38.612540816244618 ], [ -122.385442662447204, 38.608523453872593 ] ] } },
{ "type": "Feature", "properties": { "id": 299.0, "osm_id": 33903006.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.438278827291782, 38.257886064443007 ], [ -122.429764406229097, 38.256915440055522 ] ] } },
{ "type": "Feature", "properties": { "id": 300.0, "osm_id": 34417469.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.517515053466809, 38.019016827604538 ], [ -122.523233523087882, 38.015352762451293 ], [ -122.52416693182532, 38.014752534365037 ] ] } },
{ "type": "Feature", "properties": { "id": 301.0, "osm_id": 34416656.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.819078722298315, 37.331416117944592 ], [ -121.818254362121237, 37.331911320784108 ], [ -121.817831578925151, 37.332165124812178 ], [ -121.817500912844963, 37.332363692098347 ] ] } },
{ "type": "Feature", "properties": { "id": 302.0, "osm_id": 34424226.0, "name": "12\/30", "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.124969824550263, 37.068568267783455 ], [ -122.130752751006796, 37.072608764208269 ] ] } },
{ "type": "Feature", "properties": { "id": 303.0, "osm_id": 36327060.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.466856314978656, 36.951595959149998 ], [ -121.46670535690248, 36.951651782625127 ], [ -121.464048964148716, 36.95264285885635 ], [ -121.458970704292028, 36.954511185073756 ] ] } },
{ "type": "Feature", "properties": { "id": 304.0, "osm_id": 37091091.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.445782031105608, 38.671182538684278 ], [ -121.445129751400628, 38.678580238787141 ] ] } },
{ "type": "Feature", "properties": { "id": 305.0, "osm_id": 39935918.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.297776169517363, 37.228163895158744 ], [ -122.297686902248557, 37.227421174718543 ], [ -122.297572824546378, 37.226793873085036 ], [ -122.297509876453532, 37.226311494557386 ], [ -122.297368473747028, 37.225625938696837 ], [ -122.297301669978694, 37.225061249880035 ], [ -122.2971891010191, 37.224231525284907 ], [ -122.297122716345939, 37.223678822589633 ], [ -122.297077705525894, 37.223266097677374 ], [ -122.297047363036427, 37.222861922306386 ] ] } },
{ "type": "Feature", "properties": { "id": 306.0, "osm_id": 40937797.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.614989438307049, 38.401393718324186 ], [ -121.612723558422161, 38.406283636816561 ] ] } },
{ "type": "Feature", "properties": { "id": 307.0, "osm_id": 46650391.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.213682211358147, 37.729249992487489 ], [ -122.213899554107428, 37.728819330302436 ], [ -122.214356367830391, 37.727930848566018 ], [ -122.215661933068688, 37.725390796628332 ] ] } },
{ "type": "Feature", "properties": { "id": 308.0, "osm_id": 46647971.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.39464356137978, 37.63056414673153 ], [ -122.394348434569096, 37.630525925253053 ], [ -122.393735046894832, 37.630340098459726 ], [ -122.392597454996107, 37.629953357447256 ], [ -122.391870911629056, 37.62965177657108 ], [ -122.389142518327034, 37.628508987892396 ], [ -122.388483114004387, 37.628224673736753 ], [ -122.385711972996177, 37.627068557832061 ], [ -122.385085761010089, 37.626807377729143 ], [ -122.384459129928857, 37.626545946169152 ], [ -122.384184119685713, 37.626431030276663 ], [ -122.383573078944337, 37.626172029468613 ], [ -122.382800183652733, 37.625849577653518 ], [ -122.381943720786452, 37.625501561033772 ], [ -122.381442482976681, 37.625274746733886 ], [ -122.381202173812724, 37.625175253543226 ], [ -122.380737481100752, 37.62498263740828 ], [ -122.379495450688495, 37.624463546144746 ], [ -122.376901754570497, 37.623375826569919 ], [ -122.375664250385981, 37.622856651487361 ], [ -122.375494516846658, 37.622785572948459 ], [ -122.374766045641877, 37.622479884939686 ], [ -122.371294345166461, 37.621023193987185 ], [ -122.370129847358555, 37.620533942298934 ], [ -122.369473628159113, 37.620258261503558 ], [ -122.366752024198647, 37.619114718453616 ], [ -122.36561200154803, 37.618636782334661 ], [ -122.364190514588827, 37.618044097961246 ], [ -122.363300021195656, 37.617667918146822 ], [ -122.358651836790813, 37.615718371287691 ], [ -122.357534948192921, 37.615248817071929 ], [ -122.35704770816146, 37.615044047177413 ], [ -122.356920973785464, 37.614970873162655 ], [ -122.356835143096987, 37.614877331123225 ], [ -122.35676532184354, 37.614745651424414 ], [ -122.356733135335347, 37.614588323101842 ], [ -122.356745205275928, 37.614448680594982 ], [ -122.356795664333035, 37.614332255959894 ], [ -122.357292543553157, 37.613591882452589 ], [ -122.358501046352714, 37.611770578712012 ] ] } },
{ "type": "Feature", "properties": { "id": 309.0, "osm_id": 51191995.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.056320361178564, 37.987653841405056 ], [ -122.056917739417727, 37.98785668346185 ], [ -122.057914431524111, 37.988193971245551 ], [ -122.05950271835647, 37.988744075550819 ] ] } },
{ "type": "Feature", "properties": { "id": 310.0, "osm_id": 51192000.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.056129756700415, 37.989073819621673 ], [ -122.05657617686343, 37.98889008830411 ], [ -122.056641807165278, 37.988655143558148 ], [ -122.056656307857764, 37.988327662601144 ], [ -122.056917739417727, 37.98785668346185 ] ] } },
{ "type": "Feature", "properties": { "id": 311.0, "osm_id": 51191998.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.055521817263255, 37.986895195348829 ], [ -122.056459752228363, 37.985193585185534 ], [ -122.057338930052225, 37.983597922278406 ], [ -122.05831751724773, 37.981814169464037 ], [ -122.058370574694806, 37.981756334332161 ], [ -122.058433103692494, 37.981730518070385 ], [ -122.058491022643381, 37.981725237471402 ], [ -122.058529579397998, 37.98173135626071 ], [ -122.058775169161009, 37.981813582730801 ] ] } },
{ "type": "Feature", "properties": { "id": 312.0, "osm_id": 51192003.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.057101303097241, 37.993704150572782 ], [ -122.057262906190431, 37.993865753665943 ], [ -122.057356029134681, 37.993926773921061 ], [ -122.057462479305016, 37.993968683436933 ], [ -122.057558200639235, 37.993995170250955 ], [ -122.057686108481647, 37.994006737277346 ], [ -122.057802952211915, 37.993999780297699 ], [ -122.057906552535115, 37.99397622714978 ], [ -122.058334448692136, 37.993807080343743 ], [ -122.058958313745322, 37.99356827992235 ], [ -122.059576143828252, 37.993314894989425 ] ] } },
{ "type": "Feature", "properties": { "id": 313.0, "osm_id": 51192009.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.058405946326204, 37.995761488706727 ], [ -122.058830824998083, 37.996454755918215 ] ] } },
{ "type": "Feature", "properties": { "id": 314.0, "osm_id": 51191999.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.057338930052225, 37.983597922278406 ], [ -122.057726425435931, 37.983723986102127 ], [ -122.058363533896127, 37.983945771260117 ], [ -122.059571030867332, 37.984363776771389 ], [ -122.059631045294054, 37.984373583598092 ], [ -122.059731963408254, 37.98437869655902 ], [ -122.059808909279383, 37.984369895560704 ], [ -122.059893734139493, 37.984347767336303 ], [ -122.059975206238349, 37.984308875305594 ], [ -122.060033544284437, 37.984262691019119 ], [ -122.060119710249083, 37.984182392386693 ] ] } },
{ "type": "Feature", "properties": { "id": 315.0, "osm_id": 51192002.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.061009952185103, 37.982556889904281 ], [ -122.061163257194153, 37.982489918497919 ], [ -122.061263923851286, 37.982456977618426 ], [ -122.061384958533083, 37.982430323166341 ], [ -122.061470705402542, 37.982426970405086 ], [ -122.061561313775897, 37.982443650392398 ], [ -122.061630213019953, 37.982472148863181 ], [ -122.061698106435671, 37.982515818578719 ], [ -122.061762227994933, 37.982582622347017 ], [ -122.062238320095176, 37.983535980013954 ], [ -122.062266315651797, 37.983609656942839 ], [ -122.062268243489527, 37.983672353578605 ], [ -122.062256760282182, 37.983728931424999 ], [ -122.061123443154088, 37.985795489652425 ], [ -122.060991428179108, 37.986035463540283 ], [ -122.060879781228834, 37.986237383587756 ], [ -122.05950271835647, 37.988744075550819 ], [ -122.058195812013651, 37.991124955147264 ], [ -122.057829271387874, 37.991773295357731 ], [ -122.057474381607506, 37.992442841783244 ], [ -122.056929474082182, 37.993435259118989 ], [ -122.056687237080439, 37.993862736180795 ], [ -122.056649350878118, 37.993905232429931 ], [ -122.056601657849072, 37.993936077833588 ], [ -122.056552120801328, 37.993962480828571 ] ] } },
{ "type": "Feature", "properties": { "id": 316.0, "osm_id": 51192001.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.058775169161009, 37.981813582730801 ], [ -122.060197326672437, 37.982301325676502 ], [ -122.060846505073258, 37.982525625405408 ], [ -122.060920349640199, 37.98256937894002 ], [ -122.060943902788111, 37.982598296505913 ], [ -122.060946836454235, 37.982635847432157 ], [ -122.060922277477914, 37.982720588473256 ] ] } },
{ "type": "Feature", "properties": { "id": 317.0, "osm_id": 51192004.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.059757109117768, 37.996086958006948 ], [ -122.058334448692136, 37.993807080343743 ], [ -122.057474381607506, 37.992442841783244 ], [ -122.056462769713491, 37.990827816679747 ], [ -122.055452666562047, 37.989231399401334 ], [ -122.055048742648111, 37.98858766923761 ], [ -122.054392523448641, 37.987540769531243 ], [ -122.053097854684466, 37.985476893512832 ] ] } },
{ "type": "Feature", "properties": { "id": 318.0, "osm_id": 51192010.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.057376229521338, 37.997456560985505 ], [ -122.057263576742685, 37.99724516938744 ], [ -122.05727966999676, 37.997164870755086 ], [ -122.057322669160058, 37.997080297352042 ], [ -122.057365500685279, 37.997050625414808 ], [ -122.058830824998083, 37.996454755918215 ], [ -122.059757109117768, 37.996086958006948 ], [ -122.060378878695204, 37.995842290253307 ], [ -122.060674508420121, 37.995727541998868 ], [ -122.060755058509599, 37.995693595291023 ], [ -122.060808283594767, 37.995652943060612 ], [ -122.060845666882926, 37.995608183697691 ], [ -122.06087517118209, 37.995555461526699 ], [ -122.060890342426802, 37.995505673021867 ], [ -122.06088933659845, 37.995446748242529 ], [ -122.060875674096266, 37.995394445166738 ], [ -122.060820856449538, 37.995299897298963 ], [ -122.059576143828252, 37.993314894989425 ], [ -122.058195812013651, 37.991124955147264 ], [ -122.057182859015114, 37.989524849831426 ], [ -122.056641807165278, 37.988655143558148 ], [ -122.056180718671698, 37.987903789757674 ], [ -122.055772939082317, 37.987277661590625 ], [ -122.055734214689636, 37.987210774003273 ], [ -122.055521817263255, 37.986895195348829 ], [ -122.055377313252521, 37.986640385492322 ], [ -122.055314700435801, 37.986586992769126 ], [ -122.055232138689547, 37.986548771290643 ], [ -122.054416244234631, 37.986266552610772 ], [ -122.054352960865685, 37.986223134352372 ], [ -122.054311218987891, 37.986177452980051 ], [ -122.054062611739738, 37.985788448853768 ], [ -122.054007542635915, 37.98573857652989 ], [ -122.053964375834553, 37.985710916249417 ], [ -122.053864631186826, 37.985679819388672 ], [ -122.053097854684466, 37.985476893512832 ], [ -122.052033269162408, 37.985229962645342 ], [ -122.051808717976385, 37.985288552148489 ], [ -122.051507556195375, 37.985437163291778 ], [ -122.050951668376925, 37.986874659686023 ], [ -122.05094647159693, 37.986940373806902 ], [ -122.050952422748196, 37.986985552265033 ], [ -122.050974048058379, 37.987037184788576 ], [ -122.051031380276086, 37.987131648837348 ], [ -122.051708638052503, 37.988211740880281 ], [ -122.052961481119851, 37.990205544188157 ], [ -122.053558104987729, 37.991149346485507 ], [ -122.053579227383722, 37.991194189667468 ], [ -122.053582328687909, 37.991228555470499 ], [ -122.053573443870576, 37.991271219357643 ] ] } },
{ "type": "Feature", "properties": { "id": 319.0, "osm_id": 51192005.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.061123443154088, 37.985795489652425 ], [ -122.061084970218531, 37.98583798590154 ], [ -122.061036522818185, 37.985870759142955 ], [ -122.060971143973433, 37.985896072490533 ], [ -122.060794956368724, 37.985942759691213 ], [ -122.05890114916572, 37.986406362755744 ], [ -122.056697630640414, 37.986975493981198 ], [ -122.055734214689636, 37.987210774003273 ], [ -122.054392523448641, 37.987540769531243 ], [ -122.053387700896209, 37.987793819188028 ], [ -122.051708638052503, 37.988211740880281 ] ] } },
{ "type": "Feature", "properties": { "id": 320.0, "osm_id": 51192006.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.054422530662023, 37.994538988128866 ], [ -122.05476685924441, 37.993911686495352 ], [ -122.055251417066856, 37.993019684359638 ] ] } },
{ "type": "Feature", "properties": { "id": 321.0, "osm_id": 51191996.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.05232160663158, 37.986102854041803 ], [ -122.051808717976385, 37.985288552148489 ] ] } },
{ "type": "Feature", "properties": { "id": 322.0, "osm_id": 51192008.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.057299702745354, 37.994014616266348 ], [ -122.057227618378064, 37.99394621993644 ], [ -122.057169280331991, 37.9939043942396 ], [ -122.057099710535653, 37.9938777397875 ], [ -122.057027039435127, 37.993860724524055 ], [ -122.056958643105219, 37.993857036486659 ], [ -122.056879182663153, 37.993866591856275 ], [ -122.056763847675484, 37.99389685052676 ], [ -122.056552120801328, 37.993962480828571 ], [ -122.055308330189391, 37.994351652592911 ], [ -122.055123173948289, 37.994385683119809 ], [ -122.055015717949601, 37.994390125528518 ], [ -122.054942041020723, 37.99437813940699 ], [ -122.054893174525219, 37.994359950677087 ], [ -122.054843637477461, 37.99433254185368 ], [ -122.054800470676128, 37.994286441386251 ], [ -122.054762500654732, 37.994224247664675 ], [ -122.054735762383601, 37.994154929325461 ], [ -122.054723608624002, 37.994083264053316 ], [ -122.054730481784631, 37.994034229919755 ], [ -122.05476685924441, 37.993911686495352 ], [ -122.054703072961274, 37.993947141945789 ], [ -122.054617242272741, 37.993973293483663 ], [ -122.054529316108471, 37.993979579911048 ], [ -122.054448849837968, 37.993959128067317 ], [ -122.054338879268357, 37.993910680666986 ], [ -122.054259837921407, 37.993853432268303 ], [ -122.05420678047436, 37.993783778652919 ], [ -122.053448721151341, 37.992782141223699 ], [ -122.053353921826442, 37.99261953230215 ], [ -122.053301367293543, 37.992482655823316 ], [ -122.053263481091193, 37.992349132105758 ], [ -122.053247639294213, 37.992219631701722 ], [ -122.053250740598372, 37.992068673625553 ], [ -122.053267672042779, 37.991924337252911 ], [ -122.053322322051486, 37.991743455782455 ], [ -122.053385521601385, 37.991604819103941 ], [ -122.053573443870576, 37.991271219357643 ], [ -122.054505679141485, 37.9895704473847 ], [ -122.055048742648111, 37.98858766923761 ], [ -122.055772939082317, 37.987277661590625 ], [ -122.05630334591514, 37.986286920635507 ], [ -122.056866106894205, 37.985286875767869 ], [ -122.057726425435931, 37.983723986102127 ], [ -122.058775169161009, 37.981813582730801 ] ] } },
{ "type": "Feature", "properties": { "id": 323.0, "osm_id": 51850369.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.388734403461498, 37.622475861626178 ], [ -122.388597443163647, 37.62244375893701 ], [ -122.388438270822391, 37.622448871897966 ], [ -122.388292928621368, 37.622494050356103 ], [ -122.388177761271749, 37.622559848295992 ], [ -122.388055217847366, 37.622652719783147 ], [ -122.387937955021954, 37.62271063873407 ], [ -122.387816836521125, 37.622738550471652 ], [ -122.38766277714079, 37.62274299288034 ], [ -122.387496144905697, 37.622700664269274 ] ] } },
{ "type": "Feature", "properties": { "id": 324.0, "osm_id": 52372482.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.490967303002449, 37.507945285206191 ], [ -122.491334681818557, 37.507485621636157 ] ] } },
{ "type": "Feature", "properties": { "id": 325.0, "osm_id": 52372811.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.499609464269454, 37.515428061626295 ], [ -122.501240247350893, 37.513508941075678 ] ] } },
{ "type": "Feature", "properties": { "id": 326.0, "osm_id": 52372481.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.489363174373054, 37.507289820378034 ], [ -122.489636927330736, 37.50692395030449 ] ] } },
{ "type": "Feature", "properties": { "id": 327.0, "osm_id": 53756606.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.763233957128662, 37.386088422498361 ], [ -121.763684568243264, 37.38764846231701 ] ] } },
{ "type": "Feature", "properties": { "id": 328.0, "osm_id": 53756610.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.762032327489706, 37.384195956399829 ], [ -121.765486928882666, 37.389302295632163 ] ] } },
{ "type": "Feature", "properties": { "id": 329.0, "osm_id": 53828077.0, "name": "X \/ X", "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.272760606503084, 37.836213135265311 ], [ -121.273056655323202, 37.841224758991792 ] ] } },
{ "type": "Feature", "properties": { "id": 330.0, "osm_id": 54222172.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.218436510657156, 37.718294090668408 ], [ -122.218067623098491, 37.718050261105098 ], [ -122.21727511415348, 37.717697885895682 ], [ -122.216911926288972, 37.717450452113987 ] ] } },
{ "type": "Feature", "properties": { "id": 331.0, "osm_id": 54219423.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.213222547788092, 37.728917566207606 ], [ -122.21312162967385, 37.728823521253993 ], [ -122.213049210030462, 37.728732326147465 ], [ -122.212990201432106, 37.728636856270334 ], [ -122.2129473699069, 37.728511798274987 ], [ -122.212794567812068, 37.728053140533341 ], [ -122.212730027157619, 37.727858345103577 ], [ -122.21271661611253, 37.727764970702204 ], [ -122.21271661611253, 37.727699256581339 ], [ -122.212738157603695, 37.727631363165628 ], [ -122.212838572803733, 37.727440255773296 ], [ -122.213341822270252, 37.726454124864887 ], [ -122.214136426691127, 37.724897186350432 ] ] } },
{ "type": "Feature", "properties": { "id": 332.0, "osm_id": 54225634.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.223422401940894, 37.713412051164958 ], [ -122.223582747748623, 37.713322197162981 ], [ -122.225358370116922, 37.712067761534016 ], [ -122.225426012075502, 37.712020319962036 ], [ -122.225851226023508, 37.711722762399397 ] ] } },
{ "type": "Feature", "properties": { "id": 333.0, "osm_id": 54221213.0, "name": "19\/33", "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.222630731186186, 37.739796019241354 ], [ -122.222778168862973, 37.740215365857132 ], [ -122.222801722010914, 37.740282421082519 ] ] } },
{ "type": "Feature", "properties": { "id": 334.0, "osm_id": 54220761.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.219749451970259, 37.737257727503305 ], [ -122.221442764049385, 37.736406377597987 ], [ -122.223856081611103, 37.73518924143815 ], [ -122.223990108242859, 37.735102237283222 ], [ -122.224089349976438, 37.735011042176673 ] ] } },
{ "type": "Feature", "properties": { "id": 335.0, "osm_id": 54329629.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.221456007456396, 37.713627298438489 ], [ -122.221594141220692, 37.713562338688895 ], [ -122.221715930273817, 37.713514729478874 ], [ -122.221890273859827, 37.713472736143984 ], [ -122.222059169208762, 37.713454966509246 ], [ -122.22222923802417, 37.71345194902409 ], [ -122.222350021248886, 37.713466784992718 ], [ -122.222530818900339, 37.713507521042146 ], [ -122.222670377588202, 37.713530990371005 ], [ -122.22285167815383, 37.713540294283526 ], [ -122.223013029789925, 37.713530487456815 ], [ -122.223149319535509, 37.713505425566332 ], [ -122.223283932900486, 37.713468461373346 ], [ -122.223422401940894, 37.713412051164958 ] ] } },
{ "type": "Feature", "properties": { "id": 336.0, "osm_id": 54329653.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.209500815140984, 37.726841787886677 ], [ -122.209490170123971, 37.726739947763143 ], [ -122.209527637231147, 37.726650848132401 ], [ -122.209592010247505, 37.726578763765112 ], [ -122.209664429890935, 37.726536267516018 ], [ -122.209747662189443, 37.726506595578755 ], [ -122.209833409058902, 37.726493855085948 ], [ -122.209933405163781, 37.726501063522683 ] ] } },
{ "type": "Feature", "properties": { "id": 337.0, "osm_id": 54329655.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.209256650301569, 37.727317377072794 ], [ -122.209331835973032, 37.727327519175596 ], [ -122.209404255616434, 37.727323328224017 ], [ -122.209484721886909, 37.727304217484786 ], [ -122.209562505948369, 37.72726607982532 ], [ -122.209618832337668, 37.727215117854037 ], [ -122.209626962783744, 37.727157869455375 ], [ -122.209621430727637, 37.727070027110102 ] ] } },
{ "type": "Feature", "properties": { "id": 338.0, "osm_id": 54329650.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.20612374635239, 37.722304244603698 ], [ -122.20622835250397, 37.722109030078784 ], [ -122.206290043311327, 37.722017751153246 ], [ -122.206370509581802, 37.721924460570904 ], [ -122.206481066884649, 37.721837456415969 ], [ -122.206598581167142, 37.721775933246704 ], [ -122.206830508427956, 37.721709716211606 ], [ -122.208932354467734, 37.721055424849894 ] ] } },
{ "type": "Feature", "properties": { "id": 339.0, "osm_id": 54329632.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.218186981399697, 37.706613824777079 ], [ -122.217640146036672, 37.707131491117067 ], [ -122.21644212061608, 37.708264892064193 ], [ -122.216302478109213, 37.708397158496275 ], [ -122.216122267190954, 37.708568819873285 ], [ -122.215866200049021, 37.708826898671987 ] ] } },
{ "type": "Feature", "properties": { "id": 340.0, "osm_id": 54329646.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.20724490972087, 37.722667097192087 ], [ -122.205665172429761, 37.723199599500688 ] ] } },
{ "type": "Feature", "properties": { "id": 341.0, "osm_id": 54329631.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.215866200049021, 37.708826898671987 ], [ -122.216406078432442, 37.709146416820943 ], [ -122.216511271317245, 37.709208778180567 ], [ -122.217955557053088, 37.710063983761373 ], [ -122.218033760209707, 37.710123159997764 ], [ -122.218092768808049, 37.710183090605469 ], [ -122.218216150422748, 37.710315524675593 ], [ -122.218537009676226, 37.710660020896029 ], [ -122.2186597207387, 37.710760855191189 ], [ -122.218797267769759, 37.710852637030953 ], [ -122.220137282630134, 37.711746567004425 ], [ -122.220926019718746, 37.712272782885663 ], [ -122.221771753748953, 37.712836968788245 ], [ -122.22181240597935, 37.712864042335504 ], [ -122.222183305194761, 37.713111559936209 ] ] } },
{ "type": "Feature", "properties": { "id": 342.0, "osm_id": 54329662.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.224089349976438, 37.735011042176673 ], [ -122.224161769619855, 37.734919847070174 ], [ -122.224245253375443, 37.734775678335573 ], [ -122.225288381225397, 37.731167352838433 ], [ -122.225714601001783, 37.728863838208255 ], [ -122.225811328164411, 37.728674993929779 ] ] } },
{ "type": "Feature", "properties": { "id": 343.0, "osm_id": 54329645.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.222670377588202, 37.73165132392765 ], [ -122.221591123735564, 37.731303055850788 ], [ -122.219403447007267, 37.7305970481465 ], [ -122.218056978081478, 37.730166385961432 ], [ -122.213899554107428, 37.728819330302436 ], [ -122.2129473699069, 37.728511798274987 ], [ -122.212432301956895, 37.728346255687285 ], [ -122.209844054075944, 37.72750613753221 ], [ -122.209256650301569, 37.727317377072794 ], [ -122.206046046109947, 37.726279948916968 ], [ -122.205957449393409, 37.726239631962727 ], [ -122.205235935168247, 37.725845095780301 ], [ -122.203994156213071, 37.725448380303121 ], [ -122.203956521467845, 37.72542926956389 ] ] } },
{ "type": "Feature", "properties": { "id": 344.0, "osm_id": 54329627.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.214580583740243, 37.718467176968943 ], [ -122.213750942964154, 37.717727725470965 ] ] } },
{ "type": "Feature", "properties": { "id": 345.0, "osm_id": 54329644.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.212263741884072, 37.72001816433216 ], [ -122.212418471816662, 37.719976087178246 ], [ -122.212561467084811, 37.719944990317444 ], [ -122.212684764880478, 37.719922275359856 ], [ -122.212799010220721, 37.719919257874707 ], [ -122.212928426805732, 37.719935351128811 ], [ -122.213032613862168, 37.719957060258032 ], [ -122.213159432057211, 37.719990923146845 ], [ -122.213292704317666, 37.720021517093429 ], [ -122.213418432865282, 37.720041046927825 ], [ -122.213525637406846, 37.72004959646906 ], [ -122.213650108668944, 37.720051272849688 ], [ -122.21378522494814, 37.720039370547198 ], [ -122.213901062850013, 37.720017745237008 ], [ -122.214063001219301, 37.719971393312477 ], [ -122.214187221024346, 37.719919676969859 ], [ -122.21432401368412, 37.719840132708754 ], [ -122.215429083798526, 37.719061034808789 ], [ -122.215475854818237, 37.719020550216463 ], [ -122.215515668858316, 37.718972941006399 ], [ -122.215551208127749, 37.718921057025781 ], [ -122.215585322473657, 37.718863138074873 ], [ -122.215613820944483, 37.718798178325265 ], [ -122.215627231989544, 37.718751826400712 ], [ -122.215636871178205, 37.718696254382657 ], [ -122.215639553387206, 37.718637581060456 ], [ -122.215637877006557, 37.718567340711864 ], [ -122.215625639427955, 37.718508835027727 ], [ -122.215599823166173, 37.718434571365599 ], [ -122.215563026611235, 37.718362067903136 ], [ -122.215523128752125, 37.718270286063394 ], [ -122.215503179822591, 37.718204991037666 ], [ -122.215497228671325, 37.718132152299077 ], [ -122.215495049376486, 37.718064929435634 ], [ -122.215505275298341, 37.717994186172838 ], [ -122.215522374380825, 37.717931824813256 ], [ -122.215553471241591, 37.71786334466433 ], [ -122.215589764882367, 37.717802324409213 ], [ -122.21563586534981, 37.717745662743745 ], [ -122.215702250022943, 37.717677517870968 ] ] } },
{ "type": "Feature", "properties": { "id": 346.0, "osm_id": 54329651.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.205235935168247, 37.725845095780301 ], [ -122.204814828352795, 37.725611659776938 ], [ -122.204726315455289, 37.725552232083437 ], [ -122.204672755093995, 37.725486517962558 ], [ -122.204637802557798, 37.725399597626662 ], [ -122.204621709303694, 37.725314688947513 ], [ -122.204643250794845, 37.725217039775522 ], [ -122.204828071759806, 37.724850499149767 ], [ -122.205665172429761, 37.723199599500688 ], [ -122.20612374635239, 37.722304244603698 ] ] } },
{ "type": "Feature", "properties": { "id": 347.0, "osm_id": 54435257.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.221591123735564, 37.731303055850788 ], [ -122.222046763992083, 37.730417088685336 ], [ -122.222067048197744, 37.730376855550112 ], [ -122.22208230326153, 37.730310219419884 ], [ -122.222085153108623, 37.730239476157102 ], [ -122.222078615224163, 37.730167643246915 ], [ -122.222066210007426, 37.73008843426193 ], [ -122.221856075694902, 37.729289638889476 ] ] } },
{ "type": "Feature", "properties": { "id": 348.0, "osm_id": 54455263.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.219000528921725, 37.729432382700516 ], [ -122.219095160608575, 37.729487116528261 ], [ -122.219151403178813, 37.729538078499559 ], [ -122.219194318523108, 37.729603876439462 ], [ -122.219213177805244, 37.729678140101591 ], [ -122.219197000732095, 37.729756678534308 ], [ -122.219159449805915, 37.729835049328962 ], [ -122.219103123416588, 37.729896656317308 ], [ -122.219003965502026, 37.729947534469567 ] ] } },
{ "type": "Feature", "properties": { "id": 349.0, "osm_id": 54455266.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.220833651145767, 37.734668892889168 ], [ -122.220819737186503, 37.73458683405709 ], [ -122.220827867632579, 37.734521036117151 ], [ -122.220865334739756, 37.734468062489135 ], [ -122.220921661129083, 37.734425650059059 ], [ -122.220988716354469, 37.73439597812181 ], [ -122.221055771579842, 37.734389524056368 ], [ -122.221143278649024, 37.734398073597589 ] ] } },
{ "type": "Feature", "properties": { "id": 350.0, "osm_id": 54455287.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.224290431833566, 37.728182724756387 ], [ -122.224400570041269, 37.72823762622216 ], [ -122.224464859238594, 37.728288588193472 ], [ -122.224513139000891, 37.728356481609147 ], [ -122.224534680492056, 37.728430745271297 ], [ -122.224529232254994, 37.728507188228214 ], [ -122.224486316910728, 37.728579272595532 ], [ -122.224432672730416, 37.728640795764825 ], [ -122.224371065742091, 37.728685219851648 ], [ -122.224257071858929, 37.728732577604561 ] ] } },
{ "type": "Feature", "properties": { "id": 351.0, "osm_id": 54455315.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.215433274750112, 37.70928857389876 ], [ -122.215504856203196, 37.709239791222309 ], [ -122.215572917256978, 37.709203162305428 ], [ -122.215656820107753, 37.709178016595921 ], [ -122.215738627482722, 37.709161252789563 ], [ -122.215827140380227, 37.709158235304415 ], [ -122.216209355164963, 37.709145830087742 ], [ -122.216282612998697, 37.709146081544823 ], [ -122.2163687789633, 37.709159324951834 ], [ -122.216452514175998, 37.709183464832982 ], [ -122.216511271317245, 37.709208778180567 ] ] } },
{ "type": "Feature", "properties": { "id": 352.0, "osm_id": 54455259.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.212794567812068, 37.728053140533341 ], [ -122.212805380467159, 37.728142240164054 ], [ -122.212791969422071, 37.72820795428494 ], [ -122.212743605840743, 37.728263191026834 ], [ -122.212673868406341, 37.728303424162085 ], [ -122.212596168163955, 37.72833317991833 ], [ -122.21251025365639, 37.728345836592133 ], [ -122.212432301956895, 37.728346255687285 ] ] } },
{ "type": "Feature", "properties": { "id": 353.0, "osm_id": 54455279.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.224245253375443, 37.734775678335573 ], [ -122.224223460427197, 37.73487533916429 ], [ -122.224236871472272, 37.73495806854865 ], [ -122.22427987063557, 37.735036523162343 ] ] } },
{ "type": "Feature", "properties": { "id": 354.0, "osm_id": 54455312.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.21357224078848, 37.710358272381775 ], [ -122.214982076902302, 37.70885455895246 ], [ -122.215034212340001, 37.708811559789154 ], [ -122.215082073007139, 37.708780630566466 ], [ -122.215140913967417, 37.708752467371802 ], [ -122.215209561754392, 37.708727321662273 ], [ -122.215283909235552, 37.708710893132064 ], [ -122.215358172897695, 37.708703349419181 ], [ -122.215522542018917, 37.708699745200832 ], [ -122.215702166203911, 37.708695721887302 ], [ -122.215795959700429, 37.708688178174448 ], [ -122.215886568073728, 37.708667726330695 ], [ -122.215977763180277, 37.708638724945736 ], [ -122.216063258592612, 37.708604694418831 ], [ -122.216122267190954, 37.708568819873285 ] ] } },
{ "type": "Feature", "properties": { "id": 355.0, "osm_id": 58169722.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.1147413042886, 37.655172324801569 ], [ -122.114429916585721, 37.655029497171483 ], [ -122.112628729412748, 37.65420329297563 ] ] } },
{ "type": "Feature", "properties": { "id": 356.0, "osm_id": 58169880.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.115235668937785, 37.654686090598446 ], [ -122.114977422501013, 37.655048775548764 ] ] } },
{ "type": "Feature", "properties": { "id": 357.0, "osm_id": 58169877.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.120587765571159, 37.656888938571498 ], [ -122.120357179414853, 37.657210636015286 ] ] } },
{ "type": "Feature", "properties": { "id": 358.0, "osm_id": 58170416.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.128467676563616, 37.662926758703506 ], [ -122.128416630773302, 37.662940421205676 ], [ -122.128362064583655, 37.662944276881113 ], [ -122.128301044328538, 37.662937822815699 ], [ -122.128231139256087, 37.662915024039073 ], [ -122.127993931396261, 37.662804550555229 ], [ -122.12725800029763, 37.662469944980565 ] ] } },
{ "type": "Feature", "properties": { "id": 359.0, "osm_id": 58172648.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.120052581053557, 37.65997482004385 ], [ -122.120079403143691, 37.659994768973405 ], [ -122.120101531368064, 37.660015639912316 ], [ -122.120115529146389, 37.660038857784102 ], [ -122.120123156678261, 37.660060483094263 ], [ -122.120126760896639, 37.660081018757054 ], [ -122.120125922706279, 37.660101386781761 ], [ -122.120121145021486, 37.660127789776759 ], [ -122.120106811967077, 37.66015645588562 ] ] } },
{ "type": "Feature", "properties": { "id": 360.0, "osm_id": 58169875.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.117593414481448, 37.658852064113781 ], [ -122.117690812196344, 37.658719127129416 ], [ -122.118031368922288, 37.658254434417493 ], [ -122.118708207603547, 37.657325216631662 ] ] } },
{ "type": "Feature", "properties": { "id": 361.0, "osm_id": 58170347.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.130219661964958, 37.662115222838239 ], [ -122.130157552062457, 37.662131567549437 ], [ -122.130098543464115, 37.662136345234238 ], [ -122.130047581492818, 37.662129052978479 ], [ -122.129980945362576, 37.662110948067614 ], [ -122.129807942881087, 37.662043473747048 ] ] } },
{ "type": "Feature", "properties": { "id": 362.0, "osm_id": 58176978.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.38220154812808, 37.608984266459075 ], [ -122.382361977754812, 37.608780921488062 ], [ -122.382462476773881, 37.6087070769211 ], [ -122.382580410151519, 37.608656031130778 ], [ -122.382730613856381, 37.608624263717765 ], [ -122.382848631053065, 37.608624263717765 ], [ -122.382990871949914, 37.608660389720441 ], [ -122.383395801692245, 37.608830374716796 ], [ -122.383484314589765, 37.608896172656713 ], [ -122.383548519968045, 37.608986697210995 ], [ -122.383591602950361, 37.609083172916506 ], [ -122.383602331786435, 37.609193646400335 ], [ -122.383578275724332, 37.609293558686147 ], [ -122.383268480583041, 37.609769399329316 ] ] } },
{ "type": "Feature", "properties": { "id": 363.0, "osm_id": 58170248.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.122587100935164, 37.658778219546797 ], [ -122.122605205846014, 37.658796324457676 ], [ -122.122616772872391, 37.658809651683704 ], [ -122.122626747337179, 37.658823146547817 ], [ -122.122634626326146, 37.658840497087382 ], [ -122.122642253858032, 37.658859775464677 ], [ -122.122647115361886, 37.658880478765496 ], [ -122.122650132847014, 37.658901936437623 ], [ -122.122697239142866, 37.659299741562272 ], [ -122.122743423429341, 37.659714478131292 ], [ -122.122742752877073, 37.659748676296203 ], [ -122.122737807554216, 37.659780527528319 ], [ -122.122724815604315, 37.659809528913286 ], [ -122.122702603560896, 37.659843978535307 ], [ -122.122533875849996, 37.660079342376413 ] ] } },
{ "type": "Feature", "properties": { "id": 364.0, "osm_id": 58169733.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.124255854037969, 37.663989416387835 ], [ -122.1236183264826, 37.664284794655671 ], [ -122.123564263207115, 37.664308347803569 ], [ -122.123534758907965, 37.664319160458668 ], [ -122.123511708674215, 37.664323854324451 ], [ -122.123491340649508, 37.664325195428958 ], [ -122.123470469710611, 37.664322094124778 ], [ -122.123448257667192, 37.664313796040638 ], [ -122.123430739489578, 37.66430331866168 ], [ -122.123416238797063, 37.664288566512106 ], [ -122.123247678724255, 37.664057142165468 ], [ -122.122982559126868, 37.663693032291619 ], [ -122.122903936875119, 37.66358515719778 ], [ -122.122869319614992, 37.663536542159385 ], [ -122.122848364857077, 37.663501924899286 ], [ -122.122827913013325, 37.663455237698578 ], [ -122.122819447291135, 37.663416680943989 ], [ -122.12281693272017, 37.663382734236137 ], [ -122.122822045681104, 37.663348284614088 ], [ -122.122839228582606, 37.66329665209053 ], [ -122.122862278816328, 37.663244181376662 ], [ -122.122885580507145, 37.663200846937272 ], [ -122.122912067321195, 37.663158769783344 ], [ -122.123210463074187, 37.662741853919485 ], [ -122.123846146610845, 37.661863765743014 ], [ -122.123859222379778, 37.66184557701316 ] ] } },
{ "type": "Feature", "properties": { "id": 365.0, "osm_id": 58173579.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.122567319643665, 37.665895544988516 ], [ -122.122212681320377, 37.665414759022504 ], [ -122.122203461226874, 37.665396067378403 ], [ -122.122201449570142, 37.665377291915306 ], [ -122.122205053788491, 37.665359187004469 ], [ -122.122214609158107, 37.665339154255889 ], [ -122.122229445126763, 37.665325491753698 ], [ -122.122247466218568, 37.6653146790986 ], [ -122.122629932460384, 37.665137234208402 ], [ -122.123024468642726, 37.664954257262146 ], [ -122.123416322616109, 37.664772369963288 ], [ -122.123500225466884, 37.66473347793255 ], [ -122.123573064205459, 37.664699866500797 ], [ -122.123810104427207, 37.664590566483461 ], [ -122.124203634781196, 37.664409098279734 ], [ -122.124489373860385, 37.664278424409247 ], [ -122.124606804323861, 37.664224528771868 ], [ -122.124699759630033, 37.664181948703742 ], [ -122.124993042422062, 37.664045826596194 ], [ -122.125083566976315, 37.664003833261297 ], [ -122.125424458978401, 37.663845750567447 ], [ -122.125435271633506, 37.663840721425522 ], [ -122.125794771460605, 37.663673921552395 ], [ -122.125940365118751, 37.663606447231828 ], [ -122.125950004307413, 37.66360083135671 ], [ -122.126019406465687, 37.663561017316646 ], [ -122.126077241597571, 37.663516341772727 ], [ -122.126128203568868, 37.663468984019786 ], [ -122.126199114469699, 37.663371251028771 ], [ -122.126386533824672, 37.663116860267465 ], [ -122.12640304617392, 37.663076291856108 ], [ -122.12641067370582, 37.663036561635067 ], [ -122.126411428077077, 37.662998759251742 ], [ -122.126405057830695, 37.66296229797296 ], [ -122.126391814423656, 37.662925082322857 ], [ -122.126368512732839, 37.662889878329523 ], [ -122.126340433357228, 37.662860960763581 ], [ -122.126296009270419, 37.662829696264737 ] ] } },
{ "type": "Feature", "properties": { "id": 366.0, "osm_id": 58170922.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.112628729412748, 37.65420329297563 ], [ -122.112471736366359, 37.654120982686507 ], [ -122.112415661434099, 37.654086533064486 ], [ -122.112370818252103, 37.654043450082142 ], [ -122.11234416380006, 37.654007072622377 ], [ -122.112334273154275, 37.65397496993323 ], [ -122.11233284823075, 37.653939765939874 ], [ -122.112335865715892, 37.653908585260083 ], [ -122.112342906514556, 37.653877153123197 ], [ -122.112351707512872, 37.653850247214002 ], [ -122.112367214033753, 37.653825017685428 ], [ -122.11238950989619, 37.653797022128828 ], [ -122.112442483524248, 37.653740779558539 ], [ -122.112501156846463, 37.653687973568566 ], [ -122.112545580933272, 37.65365142847071 ], [ -122.112577935079528, 37.653630054617636 ], [ -122.112609953949658, 37.65361396136354 ], [ -122.112651276732279, 37.653601220870691 ], [ -122.112686816001755, 37.653594682986224 ], [ -122.112732748831135, 37.653592838967519 ], [ -122.112792847076904, 37.653594431529129 ], [ -122.113350746552129, 37.653616392115453 ], [ -122.113391231144448, 37.653618822867401 ], [ -122.113423333833623, 37.653625025475733 ], [ -122.11345300577085, 37.653634245569201 ], [ -122.113492065439601, 37.653649332994917 ], [ -122.113553840066032, 37.65367498161865 ], [ -122.115160650904386, 37.654410661260158 ], [ -122.11536231949475, 37.654502862195102 ], [ -122.115575303654367, 37.654600259909962 ], [ -122.115758532057768, 37.654683827484583 ], [ -122.120587765571159, 37.656888938571498 ], [ -122.122985157516851, 37.657982776935633 ], [ -122.123034778383627, 37.657999959837134 ], [ -122.123078029004034, 37.658007838826123 ], [ -122.12311692103475, 37.658007838826123 ], [ -122.123153130856451, 37.658002139131966 ], [ -122.123185233545613, 37.65799032064848 ], [ -122.123219180253471, 37.65796408529156 ] ] } },
{ "type": "Feature", "properties": { "id": 367.0, "osm_id": 58172608.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.118911133479386, 37.659454722951949 ], [ -122.118948265310422, 37.659484478708187 ], [ -122.118963855650335, 37.659503757085488 ], [ -122.118975422676741, 37.659522867824748 ], [ -122.118982212018324, 37.659542732935257 ], [ -122.118985900055662, 37.659567040454469 ], [ -122.118985480960518, 37.659586570288845 ], [ -122.118979110714136, 37.65960601630421 ], [ -122.11896561585003, 37.659637532260177 ], [ -122.118289280082934, 37.660559625428256 ], [ -122.118259859602801, 37.660584016766478 ], [ -122.11823186404618, 37.660600864391895 ], [ -122.118201940651858, 37.660612263780202 ], [ -122.11817595675204, 37.660619891312095 ], [ -122.118157013650858, 37.660622070606905 ], [ -122.118133125226819, 37.660620226588229 ], [ -122.118112757202098, 37.660614443075048 ], [ -122.118092137720296, 37.66060287604865 ], [ -122.118071182962339, 37.660584184404534 ], [ -122.117808577935932, 37.660165927436211 ], [ -122.117720567952588, 37.660027877490961 ], [ -122.116878605778822, 37.658725078280682 ], [ -122.116398574184075, 37.657982190202439 ] ] } },
{ "type": "Feature", "properties": { "id": 368.0, "osm_id": 58170277.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.123219180253471, 37.65796408529156 ], [ -122.123247343448142, 37.657929635669511 ], [ -122.123277853575672, 37.65790775890224 ], [ -122.123314817768673, 37.657889653991347 ], [ -122.123352955428118, 37.657881942640465 ], [ -122.12339654132461, 37.657880433897873 ], [ -122.123439037573718, 37.657887139420431 ], [ -122.123486143869513, 37.657899376999055 ], [ -122.123534004536651, 37.657915889348295 ], [ -122.123577758071249, 37.657932317878497 ], [ -122.125743809489322, 37.658926243956849 ], [ -122.126088976262011, 37.659083488460375 ], [ -122.131189448162132, 37.661406532924907 ], [ -122.131255246102043, 37.661442575108545 ], [ -122.131283325477682, 37.661468559008398 ], [ -122.131298580541454, 37.661490184318588 ], [ -122.131307716815897, 37.661511725809738 ], [ -122.131308722644306, 37.661530165996709 ], [ -122.131304615511723, 37.661550785478525 ], [ -122.131290869190522, 37.661577523749656 ], [ -122.131266477852279, 37.661609626438825 ], [ -122.131230770944754, 37.661643656965694 ], [ -122.131156758739763, 37.661686656129 ], [ -122.130219661964958, 37.662115222838239 ], [ -122.129685734732789, 37.662362572800888 ], [ -122.128467676563616, 37.662926758703506 ], [ -122.128068278877393, 37.663111663487491 ], [ -122.127950429318801, 37.663152734813067 ], [ -122.127723447380859, 37.663211324316229 ], [ -122.127415747715361, 37.663282654312269 ], [ -122.127352715803468, 37.66328743199707 ], [ -122.127299239261234, 37.663283157226431 ], [ -122.127248361108968, 37.663263292115921 ], [ -122.127137971444199, 37.663213084515903 ], [ -122.126796744165986, 37.663057684031067 ], [ -122.126695826051773, 37.663011667382641 ], [ -122.126296009270419, 37.662829696264737 ], [ -122.125723106188502, 37.662566169228974 ], [ -122.125059343276178, 37.662260816496364 ], [ -122.124970662740623, 37.662220080446957 ], [ -122.124640248117515, 37.662070882570468 ], [ -122.124090311450288, 37.661822694417488 ] ] } },
{ "type": "Feature", "properties": { "id": 369.0, "osm_id": 58756699.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.489964240649641, 37.509304829900927 ], [ -122.490771501744291, 37.507998426472291 ], [ -122.489363174373054, 37.507289820378034 ], [ -122.488792031490817, 37.507006847326878 ], [ -122.488706200802341, 37.506945156519514 ], [ -122.488644509994984, 37.506870725219351 ], [ -122.488309233868037, 37.506143092204852 ], [ -122.48823924497654, 37.505867998142698 ] ] } },
{ "type": "Feature", "properties": { "id": 370.0, "osm_id": 58756735.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.501159781080432, 37.516257786221438 ], [ -122.500773207706089, 37.51671283974472 ], [ -122.500462322917372, 37.517078961275331 ] ] } },
{ "type": "Feature", "properties": { "id": 371.0, "osm_id": 58756748.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.49923940324436, 37.515229997254274 ], [ -122.498844950881008, 37.515685469872743 ], [ -122.498472123827867, 37.516115126229423 ] ] } },
{ "type": "Feature", "properties": { "id": 372.0, "osm_id": 58756757.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.506371229378558, 37.520097787522303 ], [ -122.506001168353478, 37.520380676754407 ] ] } },
{ "type": "Feature", "properties": { "id": 373.0, "osm_id": 58756758.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.507406645877609, 37.520969924547515 ], [ -122.50714102336606, 37.521278462403309 ] ] } },
{ "type": "Feature", "properties": { "id": 374.0, "osm_id": 58756712.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.494472950185738, 37.5131600862656 ], [ -122.494738572697287, 37.512728166795071 ] ] } },
{ "type": "Feature", "properties": { "id": 375.0, "osm_id": 58756739.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.500773207706089, 37.51671283974472 ], [ -122.498844950881008, 37.515685469872743 ], [ -122.497737952928901, 37.515090019471302 ], [ -122.497595041479769, 37.515013157419205 ], [ -122.497514659028354, 37.514981222368093 ], [ -122.497490435328203, 37.514955741382458 ], [ -122.497482472520176, 37.514896146050908 ], [ -122.497511976819325, 37.514802520192447 ], [ -122.497578948225694, 37.514700344792757 ], [ -122.497792267661438, 37.51445517412494 ] ] } },
{ "type": "Feature", "properties": { "id": 376.0, "osm_id": 58756688.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.490771501744291, 37.507998426472291 ], [ -122.4915601550139, 37.508398494710789 ] ] } },
{ "type": "Feature", "properties": { "id": 377.0, "osm_id": 58756728.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.496267348017085, 37.512000533780579 ], [ -122.495880104090503, 37.511704149684348 ], [ -122.494870922948394, 37.51092957801211 ], [ -122.493471061299402, 37.509854934206203 ], [ -122.4915601550139, 37.508398494710789 ], [ -122.490967303002449, 37.507945285206191 ], [ -122.489636927330736, 37.50692395030449 ], [ -122.488505035126181, 37.506062123020186 ], [ -122.48823924497654, 37.505867998142698 ], [ -122.488011508667313, 37.505785520215454 ], [ -122.487402647220776, 37.505611092810433 ] ] } },
{ "type": "Feature", "properties": { "id": 378.0, "osm_id": 59240016.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.52416693182532, 38.014752534365037 ], [ -122.52467923374725, 38.01441868316163 ], [ -122.524944772439781, 38.014258085896813 ], [ -122.525234451013489, 38.014110145305786 ], [ -122.525537540632229, 38.01397067043699 ], [ -122.526208009067105, 38.013719297160819 ], [ -122.526519229131921, 38.013594574441584 ], [ -122.526827683168705, 38.013461469819205 ], [ -122.527506282049629, 38.013171958883589 ], [ -122.527793278414293, 38.013070454036182 ], [ -122.527959575373231, 38.013019743521944 ] ] } },
{ "type": "Feature", "properties": { "id": 379.0, "osm_id": 59239954.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.523233523087882, 38.015352762451293 ], [ -122.525341739374113, 38.015120248457258 ], [ -122.525567044931407, 38.015088564863241 ], [ -122.525768629702725, 38.015058641468912 ], [ -122.52597474070177, 38.01502519767525 ], [ -122.526181270795959, 38.014978678112627 ], [ -122.5263609788, 38.014927967598432 ], [ -122.526575555521234, 38.014856134688216 ], [ -122.526728441435139, 38.014824451094249 ], [ -122.526886607948029, 38.014818080847824 ], [ -122.527058353144042, 38.014851859917627 ] ] } },
{ "type": "Feature", "properties": { "id": 380.0, "osm_id": 59241957.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.526728441435139, 38.014824451094249 ], [ -122.527506282049629, 38.013171958883589 ] ] } },
{ "type": "Feature", "properties": { "id": 381.0, "osm_id": 59241929.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.525768629702725, 38.015058641468912 ], [ -122.525400747972455, 38.01592968884669 ] ] } },
{ "type": "Feature", "properties": { "id": 382.0, "osm_id": 59241908.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.527959575373231, 38.013019743521944 ], [ -122.527173604312665, 38.014748343413451 ], [ -122.527058353144042, 38.014851859917627 ], [ -122.526875962930987, 38.015325269808841 ], [ -122.526409258562282, 38.016411480641089 ] ] } },
{ "type": "Feature", "properties": { "id": 383.0, "osm_id": 59241748.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.525658240037927, 38.016525558343304 ], [ -122.5263609788, 38.014927967598432 ], [ -122.526414622980312, 38.014644826909233 ], [ -122.526642610746663, 38.014112240781579 ], [ -122.526779319587362, 38.013894646575196 ], [ -122.526824917140644, 38.013791046252003 ], [ -122.526851823049839, 38.013664228056989 ], [ -122.52684914084081, 38.013567081799195 ], [ -122.526827683168705, 38.013461469819205 ] ] } },
{ "type": "Feature", "properties": { "id": 384.0, "osm_id": 64142403.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.252211640951927, 37.514691040880244 ], [ -122.252194374231408, 37.514695986203094 ], [ -122.252177945701177, 37.514699255145331 ], [ -122.25216151717099, 37.514700344792757 ], [ -122.252145675373981, 37.514699674240489 ], [ -122.252126983729895, 37.514696321479235 ], [ -122.252105023143599, 37.51469028650893 ], [ -122.252086582956593, 37.514680144406121 ], [ -122.25191240700866, 37.514525665930613 ], [ -122.251800173325179, 37.514426088920921 ], [ -122.251660782275408, 37.514302372030066 ], [ -122.251546034020947, 37.514200531906532 ], [ -122.251273035434579, 37.513958378723864 ], [ -122.251142277745075, 37.513842289364902 ], [ -122.25104890334373, 37.513758889428289 ], [ -122.250987044898295, 37.513704574695758 ], [ -122.250921163139353, 37.513645817554483 ], [ -122.250398719114557, 37.513184980518012 ], [ -122.250270140719849, 37.51306914261616 ], [ -122.249940815744196, 37.51278088896602 ], [ -122.249876526546828, 37.512724562576715 ], [ -122.249808465493061, 37.512667062720922 ], [ -122.249297672313659, 37.512215278139863 ], [ -122.24905644114034, 37.512000366142516 ], [ -122.248743125599717, 37.51172133258585 ], [ -122.247803849530115, 37.510884818649131 ], [ -122.246711855184657, 37.509933891734079 ], [ -122.246662904870107, 37.509875050773815 ], [ -122.246626527410328, 37.509810677757429 ], [ -122.24654404948312, 37.509547569816839 ], [ -122.246536421951234, 37.509499625330704 ], [ -122.24653516466573, 37.509454782148687 ], [ -122.246539271798298, 37.509407172938673 ], [ -122.246549581539199, 37.509362162118634 ], [ -122.246564752783968, 37.509305248996071 ], [ -122.246591155778944, 37.509252694463193 ], [ -122.246628455248086, 37.509208270376348 ], [ -122.246670616221039, 37.509170384174034 ], [ -122.24681000727081, 37.509072818821068 ], [ -122.246852754977013, 37.509054881548302 ], [ -122.24689776579703, 37.509041554322252 ], [ -122.246944536816741, 37.509034681161644 ], [ -122.246976304229776, 37.509035351713926 ], [ -122.24700312631991, 37.509042476331587 ], [ -122.247032379161979, 37.5090622576231 ] ] } },
{ "type": "Feature", "properties": { "id": 385.0, "osm_id": 87664429.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.464048964148716, 36.95264285885635 ], [ -121.464645336559528, 36.952907475539561 ], [ -121.465203236034753, 36.953841471010165 ] ] } },
{ "type": "Feature", "properties": { "id": 386.0, "osm_id": 87664416.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.46670535690248, 36.951651782625127 ], [ -121.466962932786984, 36.952080433153412 ], [ -121.467474312699608, 36.952907475539561 ] ] } },
{ "type": "Feature", "properties": { "id": 387.0, "osm_id": 93668887.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.391654239432, 37.631766782198845 ], [ -122.390908501506672, 37.632021675874398 ] ] } },
{ "type": "Feature", "properties": { "id": 388.0, "osm_id": 93668983.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.391756163374595, 37.632918036599754 ], [ -122.391992113948916, 37.633742229138782 ], [ -122.392051122547258, 37.633873825018611 ], [ -122.392315152497247, 37.634349833299837 ], [ -122.39234490825352, 37.634439687301864 ], [ -122.39235127849993, 37.634521578495871 ], [ -122.392332838312939, 37.634614869078185 ], [ -122.392247007624448, 37.634854842966071 ], [ -122.39221088162175, 37.634911169355384 ], [ -122.392174504162, 37.634957856556063 ], [ -122.392128906608718, 37.634991887082933 ], [ -122.392054978222745, 37.635028180723687 ], [ -122.392000244395007, 37.635067240392473 ], [ -122.39194760604309, 37.635133289789479 ], [ -122.391902343765935, 37.635204284509342 ], [ -122.391521134809594, 37.63583845930345 ] ] } },
{ "type": "Feature", "properties": { "id": 389.0, "osm_id": 93997733.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.696090805576247, 37.6612762781496 ], [ -121.69013906758984, 37.661232273157964 ] ] } },
{ "type": "Feature", "properties": { "id": 390.0, "osm_id": 94452034.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.366414652595935, 37.618446932227769 ], [ -122.366946735809393, 37.617642185704064 ], [ -122.368161273579204, 37.615824318543787 ], [ -122.368565113674109, 37.615205566451529 ], [ -122.36869453025912, 37.615034827083903 ], [ -122.368855462800042, 37.614920078829428 ], [ -122.369064675103274, 37.614835170150307 ], [ -122.369268439169431, 37.614818154886862 ], [ -122.369450829382458, 37.614835170150307 ], [ -122.369648809935427, 37.614899543166707 ] ] } },
{ "type": "Feature", "properties": { "id": 391.0, "osm_id": 94452177.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.370963008533991, 37.615449898929029 ], [ -122.371355281602533, 37.615570263058622 ], [ -122.371682427283403, 37.615604293585491 ], [ -122.372009740602309, 37.615595744044249 ], [ -122.37234761511921, 37.615540423483303 ], [ -122.372680209037171, 37.615430033818541 ], [ -122.372986064683971, 37.615272789315014 ], [ -122.37323810851241, 37.615068857610773 ], [ -122.373465509545468, 37.614801893994724 ] ] } },
{ "type": "Feature", "properties": { "id": 392.0, "osm_id": 94452041.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.363967807421517, 37.617510757462284 ], [ -122.364526125991901, 37.616626634315573 ], [ -122.365701352635853, 37.61479217098703 ], [ -122.365856753120681, 37.614550436899499 ], [ -122.365969322080275, 37.614431497693474 ], [ -122.366108880768152, 37.614333680883433 ], [ -122.366280542145148, 37.61427416937088 ], [ -122.367165671120276, 37.614048947632639 ], [ -122.367305145989079, 37.61402774141758 ], [ -122.367471442948059, 37.614023466646962 ], [ -122.367610833997801, 37.61405322240325 ], [ -122.367744944448589, 37.614099993422961 ], [ -122.369648809935427, 37.614899543166707 ] ] } },
{ "type": "Feature", "properties": { "id": 393.0, "osm_id": 94452225.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.376861018521097, 37.612370387703088 ], [ -122.378538321165124, 37.613064074009742 ], [ -122.379293782098159, 37.61337093548493 ], [ -122.380119483379787, 37.61372968094075 ], [ -122.380867400599953, 37.614054731145821 ], [ -122.380986004529845, 37.614072752237625 ], [ -122.381114582924525, 37.614065292343803 ], [ -122.381242742224046, 37.614033860206895 ], [ -122.381368303133613, 37.613971331209228 ], [ -122.381460168792387, 37.613895139709392 ] ] } },
{ "type": "Feature", "properties": { "id": 394.0, "osm_id": 94453474.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.392756124423201, 37.627094793188988 ], [ -122.392839440540754, 37.627184898648096 ], [ -122.392933317856304, 37.627267795670484 ], [ -122.393048652843945, 37.627342059332598 ], [ -122.39317748269572, 37.627410036567326 ], [ -122.393420222611624, 37.627500225845459 ], [ -122.393893548683863, 37.627709521967731 ], [ -122.394786724286021, 37.628153595197865 ], [ -122.395503712283485, 37.628449141103765 ] ] } },
{ "type": "Feature", "properties": { "id": 395.0, "osm_id": 94452520.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.392272656248167, 37.620402597876215 ], [ -122.392353038699568, 37.620330429689908 ], [ -122.392467954592121, 37.620277456061842 ], [ -122.393724820972977, 37.619976629556952 ] ] } },
{ "type": "Feature", "properties": { "id": 396.0, "osm_id": 94452409.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.383268480583041, 37.609769399329316 ], [ -122.383409883289559, 37.609648532285561 ], [ -122.383519015668881, 37.60957954922246 ], [ -122.383637200503642, 37.609548536180718 ], [ -122.38375253549134, 37.609544261410065 ], [ -122.383882538809516, 37.609565467625089 ], [ -122.384011201023242, 37.609663284435143 ], [ -122.384070209621584, 37.609760933607134 ], [ -122.384102479948808, 37.609875765680577 ], [ -122.384130726962496, 37.610098891943096 ], [ -122.384160231261674, 37.610207269951118 ], [ -122.384195016159822, 37.610285892202853 ], [ -122.384256706967207, 37.610372980176869 ], [ -122.384350332825647, 37.610463337093059 ], [ -122.384463320880442, 37.610532236337122 ] ] } },
{ "type": "Feature", "properties": { "id": 397.0, "osm_id": 94453524.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.391208406002193, 37.624251735451537 ], [ -122.391651557222986, 37.624435047673956 ], [ -122.392434175522311, 37.624770072343793 ], [ -122.393240933702742, 37.625159747022359 ], [ -122.393922382430759, 37.625488988178986 ], [ -122.393991365493875, 37.625522264334613 ], [ -122.394826705964149, 37.625925769153369 ], [ -122.394978921325787, 37.626012354213174 ], [ -122.395070703165544, 37.626106399166765 ], [ -122.396441311972453, 37.627461669090884 ], [ -122.396540972801191, 37.627571472022481 ], [ -122.396605261998516, 37.627696865293956 ], [ -122.396637448506709, 37.627822174746399 ], [ -122.396642561467658, 37.627939689028885 ], [ -122.396570477100369, 37.629583128784112 ], [ -122.396551617818233, 37.629725453500015 ], [ -122.396506020264965, 37.629855037723061 ], [ -122.39643636664961, 37.629982526470314 ], [ -122.396329078288971, 37.630116385464 ], [ -122.396189519601151, 37.63025016063866 ], [ -122.396001764970038, 37.630367088187938 ], [ -122.395792552666805, 37.63046473735988 ], [ -122.395561966510542, 37.630526344348212 ], [ -122.395363483043383, 37.630553920809646 ], [ -122.39464356137978, 37.63056414673153 ] ] } },
{ "type": "Feature", "properties": { "id": 398.0, "osm_id": 94453618.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.396642561467658, 37.627939689028885 ], [ -122.396610626416575, 37.628087629619884 ], [ -122.396546253400189, 37.628204557169141 ], [ -122.396452459903657, 37.62831075588236 ], [ -122.396318349452926, 37.628404297921783 ], [ -122.396173426347048, 37.628467916566862 ], [ -122.396020540433142, 37.628508233521117 ], [ -122.395862373920266, 37.628523153308784 ], [ -122.395690628724239, 37.628504042569531 ], [ -122.395503712283485, 37.628449141103765 ], [ -122.395958849625814, 37.628644271809641 ], [ -122.396127828793766, 37.628735550735172 ], [ -122.396267303662583, 37.62885457376025 ], [ -122.396393451305343, 37.62898834893489 ], [ -122.396476515965787, 37.62912857817502 ], [ -122.396530160146099, 37.629268723596063 ], [ -122.396562346654292, 37.629411048311951 ], [ -122.396570477100369, 37.629583128784112 ] ] } },
{ "type": "Feature", "properties": { "id": 399.0, "osm_id": 94452402.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.378142946792423, 37.607745337350984 ], [ -122.378251743895632, 37.60765732736769 ], [ -122.378385854346362, 37.607573173059812 ], [ -122.378520300073319, 37.607506956024707 ], [ -122.378722303939782, 37.607493628798686 ], [ -122.378904861790915, 37.607510895519233 ], [ -122.379104434905443, 37.607574346526256 ], [ -122.379971542788752, 37.607936444743338 ], [ -122.383167981563972, 37.609279560907851 ], [ -122.383882538809516, 37.609565467625089 ], [ -122.384773702754941, 37.609791276096594 ], [ -122.387646851524764, 37.610988882422049 ], [ -122.387963519826656, 37.611120897397001 ], [ -122.388154040485759, 37.611133637889822 ], [ -122.388290833145589, 37.611110252379994 ], [ -122.38839787004909, 37.611075299843783 ], [ -122.38848395219469, 37.611018889635382 ], [ -122.388577661872162, 37.610926018148227 ], [ -122.388882260233487, 37.610480184718419 ], [ -122.388958619371408, 37.610379266604227 ], [ -122.389015029579781, 37.610322940214893 ], [ -122.389120976835869, 37.610245323791489 ], [ -122.389214518875264, 37.610195619105703 ], [ -122.389287273794835, 37.610163516416534 ], [ -122.389385174423879, 37.610128563880302 ], [ -122.389499168307083, 37.610106268017887 ], [ -122.38961316219023, 37.610094533353433 ], [ -122.389717768341825, 37.610095623000845 ], [ -122.389831762225, 37.610109453141064 ], [ -122.389944163546531, 37.610131832822553 ], [ -122.390044914022695, 37.610163516416534 ], [ -122.390146670327226, 37.610210455074316 ], [ -122.390249935374328, 37.610273151710039 ], [ -122.391400770680036, 37.611025176062775 ], [ -122.391469167009959, 37.611078317328904 ], [ -122.391518536419625, 37.611137996479492 ], [ -122.39155767990745, 37.611200441658134 ], [ -122.391583160893106, 37.611264227941277 ], [ -122.391793546662754, 37.611807291447903 ], [ -122.391808214993304, 37.611869988083662 ], [ -122.391807125345906, 37.611927152663291 ], [ -122.39179773761434, 37.611989849299022 ], [ -122.391774938837685, 37.612051456287347 ], [ -122.391738561377949, 37.612112141266337 ], [ -122.390746311680246, 37.613612082839211 ], [ -122.390694008604456, 37.613667235762115 ], [ -122.390632150159021, 37.613705792516704 ], [ -122.390558557049175, 37.613732195511673 ], [ -122.389646438345849, 37.613955321774185 ] ] } },
{ "type": "Feature", "properties": { "id": 400.0, "osm_id": 94452401.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.384610758557258, 37.608282365887312 ], [ -122.384222676440316, 37.608911343901454 ], [ -122.384050931244275, 37.60910722897863 ], [ -122.383862925156123, 37.609294061600337 ], [ -122.383478614895594, 37.609561528130591 ], [ -122.383268480583041, 37.609769399329316 ], [ -122.38277126608682, 37.610506839170533 ], [ -122.382377651913771, 37.611098098620381 ], [ -122.380714011771857, 37.61360889771602 ], [ -122.37894157452682, 37.616283898294824 ], [ -122.378861024437285, 37.616435024009029 ], [ -122.378736636994191, 37.616734090314267 ], [ -122.37867896950037, 37.616942296789091 ], [ -122.378632617575803, 37.61724823625493 ], [ -122.378628761900359, 37.617431632296395 ], [ -122.378639239279366, 37.617610334472019 ], [ -122.378658182380491, 37.617771518470029 ], [ -122.37869313491673, 37.617940749095119 ], [ -122.378763542903386, 37.618175023288828 ], [ -122.378821042759185, 37.618295052142273 ], [ -122.378961942551527, 37.618553130940974 ], [ -122.379112230075407, 37.61876133741584 ], [ -122.379219434616999, 37.618893184752729 ], [ -122.379416157884506, 37.619100720675291 ], [ -122.379619670493526, 37.619276153908714 ], [ -122.379979002682589, 37.619511685387891 ], [ -122.38026943562754, 37.619669181348534 ], [ -122.382925744562257, 37.620762852074591 ], [ -122.383579030095603, 37.621036521213256 ], [ -122.383918748631231, 37.621182450147487 ], [ -122.38517377099339, 37.621721238883467 ], [ -122.385713062643575, 37.621952830868153 ], [ -122.386118746757177, 37.622127090635146 ], [ -122.386335502773264, 37.622217363732311 ], [ -122.386563071444399, 37.622312079238178 ], [ -122.387496144905697, 37.622700664269274 ], [ -122.388300807610349, 37.62303443165365 ], [ -122.389015532493943, 37.623329474645388 ], [ -122.389376457244595, 37.623478421064775 ], [ -122.389862104714496, 37.623683945330569 ], [ -122.390800542593766, 37.62408107990295 ], [ -122.390935407415824, 37.624137490111295 ], [ -122.390979915321722, 37.624156181755382 ], [ -122.391208406002193, 37.624251735451537 ] ] } },
{ "type": "Feature", "properties": { "id": 401.0, "osm_id": 94452279.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.380957422240044, 37.606472964449239 ], [ -122.380957506059076, 37.606402891738718 ], [ -122.380976449160258, 37.606318737430826 ], [ -122.381011317877451, 37.606237935884273 ], [ -122.381075523255745, 37.606158475442165 ], [ -122.381145344509179, 37.606103238700278 ], [ -122.381252549050757, 37.606056551499563 ], [ -122.381343911795369, 37.606025454638811 ], [ -122.381453882365008, 37.606012797965008 ], [ -122.381554381384049, 37.606017240373696 ], [ -122.383108637689531, 37.606331729380791 ], [ -122.383382223009093, 37.606420996649554 ], [ -122.383580706476252, 37.606527279181805 ], [ -122.38372554576307, 37.606641943617234 ], [ -122.383881113885991, 37.606807653842971 ], [ -122.384583936467067, 37.607700158892882 ], [ -122.384659038319498, 37.607840388132971 ], [ -122.384691141008688, 37.607989166914287 ], [ -122.3846697671556, 37.608150686188466 ], [ -122.384610758557258, 37.608282365887312 ], [ -122.38453691399026, 37.608481855182823 ], [ -122.384499446883098, 37.608702885969521 ], [ -122.384391571789251, 37.609333959459427 ], [ -122.384359972014281, 37.609518780424452 ], [ -122.384327031134802, 37.60967518673764 ], [ -122.384261065556828, 37.609839639677922 ], [ -122.384186550437633, 37.609942150353746 ], [ -122.383932327314383, 37.610220094262985 ], [ -122.383770305126049, 37.610403490304385 ], [ -122.383527900486243, 37.610744298487425 ], [ -122.383097573577317, 37.611424573749012 ], [ -122.382050841509027, 37.612997186422419 ], [ -122.381629315598389, 37.613624990970116 ], [ -122.381460168792387, 37.613895139709392 ], [ -122.381029758064415, 37.614541384444074 ], [ -122.380642178861677, 37.615123256162349 ], [ -122.380320732874978, 37.615605299413865 ], [ -122.379691671041812, 37.616548850254112 ], [ -122.379559739885849, 37.616831152753008 ], [ -122.379502240030078, 37.616999461368721 ], [ -122.379455552829384, 37.617227449135051 ], [ -122.37944851203072, 37.61738268198183 ], [ -122.379444740174293, 37.617465327547123 ], [ -122.3794769266825, 37.617690633104424 ], [ -122.379551357982692, 37.617976372183598 ], [ -122.379632578624438, 37.618145267532562 ], [ -122.379766605256179, 37.618357748777989 ], [ -122.379895435107954, 37.618527649955347 ], [ -122.380077741501964, 37.618706184492915 ], [ -122.380297766460259, 37.618863345177409 ], [ -122.380736642910449, 37.619126788394176 ], [ -122.381719001962367, 37.619538758935136 ], [ -122.382611842288398, 37.619913178549893 ], [ -122.383262864707902, 37.620186177136269 ], [ -122.38400642333842, 37.620497481020138 ], [ -122.384414370565878, 37.620668220387756 ], [ -122.384955422415715, 37.620894531773452 ], [ -122.385216351061544, 37.62100374797182 ], [ -122.385772238880008, 37.621236345784872 ], [ -122.386143641009639, 37.621391746269687 ], [ -122.386500542446726, 37.621541027965243 ], [ -122.386872866585719, 37.621698440106854 ], [ -122.387947258934489, 37.622152487801735 ], [ -122.388734403461498, 37.622475861626178 ], [ -122.389139668479942, 37.622647355365096 ], [ -122.389241927698663, 37.622666633742405 ], [ -122.389337900490005, 37.622667974846927 ], [ -122.390189250395323, 37.622462534400121 ], [ -122.390417741075836, 37.622407465296298 ], [ -122.390935407415824, 37.622282491119975 ], [ -122.391019561723709, 37.622245694565066 ], [ -122.391096339956817, 37.622190374004091 ], [ -122.39136430940124, 37.621782594414718 ], [ -122.391568324924478, 37.621472296359201 ], [ -122.3917559119175, 37.621188736574865 ], [ -122.392037376226057, 37.620763271169757 ], [ -122.392242565215739, 37.62045314075236 ], [ -122.392272656248167, 37.620402597876215 ], [ -122.392461500526636, 37.620135718079162 ], [ -122.392498464719637, 37.620040918754242 ], [ -122.392493938491924, 37.619937737526186 ], [ -122.392462841631158, 37.619848554076469 ], [ -122.3923908410829, 37.619770183281766 ], [ -122.392283636541308, 37.619698518009628 ] ] } },
{ "type": "Feature", "properties": { "id": 402.0, "osm_id": 97573957.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.275184844988971, 38.216448198267024 ], [ -122.278534169678039, 38.211268768839027 ], [ -122.278964664225029, 38.210603581003163 ], [ -122.279793131534703, 38.209321652731809 ] ] } },
{ "type": "Feature", "properties": { "id": 403.0, "osm_id": 97573966.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.278534169678039, 38.211268768839027 ], [ -122.281364570741673, 38.212115257240505 ] ] } },
{ "type": "Feature", "properties": { "id": 404.0, "osm_id": 97573739.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.272196864145641, 38.211862375221777 ], [ -122.277952800873933, 38.210791754729414 ], [ -122.278964664225029, 38.210603581003163 ], [ -122.284491439720583, 38.209575792036027 ], [ -122.28844560254268, 38.208840196213522 ], [ -122.288520704395097, 38.208814966684955 ], [ -122.288590525648559, 38.208764339989791 ], [ -122.288644169828856, 38.208692674717646 ], [ -122.288654982483948, 38.208604161820169 ], [ -122.288385755754007, 38.207724481082089 ] ] } },
{ "type": "Feature", "properties": { "id": 405.0, "osm_id": 97573866.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.271283655794917, 38.20977159329415 ], [ -122.271596803697463, 38.210845147452616 ], [ -122.271649609687458, 38.211023681990234 ], [ -122.272196864145641, 38.211862375221777 ], [ -122.272623251560077, 38.212516834221525 ], [ -122.273885901454122, 38.214454730235254 ], [ -122.275184844988971, 38.216448198267024 ], [ -122.276424025554135, 38.218327840053668 ], [ -122.277110671062104, 38.219373063379408 ], [ -122.277153502587296, 38.21945319437377 ], [ -122.277158950824358, 38.219520668694301 ], [ -122.277137409333235, 38.219596441098993 ], [ -122.276145075816501, 38.221661574402887 ], [ -122.276128982562426, 38.221720583001229 ], [ -122.276139711398486, 38.221783782551149 ], [ -122.276166533488606, 38.221846982101063 ], [ -122.276601051349132, 38.22258458958035 ], [ -122.276686882037623, 38.222677293429456 ], [ -122.276778077144186, 38.222744683930962 ], [ -122.276901458758886, 38.22280369252929 ], [ -122.277040933627674, 38.222854235405428 ], [ -122.277984568286968, 38.223133771876292 ] ] } },
{ "type": "Feature", "properties": { "id": 406.0, "osm_id": 97574053.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.275954722795404, 38.207373363158148 ], [ -122.276359149623545, 38.208830137929731 ], [ -122.276671962249992, 38.209901848069457 ] ] } },
{ "type": "Feature", "properties": { "id": 407.0, "osm_id": 97574131.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.277952800873933, 38.210791754729414 ], [ -122.276853178996603, 38.210264952114954 ], [ -122.276665424365518, 38.210197477794409 ], [ -122.276461576480315, 38.210146851099218 ], [ -122.276225542086976, 38.210121537751633 ], [ -122.275962601784414, 38.210113155848468 ], [ -122.275715922374033, 38.210117346800061 ], [ -122.275394224930224, 38.210139391205388 ] ] } },
{ "type": "Feature", "properties": { "id": 408.0, "osm_id": 97574000.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.272623251560077, 38.212516834221525 ], [ -122.272378751444521, 38.21261582449803 ], [ -122.272095024022079, 38.212730656571495 ], [ -122.271867958265119, 38.212822522230304 ], [ -122.271694033774267, 38.212892930216952 ], [ -122.271514912503463, 38.212965433679415 ], [ -122.271348531725465, 38.213032740361868 ], [ -122.271159771265985, 38.213109183318821 ], [ -122.271020044940073, 38.213165761165229 ], [ -122.27098274547096, 38.213180848590973 ], [ -122.270771605329998, 38.213266344003301 ], [ -122.270600949781439, 38.213335327066439 ], [ -122.270446471305917, 38.213397939883137 ], [ -122.27038553486986, 38.213422582678504 ], [ -122.270289645897549, 38.213461474709206 ], [ -122.270086971478833, 38.213543449722252 ], [ -122.270028381975635, 38.213567170508227 ], [ -122.269935510488466, 38.213604721434436 ], [ -122.269793604867758, 38.213662137471182 ], [ -122.269734512450356, 38.213687450818767 ], [ -122.269664858835, 38.213681080572357 ], [ -122.269608448626627, 38.213645289845786 ], [ -122.269576429756526, 38.213611426956973 ], [ -122.268814514758063, 38.212437625236532 ] ] } },
{ "type": "Feature", "properties": { "id": 409.0, "osm_id": 97573851.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.27360770608783, 38.217088743307549 ], [ -122.273701164308193, 38.217050857105207 ], [ -122.27388757783477, 38.216975084700515 ], [ -122.274849317404914, 38.216584488012636 ], [ -122.275025169733496, 38.216513074197593 ], [ -122.275184844988971, 38.216448198267024 ], [ -122.27529741394855, 38.216414419197228 ], [ -122.279886757393172, 38.215195522837732 ], [ -122.282077367787551, 38.214606191225606 ] ] } },
{ "type": "Feature", "properties": { "id": 410.0, "osm_id": 97574235.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.276032423037847, 38.218483827271768 ], [ -122.276424025554135, 38.218327840053668 ], [ -122.276692246455653, 38.218214097627595 ], [ -122.276837001923482, 38.218171936654642 ], [ -122.276987205628373, 38.218142432355492 ], [ -122.277142857570283, 38.218142432355492 ], [ -122.277309154529249, 38.218155089029281 ], [ -122.277513002414409, 38.218209822857006 ], [ -122.278324957374835, 38.218450634935159 ], [ -122.279991028268654, 38.218953130030428 ] ] } },
{ "type": "Feature", "properties": { "id": 411.0, "osm_id": 97573696.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.267540549294679, 38.208334348356999 ], [ -122.26780835110111, 38.209226350492713 ], [ -122.26814672853223, 38.210353465012467 ], [ -122.271283655794917, 38.20977159329415 ], [ -122.273711306411045, 38.209321233636658 ], [ -122.273973324704258, 38.209272618598241 ], [ -122.276359149623545, 38.208830137929731 ], [ -122.276804983053353, 38.208747492364431 ] ] } },
{ "type": "Feature", "properties": { "id": 412.0, "osm_id": 97655899.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.534930804242649, 38.177354834227678 ], [ -122.528675976637487, 38.175043943522738 ] ] } },
{ "type": "Feature", "properties": { "id": 413.0, "osm_id": 100221707.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.304561463324376, 38.549874858272339 ], [ -121.304897829098735, 38.553089569596516 ] ] } },
{ "type": "Feature", "properties": { "id": 414.0, "osm_id": 100221915.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.304897829098735, 38.553089569596516 ], [ -121.305201840726824, 38.555596261559543 ] ] } },
{ "type": "Feature", "properties": { "id": 415.0, "osm_id": 100222143.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.286314814486914, 38.560396326049954 ], [ -121.287713837945631, 38.562393985033303 ], [ -121.28786672385948, 38.562599593118101 ], [ -121.28804006161711, 38.562805368841047 ], [ -121.289681573534637, 38.564548888520164 ] ] } },
{ "type": "Feature", "properties": { "id": 416.0, "osm_id": 100849321.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.406602357913556, 37.368315435009222 ], [ -122.407136117507662, 37.369178771036111 ] ] } },
{ "type": "Feature", "properties": { "id": 417.0, "osm_id": 109659224.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.9246718430025, 37.354198298408249 ], [ -121.92459791461647, 37.354202489359857 ], [ -121.924526500801434, 37.354214894576543 ], [ -121.924457182462191, 37.354242135761879 ], [ -121.924394402007422, 37.354281279249705 ], [ -121.923337444017221, 37.355023077680528 ], [ -121.922307140479148, 37.355748363762132 ], [ -121.920493883365637, 37.357019479378422 ], [ -121.919585536518738, 37.357656084924443 ], [ -121.919030905985736, 37.35804525668879 ] ] } },
{ "type": "Feature", "properties": { "id": 418.0, "osm_id": 109696314.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.917990879439941, 37.35180995891799 ], [ -121.916174353384179, 37.353079817248805 ], [ -121.915265419804058, 37.353715165509335 ], [ -121.914710202537847, 37.354103247626306 ] ] } },
{ "type": "Feature", "properties": { "id": 419.0, "osm_id": 109696316.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.923337444017221, 37.355023077680528 ], [ -121.920732264691878, 37.352635241104473 ] ] } },
{ "type": "Feature", "properties": { "id": 420.0, "osm_id": 109696318.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.939151161639572, 37.375279371622881 ], [ -121.939244536040917, 37.375284316945773 ], [ -121.939333300395532, 37.375277695242247 ], [ -121.939409827171488, 37.375260428521713 ], [ -121.939480235158143, 37.375233354974455 ], [ -121.939549218221259, 37.375194127667598 ], [ -121.940058754115185, 37.374861282292606 ], [ -121.941899336233078, 37.373622437003519 ] ] } },
{ "type": "Feature", "properties": { "id": 421.0, "osm_id": 109696317.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.920732264691878, 37.352635241104473 ], [ -121.920669148960997, 37.352587296618331 ], [ -121.92060745815364, 37.352554271919843 ], [ -121.920533781224719, 37.352526444001249 ], [ -121.920457254448749, 37.352508339090434 ], [ -121.919632475176485, 37.352385795666031 ], [ -121.919573466578143, 37.352380431248001 ], [ -121.919513116875279, 37.352382526723773 ], [ -121.919446061649907, 37.352397446511418 ], [ -121.91938973526058, 37.352417730717143 ], [ -121.919338773289297, 37.352447654111465 ], [ -121.91897198120644, 37.35270514617693 ], [ -121.918015606054325, 37.3533664783373 ], [ -121.917147157066481, 37.353967125518722 ], [ -121.916240402781185, 37.354604569255102 ], [ -121.915684179686579, 37.354991729362673 ] ] } },
{ "type": "Feature", "properties": { "id": 422.0, "osm_id": 109696320.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.926735551382819, 37.365073985413986 ], [ -121.927291858296442, 37.364685232744769 ] ] } },
{ "type": "Feature", "properties": { "id": 423.0, "osm_id": 109696313.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.91417862223858, 37.353409226043524 ], [ -121.914175269477326, 37.353482064782078 ], [ -121.914189015798527, 37.353552724225871 ], [ -121.914216676078979, 37.353621288193821 ], [ -121.914260261975485, 37.353684990657918 ], [ -121.914321030773507, 37.353748190207867 ], [ -121.914710202537847, 37.354103247626306 ], [ -121.9151149646421, 37.354472470461083 ], [ -121.915684179686579, 37.354991729362673 ], [ -121.919030905985736, 37.35804525668879 ], [ -121.921190000424204, 37.360016680315212 ], [ -121.922964952240221, 37.361634136170586 ], [ -121.924730851600785, 37.36324513796054 ], [ -121.926735551382819, 37.365073985413986 ], [ -121.928861621122778, 37.367013473989317 ], [ -121.931319362771305, 37.369255381631092 ], [ -121.933158268508549, 37.370932768094185 ], [ -121.935432614115641, 37.37300737294867 ], [ -121.935493634370744, 37.373053976330326 ], [ -121.935563455624177, 37.373085995200427 ], [ -121.935634450344082, 37.373105189758697 ], [ -121.935725645450603, 37.3731115600051 ] ] } },
{ "type": "Feature", "properties": { "id": 424.0, "osm_id": 109696312.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.935725645450603, 37.3731115600051 ], [ -121.935803429512063, 37.37310401629226 ], [ -121.935877274079033, 37.373083732086599 ], [ -121.935944245485345, 37.373046432617478 ], [ -121.936235935715814, 37.37284275237036 ], [ -121.937147551504935, 37.372206733557526 ], [ -121.938959383694936, 37.370940563264128 ], [ -121.939996728031687, 37.37021586391576 ], [ -121.940089012785634, 37.370145623567204 ], [ -121.940169730513205, 37.370073036285689 ], [ -121.940249358593334, 37.369987624692335 ], [ -121.940324460445794, 37.369895423757434 ], [ -121.940390426023754, 37.369799031870961 ], [ -121.940456140144647, 37.369691994967425 ], [ -121.940499558403076, 37.369588394644197 ], [ -121.940534510939315, 37.369480435731312 ], [ -121.940559908105925, 37.3693749913894 ], [ -121.940573570608123, 37.369271642523259 ], [ -121.940578515930966, 37.369165024714881 ], [ -121.94057516316974, 37.369045666413697 ] ] } },
{ "type": "Feature", "properties": { "id": 425.0, "osm_id": 109696319.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.941830856084124, 37.372066252860343 ], [ -121.941818115591317, 37.372137834313442 ], [ -121.941793556615011, 37.372197429645006 ], [ -121.94176002900231, 37.37225375603434 ], [ -121.941716946019994, 37.372303963634359 ], [ -121.941656680136205, 37.372353165405983 ], [ -121.941005741535704, 37.372807380738962 ], [ -121.939188377289653, 37.374067683700098 ], [ -121.938274749843742, 37.374702193770354 ] ] } },
{ "type": "Feature", "properties": { "id": 426.0, "osm_id": 109696315.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.94057516316974, 37.369045666413697 ], [ -121.940567703275875, 37.368938378053095 ], [ -121.94054331193766, 37.368820947589654 ], [ -121.940508862315596, 37.368704942049732 ], [ -121.940460834010423, 37.368591534899785 ], [ -121.940400651945623, 37.368476367550173 ], [ -121.940324963359984, 37.368361367838617 ], [ -121.940233935891527, 37.368245362298701 ], [ -121.940127820997333, 37.36813773866195 ], [ -121.937157777426819, 37.365422840224035 ], [ -121.932422002133805, 37.361093922511088 ], [ -121.93060555989706, 37.359433383673363 ], [ -121.930534732815232, 37.359371357589865 ], [ -121.930473042007876, 37.35932458657016 ], [ -121.93042635480721, 37.359293992623584 ], [ -121.930294507470308, 37.359210676506017 ], [ -121.930235331233888, 37.35916407312439 ], [ -121.926818448405214, 37.35603955107841 ], [ -121.926355683531, 37.355616264968141 ], [ -121.925760065491488, 37.355071525080895 ], [ -121.924922964821533, 37.35430617350211 ], [ -121.92487200285025, 37.354265772728844 ], [ -121.924809809128689, 37.354230568735503 ], [ -121.924742083351063, 37.354208356692055 ], [ -121.9246718430025, 37.354198298408249 ] ] } },
{ "type": "Feature", "properties": { "id": 427.0, "osm_id": 110152929.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.404281635931937, 36.887317071550051 ], [ -121.403441936872014, 36.887807748161812 ], [ -121.403165920800504, 36.887983181395214 ] ] } },
{ "type": "Feature", "properties": { "id": 428.0, "osm_id": 112864766.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.605898953489273, 38.2571549948482 ], [ -122.605706421173366, 38.257355154696022 ], [ -122.605256732068113, 38.257822781074061 ] ] } },
{ "type": "Feature", "properties": { "id": 429.0, "osm_id": 112864761.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.610941506438451, 38.259901325423051 ], [ -122.610812760405693, 38.2602215979433 ], [ -122.610290651657039, 38.260640944559043 ] ] } },
{ "type": "Feature", "properties": { "id": 430.0, "osm_id": 112864784.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.608452416472048, 38.258578744921273 ], [ -122.608260051794204, 38.258788292500626 ], [ -122.607826036847896, 38.259261199477677 ] ] } },
{ "type": "Feature", "properties": { "id": 431.0, "osm_id": 112864765.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.603313303998306, 38.255748092400538 ], [ -122.603147761410625, 38.255918580311096 ], [ -122.602692624068297, 38.256387044879475 ] ] } },
{ "type": "Feature", "properties": { "id": 432.0, "osm_id": 112864780.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.600193475818088, 38.254987853782708 ], [ -122.600609637310654, 38.254492734762245 ], [ -122.603147761410625, 38.255918580311096 ], [ -122.605706421173366, 38.257355154696022 ], [ -122.608260051794204, 38.258788292500626 ], [ -122.610812760405693, 38.2602215979433 ] ] } },
{ "type": "Feature", "properties": { "id": 433.0, "osm_id": 122737724.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.362498627433254, 37.982893590954724 ], [ -122.362851505556876, 37.98175616669409 ] ] } },
{ "type": "Feature", "properties": { "id": 434.0, "osm_id": 129870693.0, "name": "C", "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.400569039559286, 38.669648063670287 ], [ -121.399736548936076, 38.669534069787126 ], [ -121.399069265624448, 38.669038447852486 ] ] } },
{ "type": "Feature", "properties": { "id": 435.0, "osm_id": 129870696.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.399069265624448, 38.669038447852486 ], [ -121.397189707656807, 38.669015649075867 ], [ -121.396451345806256, 38.669028976301888 ] ] } },
{ "type": "Feature", "properties": { "id": 436.0, "osm_id": 129863645.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.309697223036835, 38.553003738908004 ], [ -121.305954451812795, 38.549071536672209 ] ] } },
{ "type": "Feature", "properties": { "id": 437.0, "osm_id": 129870711.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.397770573546765, 38.659582739063403 ], [ -121.400587982660468, 38.65982715535992 ] ] } },
{ "type": "Feature", "properties": { "id": 438.0, "osm_id": 129870698.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.400595023459118, 38.66719895538202 ], [ -121.399797066277003, 38.667288977022082 ], [ -121.399778039356789, 38.667290988678857 ], [ -121.399687011888332, 38.667288977022082 ], [ -121.39957502966196, 38.66727397341544 ], [ -121.399468076577435, 38.667242960373692 ], [ -121.399388029402147, 38.667207924018435 ], [ -121.399298007762056, 38.667152938733594 ], [ -121.398736001154276, 38.666663938502467 ], [ -121.397749618788808, 38.66575525637942 ] ] } },
{ "type": "Feature", "properties": { "id": 439.0, "osm_id": 129863643.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.316606677279879, 38.548720334929236 ], [ -121.316620004505936, 38.548575663280445 ], [ -121.316595864624787, 38.548422442090455 ], [ -121.316528809399372, 38.548258827340483 ], [ -121.316421521038777, 38.5481120602159 ], [ -121.313333376452547, 38.544816128250048 ] ] } },
{ "type": "Feature", "properties": { "id": 440.0, "osm_id": 129870707.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.399069265624448, 38.669038447852486 ], [ -121.398723763575646, 38.668796965222057 ], [ -121.398736001154276, 38.666663938502467 ] ] } },
{ "type": "Feature", "properties": { "id": 441.0, "osm_id": 129863644.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.288821506450006, 38.565044929549977 ], [ -121.300293482047437, 38.558427836089649 ], [ -121.304953317297702, 38.55573992737996 ], [ -121.305201840726824, 38.555596261559543 ], [ -121.309697223036835, 38.553003738908004 ], [ -121.316193533272454, 38.549255267989778 ], [ -121.316338372559287, 38.549158792284246 ], [ -121.316456305936939, 38.549039266344991 ], [ -121.316552949280549, 38.548883949679187 ], [ -121.316606677279879, 38.548720334929236 ] ] } },
{ "type": "Feature", "properties": { "id": 442.0, "osm_id": 129863640.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.300293482047437, 38.558427836089649 ], [ -121.300092232552245, 38.558293641819844 ], [ -121.298340330969978, 38.556869053556461 ], [ -121.295884265702057, 38.554878519190808 ] ] } },
{ "type": "Feature", "properties": { "id": 443.0, "osm_id": 129870691.0, "name": "B", "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.400052546685757, 38.673943034675418 ], [ -121.396931880315194, 38.673932724934517 ], [ -121.39645847042398, 38.673934652772232 ] ] } },
{ "type": "Feature", "properties": { "id": 444.0, "osm_id": 131443000.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.494030864162326, 38.517603944321102 ], [ -121.494021727887898, 38.517276463364112 ], [ -121.493998426197052, 38.516437183399368 ] ] } },
{ "type": "Feature", "properties": { "id": 445.0, "osm_id": 131443003.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.496824133394909, 38.513404694650212 ], [ -121.496416437624546, 38.513407041583108 ], [ -121.495624683050778, 38.513381225321325 ], [ -121.49395308010088, 38.51339723475639 ] ] } },
{ "type": "Feature", "properties": { "id": 446.0, "osm_id": 131442986.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.493854508919554, 38.513510138992118 ], [ -121.493957103414374, 38.513507540602134 ], [ -121.495478418840406, 38.513569985780784 ], [ -121.496255756540705, 38.513600495908342 ] ] } },
{ "type": "Feature", "properties": { "id": 447.0, "osm_id": 131442990.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.487633125108061, 38.517769570727829 ], [ -121.484542046855751, 38.517775689517151 ] ] } },
{ "type": "Feature", "properties": { "id": 448.0, "osm_id": 131443024.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.485281749810795, 38.51115926660907 ], [ -121.486204429712146, 38.51042886756651 ], [ -121.49308035634246, 38.513295897547017 ], [ -121.493938663227397, 38.51331743903819 ] ] } },
{ "type": "Feature", "properties": { "id": 449.0, "osm_id": 131443021.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.49934465549822, 38.508907635959552 ], [ -121.498176469652932, 38.508308832796821 ] ] } },
{ "type": "Feature", "properties": { "id": 450.0, "osm_id": 131443011.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.499654953553701, 38.510611090141509 ], [ -121.499170311912181, 38.51036197997918 ] ] } },
{ "type": "Feature", "properties": { "id": 451.0, "osm_id": 131442998.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.493854508919554, 38.513510138992118 ], [ -121.492955549804222, 38.513490525338696 ], [ -121.492692777139709, 38.513515754867221 ], [ -121.492459927869547, 38.513595382947372 ], [ -121.492282818255518, 38.513738042939409 ], [ -121.492100428042434, 38.513884977702006 ], [ -121.491783927378606, 38.514107349593246 ], [ -121.49149961322297, 38.514224947694757 ], [ -121.491179927435908, 38.514300636280417 ], [ -121.490879520026169, 38.514330056760535 ], [ -121.490546926108252, 38.514325865808978 ], [ -121.490142415461094, 38.514287895787589 ], [ -121.489887102690417, 38.51422092438122 ], [ -121.489498769116409, 38.514107349593246 ], [ -121.489102053639229, 38.513975083161142 ] ] } },
{ "type": "Feature", "properties": { "id": 452.0, "osm_id": 131443009.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.489340351146453, 38.518956364398157 ], [ -121.489123259854239, 38.518879418526993 ], [ -121.488976911824821, 38.518800963913293 ], [ -121.488848417249173, 38.518728041355722 ], [ -121.488706260171369, 38.518635756601782 ], [ -121.488605006781015, 38.518565180977028 ], [ -121.488468800854449, 38.518474572603758 ], [ -121.488310047608351, 38.51836175218704 ], [ -121.487995977696428, 38.518109540720538 ], [ -121.487842253592248, 38.517981884335171 ], [ -121.48768065049903, 38.517841655095097 ], [ -121.487651230018912, 38.517807037834999 ], [ -121.487633125108061, 38.517769570727829 ], [ -121.487630275260997, 38.517738976781217 ], [ -121.487634466212555, 38.51770754464431 ], [ -121.487652571123419, 38.517662366186244 ], [ -121.487685931098042, 38.517612577681383 ], [ -121.48781761079691, 38.517458685939111 ], [ -121.488596205782699, 38.516524690468472 ], [ -121.488635768365668, 38.51647146538334 ], [ -121.488649430867852, 38.516411618594674 ], [ -121.488639456403064, 38.516364931393994 ], [ -121.488590673726591, 38.516304833148254 ], [ -121.48719835579044, 38.515152153823834 ], [ -121.487136748802101, 38.515118374754039 ], [ -121.487057875093242, 38.515101443309632 ], [ -121.484451438482395, 38.515115441087929 ], [ -121.483706035833194, 38.515118877668236 ] ] } },
{ "type": "Feature", "properties": { "id": 453.0, "osm_id": 131443020.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.500708307325496, 38.505257065670392 ], [ -121.500497921555848, 38.50515623137521 ], [ -121.494272011516628, 38.506108164118622 ], [ -121.493989373741599, 38.50628577664687 ], [ -121.493876637143927, 38.506530863495684 ], [ -121.493863226098838, 38.506845771597888 ] ] } },
{ "type": "Feature", "properties": { "id": 454.0, "osm_id": 131443002.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.483737300332038, 38.512310856286035 ], [ -121.483885911475312, 38.510566330778566 ], [ -121.483965623374473, 38.51040665552312 ], [ -121.484097554530436, 38.510292074906729 ] ] } },
{ "type": "Feature", "properties": { "id": 455.0, "osm_id": 131442995.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.495433408020361, 38.519698665743206 ], [ -121.494724969564132, 38.519706628551212 ], [ -121.494433530790772, 38.519709059303146 ], [ -121.494243010131669, 38.519706796189283 ], [ -121.494010244680524, 38.519693720420328 ], [ -121.493771611897188, 38.519671089281751 ], [ -121.493569440392633, 38.519643764277426 ], [ -121.492942222578165, 38.519552652989908 ], [ -121.490773572770081, 38.519235481773819 ], [ -121.490233610567628, 38.519156440426897 ], [ -121.48962047435046, 38.519066670243916 ], [ -121.489340351146453, 38.518956364398157 ] ] } },
{ "type": "Feature", "properties": { "id": 456.0, "osm_id": 131443019.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.490253643316223, 38.51785414413083 ], [ -121.489340351146453, 38.518956364398157 ] ] } },
{ "type": "Feature", "properties": { "id": 457.0, "osm_id": 131632063.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.598679009102682, 38.694648179532699 ], [ -121.596011552236746, 38.694616328300654 ] ] } },
{ "type": "Feature", "properties": { "id": 458.0, "osm_id": 131632065.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.598470634989795, 38.707178957139057 ], [ -121.601103306957569, 38.70720653360047 ] ] } },
{ "type": "Feature", "properties": { "id": 459.0, "osm_id": 131632069.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.583959716577738, 38.691847953320483 ], [ -121.582957576234321, 38.69184108015989 ] ] } },
{ "type": "Feature", "properties": { "id": 460.0, "osm_id": 131632071.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.596011552236746, 38.694616328300654 ], [ -121.595962937198351, 38.696992933126481 ] ] } },
{ "type": "Feature", "properties": { "id": 461.0, "osm_id": 131632070.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.598859136201895, 38.683822532488932 ], [ -121.598876905836605, 38.681902238471892 ], [ -121.598863410972527, 38.68181858707824 ], [ -121.598807168402203, 38.681751531852839 ], [ -121.598721337713712, 38.681703335909582 ], [ -121.598619413771132, 38.681690846873884 ], [ -121.598498714365405, 38.681688751398084 ] ] } },
{ "type": "Feature", "properties": { "id": 462.0, "osm_id": 131632061.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.598639614157761, 38.697018581750186 ], [ -121.595962937198351, 38.696992933126481 ], [ -121.595489024392904, 38.696987233432303 ], [ -121.593281566373136, 38.696968038874026 ], [ -121.590291322415979, 38.696934930356505 ], [ -121.589171835428118, 38.69692252513979 ], [ -121.586139765774121, 38.696891344460013 ], [ -121.582873757202563, 38.696857481571179 ] ] } },
{ "type": "Feature", "properties": { "id": 463.0, "osm_id": 131632068.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.583083472419986, 38.684298876046306 ], [ -121.583001916502099, 38.689178484797793 ], [ -121.582957576234321, 38.69184108015989 ], [ -121.582921701688747, 38.693981566773331 ], [ -121.582886078600268, 38.696119371177694 ], [ -121.582873757202563, 38.696857481571179 ], [ -121.582775437478375, 38.702740990865763 ], [ -121.582714836318416, 38.706367337454736 ], [ -121.582697569597897, 38.707401831944452 ] ] } },
{ "type": "Feature", "properties": { "id": 464.0, "osm_id": 131632067.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.582873757202563, 38.696857481571179 ], [ -121.580246449652847, 38.69682697144362 ] ] } },
{ "type": "Feature", "properties": { "id": 465.0, "osm_id": 131632064.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.60129642600667, 38.695470947148216 ], [ -121.600553202652279, 38.694356070207128 ], [ -121.600152212404467, 38.693794734151574 ], [ -121.599345035128863, 38.692668457822158 ], [ -121.599065666296084, 38.692283477009369 ], [ -121.598953013517431, 38.692200328529914 ], [ -121.598840025462636, 38.692146851987658 ], [ -121.5987210024376, 38.692123717934891 ], [ -121.598160504572377, 38.692114330203339 ] ] } },
{ "type": "Feature", "properties": { "id": 466.0, "osm_id": 131632066.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.598859136201895, 38.683822532488932 ], [ -121.598824854217895, 38.685883391022209 ], [ -121.598747070156463, 38.690560660631093 ], [ -121.598731312178501, 38.691507480413577 ], [ -121.5987210024376, 38.692123717934891 ], [ -121.598679009102682, 38.694648179532699 ], [ -121.598639614157761, 38.697018581750186 ], [ -121.598627460398177, 38.697752333553986 ], [ -121.59856895471404, 38.701268374297221 ], [ -121.598470634989795, 38.707178957139057 ] ] } },
{ "type": "Feature", "properties": { "id": 467.0, "osm_id": 131632072.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.580468234810823, 38.68363762770494 ], [ -121.582300267387453, 38.683654475330329 ], [ -121.582477963734718, 38.683676938830814 ], [ -121.582619031165123, 38.683715579404449 ], [ -121.58275900894813, 38.68378799904788 ], [ -121.582855400834632, 38.683859496681976 ], [ -121.582970568184237, 38.683974244936401 ], [ -121.583046340588936, 38.684115060909711 ], [ -121.583083472419986, 38.684298876046306 ] ] } },
{ "type": "Feature", "properties": { "id": 468.0, "osm_id": 131677915.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.276194001681034, 38.203119295840501 ], [ -121.274283514490691, 38.20305676684282 ] ] } },
{ "type": "Feature", "properties": { "id": 469.0, "osm_id": 131677914.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.270394562875268, 38.20367635712541 ], [ -121.269805650358322, 38.20321694501245 ], [ -121.269404911567577, 38.202896840130258 ], [ -121.266970806885979, 38.201005631317244 ], [ -121.265622158665352, 38.19995353483089 ] ] } },
{ "type": "Feature", "properties": { "id": 470.0, "osm_id": 131677922.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.265622158665352, 38.19995353483089 ], [ -121.26528227249166, 38.199688499052556 ] ] } },
{ "type": "Feature", "properties": { "id": 471.0, "osm_id": 131686472.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.425086609256027, 38.302674177317456 ], [ -121.429477469233433, 38.303576656832156 ], [ -121.429972169158759, 38.303678496955726 ] ] } },
{ "type": "Feature", "properties": { "id": 472.0, "osm_id": 131686471.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.434527482076462, 38.30262438881261 ], [ -121.434422037734535, 38.303004675759595 ] ] } },
{ "type": "Feature", "properties": { "id": 473.0, "osm_id": 131686475.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.434422037734535, 38.303004675759595 ], [ -121.429944927973423, 38.302105549006207 ], [ -121.424124869685855, 38.300936860246686 ] ] } },
{ "type": "Feature", "properties": { "id": 474.0, "osm_id": 131677918.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.271254210864754, 38.203235049923336 ], [ -121.271258820911484, 38.202957692747312 ] ] } },
{ "type": "Feature", "properties": { "id": 475.0, "osm_id": 131686478.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.424322263505616, 38.300564536107743 ], [ -121.424235343169684, 38.300550370691361 ], [ -121.424124869685855, 38.300936860246686 ] ] } },
{ "type": "Feature", "properties": { "id": 476.0, "osm_id": 131677920.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.274283514490691, 38.20305676684282 ], [ -121.273956955543056, 38.203046038006775 ], [ -121.271258820911484, 38.202957692747312 ], [ -121.269404911567577, 38.202896840130258 ], [ -121.265120837036548, 38.202756527071138 ] ] } },
{ "type": "Feature", "properties": { "id": 477.0, "osm_id": 131676525.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.103167464117561, 38.487181156200563 ], [ -121.102867727260119, 38.486863230613189 ] ] } },
{ "type": "Feature", "properties": { "id": 478.0, "osm_id": 131691285.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.22434944043188, 37.735094190656163 ], [ -122.224266208133386, 37.735047419636466 ], [ -122.224089349976438, 37.735011042176673 ] ] } },
{ "type": "Feature", "properties": { "id": 479.0, "osm_id": 131677923.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.273956955543056, 38.203046038006775 ], [ -121.273961900865899, 38.203288526465592 ] ] } },
{ "type": "Feature", "properties": { "id": 480.0, "osm_id": 131691283.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.205665172429761, 37.723199599500688 ], [ -122.205077768655357, 37.723386264484382 ], [ -122.204954303221612, 37.723447787653669 ], [ -122.204865874143138, 37.723545353006585 ], [ -122.204028941111247, 37.724686716761738 ], [ -122.203961969704878, 37.724797022607518 ], [ -122.203929783196727, 37.72489249248467 ], [ -122.203916372151625, 37.724992237132412 ], [ -122.203940428213727, 37.725401693102441 ], [ -122.203956521467845, 37.72542926956389 ] ] } },
{ "type": "Feature", "properties": { "id": 481.0, "osm_id": 131676527.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.108154780324867, 38.483757819306462 ], [ -121.108491062280208, 38.484048671346549 ], [ -121.103167464117561, 38.487181156200563 ], [ -121.098127677196445, 38.490207442341351 ], [ -121.097953752705578, 38.490220518110306 ], [ -121.09785895338068, 38.490189672706634 ], [ -121.097662816846423, 38.489935617221469 ] ] } },
{ "type": "Feature", "properties": { "id": 482.0, "osm_id": 131677921.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.273961900865899, 38.203288526465592 ], [ -121.271254210864754, 38.203235049923336 ], [ -121.269805650358322, 38.20321694501245 ], [ -121.266778945122354, 38.203162043546705 ], [ -121.265101726297317, 38.203036482637131 ] ] } },
{ "type": "Feature", "properties": { "id": 483.0, "osm_id": 131686473.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.427813158539337, 38.3104238335346 ], [ -121.427330528554577, 38.310333141342262 ] ] } },
{ "type": "Feature", "properties": { "id": 484.0, "osm_id": 131677917.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.265120837036548, 38.202756527071138 ], [ -121.263737320098741, 38.202703637262118 ] ] } },
{ "type": "Feature", "properties": { "id": 485.0, "osm_id": 131686474.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.427330528554577, 38.310333141342262 ], [ -121.429477469233433, 38.303576656832156 ], [ -121.429800843057876, 38.302558926148826 ], [ -121.429944927973423, 38.302105549006207 ], [ -121.430064873007836, 38.301728195725303 ] ] } },
{ "type": "Feature", "properties": { "id": 486.0, "osm_id": 131677919.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.264692102689239, 38.202373725553215 ], [ -121.26470291534433, 38.202108270679695 ], [ -121.264713644180404, 38.201981787760822 ], [ -121.264778017196775, 38.201897465814895 ], [ -121.26485848346725, 38.201817334820547 ], [ -121.264944314155741, 38.201750950147435 ], [ -121.265073060188485, 38.201675093923697 ], [ -121.265191077385168, 38.201627652351732 ], [ -121.266970806885979, 38.201005631317244 ] ] } },
{ "type": "Feature", "properties": { "id": 487.0, "osm_id": 132573095.0, "name": "Sunset Skyranch Airport", "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.334453006421768, 38.394813924332944 ], [ -121.334394668375651, 38.39477528375933 ], [ -121.327089001569632, 38.389924089659601 ] ] } },
{ "type": "Feature", "properties": { "id": 488.0, "osm_id": 132573097.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.334010777210324, 38.395151798849867 ], [ -121.334251505469467, 38.394917189380045 ], [ -121.334394668375651, 38.39477528375933 ] ] } },
{ "type": "Feature", "properties": { "id": 489.0, "osm_id": 132573098.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.334251505469467, 38.394917189380045 ], [ -121.335419942771836, 38.395723779922463 ] ] } },
{ "type": "Feature", "properties": { "id": 490.0, "osm_id": 133628398.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.788659035481956, 38.530189288117121 ], [ -121.788208927281573, 38.531206180610127 ] ] } },
{ "type": "Feature", "properties": { "id": 491.0, "osm_id": 137852797.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.599404043727176, 37.082960498446575 ], [ -121.599344783671768, 37.082840134316989 ] ] } },
{ "type": "Feature", "properties": { "id": 492.0, "osm_id": 137852790.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.599798663728606, 37.085113641733798 ], [ -121.598314983047871, 37.082419446596724 ], [ -121.596932807214543, 37.07990948569141 ], [ -121.595575944728836, 37.077441266663918 ], [ -121.594721828795457, 37.077746619396507 ] ] } },
{ "type": "Feature", "properties": { "id": 493.0, "osm_id": 137852794.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.599344783671768, 37.082840134316989 ], [ -121.598979835607608, 37.082181652003676 ], [ -121.597594642289124, 37.079676552602201 ], [ -121.596240462012418, 37.077203723527973 ], [ -121.595575944728836, 37.077441266663918 ] ] } },
{ "type": "Feature", "properties": { "id": 494.0, "osm_id": 138542066.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.822111378685548, 37.33667769002372 ], [ -121.822530976758401, 37.336426735842693 ], [ -121.823354834021316, 37.335934299031251 ] ] } },
{ "type": "Feature", "properties": { "id": 495.0, "osm_id": 138542065.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.821787921042059, 37.336870976710884 ], [ -121.822111378685548, 37.33667769002372 ] ] } },
{ "type": "Feature", "properties": { "id": 496.0, "osm_id": 139284064.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.436783303677529, 37.689732755604638 ], [ -121.436577947049798, 37.689942973736258 ] ] } },
{ "type": "Feature", "properties": { "id": 497.0, "osm_id": 139284069.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.436326406135564, 37.685058084385744 ], [ -121.43622624239265, 37.685159756871251 ], [ -121.436227583497143, 37.685354552300986 ] ] } },
{ "type": "Feature", "properties": { "id": 498.0, "osm_id": 139284066.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.435467009603173, 37.689949427801679 ], [ -121.436577947049798, 37.689942973736258 ], [ -121.443168637515114, 37.689885641518515 ], [ -121.444304720671241, 37.689876169967967 ], [ -121.449107383551649, 37.689876337606002 ] ] } },
{ "type": "Feature", "properties": { "id": 499.0, "osm_id": 139284067.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.449107383551649, 37.689876337606002 ], [ -121.449113418521918, 37.69047262619776 ], [ -121.448277826594534, 37.690468686703277 ] ] } },
{ "type": "Feature", "properties": { "id": 500.0, "osm_id": 143174437.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.811986734654198, 38.514121179733472 ], [ -122.811699403013392, 38.51413274675987 ], [ -122.81022075147456, 38.514138949368224 ], [ -122.806173046613054, 38.514200891632647 ] ] } },
{ "type": "Feature", "properties": { "id": 501.0, "osm_id": 143670984.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.305314828781619, 37.681888383881677 ], [ -121.29650176050886, 37.673735222845728 ] ] } },
{ "type": "Feature", "properties": { "id": 502.0, "osm_id": 143670983.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.302010347274475, 37.683732486398846 ], [ -121.293472624520959, 37.675880235686883 ] ] } },
{ "type": "Feature", "properties": { "id": 503.0, "osm_id": 143670985.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.29650176050886, 37.673735222845728 ], [ -121.29701657700177, 37.673392989739185 ], [ -121.305782036064514, 37.681544558213481 ], [ -121.305314828781619, 37.681888383881677 ] ] } },
{ "type": "Feature", "properties": { "id": 504.0, "osm_id": 143670986.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.293472624520959, 37.675880235686883 ], [ -121.292930650661788, 37.676213332518998 ], [ -121.301525705632983, 37.684080670656677 ], [ -121.302010347274475, 37.683732486398846 ] ] } },
{ "type": "Feature", "properties": { "id": 505.0, "osm_id": 152909642.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.114556148047498, 37.458629854970624 ], [ -122.114552460010103, 37.459992752426622 ] ] } },
{ "type": "Feature", "properties": { "id": 506.0, "osm_id": 152909648.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.113886182526841, 37.456911983915212 ], [ -122.114201677362303, 37.45691022371556 ], [ -122.114449111143998, 37.456911983915212 ], [ -122.114501414219816, 37.456931094654458 ], [ -122.114534941832488, 37.456960934229727 ], [ -122.1145550584001, 37.457018350266516 ] ] } },
{ "type": "Feature", "properties": { "id": 507.0, "osm_id": 152909649.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.113979305471105, 37.456489619814285 ], [ -122.111679562697375, 37.456497917898425 ] ] } },
{ "type": "Feature", "properties": { "id": 508.0, "osm_id": 152909654.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.113992800335225, 37.455616644598756 ], [ -122.111284775057939, 37.45562284720711 ] ] } },
{ "type": "Feature", "properties": { "id": 509.0, "osm_id": 152909656.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.113817367101802, 37.455339622698901 ], [ -122.11137228212705, 37.455335767023435 ] ] } },
{ "type": "Feature", "properties": { "id": 510.0, "osm_id": 152909652.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.113560042674379, 37.455059834770985 ], [ -122.111557438368152, 37.455057236380952 ] ] } },
{ "type": "Feature", "properties": { "id": 511.0, "osm_id": 152909662.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.113316967482334, 37.457073335551293 ], [ -122.11225263341737, 37.457073335551293 ] ] } },
{ "type": "Feature", "properties": { "id": 512.0, "osm_id": 152909650.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.113887775088457, 37.456628675587964 ], [ -122.113886182526841, 37.456911983915212 ], [ -122.113874866957559, 37.459306358375763 ] ] } },
{ "type": "Feature", "properties": { "id": 513.0, "osm_id": 152909655.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.113191909487014, 37.458614683725884 ], [ -122.113167015234566, 37.457184479587383 ] ] } },
{ "type": "Feature", "properties": { "id": 514.0, "osm_id": 152909666.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.1145550584001, 37.457018350266516 ], [ -122.114551035086564, 37.458258620479072 ] ] } },
{ "type": "Feature", "properties": { "id": 515.0, "osm_id": 152909659.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.113517043511109, 37.456923886217709 ], [ -122.113545541981921, 37.458972758629471 ] ] } },
{ "type": "Feature", "properties": { "id": 516.0, "osm_id": 152909651.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.114083324889478, 37.455916549094347 ], [ -122.111309082577122, 37.455911184676324 ] ] } },
{ "type": "Feature", "properties": { "id": 517.0, "osm_id": 152909664.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.113715610797271, 37.456783321701494 ], [ -122.111964966500452, 37.456784495167931 ] ] } },
{ "type": "Feature", "properties": { "id": 518.0, "osm_id": 152909658.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.114080558861431, 37.456199857421602 ], [ -122.111436738962453, 37.456205640934805 ] ] } },
{ "type": "Feature", "properties": { "id": 519.0, "osm_id": 152909663.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.114844653154748, 37.460288717427723 ], [ -122.114882958452242, 37.460215375774936 ], [ -122.114880946795495, 37.458636560493161 ] ] } },
{ "type": "Feature", "properties": { "id": 520.0, "osm_id": 152909665.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.112403842950613, 37.457818989657603 ], [ -122.11217585518429, 37.457961565830622 ], [ -122.112124977032039, 37.458012695439947 ], [ -122.112103435540888, 37.458065920525101 ], [ -122.112106117749903, 37.458134065397907 ], [ -122.112138304258082, 37.458189469777885 ], [ -122.112485063592359, 37.458538156949913 ] ] } },
{ "type": "Feature", "properties": { "id": 521.0, "osm_id": 152909653.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.112702573979718, 37.45752512013236 ], [ -122.11225263341737, 37.457073335551293 ], [ -122.111964966500452, 37.456784495167931 ], [ -122.111679562697375, 37.456497917898425 ], [ -122.111546960989187, 37.456364729457007 ], [ -122.111453083673624, 37.456232798301073 ], [ -122.111436738962453, 37.456205640934805 ], [ -122.111359206358088, 37.456077230178145 ], [ -122.111313608804835, 37.455934654005198 ], [ -122.111309082577122, 37.455911184676324 ], [ -122.111284104505671, 37.455781348996112 ], [ -122.111284775057939, 37.45562284720711 ], [ -122.11128670289564, 37.455610944904613 ], [ -122.11131092659582, 37.455459819190409 ], [ -122.11137228212705, 37.455335767023435 ], [ -122.11141821495643, 37.455242644079178 ], [ -122.111522821108053, 37.455089339070156 ], [ -122.111557438368152, 37.455057236380952 ], [ -122.111664978185871, 37.454957324095176 ], [ -122.111799004817627, 37.454861518941875 ], [ -122.111925152460358, 37.454801839791294 ], [ -122.11202447801297, 37.454765797607635 ], [ -122.112112907091458, 37.454757164247361 ], [ -122.112839701915632, 37.454752973295768 ], [ -122.112965849558393, 37.454757164247361 ], [ -122.113067773500973, 37.454772084035021 ], [ -122.11314287535339, 37.454795553363894 ], [ -122.113209930578805, 37.454825392939242 ], [ -122.113301125685354, 37.454865793712507 ], [ -122.113499609152484, 37.454999987982312 ], [ -122.113560042674379, 37.455059834770985 ], [ -122.113711503664703, 37.455200064011059 ], [ -122.113817367101802, 37.455339622698901 ], [ -122.113883165041699, 37.455430063434143 ], [ -122.113992800335225, 37.455616644598756 ], [ -122.114022053177337, 37.45568235871967 ], [ -122.114076200271811, 37.455851589344725 ], [ -122.114083324889478, 37.455916549094347 ], [ -122.114097741762933, 37.456068764455956 ], [ -122.114073601881813, 37.4562582792867 ], [ -122.114006546656412, 37.45644997341229 ], [ -122.113979305471105, 37.456489619814285 ], [ -122.113887775088457, 37.456628675587964 ], [ -122.113767830054059, 37.456743759118496 ], [ -122.113715610797271, 37.456783321701494 ], [ -122.113517043511109, 37.456923886217709 ], [ -122.113316967482334, 37.457073335551293 ], [ -122.113167015234566, 37.457184479587383 ], [ -122.112702573979718, 37.45752512013236 ], [ -122.112403842950613, 37.457818989657603 ] ] } },
{ "type": "Feature", "properties": { "id": 522.0, "osm_id": 152909661.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.117915782477525, 37.463490772078053 ], [ -122.117923829104569, 37.463431176746468 ], [ -122.117897007014406, 37.463373676890683 ], [ -122.115879902015706, 37.461336120048259 ], [ -122.114844653154748, 37.460288717427723 ], [ -122.114552460010103, 37.459992752426622 ], [ -122.114210059265474, 37.459645993092359 ], [ -122.113874866957559, 37.459306358375763 ], [ -122.113545541981921, 37.458972758629471 ], [ -122.113191909487014, 37.458614683725884 ], [ -122.112403842950613, 37.457818989657603 ] ] } },
{ "type": "Feature", "properties": { "id": 523.0, "osm_id": 152909667.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.114201677362303, 37.45691022371556 ], [ -122.114210059265474, 37.459645993092359 ] ] } },
{ "type": "Feature", "properties": { "id": 524.0, "osm_id": 155476153.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.384773702754941, 37.609791276096594 ], [ -122.384628863468095, 37.609727238356378 ], [ -122.384535824342862, 37.609667559205747 ], [ -122.384474133535505, 37.609599581971025 ], [ -122.384427781610967, 37.609518948062508 ], [ -122.38439903168306, 37.609431692450471 ], [ -122.384391571789251, 37.609333959459427 ] ] } },
{ "type": "Feature", "properties": { "id": 525.0, "osm_id": 155476298.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.382261311097707, 37.613470763951717 ], [ -122.382148658319053, 37.613443019852227 ], [ -122.382033323331385, 37.613443019852227 ], [ -122.381935925616503, 37.613456179440199 ], [ -122.381834839864254, 37.613483420625521 ], [ -122.38173216155036, 37.613536980986801 ], [ -122.381629315598389, 37.613624990970116 ] ] } },
{ "type": "Feature", "properties": { "id": 526.0, "osm_id": 155476381.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.382269357724752, 37.61611592495521 ], [ -122.380810236020295, 37.615506141499345 ], [ -122.380739660395577, 37.615459789574786 ], [ -122.380688782243311, 37.615415197849913 ], [ -122.380653829707086, 37.615359877288967 ], [ -122.380632372034967, 37.615300365776434 ], [ -122.380624325407936, 37.615232388541692 ], [ -122.380642178861677, 37.615123256162349 ] ] } },
{ "type": "Feature", "properties": { "id": 527.0, "osm_id": 155476504.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.379077528996277, 37.616887143866208 ], [ -122.378978203443666, 37.616825536877883 ], [ -122.37884954122994, 37.616783040628782 ], [ -122.378701600638948, 37.616753452510586 ] ] } },
{ "type": "Feature", "properties": { "id": 528.0, "osm_id": 155476502.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.37894157452682, 37.616283898294824 ], [ -122.378891618383875, 37.616426474467801 ], [ -122.378889774365163, 37.616581288219422 ], [ -122.378932605890412, 37.616702322901254 ], [ -122.378997062725801, 37.616800055892213 ], [ -122.379077528996277, 37.616887143866208 ], [ -122.379316245598645, 37.617097445816839 ], [ -122.379385144842743, 37.617189143837578 ], [ -122.37942806018701, 37.617280590401165 ], [ -122.37944851203072, 37.61738268198183 ] ] } },
{ "type": "Feature", "properties": { "id": 529.0, "osm_id": 155476297.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.384085213228261, 37.614229242369881 ], [ -122.382261311097707, 37.613470763951717 ], [ -122.382178162618231, 37.613419718161381 ], [ -122.382116471810875, 37.613364481419467 ], [ -122.382078166513381, 37.613311675429465 ], [ -122.382048662214203, 37.613245877489561 ], [ -122.38203064112237, 37.613171194732288 ], [ -122.38203064112237, 37.613096847251164 ], [ -122.382050841509027, 37.612997186422419 ] ] } },
{ "type": "Feature", "properties": { "id": 530.0, "osm_id": 155476380.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.379691671041812, 37.616548850254112 ], [ -122.379503916410712, 37.616836181894925 ], [ -122.379406602514877, 37.616961826623488 ], [ -122.379307360781311, 37.617063834385114 ], [ -122.378409658951426, 37.617841172085413 ], [ -122.378301532400471, 37.617913675547889 ], [ -122.378188963440849, 37.617968828470744 ], [ -122.37806901840645, 37.618002523721493 ], [ -122.377913450283557, 37.618015348033367 ], [ -122.377762659845459, 37.618011157081781 ] ] } },
{ "type": "Feature", "properties": { "id": 531.0, "osm_id": 155486505.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.394646159769792, 37.61974797123839 ], [ -122.396036968963372, 37.619402720646654 ], [ -122.396154902341024, 37.619402720646654 ], [ -122.396289012791826, 37.619421831385857 ], [ -122.396423123242599, 37.619477068127807 ], [ -122.396511636140076, 37.61955359490377 ], [ -122.396583636688362, 37.61965208226605 ], [ -122.396626971127745, 37.619763896854408 ], [ -122.396624372737776, 37.61988074058462 ], [ -122.39658673799255, 37.61997218714825 ], [ -122.39655413238917, 37.62001954490119 ], [ -122.396621271433617, 37.620365885140295 ] ] } },
{ "type": "Feature", "properties": { "id": 532.0, "osm_id": 155475457.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.384463320880442, 37.610532236337122 ], [ -122.386303316265071, 37.611303539067173 ], [ -122.38701225763549, 37.611597660049533 ], [ -122.387378882080284, 37.611749791592153 ], [ -122.387486170440908, 37.611809219285647 ], [ -122.387585160717379, 37.61186789260789 ], [ -122.387649701371828, 37.611934696376139 ], [ -122.387697729677015, 37.612020862340778 ], [ -122.387727233976221, 37.612105771019912 ], [ -122.387714158207231, 37.612204426020263 ], [ -122.38768163642294, 37.612303332477715 ] ] } },
{ "type": "Feature", "properties": { "id": 533.0, "osm_id": 155485804.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.392869615392172, 37.621080945300037 ], [ -122.392906747223236, 37.620974830405885 ], [ -122.392906747223236, 37.620889837907683 ], [ -122.392877242924072, 37.620800654457945 ], [ -122.392812450812542, 37.62071859562586 ], [ -122.392726620124023, 37.620650534572071 ], [ -122.392638526321662, 37.620605272294959 ], [ -122.391929501132196, 37.620308552922609 ] ] } },
{ "type": "Feature", "properties": { "id": 534.0, "osm_id": 155486990.0, "name": "Y", "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.398807607057392, 37.625701637062519 ], [ -122.3985206106927, 37.624985738712454 ], [ -122.398463027017911, 37.624880545827629 ], [ -122.39837082608301, 37.624804773422966 ], [ -122.398259179132737, 37.624750961604569 ], [ -122.398157255190156, 37.62472338514312 ], [ -122.398051307934026, 37.6247127401261 ], [ -122.397977547186116, 37.624724390971508 ], [ -122.397296266096163, 37.624890017378199 ], [ -122.397240861716199, 37.624910050126815 ], [ -122.396671311395522, 37.625190676245055 ], [ -122.396583636688362, 37.625226550790615 ], [ -122.395083443658365, 37.62559535453024 ], [ -122.394850929664329, 37.62564296374029 ], [ -122.394695864455613, 37.625654866042801 ], [ -122.394489250542378, 37.62564212554998 ], [ -122.39428816868525, 37.625608178842135 ], [ -122.394124470116296, 37.625569873544634 ], [ -122.393991365493875, 37.625522264334613 ] ] } },
{ "type": "Feature", "properties": { "id": 535.0, "osm_id": 155487284.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.38026943562754, 37.619669181348534 ], [ -122.380091320185116, 37.619557869674374 ], [ -122.37998931242349, 37.61945158714213 ], [ -122.379925023226136, 37.619328373165473 ], [ -122.379903565554031, 37.619211529435233 ], [ -122.379914210571044, 37.619084040687973 ], [ -122.379940529747017, 37.618963676558394 ], [ -122.379957125915283, 37.618839792029505 ], [ -122.379941116480239, 37.618699562789409 ], [ -122.379889651594752, 37.618566458167031 ], [ -122.379766605256179, 37.618357748777989 ] ] } },
{ "type": "Feature", "properties": { "id": 536.0, "osm_id": 155486061.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.392461500526636, 37.620135718079162 ], [ -122.392434846074593, 37.62023345107017 ], [ -122.392421435029476, 37.620322634519965 ], [ -122.392439623759387, 37.620389270650165 ], [ -122.392466445849536, 37.620465797426142 ], [ -122.392520509124978, 37.620532936470532 ], [ -122.392638526321662, 37.620605272294959 ], [ -122.392815552116687, 37.620654054971403 ], [ -122.392946645082347, 37.620654893161742 ], [ -122.393073044182188, 37.620622287558383 ], [ -122.39317195063964, 37.620576270909979 ], [ -122.393258116604244, 37.620494966449179 ] ] } },
{ "type": "Feature", "properties": { "id": 537.0, "osm_id": 155508178.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.392183137522267, 37.622116445618104 ], [ -122.392225717590364, 37.622005050124926 ], [ -122.392222700105251, 37.621916453408382 ], [ -122.392193531082185, 37.621828862520218 ], [ -122.392131840274828, 37.621737499775627 ], [ -122.392054056213368, 37.621680167557912 ], [ -122.391970823914875, 37.621635575833018 ], [ -122.391866050125202, 37.621608418466742 ], [ -122.391775022656731, 37.621595175059753 ], [ -122.391659771488108, 37.621603640781942 ], [ -122.391538736806268, 37.62164663994524 ], [ -122.391447541699748, 37.621708246933551 ], [ -122.39136430940124, 37.621782594414718 ] ] } },
{ "type": "Feature", "properties": { "id": 538.0, "osm_id": 155508702.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.390449257031776, 37.623225287588951 ], [ -122.39032134918935, 37.623232998939848 ], [ -122.390219425246769, 37.62322444939862 ], [ -122.390125212655093, 37.62320173444099 ], [ -122.390032927901146, 37.623156136887737 ] ] } },
{ "type": "Feature", "properties": { "id": 539.0, "osm_id": 155508177.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.392559065879595, 37.621549326049376 ], [ -122.392475163028806, 37.621612190323162 ], [ -122.392354463623136, 37.621665247770274 ], [ -122.392212055088208, 37.621682765947902 ], [ -122.392069814191373, 37.621663655208664 ], [ -122.391970823914875, 37.621635575833018 ], [ -122.391884741769275, 37.62159148702235 ], [ -122.391809639916829, 37.621525521444369 ], [ -122.391764126182593, 37.621444887535837 ], [ -122.391734538064412, 37.621359895037642 ], [ -122.391739902482442, 37.621266352998212 ], [ -122.3917559119175, 37.621188736574865 ] ] } },
{ "type": "Feature", "properties": { "id": 540.0, "osm_id": 155508703.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.386303064807976, 37.62184411758399 ], [ -122.386134169459027, 37.621967499198696 ], [ -122.386000310465349, 37.62203698517601 ], [ -122.385876928850635, 37.622083672376689 ], [ -122.385715912490653, 37.622124073149998 ], [ -122.385536120667595, 37.622146033736328 ] ] } },
{ "type": "Feature", "properties": { "id": 541.0, "osm_id": 155508697.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.386563071444399, 37.622312079238178 ], [ -122.386437510534876, 37.622274863588096 ], [ -122.386324857756222, 37.622264218571054 ], [ -122.386209271311458, 37.622277629616143 ], [ -122.386093936323803, 37.622309480848202 ], [ -122.385994610771206, 37.622362622114323 ], [ -122.385915234148158, 37.622424480559729 ], [ -122.385941218047961, 37.622334375100614 ], [ -122.385941218047961, 37.622257848324651 ], [ -122.385919844194873, 37.62217713059708 ], [ -122.385890339895695, 37.622113428132927 ], [ -122.385823033213228, 37.622033380957667 ], [ -122.385713062643575, 37.621952830868153 ] ] } },
{ "type": "Feature", "properties": { "id": 542.0, "osm_id": 155508705.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.386563071444399, 37.622312079238178 ], [ -122.386450921579936, 37.62224728712664 ], [ -122.38637581972749, 37.62217713059708 ], [ -122.386327539965237, 37.62210278311592 ], [ -122.386298035666059, 37.622024160864157 ], [ -122.386289905220011, 37.621932881938598 ], [ -122.386303064807976, 37.62184411758399 ], [ -122.386321840271066, 37.621776224168293 ], [ -122.386335335135172, 37.621691231670098 ], [ -122.386324522480109, 37.62162115895957 ], [ -122.386287223010967, 37.621535663547213 ], [ -122.38623634485873, 37.621471961083095 ], [ -122.386143641009639, 37.621391746269687 ] ] } },
{ "type": "Feature", "properties": { "id": 543.0, "osm_id": 155487283.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.378581236509376, 37.61894733184721 ], [ -122.378931516243, 37.61899175593404 ], [ -122.379183979166598, 37.619068366529049 ], [ -122.379421019388317, 37.619155538322062 ], [ -122.379619670493526, 37.619276153908714 ] ] } },
{ "type": "Feature", "properties": { "id": 544.0, "osm_id": 155487286.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.378821042759185, 37.618295052142273 ], [ -122.378832861242657, 37.618381553383024 ], [ -122.378825317529788, 37.618484986068182 ], [ -122.37880117764864, 37.618580539764352 ], [ -122.378734122423239, 37.618697383494592 ], [ -122.378615518493319, 37.618810790644524 ], [ -122.378460537103663, 37.61889704042818 ], [ -122.378271441368071, 37.618952696265239 ] ] } },
{ "type": "Feature", "properties": { "id": 545.0, "osm_id": 155508699.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.388300807610349, 37.62303443165365 ], [ -122.388215815112176, 37.622958994525078 ], [ -122.388154124304805, 37.622878276797557 ], [ -122.388118920311484, 37.622798145803188 ], [ -122.38811657337861, 37.622699742259933 ], [ -122.388151106819649, 37.622536881881295 ], [ -122.388148759886775, 37.622455493601443 ], [ -122.388132331356559, 37.622377458082944 ], [ -122.388100480124507, 37.622304619344369 ], [ -122.388041471526137, 37.622226080911588 ], [ -122.387947258934489, 37.622152487801735 ] ] } },
{ "type": "Feature", "properties": { "id": 546.0, "osm_id": 155508701.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.386872866585719, 37.621698440106854 ], [ -122.386767422243807, 37.621684358509505 ], [ -122.386652003437092, 37.621680167557912 ], [ -122.386517976805351, 37.621707744019361 ], [ -122.386405072569616, 37.621765662970304 ], [ -122.386303064807976, 37.62184411758399 ], [ -122.386206840559538, 37.621907317133946 ], [ -122.386099216922773, 37.621954758705868 ], [ -122.385978852793215, 37.62198166461507 ], [ -122.385852705150455, 37.621977473663492 ], [ -122.385713062643575, 37.621952830868153 ] ] } },
{ "type": "Feature", "properties": { "id": 547.0, "osm_id": 155487337.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.379914210571044, 37.619084040687973 ], [ -122.379868613017777, 37.619181773678989 ], [ -122.379785045443128, 37.6192972763047 ], [ -122.379669542817439, 37.619409761445304 ] ] } },
{ "type": "Feature", "properties": { "id": 548.0, "osm_id": 155498938.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.384459129928857, 37.626545946169152 ], [ -122.384538422732831, 37.626593890655357 ], [ -122.384578655868111, 37.626643762979214 ], [ -122.384610758557258, 37.626693719122109 ], [ -122.384625510706812, 37.626739316675405 ], [ -122.384629282563253, 37.626788350808951 ], [ -122.384621403574272, 37.626836043838033 ], [ -122.384601454644709, 37.626889185104126 ], [ -122.384433481305138, 37.627151622492477 ], [ -122.384213875441986, 37.627332084867831 ], [ -122.383564361765053, 37.628316790852651 ] ] } },
{ "type": "Feature", "properties": { "id": 549.0, "osm_id": 155508700.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.385007557853456, 37.622163384275879 ], [ -122.385139321371341, 37.62214108841345 ], [ -122.385217021613784, 37.622100687640106 ], [ -122.385281478449201, 37.622043355422434 ], [ -122.385308049082255, 37.621969594674511 ], [ -122.385313329681267, 37.621907987686185 ], [ -122.385294638037166, 37.621837831156625 ], [ -122.385251974150023, 37.621777816729924 ], [ -122.38517377099339, 37.621721238883467 ] ] } },
{ "type": "Feature", "properties": { "id": 550.0, "osm_id": 155508698.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.390688560367366, 37.623167955371223 ], [ -122.390817557857218, 37.623105594011612 ], [ -122.390889977500649, 37.623041723909438 ], [ -122.390946220070944, 37.62296536477151 ], [ -122.390980837331043, 37.622883054482351 ], [ -122.390986537025199, 37.622799654545773 ], [ -122.390946220070944, 37.622684822472287 ], [ -122.390884361625524, 37.622592034804157 ], [ -122.390803811536017, 37.622521962093614 ], [ -122.390691410214458, 37.622459684553029 ], [ -122.390578505978738, 37.622417858856224 ], [ -122.390417741075836, 37.622407465296298 ] ] } },
{ "type": "Feature", "properties": { "id": 551.0, "osm_id": 155508704.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.391675613285116, 37.622797978165146 ], [ -122.391528007970223, 37.622870397808576 ], [ -122.391377804265346, 37.622891520204547 ], [ -122.391252075717745, 37.622878276797557 ], [ -122.391126011894016, 37.622837876024235 ], [ -122.391021154285312, 37.622776855769146 ], [ -122.390946220070944, 37.622684822472287 ], [ -122.390908752963739, 37.622589268776125 ], [ -122.390900622517663, 37.622504360096968 ], [ -122.390921828732701, 37.622417858856224 ], [ -122.390964827895999, 37.622337141128654 ], [ -122.391045545623541, 37.622255752848844 ], [ -122.391096339956817, 37.622190374004091 ] ] } },
{ "type": "Feature", "properties": { "id": 552.0, "osm_id": 155487285.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.379551357982692, 37.617976372183598 ], [ -122.379568205608066, 37.618121630565589 ], [ -122.379549513963994, 37.618266050757292 ], [ -122.379509280828771, 37.618408459292226 ], [ -122.379430910034074, 37.618526057393751 ], [ -122.379320939464435, 37.618655641616797 ], [ -122.379178866205663, 37.618763935805802 ], [ -122.379029165414991, 37.618848257751708 ], [ -122.378856917304745, 37.618904248864922 ], [ -122.378581236509376, 37.61894733184721 ] ] } },
{ "type": "Feature", "properties": { "id": 553.0, "osm_id": 155486938.0, "name": "B1", "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.389139668479942, 37.622647355365096 ], [ -122.389536970690372, 37.622809796648617 ], [ -122.389719025627286, 37.62290954129638 ], [ -122.389927064464075, 37.623072988408246 ], [ -122.390032927901146, 37.623156136887737 ], [ -122.390377005026423, 37.623452772441077 ], [ -122.390428553730928, 37.623513457420039 ], [ -122.390500973374373, 37.623706492650122 ] ] } },
{ "type": "Feature", "properties": { "id": 554.0, "osm_id": 155508179.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.392638526321662, 37.620605272294959 ], [ -122.392532746703608, 37.620567972825839 ], [ -122.392442976520641, 37.620566883178427 ], [ -122.392351781414092, 37.620581719147047 ], [ -122.392260502488526, 37.620603093000128 ], [ -122.392171905772003, 37.620640141012153 ], [ -122.392099318490509, 37.620693869011518 ], [ -122.392037376226057, 37.620763271169757 ], [ -122.392086158902544, 37.620674171539051 ], [ -122.392102252156619, 37.620622119920313 ], [ -122.392107616574677, 37.620569062473265 ], [ -122.392099569947632, 37.620516927035503 ], [ -122.392079453379992, 37.620461774112606 ], [ -122.392047266871842, 37.620408632846491 ], [ -122.39200703373659, 37.620365046949999 ], [ -122.391929501132196, 37.620308552922609 ] ] } },
{ "type": "Feature", "properties": { "id": 555.0, "osm_id": 155499756.0, "name": "Z", "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.395154103102101, 37.636285550018741 ], [ -122.395363650681446, 37.635785150399279 ], [ -122.395398267941545, 37.635663277527144 ], [ -122.39541737868079, 37.635532352199569 ], [ -122.395411930443728, 37.635424058010571 ], [ -122.395092747570871, 37.634030650426993 ], [ -122.393735382170973, 37.63153108308164 ], [ -122.393619963364259, 37.631293120850543 ], [ -122.393641421036392, 37.631118944902575 ], [ -122.393740914227052, 37.630946864430456 ], [ -122.394430074305973, 37.630626172814999 ], [ -122.39464356137978, 37.63056414673153 ] ] } },
{ "type": "Feature", "properties": { "id": 556.0, "osm_id": 155487336.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.379219434616999, 37.618893184752729 ], [ -122.37936175933288, 37.619062834472956 ], [ -122.379423450140237, 37.619188143925406 ], [ -122.379441638870148, 37.619326948241969 ], [ -122.379434178976297, 37.61945158714213 ], [ -122.379375170377955, 37.619574884937812 ], [ -122.379275761006326, 37.619696673990916 ], [ -122.379415319694189, 37.619606652350861 ], [ -122.379541467336949, 37.619564156101774 ], [ -122.379694353250798, 37.619532388688732 ], [ -122.379866014627794, 37.619530293212954 ], [ -122.380051003230818, 37.619570526348149 ], [ -122.38026943562754, 37.619669181348534 ] ] } },
{ "type": "Feature", "properties": { "id": 557.0, "osm_id": 155570035.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.373044067453932, 37.616186165303795 ], [ -122.372878860142364, 37.616183818370921 ], [ -122.372739217635512, 37.616212819755901 ], [ -122.372578871827784, 37.616281551361915 ], [ -122.372492538225117, 37.616340392322194 ], [ -122.37239505669119, 37.616438460589301 ] ] } },
{ "type": "Feature", "properties": { "id": 558.0, "osm_id": 155570034.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.372918758001475, 37.616272918001677 ], [ -122.372782300617828, 37.616256154195305 ], [ -122.37266964783916, 37.616264619917501 ], [ -122.372578871827784, 37.616281551361915 ] ] } },
{ "type": "Feature", "properties": { "id": 559.0, "osm_id": 155570036.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.375482614544197, 37.616429240495826 ], [ -122.375222943183871, 37.616438125313195 ], [ -122.374984478038598, 37.616474921868161 ], [ -122.374737547171094, 37.616542228550607 ], [ -122.37450168041579, 37.616638536618062 ], [ -122.374303113129614, 37.61675328487253 ], [ -122.374136816170648, 37.616887143866208 ], [ -122.373970519211696, 37.617054949567738 ], [ -122.373797265273055, 37.617273130507336 ] ] } },
{ "type": "Feature", "properties": { "id": 560.0, "osm_id": 155570037.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.372226077523209, 37.615980724857039 ], [ -122.372339736130243, 37.616071249411284 ], [ -122.372398660909582, 37.616155571357233 ], [ -122.372430931236778, 37.61624332988346 ], [ -122.372433445807729, 37.616329747305166 ], [ -122.37239505669119, 37.616438460589301 ] ] } },
{ "type": "Feature", "properties": { "id": 561.0, "osm_id": 155570038.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.37318547016045, 37.616202929110131 ], [ -122.373071979191494, 37.616156241909486 ], [ -122.373002241757064, 37.616101088986603 ], [ -122.372956644203825, 37.616041577474057 ] ] } },
{ "type": "Feature", "properties": { "id": 562.0, "osm_id": 155569880.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.381885801835537, 37.605155496908452 ], [ -122.381754373593779, 37.6051670639348 ], [ -122.381647001414109, 37.605154239622969 ], [ -122.38153166642644, 37.605130854113121 ], [ -122.381394370852448, 37.605070588229289 ] ] } },
{ "type": "Feature", "properties": { "id": 563.0, "osm_id": 155569879.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.380498680679366, 37.605739380283516 ], [ -122.380579482225926, 37.60572588541941 ], [ -122.380676041750476, 37.60572169446781 ], [ -122.380769919066054, 37.605736446617399 ], [ -122.380925571007964, 37.605794617025424 ], [ -122.381011317877451, 37.605851278690878 ], [ -122.381070326475793, 37.605921351401378 ], [ -122.38111843859997, 37.606020341677876 ], [ -122.38114542832821, 37.606129557876201 ], [ -122.381129251255075, 37.606241372464567 ], [ -122.381083737520854, 37.606337848170099 ], [ -122.380984160511161, 37.606431474028518 ] ] } },
{ "type": "Feature", "properties": { "id": 564.0, "osm_id": 155569878.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.381416834352962, 37.605710378898507 ], [ -122.381330333112246, 37.605767543478166 ], [ -122.381250034479834, 37.605806686965977 ], [ -122.3811615215823, 37.605825797705201 ], [ -122.38105423322169, 37.605821439115545 ], [ -122.380925571007964, 37.605794617025424 ], [ -122.380799423365204, 37.605734351141592 ], [ -122.380748461393935, 37.605685484646095 ], [ -122.380708228258683, 37.605621782181977 ], [ -122.380678723959505, 37.605516756935209 ] ] } },
{ "type": "Feature", "properties": { "id": 565.0, "osm_id": 155569924.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.379104434905443, 37.607574346526256 ], [ -122.378948782963505, 37.607481055943929 ], [ -122.378849457410936, 37.607372677935871 ], [ -122.378798579258671, 37.607260025157231 ], [ -122.378771673349476, 37.607138990475406 ], [ -122.378771673349476, 37.607007143138475 ], [ -122.37879581323061, 37.606894574178874 ], [ -122.378902933953185, 37.606726936115393 ] ] } },
{ "type": "Feature", "properties": { "id": 566.0, "osm_id": 155569925.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.377477758956587, 37.612140723556173 ], [ -122.377312551645048, 37.612232086300743 ], [ -122.377162347940157, 37.612285227566872 ], [ -122.376961182264012, 37.612325544521106 ], [ -122.376776109841927, 37.612327723815945 ], [ -122.376614171472625, 37.612306433781882 ] ] } },
{ "type": "Feature", "properties": { "id": 567.0, "osm_id": 155569923.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.378538321165124, 37.613064074009742 ], [ -122.3783049689808, 37.61298628994831 ], [ -122.378076981214448, 37.612939518928563 ], [ -122.37785435786617, 37.612914037942936 ], [ -122.377639781144936, 37.612914037942936 ], [ -122.377400980723522, 37.612938764557278 ], [ -122.377178441194232, 37.612992660194692 ], [ -122.376942406800865, 37.613067091494869 ], [ -122.376738475096673, 37.613163986295561 ], [ -122.376553318855571, 37.613285188615443 ], [ -122.376376460698623, 37.613443019852227 ], [ -122.376193232295222, 37.613656171649922 ] ] } },
{ "type": "Feature", "properties": { "id": 568.0, "osm_id": 155570033.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.372946502100973, 37.615585350484324 ], [ -122.372905514594464, 37.615719963849287 ], [ -122.372897551786465, 37.615851727367193 ], [ -122.372913645040541, 37.61594518558757 ], [ -122.372956644203825, 37.616041577474057 ], [ -122.373028980028209, 37.616195888311481 ], [ -122.373117409106683, 37.616308541090127 ], [ -122.373259650003547, 37.616421193868788 ] ] } },
{ "type": "Feature", "properties": { "id": 569.0, "osm_id": 155487282.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.389373858854626, 37.623588643091523 ], [ -122.389433454186204, 37.623521923142249 ], [ -122.389508556038621, 37.623466770219359 ], [ -122.389591620699065, 37.623430644216647 ], [ -122.38996612413284, 37.623340957852733 ], [ -122.390449257031776, 37.623225287588951 ], [ -122.390688560367366, 37.623167955371223 ], [ -122.390904729650231, 37.623116155209601 ], [ -122.391133807063966, 37.623061337562852 ], [ -122.391423569456677, 37.622959329801219 ], [ -122.391675613285116, 37.622797978165146 ], [ -122.391858003498157, 37.622606786953767 ], [ -122.392183137522267, 37.622116445618104 ], [ -122.392559065879595, 37.621549326049376 ], [ -122.392869615392172, 37.621080945300037 ], [ -122.393258116604244, 37.620494966449179 ], [ -122.393451235653373, 37.62018902698334 ], [ -122.393574617268087, 37.620074362547946 ], [ -122.393724820972977, 37.619976629556952 ], [ -122.394646159769792, 37.61974797123839 ], [ -122.394780521677674, 37.619699775295103 ], [ -122.394962157519458, 37.619604221598941 ], [ -122.395102219121455, 37.6194791636036 ], [ -122.395221158327473, 37.619331055374516 ], [ -122.395285279886778, 37.619207422302679 ], [ -122.395325010107825, 37.619041544438886 ], [ -122.395339678438376, 37.618900979922707 ], [ -122.39527698180261, 37.61869939515136 ], [ -122.394969449775203, 37.617983748258389 ], [ -122.394878254668654, 37.617873358593592 ], [ -122.394749424816879, 37.617784091324822 ], [ -122.392151956842469, 37.616681284324258 ] ] } },
{ "type": "Feature", "properties": { "id": 570.0, "osm_id": 155569438.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.384463320880442, 37.610532236337122 ], [ -122.384323846011597, 37.610487644612263 ], [ -122.384192417769853, 37.610464259102393 ], [ -122.384042214064962, 37.610468533873025 ], [ -122.383908103614203, 37.610500468924123 ], [ -122.383781955971443, 37.610552688180896 ], [ -122.383666704802806, 37.610615133359538 ], [ -122.383527900486243, 37.610744298487425 ], [ -122.383433268799436, 37.610862818598299 ], [ -122.383350036500914, 37.610918139159274 ], [ -122.383229337095202, 37.610958539932547 ], [ -122.383111319898532, 37.610977650671778 ], [ -122.383006881385, 37.610972118615692 ], [ -122.38292515782905, 37.610950828581636 ], [ -122.38285131326208, 37.610897771134546 ], [ -122.382797669081796, 37.610836164146214 ], [ -122.382768164782618, 37.610766091435664 ], [ -122.382752071528515, 37.610693755611301 ], [ -122.382744024901456, 37.610617228835316 ], [ -122.38277126608682, 37.610506839170533 ], [ -122.382674119829005, 37.61057816916653 ], [ -122.382577644123472, 37.610633489727476 ], [ -122.382473037971849, 37.610658970713125 ], [ -122.382368515639271, 37.610666179149881 ], [ -122.382290731577839, 37.610666179149881 ], [ -122.382163829563822, 37.610644134744526 ] ] } },
{ "type": "Feature", "properties": { "id": 571.0, "osm_id": 155569638.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.383167981563972, 37.609279560907851 ], [ -122.383261775060504, 37.609346699952297 ], [ -122.38331533542177, 37.609418868138576 ], [ -122.383344839720948, 37.60950813540741 ], [ -122.383344755901902, 37.609588098763687 ], [ -122.383268480583041, 37.609769399329316 ] ] } },
{ "type": "Feature", "properties": { "id": 572.0, "osm_id": 155702567.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.385216351061544, 37.62100374797182 ], [ -122.385115181490249, 37.620927975567156 ], [ -122.385061537309937, 37.620864273102995 ], [ -122.385021304174657, 37.62080266611472 ], [ -122.384991883694525, 37.620721948387128 ], [ -122.384993643894205, 37.620624383034176 ], [ -122.38502515985013, 37.620512149350674 ] ] } },
{ "type": "Feature", "properties": { "id": 573.0, "osm_id": 155702568.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.385807107597202, 37.619317644329428 ], [ -122.38502515985013, 37.620512149350674 ], [ -122.384954248949299, 37.620575348900594 ], [ -122.384877638354283, 37.620626897605121 ], [ -122.38478526978129, 37.620662436874568 ], [ -122.384679154887124, 37.620679955052218 ], [ -122.38455996422401, 37.620683643089627 ], [ -122.384414370565878, 37.620668220387756 ] ] } },
{ "type": "Feature", "properties": { "id": 574.0, "osm_id": 155702570.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.385772238880008, 37.621236345784872 ], [ -122.385671656041922, 37.621166440712429 ], [ -122.385620610251578, 37.621117574216903 ], [ -122.385576521440896, 37.621059739085034 ], [ -122.385549783169779, 37.621000227572473 ], [ -122.385533606096644, 37.620938620584184 ], [ -122.385538970514659, 37.620866368578817 ], [ -122.385571157022881, 37.62073896365056 ], [ -122.386212204977568, 37.619761633740538 ] ] } },
{ "type": "Feature", "properties": { "id": 575.0, "osm_id": 155569558.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.38292515782905, 37.610950828581636 ], [ -122.382821808962916, 37.610940267383619 ], [ -122.382725249438366, 37.610944458335211 ], [ -122.382626007704772, 37.610963652893489 ], [ -122.382558952479414, 37.610989133879144 ], [ -122.382473037971849, 37.611030791937935 ], [ -122.382377651913771, 37.611098098620381 ], [ -122.382387374921436, 37.611029450833406 ], [ -122.382387374921436, 37.610957282647071 ], [ -122.382373880057301, 37.61089131706909 ], [ -122.382344375758137, 37.610819148882783 ], [ -122.382298778204884, 37.610749076172247 ], [ -122.382242451815557, 37.610698030381918 ], [ -122.382163829563822, 37.610644134744526 ] ] } },
{ "type": "Feature", "properties": { "id": 576.0, "osm_id": 155702566.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.385571157022881, 37.62073896365056 ], [ -122.385501419588451, 37.620804761590499 ], [ -122.385418271108975, 37.620857819037575 ], [ -122.385313664957408, 37.620896124335054 ], [ -122.385206376596742, 37.620913139598493 ], [ -122.385094981103578, 37.620911547036876 ], [ -122.384955422415715, 37.620894531773452 ] ] } },
{ "type": "Feature", "properties": { "id": 577.0, "osm_id": 155642124.0, "name": "Plot 40 Line", "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.376581146774114, 37.623888631406068 ], [ -122.376545356047544, 37.624010671916295 ], [ -122.376564634424881, 37.624077475684579 ], [ -122.376582823154735, 37.624148721861545 ], [ -122.376628420708016, 37.624195492881285 ], [ -122.376719615814508, 37.624254920574778 ], [ -122.378760860694385, 37.625106857213297 ], [ -122.378846607563858, 37.62512177700097 ], [ -122.37893512046135, 37.625119597706117 ], [ -122.37902631556787, 37.625091937425658 ], [ -122.379082725776243, 37.625066456440017 ], [ -122.379138716889457, 37.62503142008476 ] ] } },
{ "type": "Feature", "properties": { "id": 578.0, "osm_id": 155793727.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.390655116573726, 37.63205947825768 ], [ -122.389596063107746, 37.632061825190576 ], [ -122.389545352593544, 37.63206878217018 ], [ -122.389499168307083, 37.632091580946835 ], [ -122.389467065617893, 37.63212703639725 ], [ -122.389457510248278, 37.632174226512142 ], [ -122.389447116688387, 37.633483982702018 ] ] } },
{ "type": "Feature", "properties": { "id": 579.0, "osm_id": 156038669.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.388483114004387, 37.628224673736753 ], [ -122.388588558346299, 37.628244371209213 ], [ -122.388682435661863, 37.628240180257627 ], [ -122.38876281811325, 37.628221069518403 ], [ -122.388840602174739, 37.628193493056962 ], [ -122.388902209163049, 37.628152673188524 ], [ -122.388971946597465, 37.628088886905367 ] ] } },
{ "type": "Feature", "properties": { "id": 580.0, "osm_id": 156038672.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.391015454591141, 37.628041529152441 ], [ -122.390919314161764, 37.627910855281954 ], [ -122.390830717445212, 37.627810691539047 ], [ -122.390734325558725, 37.627726034316964 ], [ -122.390616308362041, 37.627630480620788 ], [ -122.390482114092237, 37.627545571941646 ], [ -122.390313302562305, 37.627446749303253 ] ] } },
{ "type": "Feature", "properties": { "id": 581.0, "osm_id": 156038677.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.393267252878729, 37.629460836816776 ], [ -122.393282256485421, 37.629563179854522 ], [ -122.393268845440318, 37.629656554255895 ], [ -122.39318921736016, 37.62979217344926 ], [ -122.393033733056299, 37.629922931138736 ], [ -122.392809768603513, 37.629978670794884 ], [ -122.392597454996107, 37.629953357447256 ] ] } },
{ "type": "Feature", "properties": { "id": 582.0, "osm_id": 156041368.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.375664250385981, 37.622856651487361 ], [ -122.375499378350526, 37.622831673415874 ], [ -122.375354455244661, 37.622828991206895 ], [ -122.375217662584859, 37.62285447219255 ], [ -122.375104925987188, 37.622892777490037 ], [ -122.374984226581475, 37.622956479954141 ], [ -122.374824216049916, 37.62308111885433 ] ] } },
{ "type": "Feature", "properties": { "id": 583.0, "osm_id": 156041160.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.382079339979811, 37.622278048711294 ], [ -122.382255862860646, 37.62223672592863 ], [ -122.382467757372837, 37.622164557742316 ], [ -122.382634054331831, 37.622088030966339 ], [ -122.382765482573589, 37.622005217763004 ], [ -122.382888864188317, 37.621896839754953 ], [ -122.383014341278809, 37.621735488118865 ] ] } },
{ "type": "Feature", "properties": { "id": 584.0, "osm_id": 156041372.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.375449673664704, 37.62239682027927 ], [ -122.375402818825989, 37.622470497208155 ], [ -122.37538136115387, 37.622542749213501 ], [ -122.375383959543839, 37.622614498304692 ], [ -122.375405417215973, 37.622689264880975 ], [ -122.375440369752184, 37.622742489966143 ], [ -122.375494516846658, 37.622785572948459 ] ] } },
{ "type": "Feature", "properties": { "id": 585.0, "osm_id": 156038670.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.392913536564819, 37.628796151895166 ], [ -122.392826364771778, 37.628685846049379 ], [ -122.392729805247228, 37.628590627629315 ], [ -122.392630647332709, 37.628503539655341 ], [ -122.392523358972056, 37.628420726451992 ], [ -122.392378100590065, 37.628310420606233 ] ] } },
{ "type": "Feature", "properties": { "id": 586.0, "osm_id": 156041583.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.368688579107854, 37.623386555405972 ], [ -122.368565700407345, 37.623313381391263 ], [ -122.36845857968477, 37.623224617036684 ], [ -122.36838607622235, 37.623137026148505 ], [ -122.368318937177918, 37.623018086942494 ], [ -122.368284236098788, 37.622914486619244 ], [ -122.368276105652683, 37.62280183384059 ], [ -122.368292282725818, 37.622697730603171 ], [ -122.368335533346226, 37.622557249905988 ] ] } },
{ "type": "Feature", "properties": { "id": 587.0, "osm_id": 156041033.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.383426311819775, 37.620668052749714 ], [ -122.38342262378238, 37.620758158208844 ], [ -122.383430670409439, 37.620824039967779 ], [ -122.383462856917632, 37.620902662219542 ], [ -122.383505772261884, 37.620968460159467 ], [ -122.383579030095603, 37.621036521213256 ] ] } },
{ "type": "Feature", "properties": { "id": 588.0, "osm_id": 156038673.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.389120725378774, 37.627864670995478 ], [ -122.389151822239555, 37.627728129792771 ], [ -122.389162551075643, 37.627585888895901 ], [ -122.389135728985451, 37.627430739868188 ], [ -122.389068506121987, 37.627283721286503 ], [ -122.388974712625497, 37.627124968040405 ], [ -122.38885141482983, 37.626986918095128 ], [ -122.388698528915924, 37.626846772674078 ], [ -122.388542876973986, 37.626739987227651 ], [ -122.388359648570628, 37.626624819878039 ] ] } },
{ "type": "Feature", "properties": { "id": 589.0, "osm_id": 156039245.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.392214737297223, 37.624751548337791 ], [ -122.392083476693529, 37.624786081778886 ], [ -122.391981468931917, 37.624825979637968 ], [ -122.391901002661442, 37.624877444523435 ], [ -122.391847358481144, 37.624934273826987 ], [ -122.391804359317845, 37.625004346537494 ], [ -122.391772340447716, 37.625077185276069 ], [ -122.391758929402656, 37.625159998479454 ], [ -122.39176161161167, 37.625225880238368 ], [ -122.391784913302502, 37.625310788917517 ] ] } },
{ "type": "Feature", "properties": { "id": 590.0, "osm_id": 156041371.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.375449673664704, 37.62239682027927 ], [ -122.375333081391574, 37.622453481944682 ], [ -122.375193606522757, 37.622491787242225 ], [ -122.375067542699043, 37.622508718686646 ], [ -122.374935946819207, 37.622503941001817 ], [ -122.374766045641877, 37.622479884939686 ] ] } },
{ "type": "Feature", "properties": { "id": 591.0, "osm_id": 156041455.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.372764866259232, 37.625096631291449 ], [ -122.372916411068573, 37.625155723708822 ], [ -122.373031662237224, 37.625221018734528 ], [ -122.373109362479639, 37.625308190527548 ], [ -122.373154960032892, 37.625405839699518 ], [ -122.373168454897026, 37.625501477214748 ], [ -122.373144315015878, 37.625629636514262 ] ] } },
{ "type": "Feature", "properties": { "id": 592.0, "osm_id": 156041035.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.38400642333842, 37.620497481020138 ], [ -122.383886645942098, 37.620477783547678 ], [ -122.383747171073281, 37.620479879023478 ], [ -122.383629070057552, 37.620509048046515 ], [ -122.383529912143004, 37.620556321980438 ], [ -122.383403764500244, 37.620651456581406 ], [ -122.383339307664869, 37.620698143782136 ], [ -122.383250878586367, 37.620736365260576 ], [ -122.383138309626773, 37.620764528455211 ], [ -122.383036301865133, 37.620770982520668 ], [ -122.382925744562257, 37.620762852074591 ], [ -122.383028339057134, 37.620826135443593 ], [ -122.383108805327581, 37.620894196497353 ], [ -122.383157001270831, 37.620955719666654 ], [ -122.383202515005038, 37.621033839004198 ], [ -122.383221374287203, 37.621112461255969 ], [ -122.383218524440124, 37.621206590028606 ] ] } },
{ "type": "Feature", "properties": { "id": 593.0, "osm_id": 156041367.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.379047018868746, 37.619857774169937 ], [ -122.3788789617101, 37.619944443048738 ], [ -122.378701935915075, 37.620001859085498 ], [ -122.378535638956109, 37.620031531022711 ], [ -122.378371856568094, 37.620033123584314 ], [ -122.378142108602091, 37.620012420283487 ] ] } },
{ "type": "Feature", "properties": { "id": 594.0, "osm_id": 156041038.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.383918748631231, 37.621182450147487 ], [ -122.383800815253565, 37.621159651370846 ], [ -122.383674751429851, 37.621159651370846 ], [ -122.383564780860212, 37.621172475682705 ], [ -122.383446763663528, 37.62120432691475 ], [ -122.383352802528947, 37.621242548393241 ], [ -122.383274934648497, 37.621288732679709 ], [ -122.383197318225086, 37.621353021877049 ], [ -122.38313084973295, 37.621433571966584 ], [ -122.383068572192329, 37.621520827578614 ], [ -122.382987938283804, 37.621594672145534 ], [ -122.382891546397332, 37.621658961342916 ], [ -122.382789622454723, 37.621703553067768 ], [ -122.382674119829005, 37.621734817566583 ], [ -122.382542775406264, 37.621754095943892 ], [ -122.382408664955506, 37.62174764187845 ], [ -122.382217976658296, 37.62172257998796 ] ] } },
{ "type": "Feature", "properties": { "id": 595.0, "osm_id": 156038675.0, "name": "S4", "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.392641208530705, 37.62828435288737 ], [ -122.392614554078605, 37.628214699271993 ], [ -122.392601143033502, 37.62813398154443 ], [ -122.392595778615501, 37.628040439505014 ], [ -122.392609105841501, 37.627951256055262 ], [ -122.392633329541724, 37.627851343769422 ], [ -122.392753861309359, 37.627664762604759 ], [ -122.392815719754765, 37.627587984371701 ], [ -122.392925606505372, 37.627524281907583 ], [ -122.393032978685014, 37.627483881134289 ], [ -122.393145463825618, 37.627460160348321 ], [ -122.393279741914455, 37.627462674919272 ], [ -122.393420222611624, 37.627500225845459 ], [ -122.393537233979927, 37.627568873632491 ] ] } },
{ "type": "Feature", "properties": { "id": 596.0, "osm_id": 157111109.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.389536970690372, 37.622809796648617 ], [ -122.389629171625273, 37.622880372273343 ], [ -122.389672170788558, 37.622948349508064 ], [ -122.389693544641645, 37.623029067235635 ], [ -122.389662112504766, 37.623150269555524 ] ] } },
{ "type": "Feature", "properties": { "id": 597.0, "osm_id": 157105785.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.385771400689677, 37.622634698691314 ], [ -122.385648857265267, 37.622745591270331 ], [ -122.385520111232537, 37.622827398645271 ], [ -122.385369907527647, 37.622869894894386 ], [ -122.385216937794752, 37.622887832167144 ], [ -122.385045360236788, 37.622873080017584 ], [ -122.384866238965955, 37.622833768891688 ] ] } },
{ "type": "Feature", "properties": { "id": 598.0, "osm_id": 157111110.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.389927064464075, 37.623072988408246 ], [ -122.389878617063729, 37.623003586249993 ], [ -122.389865206018641, 37.622941979261654 ], [ -122.389865206018641, 37.622882467749143 ], [ -122.389885574043376, 37.622815077247601 ] ] } },
{ "type": "Feature", "properties": { "id": 599.0, "osm_id": 157111112.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.389862104714496, 37.623683945330569 ], [ -122.389771328703119, 37.623632396626057 ], [ -122.389698909059689, 37.623564419391336 ], [ -122.389656077534497, 37.623494346680801 ], [ -122.389615760580213, 37.623411449658384 ], [ -122.38960771395314, 37.623341376947913 ], [ -122.389621124998229, 37.623256384449718 ], [ -122.389662112504766, 37.623150269555524 ] ] } },
{ "type": "Feature", "properties": { "id": 600.0, "osm_id": 157111113.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.390377005026423, 37.623452772441077 ], [ -122.39027566781705, 37.623388064148557 ], [ -122.390179024473468, 37.623354033621688 ], [ -122.390074418321873, 37.623339281472091 ], [ -122.38996612413284, 37.623340957852733 ] ] } },
{ "type": "Feature", "properties": { "id": 601.0, "osm_id": 157106123.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.385277958049855, 37.62718934105677 ], [ -122.3853378048385, 37.627122872564598 ], [ -122.385407542272915, 37.62708037631554 ], [ -122.385509466215495, 37.627052799854063 ], [ -122.385614072367105, 37.627050620559245 ], [ -122.385711972996177, 37.627068557832061 ] ] } },
{ "type": "Feature", "properties": { "id": 602.0, "osm_id": 157111951.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.380867400599953, 37.614054731145821 ], [ -122.380756424201934, 37.614033776387863 ], [ -122.380657601563485, 37.614041236281714 ], [ -122.380563305152805, 37.614059257373512 ], [ -122.380474876074359, 37.614097562671049 ], [ -122.380388961566823, 37.614150620118103 ], [ -122.380300867764461, 37.614228152722482 ] ] } },
{ "type": "Feature", "properties": { "id": 603.0, "osm_id": 157110807.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.358413706921667, 37.615002640575689 ], [ -122.358328211509274, 37.615112024412127 ], [ -122.358231316708583, 37.615191736311282 ], [ -122.358113383330917, 37.615251247823842 ], [ -122.357987319507203, 37.615285278350711 ], [ -122.357837367259421, 37.615299024671913 ], [ -122.357686912097492, 37.615287373826519 ], [ -122.357534948192921, 37.615248817071929 ] ] } },
{ "type": "Feature", "properties": { "id": 604.0, "osm_id": 157105772.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.382541266663722, 37.622896297889362 ], [ -122.382381842865357, 37.623047255965517 ], [ -122.382180844827246, 37.623197040575192 ], [ -122.381977080761104, 37.623307430240025 ], [ -122.381735430492583, 37.623391333090808 ], [ -122.381461845173035, 37.623450844603333 ], [ -122.381188427491495, 37.623475319760615 ], [ -122.380898665098769, 37.623444474356894 ], [ -122.380542769490035, 37.623345735537548 ], [ -122.380829011483414, 37.623528461026716 ], [ -122.381019448323514, 37.623700457679838 ], [ -122.381137465520183, 37.623842866214765 ], [ -122.381258081106864, 37.624037242549356 ], [ -122.38132773472222, 37.624228433760734 ], [ -122.381357406659475, 37.624418535324729 ], [ -122.381346677823416, 37.624611822011893 ], [ -122.381296721680499, 37.624776023495059 ], [ -122.381241904033729, 37.624891274663689 ], [ -122.381231342835733, 37.624987834188261 ], [ -122.38125816492591, 37.625091937425658 ], [ -122.381319771914221, 37.625186569112508 ], [ -122.381442482976681, 37.625274746733886 ] ] } },
{ "type": "Feature", "properties": { "id": 605.0, "osm_id": 157112564.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.384773702754941, 37.609791276096594 ], [ -122.38463498225741, 37.609773674099941 ], [ -122.38450883461465, 37.609780044346351 ], [ -122.384409676700102, 37.609809716283571 ], [ -122.384305070548479, 37.609858666598114 ], [ -122.384186550437633, 37.609942150353746 ] ] } },
{ "type": "Feature", "properties": { "id": 606.0, "osm_id": 157113024.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.389139668479942, 37.623939761015457 ], [ -122.389063225523032, 37.624008492621435 ], [ -122.388972449511627, 37.624071189257194 ], [ -122.388875470891904, 37.624123157056864 ], [ -122.388736079842161, 37.624174119028154 ], [ -122.388618062645449, 37.624205970260235 ], [ -122.388491915002717, 37.624222985523694 ], [ -122.388355122342915, 37.624222985523694 ], [ -122.388226460129189, 37.624208149555066 ], [ -122.388065359950218, 37.624176046865919 ] ] } },
{ "type": "Feature", "properties": { "id": 607.0, "osm_id": 157113296.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.380810236020295, 37.615506141499345 ], [ -122.380732368139832, 37.615487198398171 ], [ -122.380635724796264, 37.615487198398171 ], [ -122.380566154999926, 37.615493149549437 ], [ -122.380485521091387, 37.61551041626997 ], [ -122.380413352905052, 37.615539920569148 ], [ -122.380320732874978, 37.615605299413865 ] ] } },
{ "type": "Feature", "properties": { "id": 608.0, "osm_id": 157112565.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.387378882080284, 37.611749791592153 ], [ -122.387467311158773, 37.611828330024878 ], [ -122.387504862084995, 37.611896391078638 ], [ -122.387526319757114, 37.61198347905259 ], [ -122.387526319757114, 37.612100238963798 ], [ -122.38749874329568, 37.612215573951488 ] ] } },
{ "type": "Feature", "properties": { "id": 609.0, "osm_id": 157105780.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.381943720786452, 37.625501561033772 ], [ -122.381808017774077, 37.625478678438078 ], [ -122.381671225114303, 37.625487060341264 ], [ -122.381539629234467, 37.625528550761992 ], [ -122.381427144093863, 37.625601892414743 ], [ -122.381349360032431, 37.625676156076864 ] ] } },
{ "type": "Feature", "properties": { "id": 610.0, "osm_id": 157112566.0, "name": "Diamond Line", "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.387646851524764, 37.610988882422049 ], [ -122.387754307523451, 37.611078233509893 ], [ -122.387832175403915, 37.61116322600806 ], [ -122.38788841797421, 37.611267329245457 ], [ -122.387915240064345, 37.611397081106603 ], [ -122.387907277256346, 37.611526665329663 ], [ -122.387864361912108, 37.611662619799141 ], [ -122.38749874329568, 37.612215573951488 ], [ -122.386703300684488, 37.613418628513955 ] ] } },
{ "type": "Feature", "properties": { "id": 611.0, "osm_id": 157106122.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.385002361073518, 37.627595444265538 ], [ -122.385277958049855, 37.62718934105677 ], [ -122.385305618330335, 37.627105857301167 ], [ -122.38530830053935, 37.627022960278786 ], [ -122.385286842867217, 37.626950792092472 ], [ -122.385219703822798, 37.626876444611312 ], [ -122.385085761010089, 37.626807377729143 ], [ -122.384970342203388, 37.626768066603269 ], [ -122.384860203995686, 37.626764881480042 ], [ -122.384752915635076, 37.626784076038334 ], [ -122.384667252584634, 37.626829673591608 ], [ -122.384601454644709, 37.626889185104126 ] ] } },
{ "type": "Feature", "properties": { "id": 612.0, "osm_id": 157111950.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.378628761900359, 37.617431632296395 ], [ -122.378607974780493, 37.617547889293377 ], [ -122.378570423854285, 37.617651992530774 ], [ -122.378517282588135, 37.617729525135132 ], [ -122.378409658951426, 37.617841172085413 ] ] } },
{ "type": "Feature", "properties": { "id": 613.0, "osm_id": 157111111.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.389662112504766, 37.623150269555524 ], [ -122.389562116399887, 37.623249930384262 ], [ -122.389460276276353, 37.623311621191611 ], [ -122.389350221887668, 37.623343472423684 ], [ -122.389224158063953, 37.623360487687137 ], [ -122.389108823076285, 37.623349842670102 ], [ -122.389015532493943, 37.623329474645388 ], [ -122.389100860268258, 37.623388064148557 ], [ -122.389167831674641, 37.623449671136896 ], [ -122.38921611143688, 37.623526197912845 ], [ -122.389242933527044, 37.62361538136264 ], [ -122.38925106397312, 37.623698278385021 ], [ -122.389217452541374, 37.623823084923266 ], [ -122.389283166662295, 37.623761980849117 ], [ -122.389371763378819, 37.623715293648466 ], [ -122.389457510248278, 37.623683358597347 ], [ -122.389538060337813, 37.623660056906544 ], [ -122.389639900461347, 37.623647232594685 ], [ -122.389733861595928, 37.623653686660099 ], [ -122.389862104714496, 37.623683945330569 ] ] } },
{ "type": "Feature", "properties": { "id": 614.0, "osm_id": 157105778.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.383049042357953, 37.626293818521745 ], [ -122.383076702638405, 37.62620513798614 ], [ -122.383068656011375, 37.626124420258577 ], [ -122.383041833921212, 37.626039427760404 ], [ -122.382982657684821, 37.625955524909621 ], [ -122.382800183652733, 37.625849577653518 ] ] } },
{ "type": "Feature", "properties": { "id": 615.0, "osm_id": 157105952.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.383781369238207, 37.625971534344686 ], [ -122.383661424203794, 37.625455292928223 ], [ -122.38361314444154, 37.625293773654107 ], [ -122.383551453634183, 37.62514298321603 ], [ -122.383460258527649, 37.624970818924822 ], [ -122.383344755901902, 37.624793457853691 ], [ -122.383199916615069, 37.624634117874315 ], [ -122.383022974639076, 37.624483327436224 ], [ -122.382800435109829, 37.624329351874948 ], [ -122.382513857840337, 37.624172694104651 ] ] } },
{ "type": "Feature", "properties": { "id": 616.0, "osm_id": 157105783.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.384184119685713, 37.626431030276663 ], [ -122.383996700330755, 37.626304966452942 ], [ -122.38388128152404, 37.626191391664953 ], [ -122.383819674535729, 37.626067088040863 ], [ -122.383781369238207, 37.625971534344686 ], [ -122.383765443622181, 37.625836920979744 ], [ -122.383776843010509, 37.625714796650492 ], [ -122.383839120551073, 37.625561324003378 ] ] } },
{ "type": "Feature", "properties": { "id": 617.0, "osm_id": 157111952.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.378861024437285, 37.616435024009029 ], [ -122.37878776660358, 37.61650685691923 ], [ -122.378683160451956, 37.616583383695215 ], [ -122.37857847048133, 37.61663644114229 ], [ -122.378458106351772, 37.616680027038804 ], [ -122.378323660624844, 37.616700227425447 ], [ -122.378202877400142, 37.616697796673542 ] ] } },
{ "type": "Feature", "properties": { "id": 618.0, "osm_id": 157113073.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.395083443658365, 37.62559535453024 ], [ -122.394977580221294, 37.625654866042801 ], [ -122.394924271317109, 37.625721837449142 ], [ -122.394894347922758, 37.625803561005092 ], [ -122.394905579673008, 37.62589819269192 ], [ -122.394978921325787, 37.626012354213174 ] ] } },
{ "type": "Feature", "properties": { "id": 619.0, "osm_id": 157112793.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.383076535000356, 37.618408291654134 ], [ -122.382414029373564, 37.619400457532798 ], [ -122.382344711034293, 37.619471787528802 ], [ -122.382248151509714, 37.61953339451712 ], [ -122.382135163454947, 37.619568263234321 ], [ -122.381992922558084, 37.619583183021959 ], [ -122.381848167090254, 37.619570442529138 ], [ -122.381719001962367, 37.619538758935136 ] ] } },
{ "type": "Feature", "properties": { "id": 620.0, "osm_id": 157112568.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.387963519826656, 37.611120897397001 ], [ -122.388068125978251, 37.611207985371003 ], [ -122.388137863412638, 37.611301359772348 ], [ -122.388170049920845, 37.611388531565368 ], [ -122.388170049920845, 37.611498921230137 ], [ -122.388139623612332, 37.611599336430167 ] ] } },
{ "type": "Feature", "properties": { "id": 621.0, "osm_id": 157112792.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.382414029373564, 37.619400457532798 ], [ -122.382382261960501, 37.61949089826804 ], [ -122.382376981361517, 37.619580081717793 ], [ -122.382395673005576, 37.619675635413962 ], [ -122.382443533672713, 37.619772278757559 ], [ -122.38251863552513, 37.619850817190326 ], [ -122.382611842288398, 37.619913178549893 ] ] } },
{ "type": "Feature", "properties": { "id": 622.0, "osm_id": 157111954.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.378632617575803, 37.61724823625493 ], [ -122.3786214696446, 37.617112365604491 ], [ -122.37857847048133, 37.617008262367065 ], [ -122.378495322001839, 37.61689996817806 ], [ -122.378396164087292, 37.616806426138638 ], [ -122.378229867128326, 37.616725792230135 ], [ -122.378031551299244, 37.616678685934268 ], [ -122.377779172194678, 37.616664185241788 ], [ -122.377594518867795, 37.616677931562982 ], [ -122.377425120604642, 37.616708776966682 ], [ -122.377288327944868, 37.616753368691541 ], [ -122.377148853076022, 37.616827632353683 ], [ -122.377025471461366, 37.616908433900242 ], [ -122.376915500891698, 37.617014632613454 ], [ -122.37679773515211, 37.617160142452569 ] ] } },
{ "type": "Feature", "properties": { "id": 623.0, "osm_id": 157111956.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.381029758064415, 37.614541384444074 ], [ -122.381064962057735, 37.614431162417361 ], [ -122.381064962057735, 37.61433979967272 ], [ -122.381046102775613, 37.614252627879743 ], [ -122.381005869640362, 37.614171826333155 ], [ -122.380949543251063, 37.614103932917452 ], [ -122.380867400599953, 37.614054731145821 ], [ -122.380796657337171, 37.613991280138791 ], [ -122.380740330947845, 37.613916932657617 ], [ -122.380708144439637, 37.613846859947131 ], [ -122.380694733394577, 37.613768237695318 ], [ -122.380694733394577, 37.613693890214215 ], [ -122.380714011771857, 37.61360889771602 ], [ -122.380644106699407, 37.613663044810501 ], [ -122.380557940734775, 37.613710821658621 ], [ -122.38045333458318, 37.61373848193908 ], [ -122.380343783108685, 37.613752228260282 ], [ -122.380233477262934, 37.613753317907694 ], [ -122.380119483379787, 37.61372968094075 ], [ -122.380201206935709, 37.613785252958799 ], [ -122.380262981562112, 37.613857421145127 ], [ -122.380306232182477, 37.613928667322099 ], [ -122.380332635177481, 37.614010474697039 ], [ -122.380343364013541, 37.614086917653999 ], [ -122.380329952968452, 37.614161265135174 ], [ -122.380300867764461, 37.614228152722482 ] ] } },
{ "type": "Feature", "properties": { "id": 624.0, "osm_id": 157224056.0, "name": "West Line", "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.388577661872162, 37.610926018148227 ], [ -122.388139623612332, 37.611599336430167 ], [ -122.38768163642294, 37.612303332477715 ], [ -122.38708115687956, 37.61322643147421 ] ] } },
{ "type": "Feature", "properties": { "id": 625.0, "osm_id": 157224213.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.386303316265071, 37.611303539067173 ], [ -122.386456118359916, 37.611341844364674 ], [ -122.386568854957602, 37.611348298430094 ], [ -122.386694667324235, 37.611336647584693 ], [ -122.388154040485759, 37.611133637889822 ] ] } },
{ "type": "Feature", "properties": { "id": 626.0, "osm_id": 157607501.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.91724891337104, 37.351133036417714 ], [ -121.915430040382375, 37.352401050729775 ], [ -121.91452010097386, 37.353035225523911 ], [ -121.914361850641953, 37.353145866645832 ], [ -121.914283815123397, 37.353209736747985 ], [ -121.914235619180161, 37.353271343736324 ], [ -121.914199576996495, 37.353337476952355 ], [ -121.91417862223858, 37.353409226043524 ] ] } },
{ "type": "Feature", "properties": { "id": 627.0, "osm_id": 157607576.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.924426923791771, 37.360606598660539 ], [ -121.923519415135118, 37.361244377673039 ], [ -121.922964952240221, 37.361634136170586 ] ] } },
{ "type": "Feature", "properties": { "id": 628.0, "osm_id": 157607574.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.921190000424204, 37.360016680315212 ], [ -121.921749660099096, 37.359630023121781 ], [ -121.922659934783724, 37.358995093956416 ], [ -121.924474030087566, 37.357725487082725 ], [ -121.926251664112598, 37.356441966249761 ], [ -121.926818448405214, 37.35603955107841 ] ] } },
{ "type": "Feature", "properties": { "id": 629.0, "osm_id": 157607615.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.933158268508549, 37.370932768094185 ], [ -121.933715581250567, 37.370544183063075 ], [ -121.934627029401653, 37.369908499526382 ], [ -121.936441124705496, 37.368643335061392 ] ] } },
{ "type": "Feature", "properties": { "id": 630.0, "osm_id": 157607603.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.924730851600785, 37.36324513796054 ], [ -121.925287242333468, 37.362856720567486 ], [ -121.926198019932286, 37.362221791402085 ], [ -121.928014210711922, 37.360955453470623 ] ] } },
{ "type": "Feature", "properties": { "id": 631.0, "osm_id": 157607613.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.931319362771305, 37.369255381631092 ], [ -121.93187508295172, 37.368865455495474 ], [ -121.932784435626999, 37.368228179397185 ], [ -121.934594926712478, 37.366959075437677 ], [ -121.934740604189628, 37.367092096241066 ], [ -121.936553945122199, 37.365839839906926 ], [ -121.937157777426819, 37.365422840224035 ] ] } },
{ "type": "Feature", "properties": { "id": 632.0, "osm_id": 157607762.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.93042635480721, 37.359293992623584 ], [ -121.929832916062509, 37.359709064468746 ] ] } },
{ "type": "Feature", "properties": { "id": 633.0, "osm_id": 157607685.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.91452010097386, 37.353035225523911 ], [ -121.915265419804058, 37.353715165509335 ], [ -121.916240402781185, 37.354604569255102 ], [ -121.919585536518738, 37.357656084924443 ], [ -121.921749660099096, 37.359630023121781 ], [ -121.923519415135118, 37.361244377673039 ], [ -121.925287242333468, 37.362856720567486 ], [ -121.927291858296442, 37.364685232744769 ], [ -121.929418179493467, 37.366624553682044 ], [ -121.93187508295172, 37.368865455495474 ], [ -121.933715581250567, 37.370544183063075 ], [ -121.936235935715814, 37.37284275237036 ], [ -121.938274749843742, 37.374702193770354 ], [ -121.938732066480881, 37.375119528729364 ], [ -121.938809347628123, 37.375179543156101 ], [ -121.938896016506959, 37.37522564362353 ], [ -121.938984613223482, 37.375252381894683 ], [ -121.939062564922992, 37.375267385501331 ], [ -121.939151161639572, 37.375279371622881 ] ] } },
{ "type": "Feature", "properties": { "id": 634.0, "osm_id": 157750999.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.928861621122778, 37.367013473989317 ], [ -121.929418179493467, 37.366624553682044 ], [ -121.930328370359121, 37.365988451050193 ], [ -121.932143136215217, 37.364722364575854 ] ] } },
{ "type": "Feature", "properties": { "id": 635.0, "osm_id": 157750989.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.930003823068247, 37.362770638421857 ], [ -121.931813224506314, 37.361515448421656 ], [ -121.932422002133805, 37.361093922511088 ] ] } },
{ "type": "Feature", "properties": { "id": 636.0, "osm_id": 167318897.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.370471577550944, 37.627292773741921 ], [ -122.369863470475693, 37.627037293333188 ], [ -122.381905834584103, 37.608858957006618 ], [ -122.382516707687401, 37.609118628366922 ], [ -122.370471577550944, 37.627292773741921 ] ] } },
{ "type": "Feature", "properties": { "id": 637.0, "osm_id": 167318475.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.38102875223602, 37.606955594433977 ], [ -122.380425506664636, 37.606702880053298 ], [ -122.366522024775563, 37.627663924414456 ], [ -122.367136921192369, 37.627912950757732 ], [ -122.38102875223602, 37.606955594433977 ] ] } },
{ "type": "Feature", "properties": { "id": 638.0, "osm_id": 167318898.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.392955529899723, 37.626537145170857 ], [ -122.393121910677706, 37.626287196818204 ], [ -122.393280077190568, 37.626049569863241 ], [ -122.358511523731693, 37.611460783570699 ], [ -122.358184378050822, 37.611951544001506 ], [ -122.392955529899723, 37.626537145170857 ] ] } },
{ "type": "Feature", "properties": { "id": 639.0, "osm_id": 167318474.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.357312157206579, 37.613288625195764 ], [ -122.356993058152767, 37.613784247130376 ], [ -122.393175471038973, 37.628953731674784 ], [ -122.393499850691768, 37.628471520785233 ], [ -122.357312157206579, 37.613288625195764 ] ] } },
{ "type": "Feature", "properties": { "id": 640.0, "osm_id": 169163304.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.395712648679591, 38.655236889905986 ], [ -121.396047170435253, 38.655167990661923 ], [ -121.397731513877957, 38.65442434821238 ], [ -121.397791276847585, 38.653957057110432 ], [ -121.397831426163791, 38.653835519514445 ], [ -121.397879035373805, 38.653779276944128 ], [ -121.397949443360474, 38.653720352164825 ], [ -121.398620079433371, 38.653408293909649 ], [ -121.39871320237765, 38.653389686084616 ], [ -121.398863406082498, 38.653381220362434 ], [ -121.399006233712569, 38.653404019139046 ], [ -121.399185941716624, 38.65347316984024 ], [ -121.399384425183754, 38.653538129589812 ], [ -121.399526666080604, 38.653561179823534 ], [ -121.399649377143064, 38.653559251985804 ], [ -121.399858505627279, 38.653485994152092 ], [ -121.400207276618318, 38.65333092894339 ], [ -121.400247425934495, 38.6532681484886 ], [ -121.400269051244706, 38.653266053012814 ], [ -121.400267374864086, 38.654181356839366 ], [ -121.400185735127167, 38.654007599986564 ], [ -121.400095210572886, 38.653936018533486 ], [ -121.399973840614919, 38.653875585011583 ], [ -121.399827073490385, 38.653839794285041 ], [ -121.399674103757462, 38.653839794285041 ], [ -121.399536640545392, 38.653869298584198 ], [ -121.399335474869218, 38.653955129272731 ], [ -121.398169468318784, 38.654472376517546 ], [ -121.398077518840964, 38.654560554138918 ], [ -121.398026556869667, 38.65464428935163 ], [ -121.397994370361474, 38.654753254092903 ], [ -121.397983641525428, 38.654780495278231 ], [ -121.397947934617875, 38.65478502150593 ], [ -121.397776608517034, 38.65480723354932 ], [ -121.397742913266285, 38.654811675957994 ], [ -121.397702763950079, 38.654752918816754 ], [ -121.397619531651543, 38.654734143353636 ], [ -121.397439823647517, 38.654784434772687 ], [ -121.397171602745985, 38.654918461404442 ], [ -121.396892653008365, 38.655037819705647 ], [ -121.396442041893735, 38.655226328707982 ], [ -121.396154374976803, 38.655503099150792 ], [ -121.396140963931728, 38.65557216603294 ], [ -121.396149848749104, 38.655611728615916 ], [ -121.395712648679591, 38.655236889905986 ] ] } },
{ "type": "Feature", "properties": { "id": 641.0, "osm_id": 169163302.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.397954807778504, 38.657157519199174 ], [ -121.397771747013181, 38.656998598315006 ], [ -121.397776608517034, 38.65480723354932 ], [ -121.397947934617875, 38.65478502150593 ], [ -121.397954807778504, 38.657157519199174 ] ] } },
{ "type": "Feature", "properties": { "id": 642.0, "osm_id": 169193094.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.400948069220789, 38.682297864301674 ], [ -121.400931975966714, 38.685262543454137 ], [ -121.400883612385385, 38.685275116308929 ], [ -121.400274080386623, 38.68527955871761 ], [ -121.400241810059384, 38.685229267298574 ], [ -121.400263267731532, 38.682209854318366 ], [ -121.400974807491906, 38.682209854318366 ], [ -121.400948069220789, 38.682297864301674 ] ] } },
{ "type": "Feature", "properties": { "id": 643.0, "osm_id": 169164525.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.397944162761462, 38.659453154840342 ], [ -121.397949443360474, 38.657760764770579 ], [ -121.397769064804194, 38.657599748410618 ], [ -121.397775351231559, 38.659235979729125 ], [ -121.397768310432909, 38.659855821468803 ], [ -121.39776780751869, 38.659918266647438 ], [ -121.397760347624882, 38.660839856901362 ], [ -121.397755318482965, 38.661453998946904 ], [ -121.397749618788808, 38.66575525637942 ], [ -121.397999734779475, 38.665738576392101 ], [ -121.397978947659624, 38.665606393779051 ], [ -121.397981629868653, 38.6617067971466 ], [ -121.397980875497353, 38.661688189321573 ], [ -121.397941480552447, 38.660808257126405 ], [ -121.39794407894243, 38.659815672152568 ], [ -121.397944162761462, 38.659792454280804 ], [ -121.397944162761462, 38.659453154840342 ] ] } },
{ "type": "Feature", "properties": { "id": 644.0, "osm_id": 169163588.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.40696703007066, 38.654769766442129 ], [ -121.406355570234155, 38.654769766442129 ], [ -121.405161903403226, 38.654765575490543 ], [ -121.403375552198852, 38.654761384538944 ], [ -121.402648505917597, 38.654189738742552 ], [ -121.402350361621714, 38.654082953296111 ], [ -121.402310715219699, 38.654086976609648 ], [ -121.400977070605734, 38.653157172090587 ], [ -121.400976902967713, 38.654028470925468 ], [ -121.401028619310267, 38.653908861167203 ], [ -121.401101038953712, 38.653839794285041 ], [ -121.401192234060233, 38.653795789293369 ], [ -121.401296840211842, 38.653776930011219 ], [ -121.401414270675318, 38.653785479552482 ], [ -121.401513428589851, 38.653823198116783 ], [ -121.401656256219951, 38.653906765691396 ], [ -121.402383134863129, 38.654426276050096 ], [ -121.40237517205513, 38.654558123387005 ], [ -121.402895436785087, 38.654972943775064 ], [ -121.408860669635601, 38.654972943775064 ], [ -121.408855305217585, 38.654742525256808 ], [ -121.408809707664304, 38.654761384538944 ], [ -121.408737371839933, 38.654752918816754 ], [ -121.408358425997463, 38.654762558005388 ], [ -121.408229763783737, 38.654765743128586 ], [ -121.40696703007066, 38.654769766442129 ] ] } },
{ "type": "Feature", "properties": { "id": 645.0, "osm_id": 169193219.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.401103637343681, 38.669897425289712 ], [ -121.408073608927609, 38.66979097511939 ], [ -121.410524309777514, 38.669757196049623 ], [ -121.410891269498435, 38.669928019236295 ], [ -121.411623512559672, 38.669916787486024 ], [ -121.411699620240483, 38.669868340085706 ], [ -121.411942946889624, 38.669697935994158 ], [ -121.411279938348585, 38.669114220257157 ], [ -121.411220929750243, 38.669068119789713 ], [ -121.411212044932896, 38.669139365966707 ], [ -121.411172649987975, 38.669227375950008 ], [ -121.411102828734514, 38.669344638775392 ], [ -121.411051112391959, 38.669403228278597 ], [ -121.408201600589067, 38.66943952191933 ], [ -121.40119483245023, 38.669541445861917 ], [ -121.401130459433844, 38.669520574923027 ], [ -121.4010767314345, 38.669470283503969 ], [ -121.401007077819131, 38.669407419230176 ], [ -121.400975813320287, 38.669373975436514 ], [ -121.400975729501241, 38.670006390030949 ], [ -121.401023171073234, 38.669943525757169 ], [ -121.401055357581413, 38.669914272915058 ], [ -121.401103637343681, 38.669897425289712 ] ] } },
{ "type": "Feature", "properties": { "id": 646.0, "osm_id": 169164531.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.398062179958146, 38.659549462907798 ], [ -121.398415560995943, 38.659576955550193 ], [ -121.398424278175241, 38.659555749335183 ], [ -121.398469875728509, 38.659522221722483 ], [ -121.399320052167397, 38.659599754326877 ], [ -121.399454162618198, 38.65958718147207 ], [ -121.399542004963422, 38.659551726021654 ], [ -121.399607048532062, 38.659482491501457 ], [ -121.399647365486317, 38.659417531751849 ], [ -121.399670750996179, 38.659331868701415 ], [ -121.39966077653142, 38.659266741313779 ], [ -121.399623141786165, 38.659187197052653 ], [ -121.400092528363857, 38.65958718147207 ], [ -121.400085319927143, 38.660508939364064 ], [ -121.39816334952944, 38.661480737218021 ], [ -121.398088918229234, 38.661528765523208 ], [ -121.398034603496725, 38.66157494980969 ], [ -121.398008451958788, 38.661637646445435 ], [ -121.397980875497353, 38.661688189321573 ], [ -121.397981629868653, 38.6617067971466 ], [ -121.397941480552447, 38.660808257126405 ], [ -121.398021863003905, 38.660923424475996 ], [ -121.398075507184174, 38.660971536600222 ], [ -121.39813183357353, 38.661013446116087 ], [ -121.399416611691919, 38.660347420089927 ], [ -121.399483666917348, 38.660297128670869 ], [ -121.399515853425527, 38.660207190849853 ], [ -121.399534628888631, 38.660156899430795 ], [ -121.399526666080604, 38.660066877790676 ], [ -121.399470255872259, 38.659978867807425 ], [ -121.399368331929679, 38.65990552615461 ], [ -121.399265737434831, 38.659872249999026 ], [ -121.398442969819286, 38.659790358805004 ], [ -121.398404748340823, 38.659727745988327 ], [ -121.398091600438278, 38.659696062394303 ], [ -121.398032675658996, 38.659710730724854 ], [ -121.397999734779475, 38.659740235024039 ], [ -121.397959501644252, 38.659784240015689 ], [ -121.39794407894243, 38.659815672152568 ], [ -121.397944162761462, 38.659453154840342 ], [ -121.397992358704713, 38.659509648867747 ], [ -121.398029909630949, 38.659532782920486 ], [ -121.398062179958146, 38.659549462907798 ] ] } },
{ "type": "Feature", "properties": { "id": 647.0, "osm_id": 169171470.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.397418365975383, 38.669107850010739 ], [ -121.396451261987238, 38.669108185286852 ], [ -121.396451429625287, 38.668965776751961 ], [ -121.397380815049175, 38.668961250524241 ], [ -121.397476704021472, 38.668942726518232 ], [ -121.397535712619813, 38.668915485332931 ], [ -121.397632942696617, 38.668860751505186 ], [ -121.397694633503988, 38.668806269134578 ], [ -121.397713660424202, 38.668756396810679 ], [ -121.397715420623854, 38.669279846663883 ], [ -121.397664458652571, 38.66923383001545 ], [ -121.397603438397468, 38.66918747809089 ], [ -121.397506962691935, 38.669139282147661 ], [ -121.397418365975383, 38.669107850010739 ] ] } },
{ "type": "Feature", "properties": { "id": 648.0, "osm_id": 169166013.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.39764367153272, 38.665813762063571 ], [ -121.397546441455887, 38.665788867811145 ], [ -121.39748005678274, 38.665788532534997 ], [ -121.397423730393427, 38.665811666587778 ], [ -121.397380815049175, 38.665847289676258 ], [ -121.39734385085616, 38.665874782318681 ], [ -121.397431525563377, 38.665529531726975 ], [ -121.397749618788808, 38.66575525637942 ], [ -121.397999734779475, 38.665738576392101 ], [ -121.398029239078681, 38.665839075411142 ], [ -121.398051367303054, 38.666331093127425 ], [ -121.397949443360474, 38.66641264904532 ], [ -121.397932763373134, 38.666454726199227 ], [ -121.397933350106371, 38.666645163039348 ], [ -121.397927901869309, 38.668014933655947 ], [ -121.397927482774151, 38.668153235058313 ], [ -121.397925303479326, 38.668686994652411 ], [ -121.397748361503318, 38.668689090128211 ], [ -121.397737045934036, 38.668043683583861 ], [ -121.397750959893315, 38.667451418305596 ], [ -121.397713408967093, 38.667451418305596 ], [ -121.397702763950079, 38.667405317838131 ], [ -121.397675271307662, 38.667355361695243 ], [ -121.397638307114661, 38.667340441907612 ], [ -121.397576616307305, 38.667323678101248 ], [ -121.397469327946652, 38.667317475492894 ], [ -121.397409648796099, 38.667346979792065 ], [ -121.39734804180776, 38.667382519061512 ], [ -121.397346952160362, 38.66700348940001 ], [ -121.397375450631145, 38.667055624837751 ], [ -121.397410319348367, 38.667084961498887 ], [ -121.397466645737666, 38.667112118865134 ], [ -121.397603438397468, 38.667112118865134 ], [ -121.397661860262573, 38.667083033661122 ], [ -121.397705362340048, 38.667032574604015 ], [ -121.397705362340048, 38.666971889625074 ], [ -121.397750373160093, 38.666972057263123 ], [ -121.39774023105727, 38.666557153056019 ], [ -121.397705362340048, 38.666557153056019 ], [ -121.397689269085944, 38.666488086173878 ], [ -121.397626907726334, 38.666450535247641 ], [ -121.397536466991127, 38.666429496670688 ], [ -121.397466645737666, 38.666437878573859 ], [ -121.397407637139324, 38.666473417843321 ], [ -121.397362039586056, 38.66652999568975 ], [ -121.397339911361698, 38.666569977367857 ], [ -121.397344521408442, 38.666119785348442 ], [ -121.397399674331325, 38.666192791725074 ], [ -121.397450552483562, 38.666220032910381 ], [ -121.3975250676028, 38.666226570794848 ], [ -121.397606120606454, 38.66622212838616 ], [ -121.397678540249885, 38.666167646015552 ], [ -121.397705362340048, 38.666104865560769 ], [ -121.397708044549063, 38.665882828945726 ], [ -121.397675858040898, 38.665840919429819 ], [ -121.39764367153272, 38.665813762063571 ] ] } },
{ "type": "Feature", "properties": { "id": 649.0, "osm_id": 169193788.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.406542821951049, 38.665834716821493 ], [ -121.40669302565594, 38.665725752080235 ], [ -121.406778856344403, 38.665633634964387 ], [ -121.406789668999508, 38.665482844526267 ], [ -121.406741640694307, 38.665260891730242 ], [ -121.407344131894462, 38.665764476472916 ], [ -121.407038527704728, 38.665767661596107 ], [ -121.406845408655627, 38.66587654251834 ], [ -121.406752034254254, 38.665942927191473 ], [ -121.406416255213131, 38.666052562484964 ], [ -121.401199945411165, 38.667183448861152 ], [ -121.401062566018126, 38.667283947880193 ], [ -121.400998109182751, 38.667417974511942 ], [ -121.400976064777382, 38.666672488043694 ], [ -121.40121067424721, 38.666856722275455 ], [ -121.401382251805174, 38.666948839391289 ], [ -121.401521726673991, 38.666940457488153 ], [ -121.401714845723092, 38.666898547972281 ], [ -121.406339057884907, 38.665926833937377 ], [ -121.406542821951049, 38.665834716821493 ] ] } },
{ "type": "Feature", "properties": { "id": 650.0, "osm_id": 169171403.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.397713408967093, 38.668686994652411 ], [ -121.397748361503318, 38.668689090128211 ], [ -121.397925303479326, 38.668686994652411 ], [ -121.397972912689355, 38.668685150633735 ], [ -121.397981546049621, 38.668720354627041 ], [ -121.39797073339453, 38.669302561621471 ], [ -121.397930667897356, 38.66932988662581 ], [ -121.397917256852296, 38.673287737485332 ], [ -121.397968218823564, 38.67328983296111 ], [ -121.397970901032551, 38.673425955068673 ], [ -121.397697315713003, 38.673425955068673 ], [ -121.397702763950079, 38.673285642009525 ], [ -121.397750373160093, 38.673288072761451 ], [ -121.39775364210233, 38.669384285177451 ], [ -121.397710726758078, 38.669382189701629 ], [ -121.397715420623854, 38.669279846663883 ], [ -121.397713660424202, 38.668756396810679 ], [ -121.397713408967093, 38.668686994652411 ] ] } },
{ "type": "Feature", "properties": { "id": 651.0, "osm_id": 169164099.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.401315615674946, 38.659264645837979 ], [ -121.401315615674946, 38.659381992482409 ], [ -121.40492880267594, 38.657534956299081 ], [ -121.406506109215158, 38.656728617213794 ], [ -121.409010202788224, 38.655448616780177 ], [ -121.409053118132462, 38.655389943457941 ], [ -121.409016824491729, 38.655277458317364 ], [ -121.408889503382525, 38.654998257122635 ], [ -121.408860669635601, 38.654972943775064 ], [ -121.408855305217585, 38.654742525256808 ], [ -121.40925964822668, 38.654566756747279 ], [ -121.409965739750035, 38.65456449363343 ], [ -121.410470078863966, 38.655186598486949 ], [ -121.409618309863475, 38.655619439966848 ], [ -121.408825800918407, 38.656022358052404 ], [ -121.408710465930767, 38.655881961174238 ], [ -121.406146274111904, 38.657197333239267 ], [ -121.406189273275189, 38.657245529182489 ], [ -121.406260938547305, 38.65735047061024 ], [ -121.401317627331707, 38.659874345474833 ], [ -121.401317627331707, 38.660020944961317 ], [ -121.401323159387786, 38.660649168604145 ], [ -121.401323662301976, 38.660705662631585 ], [ -121.400976400053523, 38.66071203287796 ], [ -121.400976567691572, 38.659273279198253 ], [ -121.401315615674946, 38.659264645837979 ] ] } },
{ "type": "Feature", "properties": { "id": 652.0, "osm_id": 169164526.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.400089846154842, 38.658717978112989 ], [ -121.400089259421634, 38.658973793797827 ], [ -121.397954807778504, 38.657157519199174 ], [ -121.397771747013181, 38.656998598315006 ], [ -121.396149848749104, 38.655611728615916 ], [ -121.395712648679591, 38.655236889905986 ], [ -121.395605360318967, 38.655142593495327 ], [ -121.39521560182142, 38.655406791083337 ], [ -121.395235718389003, 38.655415759719716 ], [ -121.395849776615506, 38.65597307246172 ], [ -121.397769064804194, 38.657599748410618 ], [ -121.397949443360474, 38.657760764770579 ], [ -121.399623141786165, 38.659187197052653 ], [ -121.400092528363857, 38.65958718147207 ], [ -121.400085319927143, 38.660508939364064 ], [ -121.400083811184572, 38.660705830269606 ], [ -121.400254634371237, 38.66070792574542 ], [ -121.400258573865699, 38.658716050275238 ], [ -121.400089846154842, 38.658717978112989 ] ] } },
{ "type": "Feature", "properties": { "id": 653.0, "osm_id": 169162572.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.400977070605734, 38.653085842094605 ], [ -121.400977070605734, 38.653157172090587 ], [ -121.400976902967713, 38.654028470925468 ], [ -121.400976567691572, 38.659273279198253 ], [ -121.400976400053523, 38.66071203287796 ], [ -121.400976064777382, 38.666672488043694 ], [ -121.400975813320287, 38.669373975436514 ], [ -121.400975729501241, 38.670006390030949 ], [ -121.400974807491906, 38.682209854318366 ], [ -121.400263267731532, 38.682209854318366 ], [ -121.400213143950566, 38.682209854318366 ], [ -121.400213227769555, 38.68215989817547 ], [ -121.400214149778918, 38.68170752686121 ], [ -121.400228231376261, 38.674374618869827 ], [ -121.400229907756867, 38.67351195339522 ], [ -121.400236445641355, 38.670142679776575 ], [ -121.400238708755211, 38.668940631042439 ], [ -121.400241558602275, 38.667524927596439 ], [ -121.400242815887765, 38.666850687305157 ], [ -121.400254634371237, 38.66070792574542 ], [ -121.400258573865699, 38.658716050275238 ], [ -121.400267374864086, 38.654181356839366 ], [ -121.400269051244706, 38.653266053012814 ], [ -121.400269470339865, 38.653080058581381 ], [ -121.400977070605734, 38.653085842094605 ] ] } },
{ "type": "Feature", "properties": { "id": 654.0, "osm_id": 169162343.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.40025605929479, 38.653083746618776 ], [ -121.400269470339865, 38.653080058581381 ], [ -121.400277433147863, 38.649598299822145 ], [ -121.401007077819131, 38.649606597906313 ], [ -121.400996348983057, 38.650603625288774 ], [ -121.402691421261878, 38.651919164991867 ], [ -121.402648505917597, 38.654189738742552 ], [ -121.402350361621714, 38.654082953296111 ], [ -121.402358827343917, 38.652019664010929 ], [ -121.401382503262298, 38.651265628001397 ], [ -121.401288123032543, 38.651276021561387 ], [ -121.400985536327951, 38.651399654633167 ], [ -121.400977070605734, 38.653085842094605 ], [ -121.40025605929479, 38.653083746618776 ] ] } },
{ "type": "Feature", "properties": { "id": 655.0, "osm_id": 169192993.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.397708212187112, 38.678926746664338 ], [ -121.397718941023172, 38.682071636735031 ], [ -121.397763448929041, 38.682210021956415 ], [ -121.397815416728733, 38.682331391914389 ], [ -121.39790133123627, 38.682440189017591 ], [ -121.39800325517885, 38.682532389952499 ], [ -121.398142730047667, 38.682628698019926 ], [ -121.398325120260679, 38.682691478474709 ], [ -121.39847532396557, 38.682733387990588 ], [ -121.398754273703176, 38.682745877026306 ], [ -121.398990224277526, 38.682745877026306 ], [ -121.399237071325985, 38.682712349413606 ], [ -121.39941401330195, 38.68265795086203 ], [ -121.399576622223563, 38.682591147093717 ], [ -121.399725233366823, 38.682444379969184 ], [ -121.400096970772537, 38.68215989817547 ], [ -121.400213227769555, 38.68215989817547 ], [ -121.400214149778918, 38.68170752686121 ], [ -121.400143657973231, 38.681791178254826 ], [ -121.400041734030637, 38.681866447745357 ], [ -121.399923716833953, 38.6819083572612 ], [ -121.399773513129063, 38.681925121067579 ], [ -121.399537478735695, 38.681920930115993 ], [ -121.398695265104834, 38.681929228200133 ], [ -121.398507426654717, 38.681891677273896 ], [ -121.398341213514783, 38.681832920132685 ], [ -121.398228560736129, 38.681791178254826 ], [ -121.398169552137787, 38.681732421113608 ], [ -121.398072908794205, 38.681644578768349 ], [ -121.398024712850983, 38.68155246165248 ], [ -121.39799252634279, 38.681451962633432 ], [ -121.397976433088687, 38.681288599340576 ], [ -121.397976433088687, 38.679839619738935 ], [ -121.397987161924746, 38.678729855758775 ], [ -121.397457677101258, 38.678725664807189 ], [ -121.397590111171411, 38.678767574323061 ], [ -121.397659932424872, 38.678813674790533 ], [ -121.397699075912683, 38.678864133847611 ], [ -121.397708212187112, 38.678926746664338 ] ] } },
{ "type": "Feature", "properties": { "id": 656.0, "osm_id": 169169676.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.399644431820207, 38.667200128848485 ], [ -121.399783906689024, 38.667195937896857 ], [ -121.399934110393886, 38.66715402838102 ], [ -121.400052127590598, 38.667103736961991 ], [ -121.400121948843989, 38.667036765555601 ], [ -121.400191602459387, 38.666953030342881 ], [ -121.400242815887765, 38.666850687305157 ], [ -121.400241558602275, 38.667524927596439 ], [ -121.400132677680062, 38.667421997825478 ], [ -121.399993118992228, 38.667367431635817 ], [ -121.399805448180174, 38.667359049732639 ], [ -121.399623057967119, 38.667359049732639 ], [ -121.399510321369419, 38.667350751648506 ], [ -121.399322650557394, 38.667262993122257 ], [ -121.399172446852504, 38.667204319800042 ], [ -121.399006149893552, 38.667200128848485 ], [ -121.398877320041777, 38.667287887374677 ], [ -121.398845133533598, 38.667434486861168 ], [ -121.398834404697539, 38.668184248100083 ], [ -121.398888132696868, 38.668406117077083 ], [ -121.398973963385387, 38.668536036576263 ], [ -121.399102625599056, 38.668644917498483 ], [ -121.399467406025195, 38.668992598842088 ], [ -121.3996766183284, 38.669164260219112 ], [ -121.399762532835936, 38.66920616973497 ], [ -121.3998697373775, 38.669193680699244 ], [ -121.400014660483407, 38.669139198328622 ], [ -121.400138042098121, 38.66906795215165 ], [ -121.400213143950566, 38.668984133119899 ], [ -121.400238708755211, 38.668940631042439 ], [ -121.400236445641355, 38.670142679776575 ], [ -121.400180957442373, 38.67003128428339 ], [ -121.400068220844659, 38.66993078526432 ], [ -121.399907372122769, 38.669893066700048 ], [ -121.399757168417878, 38.669842775280998 ], [ -121.39966052507431, 38.669842775280998 ], [ -121.399006149893552, 38.669248079250849 ], [ -121.398904225950972, 38.669134923558033 ], [ -121.398764751082155, 38.66913073260644 ], [ -121.398287234058358, 38.669134923558033 ], [ -121.398078021755126, 38.669160069267527 ], [ -121.39797073339453, 38.669302561621471 ], [ -121.397981546049621, 38.668720354627041 ], [ -121.398029825811903, 38.66886695411354 ], [ -121.39811565650038, 38.668925543616737 ], [ -121.398271140804255, 38.668933925519916 ], [ -121.398485717525517, 38.668933925519916 ], [ -121.398721835737931, 38.668933925519916 ], [ -121.398888132696868, 38.668933925519916 ], [ -121.398723763575646, 38.668796965222057 ], [ -121.398571632033025, 38.668749691288127 ], [ -121.398523352270772, 38.668703590820677 ], [ -121.398528632869755, 38.668230264748473 ], [ -121.398491165762579, 38.66816748429374 ], [ -121.398416063910133, 38.668154827619922 ], [ -121.398271140804255, 38.668150636668337 ], [ -121.398104927664335, 38.668150636668337 ], [ -121.397927482774151, 38.668153235058313 ], [ -121.397927901869309, 38.668014933655947 ], [ -121.398432157164194, 38.668020884807213 ], [ -121.398544726123831, 38.667978975291334 ], [ -121.398587641468097, 38.667920385788143 ], [ -121.398587641468097, 38.667727685834215 ], [ -121.398598454123189, 38.666953030342881 ], [ -121.39836233591079, 38.666446176657992 ], [ -121.398260411968209, 38.666341486687358 ], [ -121.398174665098722, 38.666307959074686 ], [ -121.398099563246305, 38.666295470038932 ], [ -121.398051367303054, 38.666331093127425 ], [ -121.398029239078681, 38.665839075411142 ], [ -121.398104927664335, 38.665977041537381 ], [ -121.398196038951809, 38.666081731508037 ], [ -121.398357055311791, 38.666224223861967 ], [ -121.399279735213128, 38.667036765555601 ], [ -121.399429938918018, 38.66713734839368 ], [ -121.39949967635242, 38.667166685054802 ], [ -121.399644431820207, 38.667200128848485 ] ] } },
{ "type": "Feature", "properties": { "id": 657.0, "osm_id": 169194128.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.409708163865503, 38.65889818903122 ], [ -121.409718808882516, 38.659187197052653 ], [ -121.409895834677542, 38.659187197052653 ], [ -121.409858367570365, 38.655509134121083 ], [ -121.409618309863475, 38.655619439966848 ], [ -121.409692070611399, 38.655634862668677 ], [ -121.409715372302216, 38.655689345039292 ], [ -121.409715372302216, 38.655827562622619 ], [ -121.409708163865503, 38.65889818903122 ] ] } },
{ "type": "Feature", "properties": { "id": 658.0, "osm_id": 169192790.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.397177134802064, 38.673821664717472 ], [ -121.397338067342986, 38.673800626140483 ], [ -121.397461448957699, 38.673746227588929 ], [ -121.397575610478924, 38.673687889542812 ], [ -121.397643839170769, 38.673591497656346 ], [ -121.397676025678933, 38.673499380540463 ], [ -121.397697315713003, 38.673425955068673 ], [ -121.397970901032551, 38.673425955068673 ], [ -121.398008619596879, 38.673549671959492 ], [ -121.398046170523088, 38.673624941449994 ], [ -121.39810517912143, 38.673691996675366 ], [ -121.398190925990889, 38.673742036637321 ], [ -121.398271476080367, 38.673788137104793 ], [ -121.39837876444102, 38.673817473765887 ], [ -121.398545061399943, 38.673834153753219 ], [ -121.399741326620898, 38.673829962801612 ], [ -121.399864624416566, 38.673809091862708 ], [ -121.399955819523115, 38.673779755201593 ], [ -121.400036369612579, 38.673729463782564 ], [ -121.400175844481424, 38.673599879559497 ], [ -121.400229907756867, 38.67351195339522 ], [ -121.400228231376261, 38.674374618869827 ], [ -121.400159751227321, 38.674236233648436 ], [ -121.400086241936478, 38.674165238928545 ], [ -121.399955819523115, 38.674085443210345 ], [ -121.399837802326431, 38.674039342742901 ], [ -121.399666224768481, 38.674039342742901 ], [ -121.398502146055733, 38.674043533694459 ], [ -121.398335849096767, 38.67406038131984 ], [ -121.398235517715776, 38.674110840376954 ], [ -121.398138958191225, 38.674165238928545 ], [ -121.398046170523088, 38.674261379357965 ], [ -121.39799780694176, 38.674349389341273 ], [ -121.397981713687699, 38.674445697408764 ], [ -121.397967380633247, 38.675291850534116 ], [ -121.397960339834583, 38.676275718328633 ], [ -121.397978025650275, 38.677586899442069 ], [ -121.397987161924746, 38.678729855758775 ], [ -121.397801251312345, 38.678728598473299 ], [ -121.397794713427857, 38.676282842946293 ], [ -121.397342006837476, 38.676237245393018 ], [ -121.397488271047848, 38.676217128825414 ], [ -121.397590111171411, 38.676192066934945 ], [ -121.397649119769753, 38.676129286480176 ], [ -121.397686754515007, 38.676045467448446 ], [ -121.397697483351067, 38.675861149397633 ], [ -121.397713576605142, 38.674454079311943 ], [ -121.397682982658566, 38.674450055998406 ], [ -121.397681306277946, 38.674349389341273 ], [ -121.397645431732357, 38.674282585572975 ], [ -121.397579466154411, 38.674202789854796 ], [ -121.397488271047848, 38.67413573462936 ], [ -121.397359525015091, 38.674068763223019 ], [ -121.397227007125949, 38.674043785151575 ], [ -121.397178727363681, 38.674043785151575 ], [ -121.397173362945637, 38.674003384378274 ], [ -121.39645260309176, 38.674003384378274 ], [ -121.396452938367872, 38.673879248392275 ], [ -121.397168836717938, 38.673873548698118 ], [ -121.397177134802064, 38.673821664717472 ] ] } },
{ "type": "Feature", "properties": { "id": 659.0, "osm_id": 169193333.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.412036237471924, 38.669755016754792 ], [ -121.412392216899732, 38.669524765874613 ], [ -121.412438652643274, 38.669491238261934 ], [ -121.411725101226139, 38.668879778425399 ], [ -121.411709007972036, 38.668829487006384 ], [ -121.411719736808095, 38.668787577490505 ], [ -121.412132880815548, 38.668469232807972 ], [ -121.412057778963103, 38.668414834256382 ], [ -121.411676821463857, 38.668707949410333 ], [ -121.411609011867185, 38.668737369890451 ], [ -121.411548159250131, 38.668724797035722 ], [ -121.411473057397686, 38.668678696568278 ], [ -121.411419329398356, 38.668611641342864 ], [ -121.411419329398356, 38.668561349923841 ], [ -121.411467609160653, 38.668515333275387 ], [ -121.411859211676898, 38.668251470963511 ], [ -121.411794838660541, 38.668184499557164 ], [ -121.411414048799372, 38.668460850904779 ], [ -121.411333582528897, 38.66849437851748 ], [ -121.411274573930555, 38.66848608043334 ], [ -121.411167201750914, 38.668406452353196 ], [ -121.409911927931617, 38.667325857396101 ], [ -121.409889548250149, 38.667306998113922 ], [ -121.409323769785956, 38.666831576565905 ], [ -121.406135461456813, 38.664129921535014 ], [ -121.403871677047718, 38.662190516778772 ], [ -121.4030938364332, 38.661545445510519 ], [ -121.401317627331707, 38.660020944961317 ], [ -121.401323159387786, 38.660649168604145 ], [ -121.403442439786204, 38.662437782922346 ], [ -121.406741640694307, 38.665260891730242 ], [ -121.407344131894462, 38.665764476472916 ], [ -121.407428202383286, 38.665834716821493 ], [ -121.409262833349885, 38.667405317838131 ], [ -121.409311113112153, 38.667455693076228 ], [ -121.411220929750243, 38.669068119789713 ], [ -121.411279938348585, 38.669114220257157 ], [ -121.411942946889624, 38.669697935994158 ], [ -121.412036237471924, 38.669755016754792 ] ] } },
{ "type": "Feature", "properties": { "id": 660.0, "osm_id": 169193522.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.410335800775144, 38.66587277066192 ], [ -121.410305877380807, 38.665873776490301 ], [ -121.410019216292241, 38.66587654251834 ], [ -121.409944114439824, 38.665914261082619 ], [ -121.409911927931617, 38.665972934404799 ], [ -121.409901282914603, 38.666014843920706 ], [ -121.409889548250149, 38.667306998113922 ], [ -121.409488138907207, 38.66696149606512 ], [ -121.409584782250789, 38.66696149606512 ], [ -121.40967052912022, 38.666927968452399 ], [ -121.409713444464487, 38.666890249888155 ], [ -121.409724257119578, 38.66676879611115 ], [ -121.409718808882516, 38.663208498919175 ], [ -121.409718808882516, 38.660753858574807 ], [ -121.409718808882516, 38.659187197052653 ], [ -121.409895834677542, 38.659187197052653 ], [ -121.409895834677542, 38.659417531751849 ], [ -121.409944114439824, 38.6594636322193 ], [ -121.409997842439154, 38.659476121255011 ], [ -121.4103304363571, 38.659480396025678 ], [ -121.410326915957754, 38.659585169815315 ], [ -121.410115859635866, 38.659580978863744 ], [ -121.409960207693928, 38.659597658851069 ], [ -121.409933469422811, 38.659652141221677 ], [ -121.410003123038166, 38.659694050737542 ], [ -121.410158774980104, 38.659698241689121 ], [ -121.41032507193907, 38.659706539773268 ], [ -121.410319623702009, 38.65980712261134 ], [ -121.41004075778342, 38.659798740708197 ], [ -121.409933469422811, 38.659815420695487 ], [ -121.409922740586737, 38.659861521162973 ], [ -121.409965655931003, 38.659911896401042 ], [ -121.41032507193907, 38.659924469255785 ], [ -121.410314343103025, 38.660029159226447 ], [ -121.410139161326654, 38.660020777323247 ], [ -121.409978228785761, 38.660029159226447 ], [ -121.409933469422811, 38.660062686839112 ], [ -121.409946042277582, 38.660117085390716 ], [ -121.409997842439154, 38.660129658245481 ], [ -121.410314343103025, 38.660133849197074 ], [ -121.410314343103025, 38.660246921070872 ], [ -121.410051402800434, 38.6602385391677 ], [ -121.409938833840812, 38.660259577744647 ], [ -121.409922740586737, 38.660322358199444 ], [ -121.409992478021152, 38.660355885812137 ], [ -121.4103304363571, 38.66036007676373 ], [ -121.41032507193907, 38.660473148637543 ], [ -121.409997842439154, 38.660473148637543 ], [ -121.409944114439824, 38.660498294347065 ], [ -121.409922740586737, 38.660535929092283 ], [ -121.409970936529987, 38.660573647656605 ], [ -121.410099766381762, 38.660577838608191 ], [ -121.4103304363571, 38.660582029559755 ], [ -121.410319623702009, 38.66068671953041 ], [ -121.410046038382433, 38.66068671953041 ], [ -121.409949562676914, 38.660707758107378 ], [ -121.409938833840812, 38.660753858574807 ], [ -121.409987029784062, 38.660791577139101 ], [ -121.410164139398148, 38.660799875223205 ], [ -121.4103304363571, 38.660799875223205 ], [ -121.41032507193907, 38.660912947097046 ], [ -121.410153326743014, 38.66090875614546 ], [ -121.409981749185079, 38.66091713804861 ], [ -121.409933469422811, 38.660950665661339 ], [ -121.409949562676914, 38.660996766128768 ], [ -121.409992478021152, 38.661013529935119 ], [ -121.410319623702009, 38.661021828019265 ], [ -121.410321551539724, 38.661130792760517 ], [ -121.409972864367703, 38.661139174663667 ], [ -121.409906647332633, 38.66117261845735 ], [ -121.40989055407853, 38.661235566550189 ], [ -121.409903126933315, 38.661344447472409 ], [ -121.409944114439824, 38.661398846024021 ], [ -121.41004075778342, 38.661411418878778 ], [ -121.4103304363571, 38.661407227927214 ], [ -121.410314343103025, 38.661537147426387 ], [ -121.409976300948003, 38.661532956474801 ], [ -121.409911927931617, 38.661583164074784 ], [ -121.409879741423438, 38.661641837396992 ], [ -121.409906647332633, 38.661733954512876 ], [ -121.409954843275884, 38.661788436883526 ], [ -121.410089037545703, 38.661809391641476 ], [ -121.410319623702009, 38.661801093557308 ], [ -121.410308978684967, 38.661901592576385 ], [ -121.410013935693257, 38.661897317805746 ], [ -121.409929949023478, 38.661922463515275 ], [ -121.40989055407853, 38.661960182079532 ], [ -121.409895834677542, 38.662425126248571 ], [ -121.409949562676914, 38.662492181473958 ], [ -121.410046038382433, 38.662508945280337 ], [ -121.410319623702009, 38.662508945280337 ], [ -121.410298249848907, 38.662622017154142 ], [ -121.409967583768704, 38.662622017154142 ], [ -121.40989055407853, 38.662672224754132 ], [ -121.409881669261182, 38.662747661882705 ], [ -121.409901282914603, 38.663200033196951 ], [ -121.409949562676914, 38.663254599386647 ], [ -121.410056851037496, 38.663275470325551 ], [ -121.41032507193907, 38.663271279373951 ], [ -121.410319623702009, 38.663380160296178 ], [ -121.409976300948003, 38.663384351247757 ], [ -121.409940677859524, 38.663430451715193 ], [ -121.409967583768704, 38.663480659315212 ], [ -121.410030028947332, 38.663484850266826 ], [ -121.41032507193907, 38.663493232169976 ], [ -121.410319623702009, 38.663602196911235 ], [ -121.409972864367703, 38.663610578814406 ], [ -121.409906647332633, 38.663652488330264 ], [ -121.409903126933315, 38.663694397846108 ], [ -121.409897762515257, 38.663916350642175 ], [ -121.409992478021152, 38.663979131096944 ], [ -121.41018551325125, 38.663991787770755 ], [ -121.410266063340728, 38.663987596819162 ], [ -121.410257178523366, 38.664113157728693 ], [ -121.410010415293925, 38.664121539631871 ], [ -121.409917376168707, 38.66418432008664 ], [ -121.409903126933315, 38.664305857682649 ], [ -121.409924500786374, 38.66443988431439 ], [ -121.409992478021152, 38.66450693953977 ], [ -121.410115859635866, 38.664527894297706 ], [ -121.410266063340728, 38.664519428575481 ], [ -121.410319623702009, 38.664523619527081 ], [ -121.41032507193907, 38.664657729977876 ], [ -121.410003123038166, 38.66466602806203 ], [ -121.409911927931617, 38.664741465190588 ], [ -121.409901282914603, 38.664800138512796 ], [ -121.409917376168707, 38.6650891465342 ], [ -121.409970936529987, 38.665135247001665 ], [ -121.410072944291628, 38.665151926988983 ], [ -121.410335716956112, 38.665147736037419 ], [ -121.410319623702009, 38.665319565052442 ], [ -121.410035309546345, 38.665315374100857 ], [ -121.409949562676914, 38.66535309266515 ], [ -121.409908407532271, 38.665436744058823 ], [ -121.409895834677542, 38.665558281654832 ], [ -121.409928021185721, 38.66567973543183 ], [ -121.409993819125646, 38.665727177003767 ], [ -121.41012407390096, 38.665734385440473 ], [ -121.410335716956112, 38.665738324934992 ], [ -121.410335800775144, 38.66587277066192 ] ] } },
{ "type": "Feature", "properties": { "id": 661.0, "osm_id": 172995352.0, "name": "H", "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.395647018377716, 38.655465967319707 ], [ -121.39784114917147, 38.654463324062121 ], [ -121.400594855821069, 38.653113921470222 ] ] } },
{ "type": "Feature", "properties": { "id": 662.0, "osm_id": 175113445.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.792038954117643, 36.932250358987439 ], [ -121.791553139009721, 36.93201273203249 ] ] } },
{ "type": "Feature", "properties": { "id": 663.0, "osm_id": 175113453.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.789487251334535, 36.935493233506236 ], [ -121.788946283303744, 36.935232640136583 ], [ -121.788882748477675, 36.935202297647109 ] ] } },
{ "type": "Feature", "properties": { "id": 664.0, "osm_id": 175113449.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.788946283303744, 36.935232640136583 ], [ -121.789278541945521, 36.934795440067049 ] ] } },
{ "type": "Feature", "properties": { "id": 665.0, "osm_id": 175113450.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.786201545290524, 36.936629819576609 ], [ -121.786058130927245, 36.937206494514896 ] ] } },
{ "type": "Feature", "properties": { "id": 666.0, "osm_id": 179320266.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.246513850181671, 37.944791554603761 ], [ -121.240594633979583, 37.945791348014296 ] ] } },
{ "type": "Feature", "properties": { "id": 667.0, "osm_id": 184068113.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.494895733381767, 37.513658725685382 ], [ -122.494692556048861, 37.513571972987549 ] ] } },
{ "type": "Feature", "properties": { "id": 668.0, "osm_id": 184068114.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.488706200802341, 37.506945156519514 ], [ -122.488608132535219, 37.507072561447764 ], [ -122.488145451480023, 37.507650745128686 ] ] } },
{ "type": "Feature", "properties": { "id": 669.0, "osm_id": 184068198.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.497490435328203, 37.514955741382458 ], [ -122.496933709319379, 37.514682994253171 ], [ -122.496406319971712, 37.514402116677829 ] ] } },
{ "type": "Feature", "properties": { "id": 670.0, "osm_id": 200089456.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.466503772131162, 36.951940623008497 ], [ -121.466858410454421, 36.952048665740378 ], [ -121.466962932786984, 36.952080433153412 ] ] } },
{ "type": "Feature", "properties": { "id": 671.0, "osm_id": 204797815.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.1144766037864, 37.656717444832537 ], [ -122.114501414219816, 37.656736890847931 ], [ -122.114514322350686, 37.656749296064632 ], [ -122.114522955710953, 37.656761282186167 ], [ -122.11453150525216, 37.656778968001859 ], [ -122.114539803336328, 37.65680755029166 ], [ -122.114542737002466, 37.656835629667292 ], [ -122.114542401726297, 37.656865469242597 ], [ -122.114538713688901, 37.656888351838269 ], [ -122.114530834699949, 37.656907881672673 ] ] } },
{ "type": "Feature", "properties": { "id": 672.0, "osm_id": 204797818.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.1144206126732, 37.656691880027871 ], [ -122.114393706764005, 37.656685593600493 ], [ -122.114371913815759, 37.656683917219873 ], [ -122.11434752247753, 37.656684420134049 ], [ -122.114325478072161, 37.656686683247905 ], [ -122.114299661810392, 37.656692969675277 ], [ -122.114268481130608, 37.656704117606495 ], [ -122.114244173611382, 37.656717277194502 ], [ -122.114216680968951, 37.656736220295663 ], [ -122.114198743696193, 37.656753151740077 ], [ -122.114182818080167, 37.656769999365466 ] ] } },
{ "type": "Feature", "properties": { "id": 673.0, "osm_id": 204797816.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.114762678141716, 37.656848118703017 ], [ -122.114738035346377, 37.656842754285002 ], [ -122.114716410036195, 37.656839820618885 ], [ -122.1146929407073, 37.656838730971458 ], [ -122.114666872988437, 37.656839820618885 ], [ -122.114640805269559, 37.656843927751432 ], [ -122.114613312627156, 37.656852477292666 ], [ -122.114589256565054, 37.656862787033617 ], [ -122.114571654568365, 37.656872426222243 ], [ -122.114550951267532, 37.656886591638624 ], [ -122.114530834699949, 37.656907881672673 ] ] } },
{ "type": "Feature", "properties": { "id": 674.0, "osm_id": 204797817.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.129685734732789, 37.662362572800888 ], [ -122.129744659512099, 37.662329129007247 ], [ -122.129781120790909, 37.662295433756491 ], [ -122.129805176853012, 37.662260145944117 ], [ -122.129817246793579, 37.6622236846653 ], [ -122.129817665888737, 37.662177919473997 ], [ -122.12980760760496, 37.662139195081302 ], [ -122.129789502694052, 37.662102649983481 ], [ -122.129766620098422, 37.662070295837232 ], [ -122.129743402226623, 37.662047077965461 ], [ -122.129683723076027, 37.661987063538703 ] ] } },
{ "type": "Feature", "properties": { "id": 675.0, "osm_id": 204797819.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.114131017918567, 37.656560619424191 ], [ -122.114161947141241, 37.656577634687615 ], [ -122.114176112557629, 37.656589788447221 ], [ -122.114192876363973, 37.656609485919681 ], [ -122.114203018466796, 37.65662583063088 ], [ -122.11420670650422, 37.656643516446593 ], [ -122.114210143084492, 37.656664471204515 ], [ -122.114210478360633, 37.65668936545692 ], [ -122.11420586831386, 37.656716522823189 ], [ -122.114200420076827, 37.656739489237914 ], [ -122.114182818080167, 37.656769999365466 ] ] } },
{ "type": "Feature", "properties": { "id": 676.0, "osm_id": 204797821.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.127950429318801, 37.663152734813067 ], [ -122.128001558928148, 37.663127924379644 ], [ -122.128032069055706, 37.663107975450096 ], [ -122.128065261392265, 37.663076794770319 ], [ -122.128088563083082, 37.663048463937592 ], [ -122.128102560861393, 37.663008733716524 ], [ -122.128108679650722, 37.662971266609325 ], [ -122.128103734327823, 37.662936649349255 ], [ -122.128091748206288, 37.662905217212355 ], [ -122.128072805105091, 37.662872192513824 ], [ -122.1280452286437, 37.66284008982467 ], [ -122.127993931396261, 37.662804550555229 ] ] } },
{ "type": "Feature", "properties": { "id": 677.0, "osm_id": 204797831.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.123409365636491, 37.665668395412538 ], [ -122.122985911888165, 37.665093732130963 ], [ -122.122975518328218, 37.665073783201407 ], [ -122.122969148081808, 37.665051571157967 ], [ -122.122971159738555, 37.665030281123911 ], [ -122.122975937423362, 37.66501117038468 ], [ -122.122986330983309, 37.6649918920074 ], [ -122.123002424237413, 37.664973032725271 ], [ -122.123024468642726, 37.664954257262146 ] ] } },
{ "type": "Feature", "properties": { "id": 678.0, "osm_id": 204797814.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.126695826051773, 37.663011667382641 ], [ -122.126645869908856, 37.662997837242393 ], [ -122.126612509934233, 37.662994316843083 ], [ -122.12658325709215, 37.662994987395301 ], [ -122.126548304555911, 37.662999429803982 ], [ -122.126512513829383, 37.663008985173633 ], [ -122.126477226017002, 37.663025497522881 ], [ -122.126445961518186, 37.663045194995348 ], [ -122.126419977618355, 37.663069921609711 ], [ -122.126386533824672, 37.663116860267465 ] ] } },
{ "type": "Feature", "properties": { "id": 679.0, "osm_id": 204797832.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.123004352075142, 37.665838045132773 ], [ -122.122598835599604, 37.665286599722968 ], [ -122.122583915811958, 37.66526245984182 ], [ -122.122577964660707, 37.665238571417802 ], [ -122.122576707375217, 37.665217616659859 ], [ -122.122580730688725, 37.665195739892582 ], [ -122.122590705153527, 37.665175623324942 ], [ -122.122606882226634, 37.665156344947626 ], [ -122.122629932460384, 37.665137234208402 ] ] } },
{ "type": "Feature", "properties": { "id": 680.0, "osm_id": 204797829.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.114481632928317, 37.656719791765447 ], [ -122.114467802788042, 37.656710320214856 ], [ -122.1144514580769, 37.656698166455243 ], [ -122.114440058688572, 37.656687856714349 ], [ -122.114428240205086, 37.656676289688001 ], [ -122.114417930464185, 37.656664052109363 ], [ -122.114410973484553, 37.65665089252137 ], [ -122.114406782532967, 37.656638319666641 ], [ -122.114406363437809, 37.656626249726031 ], [ -122.114407704542302, 37.656614598880616 ], [ -122.114413152779377, 37.656603786225517 ], [ -122.114420947949341, 37.656593225027521 ], [ -122.114430251861862, 37.656584591667254 ], [ -122.114443411449827, 37.656574868659568 ], [ -122.11446143254166, 37.656564558918689 ], [ -122.114485153327649, 37.656555338825186 ], [ -122.114513903255542, 37.656546537826848 ], [ -122.114549442524975, 37.656539664666248 ], [ -122.114606523285602, 37.656527762363758 ], [ -122.114657736713966, 37.656517787898991 ], [ -122.114677182729338, 37.656512423480947 ], [ -122.114695120002125, 37.656504376853903 ], [ -122.114710039789756, 37.65649423475103 ], [ -122.114725043396476, 37.656479482601448 ], [ -122.114737029517997, 37.656462886433175 ], [ -122.114743651221502, 37.6564502297594 ], [ -122.11474851272537, 37.65643598052398 ], [ -122.114750524382103, 37.656423659126332 ], [ -122.114750524382103, 37.656408571700595 ], [ -122.114747758354056, 37.656391724075249 ], [ -122.114740969012473, 37.656376552830487 ] ] } },
{ "type": "Feature", "properties": { "id": 681.0, "osm_id": 204797833.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.114885137747066, 37.656904361273334 ], [ -122.114907265971468, 37.656924394021907 ], [ -122.114922018121021, 37.656943840037279 ], [ -122.11492947801483, 37.656960436205537 ], [ -122.114934507156775, 37.656980468954146 ], [ -122.114936770270603, 37.657009637977204 ], [ -122.114935680623205, 37.657037633533783 ], [ -122.11493081911938, 37.657059845577209 ], [ -122.114922353397162, 37.657080716516084 ] ] } },
{ "type": "Feature", "properties": { "id": 682.0, "osm_id": 204797834.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.124199024734452, 37.665308644128338 ], [ -122.123776744452584, 37.664730041352257 ], [ -122.123767021444891, 37.664712858450763 ], [ -122.123761070293639, 37.664694418263743 ], [ -122.123760651198481, 37.664673463505842 ], [ -122.123764255416845, 37.664653766033361 ], [ -122.123770206568096, 37.664634487656059 ], [ -122.123784371984456, 37.664614035812313 ], [ -122.123810104427207, 37.664590566483461 ] ] } },
{ "type": "Feature", "properties": { "id": 683.0, "osm_id": 204797823.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.114530834699949, 37.656907881672673 ], [ -122.114071338767957, 37.657537530239061 ] ] } },
{ "type": "Feature", "properties": { "id": 684.0, "osm_id": 204797824.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.114182818080167, 37.656769999365466 ], [ -122.113707312713132, 37.657434684287104 ] ] } },
{ "type": "Feature", "properties": { "id": 685.0, "osm_id": 204798815.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.11592650539734, 37.657381794478091 ], [ -122.115894235070115, 37.657373747851054 ], [ -122.1158698437319, 37.657372071470412 ], [ -122.115846374403034, 37.657372490565571 ], [ -122.115813433523542, 37.657377016793298 ], [ -122.11578862309014, 37.657382632668416 ], [ -122.115766327227689, 37.657393193866412 ], [ -122.115729782129861, 37.657415657366911 ], [ -122.115705223153569, 37.657435857753555 ], [ -122.115687537337877, 37.657453292112152 ] ] } },
{ "type": "Feature", "properties": { "id": 686.0, "osm_id": 204798816.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.115629450748898, 37.657245588551518 ], [ -122.115658871229002, 37.657264783109788 ], [ -122.115676724682771, 37.657282049830307 ], [ -122.115692063565575, 37.657303088407296 ], [ -122.115707067172252, 37.657333347077753 ], [ -122.115712180133201, 37.657357822235035 ], [ -122.115712180133201, 37.657380034278418 ], [ -122.115707905362598, 37.65740694018762 ], [ -122.115698852907158, 37.657432840268413 ], [ -122.115687537337877, 37.657453292112152 ] ] } },
{ "type": "Feature", "properties": { "id": 687.0, "osm_id": 204798820.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.117686872701853, 37.660127370681607 ], [ -122.117327540512804, 37.660276065643906 ] ] } },
{ "type": "Feature", "properties": { "id": 688.0, "osm_id": 204798821.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.115687537337877, 37.657453292112152 ], [ -122.115267268712742, 37.658034325640138 ] ] } },
{ "type": "Feature", "properties": { "id": 689.0, "osm_id": 204797822.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.114048623810362, 37.656332380200766 ], [ -122.114064968521546, 37.656319723526963 ], [ -122.11407762519535, 37.656311425442837 ], [ -122.114096233020376, 37.656302289168394 ], [ -122.114126910786013, 37.656290889780074 ], [ -122.114160941312889, 37.65628275933399 ], [ -122.114219530816044, 37.656271359945656 ], [ -122.114301338191069, 37.656254093225101 ], [ -122.114373841653489, 37.656236742685529 ], [ -122.114400747562684, 37.656230037163013 ], [ -122.114419523025774, 37.656221990535983 ], [ -122.114435700098895, 37.656210591147648 ], [ -122.114450452248491, 37.656195922817105 ], [ -122.114461013446501, 37.656178991372698 ], [ -122.114465874950312, 37.656165161232444 ], [ -122.114467635149992, 37.656148732702263 ], [ -122.114465204398101, 37.656132471810082 ], [ -122.114457073951996, 37.65611168469021 ] ] } },
{ "type": "Feature", "properties": { "id": 690.0, "osm_id": 204797830.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.123804069456909, 37.665490279970101 ], [ -122.123381872994059, 37.664912683022379 ], [ -122.123368713406094, 37.664888878417379 ], [ -122.123364857730607, 37.664866331097834 ], [ -122.123366534111241, 37.664841688302531 ], [ -122.123373826367015, 37.664819643897168 ], [ -122.123388662335643, 37.664798521501176 ], [ -122.123416322616109, 37.664772369963288 ] ] } },
{ "type": "Feature", "properties": { "id": 691.0, "osm_id": 204797828.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.114235121155986, 37.656607222805818 ], [ -122.114215675140571, 37.656594230855902 ], [ -122.114202767009729, 37.656583669657905 ], [ -122.114192205811705, 37.656572773183768 ], [ -122.114180974061455, 37.656557853396144 ], [ -122.114172256882171, 37.656542765970435 ], [ -122.114166976283158, 37.656528768192139 ], [ -122.114163958798031, 37.656515440966089 ], [ -122.114163707340936, 37.656501946101976 ], [ -122.114166305730919, 37.656490379075578 ], [ -122.114171837786998, 37.656480153153687 ], [ -122.114180806423434, 37.65646917286054 ], [ -122.114191954354638, 37.656460288043206 ], [ -122.114205365399698, 37.656451319406791 ], [ -122.114222715939249, 37.656443356598771 ], [ -122.114244425068478, 37.656436148162058 ], [ -122.114260266865514, 37.656431035201123 ], [ -122.11429932653428, 37.656423491488276 ], [ -122.114539048965042, 37.656372445697919 ], [ -122.114552711467226, 37.656367416556009 ], [ -122.114566709245523, 37.656359621386066 ], [ -122.114578108633822, 37.656348221997746 ], [ -122.114588166917599, 37.656334727133647 ], [ -122.11459587826856, 37.65632148372665 ], [ -122.114600069220117, 37.656307737405434 ], [ -122.114602416153048, 37.656294493998438 ], [ -122.114602667610114, 37.656280663858197 ], [ -122.114601075048498, 37.65626918065086 ], [ -122.114596632639845, 37.656254428501235 ], [ -122.114581377576073, 37.656227187315942 ] ] } },
{ "type": "Feature", "properties": { "id": 692.0, "osm_id": 204798831.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.117720567952588, 37.660027877490961 ], [ -122.117723501618698, 37.660042797278592 ], [ -122.117723753075822, 37.66005796852334 ], [ -122.117721741419061, 37.660073055949049 ], [ -122.117716963734239, 37.660086886089275 ], [ -122.117708330373958, 37.660103817533681 ], [ -122.117698020633057, 37.660116893302657 ], [ -122.117686872701853, 37.660127370681607 ] ] } },
{ "type": "Feature", "properties": { "id": 693.0, "osm_id": 204798817.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.115241871546147, 37.657067892204267 ], [ -122.115260479371187, 37.65708147088737 ], [ -122.115282272319419, 37.657100330169534 ], [ -122.115296940649998, 37.65711717779493 ], [ -122.115308340038297, 37.657135534162862 ], [ -122.115318230684039, 37.657157746206288 ], [ -122.115323008368861, 37.657178868602251 ], [ -122.115324265654323, 37.65720108064567 ], [ -122.11532166726434, 37.657222622136842 ], [ -122.115317643950817, 37.657239218305115 ], [ -122.115309429685723, 37.657259251053716 ] ] } },
{ "type": "Feature", "properties": { "id": 694.0, "osm_id": 204798814.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.116231103758693, 37.657722770299216 ], [ -122.116213753219128, 37.657707599054454 ], [ -122.116201264183388, 37.657698546599029 ], [ -122.116189110423775, 37.657693433638066 ], [ -122.116171508427115, 37.657687817762948 ], [ -122.116151978592711, 37.6576840459065 ], [ -122.116134125138956, 37.657683375354267 ], [ -122.116117109875518, 37.657683123897165 ], [ -122.116100932802397, 37.65768672811555 ], [ -122.116077379654485, 37.657692260171622 ] ] } },
{ "type": "Feature", "properties": { "id": 695.0, "osm_id": 204798830.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.116077379654485, 37.657692260171622 ], [ -122.11596740908486, 37.657736935715555 ], [ -122.115942766289535, 37.657747580732575 ], [ -122.115930025796686, 37.657755878816737 ], [ -122.115920638065148, 37.657763673986679 ], [ -122.115910412143236, 37.657777336488849 ], [ -122.115898845116888, 37.657793262104896 ], [ -122.115523838768894, 37.658315035577452 ] ] } },
{ "type": "Feature", "properties": { "id": 696.0, "osm_id": 204798818.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.115141204889028, 37.65702179173681 ], [ -122.115114969532101, 37.657014667119086 ], [ -122.115095607335746, 37.657013074557483 ], [ -122.115074652577803, 37.657013996566846 ], [ -122.115046908478334, 37.657017768423273 ], [ -122.115024864072964, 37.657023551936454 ], [ -122.115001227106049, 37.657032772029957 ], [ -122.114967867131398, 37.657047356541455 ], [ -122.114947750563786, 37.657059258843979 ], [ -122.114934339518697, 37.657069149489701 ], [ -122.114922353397162, 37.657080716516084 ] ] } },
{ "type": "Feature", "properties": { "id": 697.0, "osm_id": 204798832.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.117808577935932, 37.660165927436211 ], [ -122.117793155234082, 37.660153438400492 ], [ -122.117778067808388, 37.660143966849908 ], [ -122.117763818572982, 37.660136087860934 ], [ -122.117753257374972, 37.660131226357095 ], [ -122.117739930148971, 37.660127119224519 ], [ -122.11772534563741, 37.660124185558402 ], [ -122.117708917107194, 37.660124269377455 ], [ -122.117686872701853, 37.660127370681607 ] ] } },
{ "type": "Feature", "properties": { "id": 698.0, "osm_id": 204798822.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.114922353397162, 37.657080716516084 ], [ -122.114481800566338, 37.657688991229392 ] ] } },
{ "type": "Feature", "properties": { "id": 699.0, "osm_id": 204798827.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.114977422501013, 37.655048775548764 ], [ -122.114947415287645, 37.655073669801197 ], [ -122.114912965665596, 37.655099066967821 ], [ -122.114871223787802, 37.655117423335767 ], [ -122.114804755295623, 37.655131421114056 ], [ -122.114740549917315, 37.655130163828574 ], [ -122.11467726654837, 37.655119351173504 ], [ -122.114628316233862, 37.655102838824256 ], [ -122.114429916585721, 37.655029497171483 ], [ -122.11462596930096, 37.655132762218578 ], [ -122.114665280426834, 37.655160087222903 ], [ -122.114698975677598, 37.655193028102403 ], [ -122.11473493404219, 37.655236865456004 ], [ -122.114756643171418, 37.655278774971833 ], [ -122.114759828294652, 37.655316158260007 ], [ -122.11475261985791, 37.655349182958531 ], [ -122.114722361187461, 37.655410370851662 ], [ -122.114771814416187, 37.65536125289907 ], [ -122.114819926540363, 37.655334598446998 ], [ -122.114856806914332, 37.655321271220963 ], [ -122.114908104161771, 37.655311045299079 ], [ -122.114965855474622, 37.655309117461357 ], [ -122.115075071673004, 37.655321522678044 ], [ -122.115011536846922, 37.655258323128102 ], [ -122.114977925415204, 37.655217754716745 ], [ -122.114961077789829, 37.655189256245954 ], [ -122.11495060041085, 37.655161931241608 ], [ -122.114947415287645, 37.655130834380849 ], [ -122.114953031162742, 37.655104766661978 ], [ -122.114977422501013, 37.655048775548764 ] ] } },
{ "type": "Feature", "properties": { "id": 700.0, "osm_id": 204797826.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.114389515812448, 37.655858718852421 ], [ -122.114371662358664, 37.655896437416708 ], [ -122.11436227462714, 37.65592585789684 ], [ -122.114361436436781, 37.6559518417967 ], [ -122.114365459750317, 37.655981262276832 ], [ -122.114375937129296, 37.656013784061123 ], [ -122.114390940735973, 37.656043455998372 ], [ -122.114407033990062, 37.656063572565991 ], [ -122.114428910757368, 37.656086455161656 ], [ -122.114457073951996, 37.65611168469021 ], [ -122.11447023353999, 37.656123586992706 ], [ -122.114581377576073, 37.656227187315942 ], [ -122.114663604046214, 37.656303965549021 ], [ -122.114740969012473, 37.656376552830487 ], [ -122.114845826621206, 37.656474956373742 ], [ -122.114870301778467, 37.656499263892961 ], [ -122.114921850482943, 37.656550561140392 ], [ -122.114962921808512, 37.656599762911995 ], [ -122.115009441371157, 37.656655837844255 ], [ -122.115037772203863, 37.656695735703337 ], [ -122.115043471898005, 37.656710571671958 ], [ -122.115043723355129, 37.656720462317701 ] ] } },
{ "type": "Feature", "properties": { "id": 701.0, "osm_id": 204797827.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.114675841624845, 37.656808472301037 ], [ -122.114655054504979, 37.656794893617885 ], [ -122.114640805269559, 37.65678181784893 ], [ -122.114633177737701, 37.656766562785172 ], [ -122.114629238243211, 37.656749798978822 ], [ -122.114629238243211, 37.656734627734032 ], [ -122.114634602661212, 37.656718953575108 ], [ -122.114643655116652, 37.656703279416213 ], [ -122.114653881038521, 37.656693640227523 ], [ -122.114666370074232, 37.656686431790817 ], [ -122.114679948757384, 37.656682157020185 ], [ -122.114805844943049, 37.656657933320062 ], [ -122.114841216574447, 37.656649132321697 ], [ -122.114858567114027, 37.656640834237557 ], [ -122.114872900168464, 37.65663052449667 ], [ -122.114887400860951, 37.656613928328355 ], [ -122.114895615126045, 37.656599595273924 ], [ -122.114899303163469, 37.656584340210152 ], [ -122.114900225172775, 37.656569923336683 ], [ -122.114897040049584, 37.656553578625505 ], [ -122.114891424174459, 37.656535892809835 ], [ -122.114880024786132, 37.656513429309314 ], [ -122.114870301778467, 37.656499263892961 ] ] } },
{ "type": "Feature", "properties": { "id": 702.0, "osm_id": 204800999.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.124535306689793, 37.664142386120766 ], [ -122.124547879544536, 37.664153869328103 ], [ -122.124560536218311, 37.664163424697719 ], [ -122.124573360530164, 37.664171387505718 ], [ -122.124590627250711, 37.664178763580502 ], [ -122.12460990562802, 37.664184379455655 ], [ -122.12462868109111, 37.664187648397878 ], [ -122.12465072549648, 37.664189073321417 ], [ -122.12467000387376, 37.664186726388536 ], [ -122.124699759630033, 37.664181948703742 ] ] } },
{ "type": "Feature", "properties": { "id": 703.0, "osm_id": 204798825.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.118289280082934, 37.660559625428256 ], [ -122.118263631459243, 37.660596924897384 ], [ -122.118239575397084, 37.660636068385209 ], [ -122.11822675108526, 37.660666159417588 ], [ -122.118205125775063, 37.660722653444992 ], [ -122.11818542830261, 37.660783254604929 ], [ -122.118171681981408, 37.660818542417267 ], [ -122.118167071934664, 37.660830528538831 ], [ -122.118152571242149, 37.660857518267044 ], [ -122.118132957588756, 37.660881658148185 ], [ -122.118112170468876, 37.660901690896772 ], [ -122.118088868778031, 37.660920047264725 ], [ -122.118061124678562, 37.660935218509465 ], [ -122.118027177970703, 37.66095173085872 ], [ -122.117945705871847, 37.660986096661752 ], [ -122.117594420309857, 37.661128924291823 ], [ -122.117569023143233, 37.661133031424377 ], [ -122.11754496708113, 37.661131522681799 ], [ -122.117519318457425, 37.661126493539911 ], [ -122.117494005109819, 37.661117860179637 ], [ -122.117467518295797, 37.661103527125206 ], [ -122.117439941834363, 37.661083578195672 ], [ -122.117420244361895, 37.661065557103782 ], [ -122.117404234926866, 37.661047452192975 ], [ -122.117168200533499, 37.660683426138135 ] ] } },
{ "type": "Feature", "properties": { "id": 704.0, "osm_id": 204801004.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.124984409061824, 37.664943276968991 ], [ -122.124566571188609, 37.664373139915114 ], [ -122.124555171800282, 37.664355370280404 ], [ -122.124549555925185, 37.664337852102733 ], [ -122.124546622259047, 37.664316394430607 ], [ -122.12454972356322, 37.664297283691383 ], [ -122.124555423257377, 37.664279178780532 ], [ -122.124564224255735, 37.664264594269028 ], [ -122.124580652785923, 37.664244561520441 ], [ -122.124606804323861, 37.664224528771868 ] ] } },
{ "type": "Feature", "properties": { "id": 705.0, "osm_id": 204801003.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.124594147650058, 37.665125080448817 ], [ -122.124171615911067, 37.664548992243702 ], [ -122.124162479636624, 37.664532563713493 ], [ -122.124156863761513, 37.664515296992946 ], [ -122.124154516828625, 37.664498952281761 ], [ -122.124155355018928, 37.664476488781254 ], [ -122.124162144360511, 37.664458048594256 ], [ -122.124172621739476, 37.664438937855017 ], [ -122.124187457708075, 37.664422844600942 ], [ -122.124203634781196, 37.664409098279734 ] ] } },
{ "type": "Feature", "properties": { "id": 706.0, "osm_id": 204801006.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.119190334674073, 37.659583468984678 ], [ -122.11915940545137, 37.659574835624419 ], [ -122.119136774312807, 37.659570896129921 ], [ -122.119113221164895, 37.659569974120579 ], [ -122.119089165102793, 37.659571231406062 ], [ -122.119064270850359, 37.659575338538602 ], [ -122.119038454588562, 37.659582966070495 ], [ -122.119018840935169, 37.659591264154635 ], [ -122.119000149291082, 37.659602747361959 ], [ -122.118979110714136, 37.659622696291514 ], [ -122.11896561585003, 37.659637532260177 ] ] } },
{ "type": "Feature", "properties": { "id": 707.0, "osm_id": 204801005.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.124640248117515, 37.662070882570468 ], [ -122.124675955025026, 37.662091585871288 ], [ -122.124695401040384, 37.662107092392155 ], [ -122.124713673589312, 37.662127292778806 ], [ -122.124726665539228, 37.662148750450939 ], [ -122.124736053270766, 37.662173057970172 ], [ -122.124739406032049, 37.662194096547083 ], [ -122.124739657489172, 37.662208681058651 ], [ -122.12473655618497, 37.662230222549766 ], [ -122.124729263929197, 37.662250171479322 ], [ -122.124724150968262, 37.662260984134427 ] ] } },
{ "type": "Feature", "properties": { "id": 708.0, "osm_id": 204801007.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.126199114469699, 37.663371251028771 ], [ -122.126174555493435, 37.663392038148686 ], [ -122.126152427269034, 37.66340578446988 ], [ -122.126128371206931, 37.663414082554027 ], [ -122.126103141678385, 37.663420368981384 ], [ -122.126075900493049, 37.663423051190406 ], [ -122.126050168050313, 37.663421458628811 ], [ -122.126021753398575, 37.663417351496264 ], [ -122.125998535526762, 37.663410645973713 ], [ -122.125971042884387, 37.663397654023797 ], [ -122.125942209137435, 37.663376950722956 ] ] } },
{ "type": "Feature", "properties": { "id": 709.0, "osm_id": 204801008.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.122763372358904, 37.658597924809541 ], [ -122.12273068293652, 37.658630027498681 ], [ -122.122707800340834, 37.65864586929569 ], [ -122.122678966593938, 37.658660118531088 ], [ -122.122648540285397, 37.658672523747789 ], [ -122.122614425939517, 37.658679564546475 ], [ -122.122573103156839, 37.658683671679022 ], [ -122.122527840879727, 37.6586823305745 ], [ -122.122489703220282, 37.658677217613572 ], [ -122.122455253598218, 37.658670679729099 ], [ -122.122416864481707, 37.658656933407876 ], [ -122.122097765427895, 37.658528774108341 ] ] } },
{ "type": "Feature", "properties": { "id": 710.0, "osm_id": 204798826.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.115788706909186, 37.657035035143792 ], [ -122.115795328612663, 37.657057498644285 ], [ -122.115799016650087, 37.657074597726776 ], [ -122.115799435745245, 37.657092032085373 ], [ -122.115796166802994, 37.657110723729474 ], [ -122.115788958366252, 37.657130169744811 ], [ -122.115778229530207, 37.657148023198587 ], [ -122.115763309742562, 37.657166044290399 ], [ -122.115744450460426, 37.657181047897097 ], [ -122.11572735137797, 37.657192195828301 ], [ -122.115708073000661, 37.657201164464716 ], [ -122.115680831815354, 37.657208037625288 ], [ -122.115651662792288, 37.657212563853001 ], [ -122.115622409950234, 37.65721524606203 ], [ -122.115590977813312, 37.657213066767213 ], [ -122.115566502656065, 37.657210384558191 ], [ -122.115542446593906, 37.657205690692422 ], [ -122.115509840990597, 37.657199739541149 ], [ -122.115484946738192, 37.657197560246338 ], [ -122.115461728866364, 37.65719814697956 ], [ -122.115433314214599, 37.657200661550519 ], [ -122.115408671419289, 37.657204936321122 ], [ -122.115385705004599, 37.657211893300726 ], [ -122.115365336979892, 37.657219939927806 ], [ -122.115343711669681, 37.657230249668736 ], [ -122.115327618415606, 37.657241229961883 ], [ -122.115309429685723, 37.657259251053716 ] ] } },
{ "type": "Feature", "properties": { "id": 711.0, "osm_id": 204801010.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.127137971444199, 37.663213084515903 ], [ -122.127111149354022, 37.663205121707897 ], [ -122.127092122433808, 37.663201349851477 ], [ -122.127067060543325, 37.663198667642433 ], [ -122.127042333928969, 37.663198751461472 ], [ -122.127012745810759, 37.663199841108892 ], [ -122.126988857386706, 37.663204367336583 ], [ -122.126963041124938, 37.663210821402046 ], [ -122.126932782454503, 37.663222723704557 ], [ -122.12691233061075, 37.663233955454793 ], [ -122.126888609824761, 37.663251725089538 ], [ -122.126864302305563, 37.66327427240909 ] ] } },
{ "type": "Feature", "properties": { "id": 712.0, "osm_id": 204801011.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.122763372358904, 37.658597924809541 ], [ -122.12274484835288, 37.658633799355108 ], [ -122.122737723735185, 37.658661543454613 ], [ -122.122737472278118, 37.658684761326413 ], [ -122.122741160315485, 37.658718372758145 ], [ -122.12275364935121, 37.658753828208539 ], [ -122.122768652957888, 37.658776962261321 ], [ -122.122789356258735, 37.658803197618283 ], [ -122.122813747596965, 37.658825493480698 ], [ -122.122849705961585, 37.658852734666013 ], [ -122.122876025137529, 37.6588664809872 ], [ -122.123165200797047, 37.659015175949484 ] ] } },
{ "type": "Feature", "properties": { "id": 713.0, "osm_id": 204801017.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.124717613083774, 37.662270288046933 ], [ -122.124709901732871, 37.662292164814254 ], [ -122.124707554799969, 37.662315969419247 ], [ -122.124712751579949, 37.662340696033603 ], [ -122.124723983330213, 37.662367350485681 ], [ -122.124752817077109, 37.662414624419597 ], [ -122.124865469855763, 37.662569186714116 ], [ -122.125631575805826, 37.663616673153719 ], [ -122.125656302420197, 37.663646764186119 ], [ -122.125673904416857, 37.663662270706965 ], [ -122.125695781184163, 37.663672748085929 ], [ -122.125718747598839, 37.663679034513322 ], [ -122.125743641851301, 37.663681046170083 ], [ -122.12576744645628, 37.663680459436854 ], [ -122.125794771460605, 37.663673921552395 ] ] } },
{ "type": "Feature", "properties": { "id": 714.0, "osm_id": 204801018.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.124515944493439, 37.662550997984241 ], [ -122.12450010269643, 37.662580753740492 ], [ -122.124493313354876, 37.662600954127122 ], [ -122.124488535670054, 37.662629117321778 ], [ -122.124488535670054, 37.662657867249706 ], [ -122.124495660287778, 37.66268904792949 ], [ -122.124507227314126, 37.662717881676414 ], [ -122.124526840967576, 37.662747469794603 ], [ -122.12528976179442, 37.66378649051201 ], [ -122.125310548914285, 37.663811720040549 ], [ -122.125333850605102, 37.663830579322685 ], [ -122.125358241943374, 37.663839464140054 ], [ -122.125383806748019, 37.663844493281964 ], [ -122.125407946629167, 37.663845163834218 ], [ -122.125435271633506, 37.663840721425522 ] ] } },
{ "type": "Feature", "properties": { "id": 715.0, "osm_id": 204798823.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.117389734234365, 37.658759024988534 ], [ -122.117427452798637, 37.658768580358128 ], [ -122.117467434476765, 37.658774699147443 ], [ -122.117509176354588, 37.658776878442282 ], [ -122.117548822756575, 37.658775537337768 ], [ -122.117584110568927, 37.658771430205213 ], [ -122.1176146206965, 37.658764473225574 ], [ -122.117642280976966, 37.658753995846624 ], [ -122.117668767790988, 37.658738489325749 ], [ -122.117690812196344, 37.658719127129416 ], [ -122.117680753912538, 37.658742261182191 ], [ -122.117676730599015, 37.658764137949468 ], [ -122.117675557132571, 37.658783835421914 ], [ -122.11767958044608, 37.658806969474682 ], [ -122.117687124158948, 37.658828259508773 ], [ -122.1176972662618, 37.65884913044767 ], [ -122.117714449163273, 37.658873354147815 ], [ -122.117737247939928, 37.658899338047647 ], [ -122.117762561287506, 37.658919957529477 ], [ -122.117810673411711, 37.65895164112348 ] ] } },
{ "type": "Feature", "properties": { "id": 716.0, "osm_id": 204801001.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.123790239316691, 37.661685398843524 ], [ -122.123819575977791, 37.661694032203791 ], [ -122.123842207116354, 37.661696965869901 ], [ -122.123868526292327, 37.661698390793426 ], [ -122.123896354210856, 37.661695624765386 ], [ -122.123921583739403, 37.661690427985427 ], [ -122.123944801611202, 37.661683219548664 ], [ -122.123967768025906, 37.661671568703255 ], [ -122.123989058059934, 37.661657068010797 ], [ -122.124007162970813, 37.661639885109288 ] ] } },
{ "type": "Feature", "properties": { "id": 717.0, "osm_id": 204801024.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.119777151715255, 37.657997277628141 ], [ -122.119258563365904, 37.658647964771461 ] ] } },
{ "type": "Feature", "properties": { "id": 718.0, "osm_id": 204798819.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.114884802470954, 37.657847576837447 ], [ -122.115309429685723, 37.657259251053716 ] ] } },
{ "type": "Feature", "properties": { "id": 719.0, "osm_id": 204801025.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.120106811967077, 37.66015645588562 ], [ -122.119930959638495, 37.660405482228917 ] ] } },
{ "type": "Feature", "properties": { "id": 720.0, "osm_id": 204801013.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.124090311450288, 37.661822694417488 ], [ -122.124054017809556, 37.661801655840499 ], [ -122.124034404156134, 37.661788831528646 ], [ -122.124021747482331, 37.661776593950016 ], [ -122.12401093482724, 37.661763099085924 ], [ -122.124001044181497, 37.661745161813123 ], [ -122.123994757754105, 37.661725631978747 ], [ -122.123991907906998, 37.661707862344009 ], [ -122.123991572630899, 37.661693277832498 ], [ -122.123993500468615, 37.6616782742258 ], [ -122.123998781067627, 37.661662683885893 ], [ -122.12401194065562, 37.661633095767705 ] ] } },
{ "type": "Feature", "properties": { "id": 721.0, "osm_id": 204801028.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.119071563106104, 37.658876623090066 ], [ -122.118779453780519, 37.659246851753238 ] ] } },
{ "type": "Feature", "properties": { "id": 722.0, "osm_id": 204801027.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.125374083740354, 37.659747670467851 ], [ -122.125811619086022, 37.659141575049368 ] ] } },
{ "type": "Feature", "properties": { "id": 723.0, "osm_id": 204801021.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.118840306397544, 37.659422787900859 ], [ -122.118808119889351, 37.659401665504866 ], [ -122.118788841512071, 37.659382387127529 ], [ -122.118775514286042, 37.659362186740907 ], [ -122.118767216201888, 37.65934374655393 ], [ -122.118762773793222, 37.659324971090804 ], [ -122.118761600326764, 37.659303345780607 ], [ -122.118765539821254, 37.659279876451748 ], [ -122.118770652782189, 37.659264872845043 ], [ -122.118779453780519, 37.659246851753238 ], [ -122.118761432688714, 37.659262693550211 ], [ -122.118748356919752, 37.65927325474825 ], [ -122.11872622869538, 37.659287587802666 ], [ -122.118705525394532, 37.659297226991299 ], [ -122.11867660782859, 37.659306698541876 ], [ -122.118644337501337, 37.65931047039831 ], [ -122.118617180135104, 37.659309380750912 ], [ -122.118595219548752, 37.659305944170605 ], [ -122.118564122687985, 37.659297143172289 ] ] } },
{ "type": "Feature", "properties": { "id": 724.0, "osm_id": 204801031.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.122697239142866, 37.659299741562272 ], [ -122.122698244971218, 37.659264621387941 ], [ -122.122700424266071, 37.659244672458385 ], [ -122.122707548883767, 37.659222628053051 ], [ -122.122716014605956, 37.659199745457386 ], [ -122.122736214992614, 37.659156494837035 ], [ -122.12275775648375, 37.659113328035687 ], [ -122.122774771747203, 37.659088433783246 ], [ -122.122794636857748, 37.659063539530841 ], [ -122.122816178348884, 37.659040656935169 ], [ -122.122839144763574, 37.659019366901077 ], [ -122.122861272987976, 37.65900478238958 ], [ -122.122882479203014, 37.658992460991897 ], [ -122.12290888219799, 37.658982570346147 ], [ -122.12293402790749, 37.658977373566209 ], [ -122.122960766178636, 37.658975194271392 ], [ -122.122988761735229, 37.658975529547497 ], [ -122.123017176386981, 37.658977625023304 ], [ -122.123048524704856, 37.65898382763163 ], [ -122.123093032610711, 37.658996484305433 ], [ -122.123123710376319, 37.659010398264684 ], [ -122.123143575486836, 37.659019366901077 ], [ -122.123473906290911, 37.659156075741883 ] ] } },
{ "type": "Feature", "properties": { "id": 725.0, "osm_id": 204801020.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.125059343276178, 37.662260816496364 ], [ -122.125092535612751, 37.662279843416549 ], [ -122.125126649958688, 37.66230146872676 ], [ -122.125162356866184, 37.662328793731106 ], [ -122.125191274432126, 37.662356034916421 ], [ -122.125219269988747, 37.662387718510395 ], [ -122.125293868926974, 37.66248905571976 ], [ -122.125438540575729, 37.662687958282092 ], [ -122.125942209137435, 37.663376950722956 ], [ -122.125980933530144, 37.663429924351 ], [ -122.12599652387, 37.663453477498912 ], [ -122.126004570497045, 37.663473091152341 ], [ -122.126009012905755, 37.663497147214457 ], [ -122.126006582153806, 37.663520616543366 ], [ -122.126000547183537, 37.663541319844171 ], [ -122.125989734528446, 37.66356193932598 ], [ -122.125974144188561, 37.663580044236824 ], [ -122.125950004307413, 37.66360083135671 ] ] } },
{ "type": "Feature", "properties": { "id": 726.0, "osm_id": 204801032.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.118286178778746, 37.656789445380838 ], [ -122.118577366094996, 37.65693738597183 ], [ -122.118626651685673, 37.656961525852964 ], [ -122.118682223703686, 37.657004692654326 ], [ -122.118712817650277, 37.657039226095392 ], [ -122.118732682760793, 37.657067976023264 ], [ -122.118746261443974, 37.657098067055649 ], [ -122.118753637518736, 37.657132516677706 ], [ -122.118753050785529, 37.657184149201235 ], [ -122.118746261443974, 37.657238547752868 ], [ -122.118738633912088, 37.657265453662035 ], [ -122.118728324171187, 37.657289593543176 ], [ -122.118708207603547, 37.657325216631662 ], [ -122.118737711902739, 37.657294538866054 ], [ -122.118759504850956, 37.657276182498116 ], [ -122.118793954473034, 37.65724986332215 ], [ -122.118829912837626, 37.657228321830999 ], [ -122.118866877030626, 37.657207953806271 ], [ -122.118890178721443, 37.657197895522472 ], [ -122.118912139307739, 37.657189932714438 ], [ -122.118940218683377, 37.657184568296408 ], [ -122.118972237553507, 37.657182221363534 ], [ -122.119014733802615, 37.657183562468028 ], [ -122.119086901988922, 37.65718834015285 ], [ -122.119126632209984, 37.657194039846985 ], [ -122.119163177307811, 37.657203259940495 ], [ -122.119189161207672, 37.657214324052681 ], [ -122.119375407096143, 37.657283642391931 ] ] } },
{ "type": "Feature", "properties": { "id": 727.0, "osm_id": 204801012.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.12377992957579, 37.661680621158688 ], [ -122.123804656190146, 37.661696295317626 ], [ -122.123819240701678, 37.661707024153714 ], [ -122.123832651746739, 37.661720686655869 ], [ -122.123845476058577, 37.661738288652515 ], [ -122.123854528514016, 37.66175413044953 ], [ -122.123860982579444, 37.661773995560019 ], [ -122.123863916245554, 37.661792854842176 ], [ -122.123863161874297, 37.661809534829516 ], [ -122.123860312027205, 37.661826633911971 ], [ -122.123854947609175, 37.661842391889948 ], [ -122.123846146610845, 37.661863765743014 ] ] } },
{ "type": "Feature", "properties": { "id": 728.0, "osm_id": 204798824.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.115160650904386, 37.654410661260158 ], [ -122.115193843240931, 37.654433040941633 ], [ -122.11522150352144, 37.654455839718288 ], [ -122.115238770241987, 37.654478387037813 ], [ -122.115255114953158, 37.65450562822312 ], [ -122.115266430522439, 37.654534881065196 ], [ -122.115270453835947, 37.654559356222443 ], [ -122.11527087293112, 37.654586681226832 ], [ -122.11526886127433, 37.654612329850544 ], [ -122.115258300076363, 37.654644683996786 ], [ -122.115235668937785, 37.654686090598446 ], [ -122.115269615645644, 37.654649796957706 ], [ -122.11529844939254, 37.654625992352706 ], [ -122.115324181835305, 37.654611659298304 ], [ -122.115352512668039, 37.654598667348353 ], [ -122.115381430233981, 37.654590117807118 ], [ -122.115413113827969, 37.654583747560721 ], [ -122.11544764726905, 37.65457997570428 ], [ -122.115481677795927, 37.654580981532689 ], [ -122.115518977265069, 37.65458592685556 ], [ -122.115575303654367, 37.654600259909962 ] ] } },
{ "type": "Feature", "properties": { "id": 729.0, "osm_id": 204801026.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.122763372358904, 37.658597924809541 ], [ -122.123219180253471, 37.65796408529156 ] ] } },
{ "type": "Feature", "properties": { "id": 730.0, "osm_id": 204801015.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.124245711935131, 37.662924244132554 ], [ -122.12423607274647, 37.662948216375646 ], [ -122.12423364199455, 37.662971769523523 ], [ -122.124236827117741, 37.662996496137893 ], [ -122.124244538468687, 37.66301862436228 ], [ -122.12425853624697, 37.663041255500879 ], [ -122.124932441262104, 37.663962342840556 ], [ -122.124950881449095, 37.663980783027597 ], [ -122.124972925854451, 37.663993439701379 ], [ -122.12499564081206, 37.664002575975836 ], [ -122.125015673560654, 37.664007186022545 ], [ -122.125035706309234, 37.664008778584169 ], [ -122.125057834533607, 37.66400785657482 ], [ -122.125083566976315, 37.664003833261297 ] ] } },
{ "type": "Feature", "properties": { "id": 731.0, "osm_id": 204797825.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.126088976262011, 37.659083488460375 ], [ -122.126058382315435, 37.659075441833323 ], [ -122.126033152786874, 37.659070999424642 ], [ -122.126004402858982, 37.659067898120483 ], [ -122.125963331533455, 37.659068484853719 ], [ -122.125932150853657, 37.659072927262407 ], [ -122.125897868869671, 37.65908248263198 ], [ -122.125867442561159, 37.659093462925163 ], [ -122.125845817250948, 37.659105951960882 ], [ -122.125828801987495, 37.6591205364724 ], [ -122.125811619086022, 37.659141575049368 ], [ -122.125824024302702, 37.659118776272756 ], [ -122.125831651834588, 37.659100336085771 ], [ -122.125836513338427, 37.659083320822326 ], [ -122.125839949918756, 37.659060186769558 ], [ -122.125838776452284, 37.659041998039669 ], [ -122.125834250224557, 37.659019785996257 ], [ -122.125827712340069, 37.659002686913787 ], [ -122.12581807315145, 37.658986761297768 ], [ -122.125799381507363, 37.658963124330811 ], [ -122.125781779510717, 37.658948791276408 ], [ -122.125743809489322, 37.658926243956849 ] ] } },
{ "type": "Feature", "properties": { "id": 732.0, "osm_id": 204801042.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.122097765427895, 37.658528774108341 ], [ -122.122399933037272, 37.658680486555802 ], [ -122.12248375206903, 37.658719546224567 ], [ -122.12252507485168, 37.658737232040295 ], [ -122.122557931912098, 37.658755336951138 ], [ -122.122587100935164, 37.658778219546797 ] ] } },
{ "type": "Feature", "properties": { "id": 733.0, "osm_id": 204801000.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.124535306689793, 37.664142386120766 ], [ -122.124542179850366, 37.664159485203228 ], [ -122.124546706078092, 37.664177590114072 ], [ -122.124546957535159, 37.664192677539766 ], [ -122.124545532611648, 37.664207848784528 ], [ -122.124539832917492, 37.664223522943473 ], [ -122.124531953928511, 37.664237269264682 ], [ -122.124521476549532, 37.664251183223975 ], [ -122.124507814047362, 37.664263756078697 ], [ -122.124489373860385, 37.664278424409247 ] ] } },
{ "type": "Feature", "properties": { "id": 734.0, "osm_id": 204798829.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.118071182962339, 37.660584184404534 ], [ -122.118164557363713, 37.660732544090749 ], [ -122.118174448009455, 37.660752660658368 ], [ -122.118178136046851, 37.660768586274393 ], [ -122.118177214037487, 37.66078585299492 ], [ -122.118171681981408, 37.660818542417267 ] ] } },
{ "type": "Feature", "properties": { "id": 735.0, "osm_id": 204801029.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.119258563365904, 37.658647964771461 ], [ -122.119240709912148, 37.658676295604231 ], [ -122.119235345494118, 37.658695993076684 ], [ -122.11923425584672, 37.658716864015588 ], [ -122.119237608607989, 37.658741087715754 ], [ -122.11924448176859, 37.658760366093027 ], [ -122.119261161755901, 37.658784841250281 ], [ -122.119279015209642, 37.658803281437294 ], [ -122.119299131777282, 37.658817865948812 ], [ -122.119318158697467, 37.658828846241974 ], [ -122.119540446769633, 37.658943929772548 ], [ -122.119304831471453, 37.658846783514754 ], [ -122.119272728782278, 37.658836641411924 ], [ -122.119245236139875, 37.65882943297521 ], [ -122.119215731840697, 37.658825661118769 ], [ -122.119191172864404, 37.658825661118769 ], [ -122.119166110973921, 37.658828343327777 ], [ -122.119142641645027, 37.658834126840979 ], [ -122.119115400459719, 37.658844939496042 ], [ -122.119093607511473, 37.658858266722092 ], [ -122.119071563106104, 37.658876623090066 ] ] } },
{ "type": "Feature", "properties": { "id": 736.0, "osm_id": 204798828.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.114216680968951, 37.656100369120914 ], [ -122.114232438946956, 37.6560693560792 ], [ -122.114242329592699, 37.656035996104571 ], [ -122.114244005973333, 37.656008754919242 ], [ -122.114239815021776, 37.655978244791676 ], [ -122.114231600756654, 37.655952260891851 ], [ -122.114214836950296, 37.655920828754958 ], [ -122.114197318772653, 37.655896521235761 ], [ -122.114181728432769, 37.655877745772628 ], [ -122.114165216083521, 37.655862239251761 ], [ -122.114145350973004, 37.65584547544541 ], [ -122.114174352357949, 37.655854863176977 ], [ -122.114198408420052, 37.65585863503339 ], [ -122.114233025680178, 37.655860479052087 ], [ -122.114262278522261, 37.655859724680802 ], [ -122.114290274078854, 37.655856120462445 ], [ -122.114325729529256, 37.655847822378313 ], [ -122.114350037048453, 37.655840278665437 ], [ -122.114376440043458, 37.655829298372289 ], [ -122.114401166657842, 37.655816054965278 ], [ -122.114423211063198, 37.655798788244766 ], [ -122.114447183306268, 37.655779174591352 ], [ -122.114437627936624, 37.655803817386655 ], [ -122.11443251497569, 37.655828544001004 ], [ -122.114429581309579, 37.655852180967948 ], [ -122.114429078395389, 37.655872381354612 ], [ -122.11443234733764, 37.655899873997036 ], [ -122.11444014250759, 37.655923343325917 ], [ -122.114451374257825, 37.655945220093201 ], [ -122.114465372036122, 37.655965588117873 ], [ -122.114485404784716, 37.655986123780664 ], [ -122.11450862265653, 37.656005234519888 ], [ -122.114539551879261, 37.656025770182708 ], [ -122.114507616828135, 37.656015460441743 ], [ -122.114481800566338, 37.656010096023728 ], [ -122.11446143254166, 37.656007832909893 ], [ -122.114438466126956, 37.656006659443435 ], [ -122.114405022333315, 37.656008419643094 ], [ -122.114375937129296, 37.656013784061123 ], [ -122.114350875238813, 37.656019232298213 ], [ -122.114314330140957, 37.656031386057826 ], [ -122.114288513879188, 37.656043455998372 ], [ -122.114260434503549, 37.656060387442785 ], [ -122.11424266486884, 37.65607555868754 ], [ -122.114216680968951, 37.656100369120914 ] ] } },
{ "type": "Feature", "properties": { "id": 737.0, "osm_id": 204801047.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.123978748319033, 37.663293131691226 ], [ -122.123971120787147, 37.663312745344641 ], [ -122.123968606216209, 37.663328838598758 ], [ -122.123968857673304, 37.66334753024281 ], [ -122.123973132443908, 37.663365048420417 ], [ -122.12398134670903, 37.663380974036485 ], [ -122.124535306689793, 37.664142386120766 ] ] } },
{ "type": "Feature", "properties": { "id": 738.0, "osm_id": 204801034.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.123859222379778, 37.66184557701316 ], [ -122.123928959814222, 37.661748933669557 ], [ -122.124007162970813, 37.661639885109288 ] ] } },
{ "type": "Feature", "properties": { "id": 739.0, "osm_id": 204801035.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.124478309748199, 37.660984252643026 ], [ -122.124486440194275, 37.660973020892804 ], [ -122.125095217821766, 37.660133070375785 ] ] } },
{ "type": "Feature", "properties": { "id": 740.0, "osm_id": 204801022.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.125438540575729, 37.662687958282092 ], [ -122.125427811739712, 37.662663566943891 ], [ -122.125423872245193, 37.662650742632017 ], [ -122.125422112045541, 37.662638672691415 ], [ -122.125424123702288, 37.662624339636984 ], [ -122.125429236663209, 37.662610174220639 ], [ -122.125437702385426, 37.662600032117794 ], [ -122.125446503383756, 37.662590476748193 ], [ -122.125459830609813, 37.662580167007278 ], [ -122.125477181149364, 37.662570946913796 ], [ -122.125500147564068, 37.662561056268075 ], [ -122.125524538902312, 37.66255368019327 ], [ -122.12554666712667, 37.662549824517797 ], [ -122.125575500873609, 37.662546471756507 ], [ -122.125603664068294, 37.662545968842352 ], [ -122.12563643730968, 37.662546471756507 ], [ -122.125663175580797, 37.662550495070043 ], [ -122.125688069833231, 37.662555859488066 ], [ -122.125723106188502, 37.662566169228974 ] ] } },
{ "type": "Feature", "properties": { "id": 741.0, "osm_id": 204801023.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.124724150968262, 37.662260984134427 ], [ -122.124717613083774, 37.662270288046933 ], [ -122.124671344978282, 37.662336169805911 ], [ -122.124515944493439, 37.662550997984241 ], [ -122.124245711935131, 37.662924244132554 ], [ -122.123978748319033, 37.663293131691226 ], [ -122.123950082210186, 37.663332442817108 ], [ -122.12393197729935, 37.663351050642113 ], [ -122.123914040026563, 37.663366976258139 ], [ -122.123895013106335, 37.663379968208112 ], [ -122.123859641474951, 37.663398659852184 ], [ -122.123151035380673, 37.6637254702569 ], [ -122.123130667355966, 37.663729996484605 ], [ -122.123107700941247, 37.663731756684264 ], [ -122.123082471412687, 37.663730667036866 ], [ -122.123050703999681, 37.663725218799804 ], [ -122.123026647937579, 37.663717591267911 ], [ -122.123007956293492, 37.663708874088599 ], [ -122.122982559126868, 37.663693032291619 ] ] } },
{ "type": "Feature", "properties": { "id": 742.0, "osm_id": 204801040.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.124486440194275, 37.660973020892804 ], [ -122.124459366647017, 37.66100227373488 ], [ -122.1244395015365, 37.66101828316993 ], [ -122.124417960045363, 37.661030772205649 ], [ -122.12439356870712, 37.661040662851384 ], [ -122.124362136570198, 37.661050553497127 ], [ -122.124325256196229, 37.661055666458068 ], [ -122.124283346680386, 37.661057426657734 ], [ -122.124238838774531, 37.661054325353575 ], [ -122.124196258706405, 37.661047116916833 ], [ -122.124167173502414, 37.661040495213328 ], [ -122.124132220966175, 37.661026748892134 ], [ -122.123811780807841, 37.660895488288432 ], [ -122.124120653939784, 37.661044937622016 ], [ -122.124158372504056, 37.661068490769928 ], [ -122.124187960622265, 37.661090954270463 ], [ -122.124217632559493, 37.66112205113123 ], [ -122.124238419679358, 37.661150381963928 ], [ -122.124251746905429, 37.661178545158585 ], [ -122.124259374437315, 37.661210647847774 ], [ -122.124260966998904, 37.661238559585307 ], [ -122.124255351123779, 37.661272590112205 ], [ -122.124247723591893, 37.661295053612704 ], [ -122.124236910936801, 37.66131927731287 ], [ -122.124257530418603, 37.661294466879482 ], [ -122.124281754118783, 37.661273679759603 ], [ -122.124301032496078, 37.661262531828399 ], [ -122.124332213175876, 37.661248953145247 ], [ -122.124362807122466, 37.661239733051779 ], [ -122.124391473231313, 37.661234117176654 ], [ -122.124427431595933, 37.661230345320213 ], [ -122.12446313850343, 37.661231686424735 ], [ -122.124494905916464, 37.661235625919225 ], [ -122.12453262448075, 37.661242834355924 ], [ -122.124561206770579, 37.661249372240427 ], [ -122.124579479319479, 37.661257418867457 ], [ -122.124877120701214, 37.661382141586692 ], [ -122.12459054343168, 37.661237637575987 ], [ -122.124564140436689, 37.661222717788327 ], [ -122.124533630309159, 37.66119799117395 ], [ -122.124507562590267, 37.661171336721871 ], [ -122.124487110746543, 37.661145688098152 ], [ -122.124473532063405, 37.661120290931564 ], [ -122.124463054684412, 37.661096486326549 ], [ -122.12445660061897, 37.661067820217681 ], [ -122.12445660061897, 37.661040998127525 ], [ -122.124463473779571, 37.661013924580267 ], [ -122.124478309748199, 37.660984252643026 ] ] } },
{ "type": "Feature", "properties": { "id": 743.0, "osm_id": 204801009.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.126796744165986, 37.663057684031067 ], [ -122.126822476608723, 37.66307578894191 ], [ -122.126841419709891, 37.663093474757609 ], [ -122.126857345325917, 37.663111831125548 ], [ -122.12687125928521, 37.663135468092527 ], [ -122.126880563197716, 37.663157847774002 ], [ -122.126885927615746, 37.663180227455477 ], [ -122.126887017263144, 37.663199589651803 ], [ -122.126885927615746, 37.663217024010393 ], [ -122.126880814654825, 37.663238649320576 ], [ -122.12687343858002, 37.663257760059828 ], [ -122.126864302305563, 37.66327427240909 ] ] } },
{ "type": "Feature", "properties": { "id": 744.0, "osm_id": 204801037.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.114722361187461, 37.655410370851662 ], [ -122.114447183306268, 37.655779174591352 ], [ -122.114389515812448, 37.655858718852421 ], [ -122.114334530527614, 37.655931641410049 ], [ -122.114216680968951, 37.656100369120914 ], [ -122.114086342374634, 37.656279741848856 ], [ -122.114048623810362, 37.656332380200766 ], [ -122.11402507066245, 37.65636515344216 ], [ -122.114012246350569, 37.656386946390434 ], [ -122.114004367361616, 37.65640463220614 ], [ -122.113998667667445, 37.656431119020134 ], [ -122.11400034404808, 37.656456097091613 ], [ -122.11401031851284, 37.656477638582743 ], [ -122.11402507066245, 37.656498928616834 ], [ -122.114043427030396, 37.656516279156421 ], [ -122.114066477264117, 37.656531785677295 ], [ -122.114131017918567, 37.656560619424191 ], [ -122.114235121155986, 37.656607222805818 ], [ -122.114240820850128, 37.656609737376776 ], [ -122.1144206126732, 37.656691880027871 ], [ -122.1144766037864, 37.656717444832537 ], [ -122.114481632928317, 37.656719791765447 ], [ -122.114675841624845, 37.656808472301037 ], [ -122.114762678141716, 37.656848118703017 ], [ -122.114885137747066, 37.656904361273334 ], [ -122.115141204889028, 37.65702179173681 ], [ -122.115241871546147, 37.657067892204267 ], [ -122.115542446593906, 37.657205690692422 ], [ -122.115629450748898, 37.657245588551518 ], [ -122.11592650539734, 37.657381794478091 ], [ -122.11595902718166, 37.65739721717992 ], [ -122.115988280023743, 37.657413142795946 ], [ -122.116013174276176, 37.657429655145208 ], [ -122.116039577271181, 37.657451196636352 ], [ -122.116083582262831, 37.657496878008658 ] ] } },
{ "type": "Feature", "properties": { "id": 745.0, "osm_id": 204801039.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.122533875849996, 37.660079342376413 ], [ -122.122505377379213, 37.66010884667557 ], [ -122.122481656593223, 37.660128292690956 ], [ -122.12245726525498, 37.660141871374101 ], [ -122.122424324375515, 37.660155282419169 ], [ -122.122384677973514, 37.660165089245886 ], [ -122.122342517000575, 37.66016944783555 ], [ -122.122302870598531, 37.660169196378455 ], [ -122.122261966911054, 37.660164418693626 ], [ -122.122222320509039, 37.660154528047904 ], [ -122.1221942411334, 37.660145391773412 ], [ -122.122171358537742, 37.660135584946708 ], [ -122.121845637780424, 37.659997199725346 ], [ -122.122163731005855, 37.6601561206095 ], [ -122.122197426256605, 37.660172381501624 ], [ -122.122227517289033, 37.660192330431201 ], [ -122.122249142599173, 37.660211692627513 ], [ -122.122271270823575, 37.660238095622553 ], [ -122.122289208096362, 37.66027003067363 ], [ -122.122300020751453, 37.660298948239571 ], [ -122.12230681009305, 37.660335744794494 ], [ -122.122305636626578, 37.660363321255971 ], [ -122.122299601656309, 37.660389472793852 ], [ -122.12228325694511, 37.660426520805871 ], [ -122.122310833406544, 37.66039869288732 ], [ -122.122336901125422, 37.66037924687199 ], [ -122.122356514778843, 37.660367176931416 ], [ -122.122380654659992, 37.660357034828536 ], [ -122.12241233825398, 37.660346892725691 ], [ -122.122452403751169, 37.6603395166509 ], [ -122.122492469248314, 37.660337672632217 ], [ -122.122525326308775, 37.66033993574608 ], [ -122.122569834214616, 37.660350077848911 ], [ -122.12261233046371, 37.66036248306564 ], [ -122.1226360512497, 37.660371619340097 ], [ -122.122947941866769, 37.660500784467985 ], [ -122.122648037371206, 37.66035326297213 ], [ -122.122622304928498, 37.660340857755422 ], [ -122.122592381534176, 37.660322166111371 ], [ -122.12256740346271, 37.660301546629547 ], [ -122.122545442876387, 37.660276736196174 ], [ -122.122527337965508, 37.660251087572469 ], [ -122.122517363500748, 37.660227534424521 ], [ -122.122508143407273, 37.660192917164423 ], [ -122.122506131750498, 37.660165675979108 ], [ -122.122507724312086, 37.660138770069949 ], [ -122.122516525310445, 37.660112367074909 ], [ -122.122533875849996, 37.660079342376413 ] ] } },
{ "type": "Feature", "properties": { "id": 746.0, "osm_id": 204801019.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.122107572254606, 37.660913928475431 ], [ -122.122081755992824, 37.660897080850049 ], [ -122.122063483443895, 37.660878556844025 ], [ -122.122049066570426, 37.660857853543177 ], [ -122.122038673010508, 37.66083362984299 ], [ -122.122034649696971, 37.660818039503077 ], [ -122.122034062963749, 37.660801778610953 ], [ -122.122035823163444, 37.660784428071395 ], [ -122.122039427381793, 37.660770681750158 ], [ -122.122051581141378, 37.660745619859675 ], [ -122.122026016336733, 37.660767999541171 ], [ -122.122004307207504, 37.660781242948161 ], [ -122.121975054365407, 37.660794570174218 ], [ -122.121942281124007, 37.660803119715446 ], [ -122.121918979433175, 37.66080638865769 ], [ -122.121892576438185, 37.660807562124127 ], [ -122.12186768218578, 37.660804377000922 ] ] } },
{ "type": "Feature", "properties": { "id": 747.0, "osm_id": 204801048.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.124082935375498, 37.663750448328365 ], [ -122.123366115016097, 37.664082790789166 ], [ -122.123343148601407, 37.664089244854644 ], [ -122.123321942386383, 37.664090166863964 ], [ -122.123301239085563, 37.664085892093354 ], [ -122.123280871060828, 37.664076839637929 ], [ -122.123247678724255, 37.664057142165468 ] ] } },
{ "type": "Feature", "properties": { "id": 748.0, "osm_id": 204801014.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.126864302305563, 37.66327427240909 ], [ -122.126798839641793, 37.663368317362668 ], [ -122.126786434425085, 37.663387847197093 ], [ -122.126777381969646, 37.663408047583715 ], [ -122.126771682275503, 37.663428499427468 ], [ -122.126768832428411, 37.663449957099587 ], [ -122.126768832428411, 37.663474851351999 ], [ -122.126771682275503, 37.663500080880567 ], [ -122.126777968702868, 37.663522628200127 ], [ -122.126793223766654, 37.663554982346369 ], [ -122.126805964259489, 37.663579038408464 ], [ -122.126830355597704, 37.663613571849531 ], [ -122.127092038614791, 37.663978771370829 ] ] } },
{ "type": "Feature", "properties": { "id": 749.0, "osm_id": 204801033.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.124090311450288, 37.661822694417488 ], [ -122.123928959814222, 37.661748933669557 ], [ -122.123790239316691, 37.661685398843524 ] ] } },
{ "type": "Feature", "properties": { "id": 750.0, "osm_id": 204801036.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.124007162970813, 37.661639885109288 ], [ -122.12401194065562, 37.661633095767705 ], [ -122.124236910936801, 37.66131927731287 ] ] } },
{ "type": "Feature", "properties": { "id": 751.0, "osm_id": 204801050.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.125798627136078, 37.664573048305805 ], [ -122.125382717100621, 37.664005258184858 ], [ -122.125372574997769, 37.663987740007222 ], [ -122.125364025456548, 37.663966282335082 ], [ -122.125362349075914, 37.663942980644258 ], [ -122.125363438723312, 37.663919595134395 ], [ -122.125373664645196, 37.663895790529402 ], [ -122.125391266641856, 37.663874249038258 ], [ -122.125424458978401, 37.663845750567447 ] ] } },
{ "type": "Feature", "properties": { "id": 752.0, "osm_id": 204801052.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.124090311450288, 37.661822694417488 ], [ -122.124047479925068, 37.661807523172747 ], [ -122.12402266949168, 37.661800230916974 ], [ -122.123998948705704, 37.661796375241522 ], [ -122.123970869330051, 37.661797381069881 ], [ -122.123944801611202, 37.661802158754689 ], [ -122.123919572082656, 37.661809786286611 ], [ -122.123889145774129, 37.661823364969727 ], [ -122.123859222379778, 37.66184557701316 ] ] } },
{ "type": "Feature", "properties": { "id": 753.0, "osm_id": 204802920.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.121148514893477, 37.661903160687928 ], [ -122.121139546257098, 37.661927552026192 ], [ -122.121135858219702, 37.661952697735707 ], [ -122.121137953695509, 37.661992344137715 ], [ -122.12114432394192, 37.662029475968779 ], [ -122.121160333376949, 37.662067529809171 ], [ -122.121181539591987, 37.662096028279969 ], [ -122.121200482693155, 37.662114719924048 ], [ -122.121230154630382, 37.662135171767794 ], [ -122.121264520433414, 37.662151935574137 ], [ -122.121302238997686, 37.662170627218245 ], [ -122.122723977413983, 37.662825170037038 ], [ -122.122755241912827, 37.662837575253747 ], [ -122.122792541381941, 37.66284738208045 ], [ -122.122830259946198, 37.662854674336216 ], [ -122.122898320999965, 37.662860038754246 ], [ -122.122949618247432, 37.662860793125525 ], [ -122.122979709279804, 37.662859452021003 ], [ -122.123040645715875, 37.662846962985284 ] ] } },
{ "type": "Feature", "properties": { "id": 754.0, "osm_id": 204801049.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.125379448158384, 37.664758875099189 ], [ -122.124959430990344, 37.664188989502392 ], [ -122.124944008288509, 37.664162921783522 ], [ -122.124939230603701, 37.664144230139478 ], [ -122.124940823165304, 37.664116653678001 ], [ -122.124948953611366, 37.664091256511377 ], [ -122.124963705760976, 37.664071223762811 ], [ -122.124993042422062, 37.664045826596194 ] ] } },
{ "type": "Feature", "properties": { "id": 755.0, "osm_id": 204801002.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.120336979028224, 37.660105661552379 ], [ -122.120304708700999, 37.660094345983097 ], [ -122.120280652638897, 37.660089652117335 ], [ -122.1202582729574, 37.660088646288933 ], [ -122.120230528857903, 37.660089987393434 ], [ -122.120206556614832, 37.660094094526009 ], [ -122.120181243267282, 37.660102057334022 ], [ -122.120155259367422, 37.660114797826843 ], [ -122.120130365114989, 37.660131561633207 ], [ -122.120106811967077, 37.66015645588562 ] ] } },
{ "type": "Feature", "properties": { "id": 756.0, "osm_id": 204801045.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.119375407096143, 37.657283642391931 ], [ -122.119558048766294, 37.657383554677764 ], [ -122.119593671854801, 37.657402916874076 ], [ -122.119626109820075, 37.657426721479091 ], [ -122.119677407067513, 37.657476845260085 ], [ -122.119756867509579, 37.657564771424362 ], [ -122.119803722348308, 37.657623528565622 ], [ -122.119825347658491, 37.657660073663443 ], [ -122.119836244132657, 37.657688823591329 ], [ -122.119843871664543, 37.657724446679843 ], [ -122.1198446260358, 37.65776065650153 ], [ -122.119841860007753, 37.657815557967304 ], [ -122.11983222081912, 37.657865346472192 ], [ -122.119816127565016, 37.657919996480857 ], [ -122.119799363758659, 37.657958972330626 ], [ -122.119777151715255, 37.657997277628141 ], [ -122.119821743440141, 37.6579443878191 ], [ -122.119841440912623, 37.657924690346626 ], [ -122.119869436469202, 37.657900550465499 ], [ -122.119899527501602, 37.657878673698221 ], [ -122.119928445067544, 37.657858976225775 ], [ -122.119982508343, 37.657831735040475 ], [ -122.120033051219153, 37.65781078028251 ], [ -122.1200735358115, 37.65779862652289 ], [ -122.120122067030863, 37.657788232962979 ], [ -122.120162132528023, 37.657783790554298 ], [ -122.120204628777117, 37.657783790554298 ], [ -122.120276377868265, 37.657787981505876 ], [ -122.120352150272964, 37.657794854666484 ], [ -122.120452314015878, 37.657808265711544 ], [ -122.120506042015222, 37.657818323995357 ], [ -122.120539737265986, 37.657828549917248 ], [ -122.120849280950182, 37.657958972330626 ], [ -122.120553315949138, 37.657804074759959 ], [ -122.12052138089804, 37.657785634572981 ], [ -122.120486847456959, 37.657763757805718 ], [ -122.120451140549463, 37.65773458878266 ], [ -122.120418618765157, 37.657704162474154 ], [ -122.120381403115033, 37.657665018986322 ], [ -122.120359358709706, 37.657636520515531 ], [ -122.120337733399495, 37.657603244359947 ], [ -122.120320466678976, 37.657569549109169 ], [ -122.120308480557412, 37.657539793352896 ], [ -122.120297667902349, 37.657497883837038 ], [ -122.12029280639851, 37.657463853310169 ], [ -122.120293225493668, 37.657416998471433 ], [ -122.120300433930396, 37.657362097005631 ], [ -122.12031040839517, 37.657320438946847 ], [ -122.120329602953433, 37.657266124214281 ], [ -122.120357179414853, 37.657210636015286 ], [ -122.120317616831898, 37.657254724825975 ], [ -122.120291213836893, 37.657282636563536 ], [ -122.120263972651586, 37.657306441168579 ], [ -122.120230277400836, 37.657331586878087 ], [ -122.120193816122011, 37.657353128369252 ], [ -122.120150146406488, 37.657374083127195 ], [ -122.12010647669095, 37.65738967346708 ], [ -122.120058364566759, 37.657403587426352 ], [ -122.120010168623466, 37.657412723700787 ], [ -122.119953674596104, 37.65741817193787 ], [ -122.119888379570369, 37.65742035123268 ], [ -122.119825347658491, 37.657417249928493 ], [ -122.119757621880865, 37.657409957672741 ], [ -122.119699116196742, 37.657400067026991 ], [ -122.119644969102211, 37.657385147239381 ], [ -122.119603730138635, 37.657372742022666 ], [ -122.119567604135923, 37.657357570777926 ], [ -122.119375407096143, 37.657283642391931 ] ] } },
{ "type": "Feature", "properties": { "id": 757.0, "osm_id": 204801549.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.123210463074187, 37.662741853919485 ], [ -122.123177438375649, 37.662774291884787 ], [ -122.123155477789354, 37.662790720414996 ], [ -122.123121363443445, 37.662811088439703 ], [ -122.123066461977672, 37.662835898873091 ], [ -122.123040645715875, 37.662846962985284 ], [ -122.122950121161622, 37.662886274111173 ], [ -122.122465563339148, 37.663094145309849 ], [ -122.122155265283638, 37.663225573551621 ], [ -122.121957536187793, 37.663315679010744 ], [ -122.121679759916603, 37.663442832481898 ], [ -122.121219928708527, 37.663657744479266 ], [ -122.120659514662364, 37.663913476345087 ], [ -122.12055096901625, 37.663966449973103 ], [ -122.120536468323763, 37.663979861018227 ], [ -122.12052967898218, 37.663995032262974 ], [ -122.120530433353466, 37.664009030041264 ], [ -122.120534037571829, 37.664024871838272 ], [ -122.120544934045952, 37.664042641472989 ] ] } },
{ "type": "Feature", "properties": { "id": 758.0, "osm_id": 204801051.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.126461803315195, 37.664261660602925 ], [ -122.126078247425951, 37.663734857988452 ], [ -122.126062908543162, 37.663709796097969 ], [ -122.126052766440296, 37.663679621246551 ], [ -122.126047066746153, 37.663646093633844 ], [ -122.126048156393551, 37.663614577677912 ], [ -122.126054945735135, 37.663584570464558 ], [ -122.126068524418287, 37.663557664555348 ], [ -122.126128203568868, 37.663468984019786 ] ] } },
{ "type": "Feature", "properties": { "id": 759.0, "osm_id": 204801038.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.125374083740354, 37.659747670467851 ], [ -122.125328821463214, 37.659796536963356 ], [ -122.125298227516623, 37.659821682672863 ], [ -122.125260844228492, 37.659841883059521 ], [ -122.125221616921621, 37.659854875009444 ], [ -122.125178617758351, 37.659862586360347 ], [ -122.12513897135635, 37.659866190578697 ], [ -122.125087338832785, 37.659860239427466 ], [ -122.125048782078167, 37.659853198628788 ], [ -122.125002262515565, 37.659836434822452 ], [ -122.124400022772562, 37.659578858937941 ], [ -122.124985331071159, 37.659859736513276 ], [ -122.125015841198717, 37.659876248862531 ], [ -122.125043166203042, 37.659893683221142 ], [ -122.125064707694207, 37.659913380693588 ], [ -122.125086416823436, 37.65993936459342 ], [ -122.125108042133618, 37.65997146728256 ], [ -122.125120028255154, 37.660004156704957 ], [ -122.125126147044469, 37.660031481709311 ], [ -122.125123213378359, 37.660056459780755 ], [ -122.125115669665519, 37.660088562469923 ], [ -122.125095217821766, 37.660133070375785 ], [ -122.125129751262847, 37.660095519449541 ], [ -122.125151711849171, 37.660077749814803 ], [ -122.125176606101576, 37.660063416760394 ], [ -122.125204266382042, 37.660053945209789 ], [ -122.125239973289567, 37.660047658782432 ], [ -122.125280876977058, 37.660044725116322 ], [ -122.12531733825584, 37.660044138383093 ], [ -122.125366204751373, 37.660048245515632 ], [ -122.12540635406755, 37.660056459780755 ], [ -122.125445665193453, 37.660071044292287 ], [ -122.126050419507408, 37.66032954218614 ], [ -122.125458908600464, 37.660046150039854 ], [ -122.12542714118743, 37.660026871662566 ], [ -122.125403336582423, 37.660007593285279 ], [ -122.125378442330017, 37.659984626870546 ], [ -122.125355727372408, 37.659955038752365 ], [ -122.125337622461544, 37.659925869729314 ], [ -122.125326809806438, 37.65989846090595 ], [ -122.125321780664535, 37.659867531683219 ], [ -122.125324043778392, 37.659840122859848 ], [ -122.125330246386767, 37.65981992247319 ], [ -122.125374083740354, 37.659747670467851 ] ] } },
{ "type": "Feature", "properties": { "id": 760.0, "osm_id": 204801053.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.124970662740623, 37.662220080446957 ], [ -122.124923221168629, 37.662208848696679 ], [ -122.124885167328259, 37.662205076840273 ], [ -122.124851807353608, 37.662206082668646 ], [ -122.124820961949922, 37.66221077653443 ], [ -122.124782069919206, 37.662221673008546 ], [ -122.124754661095849, 37.662235167872645 ], [ -122.124737478194319, 37.662249249469973 ], [ -122.124724150968262, 37.662260984134427 ] ] } },
{ "type": "Feature", "properties": { "id": 761.0, "osm_id": 204798833.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.116136304433752, 37.657579188297817 ], [ -122.116141417394743, 37.65759896958933 ], [ -122.116142255585046, 37.657614057015017 ], [ -122.116140076290193, 37.657629479716888 ], [ -122.116134208958002, 37.657643561314188 ], [ -122.116125659416753, 37.657657056178294 ], [ -122.116113673295217, 37.65767004812821 ], [ -122.116098502050477, 37.657681363697534 ], [ -122.116077379654485, 37.657692260171622 ] ] } },
{ "type": "Feature", "properties": { "id": 762.0, "osm_id": 204801030.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.121737427410451, 37.660745955135845 ], [ -122.121767853718964, 37.66076372477054 ], [ -122.121782270592433, 37.660776129987234 ], [ -122.121797944751364, 37.660793648164855 ], [ -122.121813535091249, 37.660816195484401 ], [ -122.121825940307957, 37.660835892956875 ], [ -122.121833903115984, 37.660857434448026 ], [ -122.121839267534014, 37.66088375362397 ], [ -122.121839602810127, 37.660905043658047 ], [ -122.121837172058235, 37.660925663139849 ], [ -122.121832310554367, 37.6609437680507 ], [ -122.121817642223832, 37.660975619282766 ], [ -122.121841614466916, 37.66095223377291 ], [ -122.121860054653894, 37.660938990365878 ], [ -122.121887882572437, 37.66092323238793 ], [ -122.12191537521484, 37.660913174104095 ], [ -122.121942281124007, 37.660906887676767 ], [ -122.121973126527678, 37.660901942353895 ], [ -122.122008079063946, 37.66089942778293 ], [ -122.122044037428566, 37.660900349792271 ], [ -122.122071865347095, 37.660904121648692 ], [ -122.122107572254606, 37.660913928475431 ] ] } },
{ "type": "Feature", "properties": { "id": 763.0, "osm_id": 204801016.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.12228325694511, 37.660426520805871 ], [ -122.122051581141378, 37.660745619859675 ], [ -122.122025261965447, 37.660779650386573 ], [ -122.121993913647586, 37.660808567952515 ], [ -122.121971031051899, 37.660825331758865 ], [ -122.121949573379766, 37.660841760289102 ], [ -122.121891319152738, 37.660891045879751 ], [ -122.121856450435516, 37.660926249873057 ], [ -122.121817642223832, 37.660975619282766 ], [ -122.121148514893477, 37.661903160687928 ], [ -122.121043322008674, 37.662048921984159 ], [ -122.120998730283787, 37.662096866470293 ], [ -122.12095380328276, 37.662135590862952 ], [ -122.120915162709153, 37.662164340790824 ], [ -122.12086327872845, 37.662195856746784 ], [ -122.120812903490403, 37.662221840646588 ], [ -122.120762444433325, 37.662239861738414 ], [ -122.120717182156184, 37.662251931679002 ], [ -122.120671836060026, 37.662256793182834 ], [ -122.119938670989427, 37.662298283603555 ] ] } },
{ "type": "Feature", "properties": { "id": 764.0, "osm_id": 204801043.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.123790239316691, 37.661685398843524 ], [ -122.12377992957579, 37.661680621158688 ], [ -122.122107572254606, 37.660913928475431 ], [ -122.121949573379766, 37.660841760289102 ], [ -122.12186768218578, 37.660804377000922 ], [ -122.121737427410451, 37.660745955135845 ], [ -122.120336979028224, 37.660105661552379 ], [ -122.120052581053557, 37.65997482004385 ], [ -122.119190334674073, 37.659583468984678 ], [ -122.118911133479386, 37.659454722951949 ], [ -122.118840306397544, 37.659422787900859 ], [ -122.118564122687985, 37.659297143172289 ], [ -122.117810673411711, 37.65895164112348 ], [ -122.117593414481448, 37.658852064113781 ], [ -122.117389734234365, 37.658759024988534 ], [ -122.117176414798593, 37.658665147672977 ], [ -122.117093936871356, 37.658622399966788 ], [ -122.117021433408922, 37.658581747736413 ], [ -122.116963765915074, 37.65854436444824 ], [ -122.116894782851972, 37.658493570115034 ], [ -122.116820267732734, 37.658431376393487 ], [ -122.116651875298004, 37.6582650794345 ], [ -122.116524135093627, 37.6581327291834 ], [ -122.116398574184075, 37.657982190202439 ], [ -122.116231103758693, 37.657722770299216 ], [ -122.116136304433752, 37.657579188297817 ], [ -122.116083582262831, 37.657496878008658 ], [ -122.115788706909186, 37.657035035143792 ], [ -122.115469775493438, 37.656535222257574 ], [ -122.115375814358856, 37.656435393790773 ], [ -122.115255953143489, 37.656354676063195 ], [ -122.114539551879261, 37.656025770182708 ], [ -122.114334530527614, 37.655931641410049 ], [ -122.114145350973004, 37.65584547544541 ], [ -122.112385235125586, 37.655043746406875 ], [ -122.112327651450769, 37.655011978993855 ], [ -122.112288507962944, 37.654985240722731 ], [ -122.112252381960275, 37.654954479138084 ], [ -122.112215836862447, 37.654913156355427 ], [ -122.112171412775581, 37.654858590165759 ], [ -122.112137466067779, 37.654804945985447 ], [ -122.112114248195979, 37.654762198279272 ], [ -122.112086336458404, 37.654701429481278 ], [ -122.112076529631707, 37.654668991515983 ], [ -122.112069740290124, 37.654631859684919 ], [ -122.112070075566237, 37.654596488053535 ], [ -122.112077116364901, 37.654563882450176 ], [ -122.11209354489516, 37.654519458363353 ], [ -122.112119025880801, 37.654467322925626 ], [ -122.112141321743238, 37.654430694008752 ], [ -122.112163869062755, 37.654394987101227 ], [ -122.112234277049424, 37.654294823358313 ], [ -122.112278868774297, 37.654241765911244 ], [ -122.112302421922237, 37.654220559696206 ], [ -122.112332177678496, 37.654204382623057 ], [ -122.112371321166322, 37.654191977406384 ], [ -122.112425132984697, 37.654182757312867 ], [ -122.112485315049454, 37.654183092589001 ], [ -122.112548179323241, 37.654190049568619 ], [ -122.112628729412748, 37.65420329297563 ] ] } },
{ "type": "Feature", "properties": { "id": 765.0, "osm_id": 207269087.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.704085800099264, 38.191316821800889 ], [ -121.702145221876549, 38.191438275577866 ] ] } },
{ "type": "Feature", "properties": { "id": 766.0, "osm_id": 207269089.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.702139522182392, 38.192369672658508 ], [ -121.701602326008, 38.191164019706051 ], [ -121.701612216653785, 38.191074668618207 ], [ -121.701676673489146, 38.19102404192305 ], [ -121.701784716221056, 38.190970062466619 ], [ -121.701875156956291, 38.190973499046898 ], [ -121.701956461417069, 38.191024880113368 ] ] } },
{ "type": "Feature", "properties": { "id": 767.0, "osm_id": 207269091.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.697439537615907, 38.193217250707427 ], [ -121.700765560614215, 38.193006445842634 ], [ -121.700866646366464, 38.193022455277671 ], [ -121.700964044081346, 38.193073920163165 ] ] } },
{ "type": "Feature", "properties": { "id": 768.0, "osm_id": 207269096.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.700964044081346, 38.193073920163165 ], [ -121.7009898603431, 38.193294867130831 ], [ -121.701013832586185, 38.193477592619999 ], [ -121.701075523393541, 38.193946643921592 ] ] } },
{ "type": "Feature", "properties": { "id": 769.0, "osm_id": 207269097.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.702427440556406, 38.191004176812541 ], [ -121.702380418079585, 38.190598492698932 ], [ -121.702352506342038, 38.190357848258806 ], [ -121.702369437786444, 38.190287021177014 ], [ -121.70244453963889, 38.190236478300868 ], [ -121.703496049391987, 38.190173194931923 ], [ -121.703554219800026, 38.190197670089184 ], [ -121.703608618351609, 38.190257516877843 ], [ -121.703734430718242, 38.190524899589093 ], [ -121.703892429593068, 38.190881298112011 ], [ -121.704085800099264, 38.191316821800889 ], [ -121.704258551123687, 38.191687050464061 ], [ -121.704487628537407, 38.192175044866829 ], [ -121.704594916898046, 38.192356345432493 ] ] } },
{ "type": "Feature", "properties": { "id": 770.0, "osm_id": 207269099.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.704525514739785, 38.193085319551479 ], [ -121.704477821710711, 38.192723472791492 ], [ -121.704456280219532, 38.192559522765428 ], [ -121.70449290913642, 38.1924195449824 ], [ -121.704594916898046, 38.192356345432493 ], [ -121.705239066156921, 38.192190299930608 ] ] } },
{ "type": "Feature", "properties": { "id": 771.0, "osm_id": 207269106.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.701743141981311, 38.1924012724335 ], [ -121.701607774245076, 38.192125256361997 ] ] } },
{ "type": "Feature", "properties": { "id": 772.0, "osm_id": 207269081.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.700964044081346, 38.193073920163165 ], [ -121.701012240024596, 38.192981132495035 ], [ -121.701081223087698, 38.192921285706376 ], [ -121.701253638835979, 38.192909467222925 ], [ -121.704477821710711, 38.192723472791492 ] ] } },
{ "type": "Feature", "properties": { "id": 773.0, "osm_id": 207269104.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.70453473483326, 38.190672840180063 ], [ -121.703892429593068, 38.190881298112011 ], [ -121.703683720204054, 38.190948940070605 ], [ -121.702427440556406, 38.191004176812541 ], [ -121.701956461417069, 38.191024880113368 ] ] } },
{ "type": "Feature", "properties": { "id": 774.0, "osm_id": 207269082.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.695057316914955, 38.194301030787756 ], [ -121.694993614450851, 38.193756961452792 ], [ -121.695015155942002, 38.193676746639412 ], [ -121.695111631647535, 38.193643051388655 ], [ -121.697465605334756, 38.193503660338862 ], [ -121.7009898603431, 38.193294867130831 ], [ -121.704525514739785, 38.193085319551479 ], [ -121.705624214607752, 38.193020275982853 ], [ -121.706079268131035, 38.192993286254641 ], [ -121.706482521492717, 38.192969397830574 ], [ -121.706938832301475, 38.192941569912065 ], [ -121.707469825867534, 38.192909131946777 ], [ -121.709193061340969, 38.192804022880978 ], [ -121.709283418257186, 38.192811650412871 ], [ -121.709369248945691, 38.192845345663621 ], [ -121.709429011915319, 38.192901085319725 ], [ -121.709455079634182, 38.19295079000554 ], [ -121.709481482629158, 38.193451524901143 ] ] } },
{ "type": "Feature", "properties": { "id": 775.0, "osm_id": 207269100.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.703734430718242, 38.190524899589093 ], [ -121.702380418079585, 38.190598492698932 ] ] } },
{ "type": "Feature", "properties": { "id": 776.0, "osm_id": 207269105.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.701956461417069, 38.191024880113368 ], [ -121.702145221876549, 38.191438275577866 ], [ -121.702313279035167, 38.19180607348914 ], [ -121.702557276236561, 38.192340335997429 ] ] } },
{ "type": "Feature", "properties": { "id": 777.0, "osm_id": 207269092.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.701253638835979, 38.192909467222925 ], [ -121.701220614137469, 38.192541836949708 ], [ -121.701285825344172, 38.192471093686912 ], [ -121.70137081784236, 38.192423735933993 ], [ -121.701743141981311, 38.1924012724335 ], [ -121.702139522182392, 38.192369672658508 ], [ -121.702557276236561, 38.192340335997429 ], [ -121.704306076514698, 38.192230616884878 ], [ -121.704487628537407, 38.192175044866829 ] ] } },
{ "type": "Feature", "properties": { "id": 778.0, "osm_id": 207269101.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.704258551123687, 38.191687050464061 ], [ -121.702313279035167, 38.19180607348914 ] ] } },
{ "type": "Feature", "properties": { "id": 779.0, "osm_id": 207269093.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.70752120693399, 38.195221782851384 ], [ -121.707129017684494, 38.19534223079998 ], [ -121.706923828694826, 38.195405346530869 ], [ -121.706832633588277, 38.19539277367614 ], [ -121.70669852313749, 38.195346337932527 ], [ -121.706638760167863, 38.195269559699476 ], [ -121.706151436317356, 38.194180163744008 ], [ -121.705919341418479, 38.193661323937597 ], [ -121.705688000890916, 38.193158996480399 ], [ -121.705624214607752, 38.193020275982853 ], [ -121.705239066156921, 38.192190299930608 ], [ -121.70453473483326, 38.190672840180063 ], [ -121.70423625526125, 38.19002986438764 ], [ -121.70423625526125, 38.189949733393298 ], [ -121.70426760357914, 38.18987722993085 ], [ -121.704353518086648, 38.189813946561891 ], [ -121.70456038345695, 38.189758542181906 ], [ -121.704953327077703, 38.189653349297117 ], [ -121.705364040333251, 38.189531727882049 ], [ -121.705647181022442, 38.189447992669336 ], [ -121.70573753793866, 38.189442963527448 ], [ -121.705823368627136, 38.189468276875012 ], [ -121.705887741643522, 38.189497781174175 ], [ -121.705930656987789, 38.189565255494756 ], [ -121.706221760484979, 38.190192221852108 ], [ -121.707208813402701, 38.192342096197102 ], [ -121.707469825867534, 38.192909131946777 ] ] } },
{ "type": "Feature", "properties": { "id": 780.0, "osm_id": 207269102.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.700964044081346, 38.193073920163165 ], [ -121.700936383800865, 38.192895972358777 ], [ -121.700911154272347, 38.192799077558107 ], [ -121.700845104875299, 38.19273151941853 ], [ -121.70073337410598, 38.192707128080286 ], [ -121.697541545377533, 38.192875771972133 ], [ -121.697438783244621, 38.192925476657997 ], [ -121.697412715525758, 38.192981132495035 ], [ -121.697439537615907, 38.193217250707427 ], [ -121.697465605334756, 38.193503660338862 ] ] } },
{ "type": "Feature", "properties": { "id": 781.0, "osm_id": 221294583.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.271514912503463, 38.212965433679415 ], [ -122.271461855056373, 38.212960320718452 ], [ -122.271429836186243, 38.212949759520484 ], [ -122.271378874214975, 38.212920171402246 ] ] } },
{ "type": "Feature", "properties": { "id": 782.0, "osm_id": 221294584.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.270584856527336, 38.213470359526568 ], [ -122.270579408290274, 38.213430377848439 ], [ -122.270590137126348, 38.213388133056434 ], [ -122.270616959216483, 38.213358628757263 ], [ -122.270643948944695, 38.213322754211674 ] ] } },
{ "type": "Feature", "properties": { "id": 783.0, "osm_id": 221294585.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.273973324704258, 38.209272618598241 ], [ -122.273916160124585, 38.20925954282928 ], [ -122.273854469317243, 38.209230038530109 ], [ -122.273822366628082, 38.209192068508749 ], [ -122.273800741317913, 38.209149991354785 ] ] } },
{ "type": "Feature", "properties": { "id": 784.0, "osm_id": 221294572.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.273711306411045, 38.209321233636658 ], [ -122.273776601436779, 38.209272199503097 ], [ -122.273800908955948, 38.209210927790885 ], [ -122.273800741317913, 38.209149991354785 ], [ -122.273417269247716, 38.207868565997664 ] ] } },
{ "type": "Feature", "properties": { "id": 785.0, "osm_id": 221294587.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.269581626536464, 38.212220617763414 ], [ -122.270297860162671, 38.213333399228723 ], [ -122.270305906789687, 38.213354353986638 ], [ -122.270316551806715, 38.213381846629026 ], [ -122.270311355026749, 38.21341755353658 ], [ -122.270289645897549, 38.213461474709206 ], [ -122.270249664219421, 38.213506066434086 ], [ -122.270225356700223, 38.213541940979681 ], [ -122.270220159920228, 38.213577731706216 ], [ -122.270228206547287, 38.213619892679176 ], [ -122.271059523704039, 38.214894947789944 ] ] } },
{ "type": "Feature", "properties": { "id": 786.0, "osm_id": 221294576.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.270228206547287, 38.213619892679176 ], [ -122.270174478547929, 38.213586281247458 ], [ -122.270118068339599, 38.213571529097862 ], [ -122.270076326461762, 38.213567673422411 ], [ -122.270028381975635, 38.213567170508227 ] ] } },
{ "type": "Feature", "properties": { "id": 787.0, "osm_id": 221294588.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.270600949781439, 38.213335327066439 ], [ -122.270633052470586, 38.213295429207328 ], [ -122.270642440202124, 38.21326248832785 ], [ -122.270627771871574, 38.213209095604668 ] ] } },
{ "type": "Feature", "properties": { "id": 788.0, "osm_id": 221294579.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.27141625750312, 38.214743235342524 ], [ -122.270584856527336, 38.213470359526568 ], [ -122.270542025002115, 38.213440771408365 ], [ -122.270482848765724, 38.213426019258797 ], [ -122.2704266061954, 38.213423839963959 ], [ -122.27038553486986, 38.213422582678504 ] ] } },
{ "type": "Feature", "properties": { "id": 789.0, "osm_id": 221295110.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.270748471277273, 38.215598860018481 ], [ -122.272862135800523, 38.214747342475071 ], [ -122.272896836879681, 38.214747426294089 ], [ -122.272966658133086, 38.214755892016306 ], [ -122.273004125240291, 38.214755892016306 ], [ -122.273060451629618, 38.214755892016306 ], [ -122.273285421910813, 38.214660254501062 ], [ -122.273417269247716, 38.214604179568845 ], [ -122.273540902319553, 38.21456176713879 ], [ -122.273554229545567, 38.214549529560138 ], [ -122.273673001113536, 38.214502255626286 ], [ -122.273814320001037, 38.214445929236931 ], [ -122.273854469317243, 38.214446096875001 ], [ -122.273885901454122, 38.214454730235254 ] ] } },
{ "type": "Feature", "properties": { "id": 790.0, "osm_id": 221294581.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.271786402347232, 38.214555648349467 ], [ -122.270979057433593, 38.213320742554913 ], [ -122.270946954744403, 38.213291238255749 ], [ -122.270906637790162, 38.213280677057739 ], [ -122.270836900355761, 38.213268020383957 ], [ -122.270771605329998, 38.213266344003301 ], [ -122.27070631030432, 38.213263075061093 ], [ -122.270662724407813, 38.213238432265754 ], [ -122.270627771871574, 38.213209095604668 ], [ -122.269957135798649, 38.212123639143684 ] ] } },
{ "type": "Feature", "properties": { "id": 791.0, "osm_id": 221294570.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.271867958265119, 38.212822522230304 ], [ -122.271818672674456, 38.212821264944829 ], [ -122.27177584114925, 38.21280852445198 ], [ -122.27175161744907, 38.212789581350798 ], [ -122.271733177262092, 38.212778936333763 ] ] } },
{ "type": "Feature", "properties": { "id": 792.0, "osm_id": 221294586.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.270305906789687, 38.213354353986638 ], [ -122.270356868761013, 38.213383942104855 ], [ -122.270402466314266, 38.213394419483798 ], [ -122.270446471305917, 38.213397939883137 ] ] } },
{ "type": "Feature", "properties": { "id": 793.0, "osm_id": 221294569.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.267221450240868, 38.209607475630023 ], [ -122.267146264569419, 38.209381750977563 ], [ -122.267146264569419, 38.209352246678407 ], [ -122.267164956213492, 38.209316455951843 ], [ -122.267191862122687, 38.209286951652651 ], [ -122.267221366421865, 38.209267924732465 ], [ -122.267277608992146, 38.20925954282928 ], [ -122.267682622553494, 38.209181591129763 ], [ -122.267714809061687, 38.209181591129763 ], [ -122.267752359987895, 38.209187877557135 ], [ -122.267792760761196, 38.209208832315106 ], [ -122.26780835110111, 38.209226350492713 ] ] } },
{ "type": "Feature", "properties": { "id": 794.0, "osm_id": 221294589.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.270086971478833, 38.213543449722252 ], [ -122.270034919860109, 38.213541940979681 ], [ -122.269997368933872, 38.213529368124895 ], [ -122.269962500216678, 38.213514699794352 ] ] } },
{ "type": "Feature", "properties": { "id": 795.0, "osm_id": 221294573.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.270979057433593, 38.213320742554913 ], [ -122.270971010806534, 38.213257459185968 ], [ -122.270987104060637, 38.213217477507825 ], [ -122.271020044940073, 38.213165761165229 ] ] } },
{ "type": "Feature", "properties": { "id": 796.0, "osm_id": 221295115.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.274068962219445, 38.216755730294459 ], [ -122.273140917900093, 38.215339691572311 ], [ -122.273108815210946, 38.215322676308865 ], [ -122.273076544883722, 38.215320664652104 ], [ -122.273029438587898, 38.215315970786328 ] ] } },
{ "type": "Feature", "properties": { "id": 797.0, "osm_id": 221295117.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.273482312816355, 38.2147039242166 ], [ -122.273476277846058, 38.21464416124698 ], [ -122.27349496949013, 38.214608370520416 ], [ -122.273524557608326, 38.214576770745474 ], [ -122.273540902319553, 38.21456176713879 ], [ -122.273554229545567, 38.214549529560138 ] ] } },
{ "type": "Feature", "properties": { "id": 798.0, "osm_id": 221295104.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.27388757783477, 38.216975084700515 ], [ -122.273835610035121, 38.216972737767605 ], [ -122.273779367464797, 38.216962260388648 ], [ -122.273745923671143, 38.216946334772629 ], [ -122.273721616151946, 38.216919093587308 ] ] } },
{ "type": "Feature", "properties": { "id": 799.0, "osm_id": 221295120.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.273482312816355, 38.2147039242166 ], [ -122.273433362501819, 38.214671570070337 ], [ -122.273390530976599, 38.214658829577566 ], [ -122.273342251214316, 38.214658829577566 ], [ -122.273285421910813, 38.214660254501062 ] ] } },
{ "type": "Feature", "properties": { "id": 800.0, "osm_id": 221295121.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.272273055645485, 38.212856552757174 ], [ -122.272269283789072, 38.212810787565871 ], [ -122.272271965998087, 38.212770638249658 ], [ -122.272282778653178, 38.212726381800898 ], [ -122.272306750896277, 38.212694865844952 ], [ -122.272344301822486, 38.212656895823571 ], [ -122.272378751444521, 38.21261582449803 ] ] } },
{ "type": "Feature", "properties": { "id": 801.0, "osm_id": 221295122.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.273137565138825, 38.215025873117519 ], [ -122.273106049182871, 38.215006678559249 ], [ -122.273071348103727, 38.215002319969592 ], [ -122.27303631174847, 38.215008774035056 ] ] } },
{ "type": "Feature", "properties": { "id": 802.0, "osm_id": 221295123.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.273285421910813, 38.214660254501062 ], [ -122.273336719158209, 38.214608370520416 ], [ -122.273352812412313, 38.214580961697067 ], [ -122.273363541248386, 38.21454936192211 ], [ -122.273364547076767, 38.214523629479373 ] ] } },
{ "type": "Feature", "properties": { "id": 803.0, "osm_id": 221295103.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.272862135800523, 38.214747342475071 ], [ -122.272888874071654, 38.214724292241328 ], [ -122.272904967325744, 38.214696883417936 ], [ -122.272908403906058, 38.214667965851994 ] ] } },
{ "type": "Feature", "properties": { "id": 804.0, "osm_id": 221294580.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.271694033774267, 38.212892930216952 ], [ -122.271724711539903, 38.212857055671364 ], [ -122.271738206403981, 38.212827467553147 ], [ -122.271738206403981, 38.212789581350798 ], [ -122.271733177262092, 38.212778936333763 ], [ -122.27172202933086, 38.21275596991908 ], [ -122.271215175645978, 38.211984583370054 ] ] } },
{ "type": "Feature", "properties": { "id": 805.0, "osm_id": 221294575.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.270434569003399, 38.212155238918662 ], [ -122.271019458206865, 38.213059227175933 ], [ -122.27102750483391, 38.213093090064731 ], [ -122.27102750483391, 38.213120498888117 ], [ -122.271014009969775, 38.213145644597617 ], [ -122.27098274547096, 38.213180848590973 ] ] } },
{ "type": "Feature", "properties": { "id": 806.0, "osm_id": 221294582.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.270869170682971, 38.21213637963649 ], [ -122.271378874214975, 38.212920171402246 ], [ -122.27138415481393, 38.212951938815294 ], [ -122.271381556423961, 38.212989741198584 ], [ -122.271348531725465, 38.213032740361868 ] ] } },
{ "type": "Feature", "properties": { "id": 807.0, "osm_id": 221295112.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.273540902319553, 38.21456176713879 ], [ -122.27348155844507, 38.214559839301074 ], [ -122.273438643100803, 38.214555648349467 ], [ -122.273401175993612, 38.21454098001891 ], [ -122.273364547076767, 38.214523629479373 ] ] } },
{ "type": "Feature", "properties": { "id": 808.0, "osm_id": 221295118.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.273701164308193, 38.217050857105207 ], [ -122.273731171521575, 38.217005343370964 ], [ -122.273733853730576, 38.216969552644407 ], [ -122.273721616151946, 38.216919093587308 ], [ -122.272866075295028, 38.215614534177369 ], [ -122.272811006191191, 38.215510263301915 ], [ -122.272827183264297, 38.215450248875172 ], [ -122.27285660374443, 38.215394341581025 ], [ -122.27288845497651, 38.21537246481374 ] ] } },
{ "type": "Feature", "properties": { "id": 809.0, "osm_id": 221294574.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.267333935381501, 38.2105051774599 ], [ -122.26814672853223, 38.210353465012467 ] ] } },
{ "type": "Feature", "properties": { "id": 810.0, "osm_id": 221295105.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.273140917900093, 38.215339691572311 ], [ -122.273135553482064, 38.215310187273154 ], [ -122.273140917900093, 38.21529325582874 ], [ -122.273148964527152, 38.215267942481162 ] ] } },
{ "type": "Feature", "properties": { "id": 811.0, "osm_id": 221294577.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.271159771265985, 38.213109183318821 ], [ -122.271097158449294, 38.213101555786913 ], [ -122.271059523704039, 38.213086719818321 ], [ -122.271019458206865, 38.213059227175933 ] ] } },
{ "type": "Feature", "properties": { "id": 812.0, "osm_id": 221295109.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.274849317404914, 38.216584488012636 ], [ -122.274801205280681, 38.216582979270051 ], [ -122.274761055964504, 38.216574597366879 ], [ -122.274712776202207, 38.21656403616889 ], [ -122.274672626886002, 38.216528077804234 ], [ -122.273482312816355, 38.2147039242166 ], [ -122.273417269247716, 38.214604179568845 ], [ -122.273364547076767, 38.214523629479373 ], [ -122.272273055645485, 38.212856552757174 ], [ -122.272220920207744, 38.212776924676994 ], [ -122.272196864145641, 38.212749599672684 ], [ -122.272154032620449, 38.212734763704056 ], [ -122.272095024022079, 38.212730656571495 ] ] } },
{ "type": "Feature", "properties": { "id": 813.0, "osm_id": 221295126.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.273013512971872, 38.214830071859353 ], [ -122.273020218494395, 38.214798052989252 ], [ -122.273025666731456, 38.214783217020617 ], [ -122.273060451629618, 38.214755892016306 ] ] } },
{ "type": "Feature", "properties": { "id": 814.0, "osm_id": 221295108.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.270928179281299, 38.215870685138384 ], [ -122.271571825625998, 38.215617719300589 ], [ -122.271638964670416, 38.215579833098225 ], [ -122.271705936076785, 38.215539851420104 ], [ -122.27303631174847, 38.215008774035056 ], [ -122.273065816047648, 38.214989747114842 ], [ -122.27307126428471, 38.214960242815643 ], [ -122.273078724178546, 38.214933085449381 ] ] } },
{ "type": "Feature", "properties": { "id": 815.0, "osm_id": 221294578.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.270694743277915, 38.215040373809984 ], [ -122.26986066009313, 38.21376967728888 ], [ -122.269855211856068, 38.213742268465495 ], [ -122.269855211856068, 38.21370211914931 ], [ -122.269876837166251, 38.213668340079536 ], [ -122.269906341465429, 38.213640931256144 ], [ -122.269935510488466, 38.213604721434436 ], [ -122.269954621227711, 38.213571361459806 ], [ -122.269962500216678, 38.213541940979681 ], [ -122.269962500216678, 38.213514699794352 ], [ -122.269946406962589, 38.213480836905539 ], [ -122.269187509449253, 38.212313237793452 ] ] } },
{ "type": "Feature", "properties": { "id": 816.0, "osm_id": 221295106.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.270697425486958, 38.215240533657798 ], [ -122.271566461207968, 38.214897043265715 ], [ -122.271665702941561, 38.214875920869758 ], [ -122.271714066522833, 38.214857061587573 ], [ -122.272647475260271, 38.214477696649936 ], [ -122.272684942367462, 38.214465039976155 ], [ -122.2727278577117, 38.214458753548783 ], [ -122.272762726428894, 38.214471326403526 ], [ -122.272792230728072, 38.214492448799518 ], [ -122.272908403906058, 38.214667965851994 ], [ -122.272966658133086, 38.214755892016306 ], [ -122.273013512971872, 38.214830071859353 ], [ -122.273078724178546, 38.214933085449381 ], [ -122.273137565138825, 38.215025873117519 ], [ -122.273229430797599, 38.215171047680478 ], [ -122.273229430797599, 38.215211029358592 ], [ -122.273205374735468, 38.215244724609391 ], [ -122.273148964527152, 38.215267942481162 ], [ -122.273029438587898, 38.215315970786328 ], [ -122.27288845497651, 38.21537246481374 ], [ -122.271625637444359, 38.215879067041527 ] ] } },
{ "type": "Feature", "properties": { "id": 817.0, "osm_id": 223174191.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.059571030867332, 37.984363776771389 ], [ -122.059628949818276, 37.984392861975415 ], [ -122.059685779121764, 37.984433178929649 ], [ -122.059722827133783, 37.98447307678876 ], [ -122.059770101067713, 37.984550190297945 ], [ -122.059790301454342, 37.984608695982125 ], [ -122.059796671700752, 37.984670135332387 ], [ -122.059786948693088, 37.984735178900983 ], [ -122.059734142703064, 37.984877671254928 ], [ -122.059819721934474, 37.984757558582473 ], [ -122.059861212355202, 37.984720762027543 ], [ -122.059928183761542, 37.984691425366421 ], [ -122.05998601889344, 37.984679355425854 ], [ -122.060040920359214, 37.984679355425854 ], [ -122.060095905644047, 37.984685055119996 ], [ -122.060144017768252, 37.984701399831181 ], [ -122.060201936719196, 37.984747584117699 ] ] } },
{ "type": "Feature", "properties": { "id": 818.0, "osm_id": 223174190.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.060119710249083, 37.984182392386693 ], [ -122.060074028876784, 37.984305857820445 ], [ -122.060061372202952, 37.984371991036504 ], [ -122.060059612003315, 37.984415744571038 ], [ -122.060064808783252, 37.984456564439498 ], [ -122.060087272283766, 37.984508196963056 ], [ -122.060201936719196, 37.984747584117699 ], [ -122.060225657505185, 37.984797037346404 ], [ -122.060794956368724, 37.985942759691213 ], [ -122.060876009372393, 37.986126491008761 ], [ -122.060888666046196, 37.986175189866223 ], [ -122.060879781228834, 37.986237383587756 ] ] } },
{ "type": "Feature", "properties": { "id": 819.0, "osm_id": 226880335.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.285342202892679, 38.2607123583741 ], [ -122.285165177097653, 38.260695426929672 ], [ -122.28507825676175, 38.261824134011057 ], [ -122.285245643368114, 38.261836958322888 ], [ -122.285342202892679, 38.2607123583741 ] ] } },
{ "type": "Feature", "properties": { "id": 820.0, "osm_id": 229293502.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.369968663360524, 37.620113925130916 ], [ -122.369876462425637, 37.620198749991033 ], [ -122.369756768848305, 37.62025666894197 ], [ -122.369617210160442, 37.620273684205394 ], [ -122.369473628159113, 37.620258261503558 ] ] } },
{ "type": "Feature", "properties": { "id": 821.0, "osm_id": 229293501.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.369473628159113, 37.620258261503558 ], [ -122.369585023652263, 37.620362867655182 ], [ -122.369636069442606, 37.620456325875566 ], [ -122.369638751651649, 37.620549867914946 ], [ -122.369608744438253, 37.620657994465901 ], [ -122.369705723057962, 37.620568978654219 ], [ -122.369831870700722, 37.620524386929311 ], [ -122.369947121869345, 37.62050527619008 ], [ -122.370129847358555, 37.620533942298934 ], [ -122.37003295255785, 37.62045213492398 ], [ -122.369979308377566, 37.620369237901599 ], [ -122.369952570106449, 37.620267230139937 ], [ -122.369968663360524, 37.620113925130916 ] ] } },
{ "type": "Feature", "properties": { "id": 822.0, "osm_id": 236004654.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.589210308363704, 38.694952861713077 ], [ -121.589186252301602, 38.696188521878916 ] ] } },
{ "type": "Feature", "properties": { "id": 823.0, "osm_id": 236004655.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.584983314593316, 38.694002270074165 ], [ -121.585013154168578, 38.691857676328191 ] ] } },
{ "type": "Feature", "properties": { "id": 824.0, "osm_id": 236004656.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.585780014489913, 38.691864717126819 ], [ -121.585013154168578, 38.691857676328191 ], [ -121.583959716577738, 38.691847953320483 ] ] } },
{ "type": "Feature", "properties": { "id": 825.0, "osm_id": 236004657.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.58835233675488, 38.697648649411718 ], [ -121.589157418554649, 38.697656779857802 ], [ -121.589637533968443, 38.697661641361641 ], [ -121.598627460398177, 38.697752333553986 ] ] } },
{ "type": "Feature", "properties": { "id": 826.0, "osm_id": 236004653.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.586150662248286, 38.696156838284921 ], [ -121.586186872070002, 38.694452294455544 ], [ -121.586177149062308, 38.69435456146455 ], [ -121.586150662248286, 38.694283063830468 ], [ -121.586104980875973, 38.694204190121603 ], [ -121.586008505170426, 38.694117688880851 ], [ -121.585902641733355, 38.694051890940919 ], [ -121.585742715020828, 38.694011657805724 ], [ -121.584983314593316, 38.694002270074165 ], [ -121.583923842032164, 38.693989026667154 ] ] } },
{ "type": "Feature", "properties": { "id": 827.0, "osm_id": 236004658.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.589171835428118, 38.69692252513979 ], [ -121.589167309200405, 38.697304153191318 ], [ -121.58918440828289, 38.697398617240061 ], [ -121.58923210131195, 38.697483777376334 ], [ -121.589295217042832, 38.697558124857437 ], [ -121.589393955862235, 38.697611349942605 ], [ -121.589514906725, 38.697651163982677 ], [ -121.589637533968443, 38.697661641361641 ] ] } },
{ "type": "Feature", "properties": { "id": 828.0, "osm_id": 240320428.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.494010244680524, 38.519693720420328 ], [ -121.494030864162326, 38.517603944321102 ] ] } },
{ "type": "Feature", "properties": { "id": 829.0, "osm_id": 240320427.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.484097554530436, 38.510292074906729 ], [ -121.484474656354209, 38.509977082985444 ], [ -121.484844382103205, 38.509928887042221 ], [ -121.485085361819415, 38.509960989731368 ], [ -121.486204429712146, 38.51042886756651 ] ] } },
{ "type": "Feature", "properties": { "id": 830.0, "osm_id": 240320429.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.494977348668669, 38.518305341978653 ], [ -121.494782720876998, 38.518455545683523 ], [ -121.494718347860626, 38.518552189027112 ], [ -121.494696806369475, 38.518669619490595 ], [ -121.494724969564132, 38.519706628551212 ] ] } },
{ "type": "Feature", "properties": { "id": 831.0, "osm_id": 240320431.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.494977348668669, 38.518305341978653 ], [ -121.495470120756266, 38.517891359780947 ], [ -121.49582568108886, 38.517622049231953 ], [ -121.496638641877666, 38.516916879717989 ], [ -121.49673000462225, 38.516846974645489 ], [ -121.496815332396579, 38.516764748175369 ], [ -121.496860259397565, 38.516681348238819 ], [ -121.49686688110107, 38.516571796764332 ], [ -121.496868306024624, 38.516419162307542 ], [ -121.496824133394909, 38.513404694650212 ], [ -121.496828911079731, 38.512949641126916 ] ] } },
{ "type": "Feature", "properties": { "id": 832.0, "osm_id": 240320430.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.496080742402469, 38.513845750395184 ], [ -121.496255756540705, 38.513600495908342 ], [ -121.496416437624546, 38.513407041583108 ], [ -121.496828911079731, 38.512949641126916 ], [ -121.497010463102455, 38.512435998100443 ], [ -121.497934567927345, 38.511397480297241 ], [ -121.498971576987955, 38.511422039273548 ], [ -121.499654953553701, 38.510611090141509 ], [ -121.501574744656565, 38.508337750362791 ], [ -121.501606931164744, 38.508144882770758 ], [ -121.501229242607749, 38.506634128542764 ], [ -121.500866725295509, 38.505343063996975 ], [ -121.500708307325496, 38.505257065670392 ] ] } },
{ "type": "Feature", "properties": { "id": 833.0, "osm_id": 241188211.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.040674281619729, 37.406887025576012 ], [ -122.040670677401351, 37.406644285660114 ], [ -122.040746701263132, 37.406520149674101 ], [ -122.040886176131949, 37.406392744745865 ], [ -122.042406904824745, 37.405894272964161 ], [ -122.042723237850495, 37.405794193040244 ] ] } },
{ "type": "Feature", "properties": { "id": 834.0, "osm_id": 241188215.0, "name": "East Parallel", "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.052017343546368, 37.428958839745754 ], [ -122.050928366686094, 37.426848025069567 ], [ -122.050276506076287, 37.425567856997866 ], [ -122.049581813941259, 37.424219544053379 ], [ -122.049327004084773, 37.423721072271647 ], [ -122.049015951658021, 37.423122520566011 ], [ -122.047023070359486, 37.419241364120552 ], [ -122.044394421705221, 37.414128570822754 ], [ -122.043039906152387, 37.411493216645972 ], [ -122.041497635968469, 37.408482856121218 ], [ -122.041309965156415, 37.408124948855708 ], [ -122.040674281619729, 37.406887025576012 ] ] } },
{ "type": "Feature", "properties": { "id": 835.0, "osm_id": 241188214.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.051969063784099, 37.426104634077063 ], [ -122.052985872458095, 37.425771453425952 ], [ -122.054976742099853, 37.425127555624144 ], [ -122.055517542492623, 37.424950194553006 ], [ -122.055767071750097, 37.424847935334292 ], [ -122.055957424771151, 37.424728660852132 ], [ -122.056123721730117, 37.424577367499843 ], [ -122.056249869372905, 37.424404867932523 ], [ -122.056343746688412, 37.424232368365217 ], [ -122.056375933196634, 37.424074620947508 ], [ -122.056394624840706, 37.423917041167854 ], [ -122.056375933196634, 37.423750995665976 ], [ -122.056324971225308, 37.423582687050256 ] ] } },
{ "type": "Feature", "properties": { "id": 836.0, "osm_id": 241188212.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.054190100487048, 37.423597439199845 ], [ -122.053774106632517, 37.423861636787862 ], [ -122.053586435820492, 37.423961884349829 ], [ -122.053385270144318, 37.424047044486031 ], [ -122.052285564447942, 37.424408220693799 ], [ -122.051485344151956, 37.424666970044768 ], [ -122.051131208742859, 37.424786244526949 ], [ -122.050798782463033, 37.424820358872836 ], [ -122.050444647053936, 37.424743664458788 ], [ -122.050112053136019, 37.424641321421063 ], [ -122.049581813941259, 37.424219544053379 ] ] } },
{ "type": "Feature", "properties": { "id": 837.0, "osm_id": 241188213.0, "name": "West Parallel", "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.056324971225308, 37.423582687050256 ], [ -122.053248477484516, 37.417590380652484 ], [ -122.053074133898505, 37.417260133667426 ], [ -122.04909633410945, 37.409507627603219 ], [ -122.04864044239585, 37.408617050391001 ], [ -122.04811204721976, 37.407590183433236 ], [ -122.048039543757312, 37.407475183721708 ], [ -122.047967124113939, 37.407372840683948 ], [ -122.046344471478562, 37.405468053187775 ], [ -122.045671237015668, 37.404677639718493 ], [ -122.04553972495485, 37.404530537317818 ], [ -122.045480716356508, 37.404487957249685 ], [ -122.045411062741152, 37.404466667215615 ], [ -122.045333278679692, 37.404468846510461 ], [ -122.044861126073926, 37.404558281417316 ], [ -122.044681418069885, 37.40460304078028 ], [ -122.044300544389685, 37.404722399081443 ], [ -122.044177246594018, 37.404771349395993 ], [ -122.044053864979276, 37.404837482612024 ], [ -122.042956841491943, 37.405538377355406 ], [ -122.042849553131319, 37.405627896081299 ], [ -122.042766320832811, 37.405713140036568 ], [ -122.042723237850495, 37.405794193040244 ] ] } },
{ "type": "Feature", "properties": { "id": 838.0, "osm_id": 248410416.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.870018146273779, 38.678763551009553 ], [ -121.869826116872048, 38.678706973163138 ], [ -121.869943714973559, 38.67844378140348 ], [ -121.870463476789368, 38.677281043795247 ], [ -121.870852229458549, 38.676413852092928 ], [ -121.871295548317406, 38.675425038975554 ], [ -121.872653751907663, 38.672395819168656 ], [ -121.872880063293323, 38.671891060959503 ], [ -121.874039867235453, 38.669244726489559 ], [ -121.874159560812757, 38.668971727903219 ], [ -121.874360642669885, 38.66901992384647 ], [ -121.874248408986404, 38.6692717162178 ], [ -121.870181677204698, 38.678396758926674 ], [ -121.870018146273779, 38.678763551009553 ] ] } },
{ "type": "Feature", "properties": { "id": 839.0, "osm_id": 248410399.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.873910031555269, 38.669204241897248 ], [ -121.87395294689955, 38.669181191663526 ], [ -121.874001226661818, 38.669191669042512 ], [ -121.874039867235453, 38.669244726489559 ], [ -121.874159560812757, 38.668971727903219 ], [ -121.873990581644776, 38.668925795073832 ], [ -121.873883209465134, 38.668915233875843 ], [ -121.873782375169952, 38.668919424827422 ], [ -121.873704674927509, 38.668957143391687 ], [ -121.873653629137209, 38.669024198617102 ], [ -121.873615072382592, 38.669116231913925 ], [ -121.873577437637351, 38.669296359013103 ], [ -121.873542652739189, 38.669455531354394 ], [ -121.872579655883598, 38.671612446498031 ], [ -121.872531459940348, 38.671679585542456 ], [ -121.872445545432811, 38.671742365997204 ], [ -121.872340939281187, 38.671784275513112 ], [ -121.871952018973943, 38.671943364035307 ], [ -121.870990279403827, 38.672318286564263 ], [ -121.871048114535711, 38.672439656522229 ], [ -121.871096478117039, 38.672422976534918 ], [ -121.870991871965444, 38.675356642645632 ], [ -121.870962367666252, 38.67546552356788 ], [ -121.870905957457879, 38.675593263772228 ], [ -121.870871172559731, 38.675658223521843 ], [ -121.870747707125972, 38.675704240170219 ], [ -121.870533130404738, 38.675695858267076 ], [ -121.870460710761307, 38.675683369231336 ], [ -121.870348057982653, 38.675819491338878 ], [ -121.869747243163161, 38.675746149686105 ], [ -121.869723103282041, 38.675907333684151 ], [ -121.870661960256527, 38.676009928178999 ], [ -121.870688782346676, 38.676037253183353 ], [ -121.870651147601421, 38.676141943153972 ], [ -121.870565316912931, 38.676146050286526 ], [ -121.869698963400907, 38.676024680328595 ], [ -121.869661412474699, 38.676114618149612 ], [ -121.870533130404738, 38.676254931208767 ], [ -121.870573363539989, 38.676303127152003 ], [ -121.870522401568692, 38.676437153783738 ], [ -121.870257952523559, 38.677004692447625 ], [ -121.870185532880129, 38.677029754338108 ], [ -121.869967268121471, 38.677471564454386 ], [ -121.869841120478725, 38.677881942433757 ], [ -121.869690916773862, 38.678252674011119 ], [ -121.869654455495052, 38.678254769486898 ], [ -121.869613132712402, 38.678246387583741 ], [ -121.86966686071176, 38.677980345977019 ], [ -121.869465611216555, 38.677959475038115 ], [ -121.869438872945437, 38.678122754511946 ], [ -121.869383552384491, 38.678118563560361 ], [ -121.869377182138081, 38.678204478067862 ], [ -121.86948170447063, 38.6783635665901 ], [ -121.86958362841321, 38.678520643455563 ], [ -121.869826116872048, 38.678706973163138 ], [ -121.869943714973559, 38.67844378140348 ], [ -121.869795522925486, 38.67835317303016 ], [ -121.870683334109614, 38.676321986434125 ], [ -121.87069406294566, 38.676267587882556 ], [ -121.870753155363047, 38.676257026684553 ], [ -121.870820126769416, 38.676286363345653 ], [ -121.870841668260553, 38.676376468804769 ], [ -121.870852229458549, 38.676413852092928 ], [ -121.871295548317406, 38.675425038975554 ], [ -121.871210136724073, 38.67546552356788 ], [ -121.871168813941409, 38.675467619043658 ], [ -121.871133945224216, 38.675446748104754 ], [ -121.871101758716023, 38.675409029540489 ], [ -121.871107123134081, 38.67530853052142 ], [ -121.871214411494677, 38.672512998175009 ], [ -121.871370063436615, 38.672272186096841 ], [ -121.871860823867422, 38.672083677094456 ], [ -121.871884963748542, 38.672075295191291 ], [ -121.872011027572285, 38.672083677094456 ], [ -121.872252426383682, 38.672142350416642 ], [ -121.872558282030482, 38.672226085629354 ], [ -121.872630617854867, 38.672286770608345 ], [ -121.872653751907663, 38.672395819168656 ], [ -121.872807643649892, 38.672033469494437 ], [ -121.87266280436306, 38.672148553025018 ], [ -121.872611842391777, 38.672146457549239 ], [ -121.872182772768326, 38.672037660446023 ], [ -121.872163913486162, 38.672004049014298 ], [ -121.872158549068146, 38.671968425925797 ], [ -121.872209511039443, 38.671937077607943 ], [ -121.872467003104916, 38.671838674064688 ], [ -121.872544870985408, 38.671786370988883 ], [ -121.872609160182748, 38.671727697666654 ], [ -121.872657439945058, 38.671658546965475 ], [ -121.87272457898942, 38.671539272483329 ], [ -121.873634853674091, 38.669520491103981 ], [ -121.873706267489126, 38.669411526362722 ], [ -121.873762510059436, 38.669344554956368 ], [ -121.873829565284836, 38.669275488074213 ], [ -121.873910031555269, 38.669204241897248 ] ] } },
{ "type": "Feature", "properties": { "id": 840.0, "osm_id": 248410398.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.870018146273779, 38.678763551009553 ], [ -121.870286367175297, 38.678732118872645 ], [ -121.870417879236086, 38.678637822461923 ], [ -121.870573363539989, 38.678474542988134 ], [ -121.870723567244838, 38.678309168038524 ], [ -121.87131365322827, 38.676975355786503 ], [ -121.871573827502758, 38.676422569272205 ], [ -121.871643564937173, 38.676342941192047 ], [ -121.871791170252038, 38.676146050286526 ], [ -121.872051260707508, 38.675708431121826 ], [ -121.874663732288653, 38.669878566007561 ], [ -121.874870262382856, 38.669352936859539 ], [ -121.874886355636932, 38.669304740916324 ], [ -121.874878309009887, 38.669256544973074 ], [ -121.874859533546768, 38.669210528324641 ], [ -121.874819300411545, 38.66916233238139 ], [ -121.874360642669885, 38.66901992384647 ], [ -121.874248408986404, 38.6692717162178 ], [ -121.874331138370692, 38.669191669042512 ], [ -121.874417052878258, 38.669185382615112 ], [ -121.874540350673925, 38.669193764518283 ], [ -121.874631545780446, 38.669256544973074 ], [ -121.874682507751757, 38.669365425895258 ], [ -121.874703965423876, 38.669472295160745 ], [ -121.874682507751757, 38.669568687047231 ], [ -121.874623582972447, 38.669713191057937 ], [ -121.871978841064106, 38.675643555191293 ], [ -121.871920670656067, 38.6757703733863 ], [ -121.871817908523184, 38.675955529627402 ], [ -121.871745572698799, 38.67605812412225 ], [ -121.871662340400263, 38.676164993387708 ], [ -121.871568463084756, 38.676280160737313 ], [ -121.871490762842313, 38.676405721646844 ], [ -121.871427479473368, 38.676531366375414 ], [ -121.870656512019451, 38.678221158055202 ], [ -121.870369515654787, 38.678514357028199 ], [ -121.870303550076827, 38.678524834407156 ], [ -121.870235405204028, 38.678510166076613 ], [ -121.870181677204698, 38.678396758926674 ], [ -121.870018146273779, 38.678763551009553 ] ] } },
{ "type": "Feature", "properties": { "id": 841.0, "osm_id": 249005227.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.389373858854626, 37.623588643091523 ], [ -122.389662112504766, 37.623150269555524 ], [ -122.389885574043376, 37.622815077247601 ], [ -122.390055726677801, 37.622559680657915 ], [ -122.390112053067128, 37.622508634867607 ], [ -122.390189250395323, 37.622462534400121 ] ] } },
{ "type": "Feature", "properties": { "id": 842.0, "osm_id": 285608536.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.404820508486964, 36.890640328520242 ], [ -121.405085628084322, 36.890449472585004 ], [ -121.405155952251945, 36.890405299955262 ], [ -121.405193503178182, 36.890357020192994 ], [ -121.405203645281006, 36.890298849784976 ], [ -121.405168441287685, 36.890238667720212 ], [ -121.405135835684362, 36.890198518403992 ], [ -121.403047735965757, 36.888056774505095 ] ] } },
{ "type": "Feature", "properties": { "id": 843.0, "osm_id": 285608541.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.401850381097404, 36.88570447719848 ], [ -121.401842502108451, 36.885736579887642 ], [ -121.401801430782868, 36.885778573222545 ], [ -121.401520553207547, 36.885988958992222 ], [ -121.401498676440269, 36.886041262067977 ], [ -121.401501274830238, 36.886122398890727 ], [ -121.401566569855973, 36.886381986431985 ] ] } },
{ "type": "Feature", "properties": { "id": 844.0, "osm_id": 285608827.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.40473258232268, 36.887569618292673 ], [ -121.404455644241821, 36.887741866402848 ], [ -121.407645042218348, 36.891038385101972 ], [ -121.403095009899673, 36.892288629779337 ], [ -121.403208500868658, 36.892555174300249 ], [ -121.407913011662814, 36.891317753934757 ], [ -121.417821846137443, 36.901422138210457 ], [ -121.418093000705127, 36.901250393014408 ], [ -121.40828734745854, 36.891204933518047 ], [ -121.413514469915611, 36.889841533147838 ], [ -121.413399218746974, 36.889580436863994 ], [ -121.408064640291229, 36.890989853882601 ], [ -121.40473258232268, 36.887569618292673 ] ] } },
{ "type": "Feature", "properties": { "id": 845.0, "osm_id": 285608534.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.405280758790212, 36.891140476682637 ], [ -121.405309341080013, 36.891132932969768 ] ] } },
{ "type": "Feature", "properties": { "id": 846.0, "osm_id": 285608532.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.405309341080013, 36.891132932969768 ], [ -121.405903701834049, 36.891429233246946 ], [ -121.405933206133227, 36.89145127765228 ], [ -121.405946617178287, 36.891493019530088 ], [ -121.405940666027064, 36.891549932652673 ], [ -121.405930523924212, 36.891590165787861 ], [ -121.405911161727857, 36.891618580439641 ], [ -121.405876209191675, 36.891668452763518 ], [ -121.405810914165912, 36.891718492725481 ] ] } },
{ "type": "Feature", "properties": { "id": 847.0, "osm_id": 285611186.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.822921070532075, 37.338648778373994 ], [ -121.822342132479903, 37.338044946069353 ], [ -121.821035477594194, 37.336682551527552 ] ] } },
{ "type": "Feature", "properties": { "id": 848.0, "osm_id": 285611187.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.820544633344355, 37.339256550173104 ], [ -121.822342132479903, 37.338044946069353 ], [ -121.82265385545891, 37.337854844505394 ] ] } },
{ "type": "Feature", "properties": { "id": 849.0, "osm_id": 285611189.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.819176706746418, 37.337930030176864 ], [ -121.820007101893808, 37.33737271743486 ], [ -121.820239112973667, 37.337217065492936 ], [ -121.820481936708589, 37.337054037476172 ], [ -121.820736914203152, 37.336882962832448 ], [ -121.821035477594194, 37.336682551527552 ], [ -121.821399336010955, 37.336462358931172 ] ] } },
{ "type": "Feature", "properties": { "id": 850.0, "osm_id": 285608540.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.401128447777097, 36.886961343579365 ], [ -121.401521139940755, 36.886908286132268 ] ] } },
{ "type": "Feature", "properties": { "id": 851.0, "osm_id": 285608542.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.401991783803979, 36.886328677527835 ], [ -121.401982312253381, 36.886376873471079 ], [ -121.401949036097761, 36.886430182375229 ], [ -121.401884830719453, 36.88646404526407 ], [ -121.401806627562848, 36.886476366661739 ], [ -121.401748876250011, 36.886484580926833 ], [ -121.401696237898051, 36.886475360833352 ], [ -121.401651310897051, 36.886450718038041 ], [ -121.401605126610534, 36.886419956453373 ], [ -121.401566569855973, 36.886381986431985 ] ] } },
{ "type": "Feature", "properties": { "id": 852.0, "osm_id": 285611196.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.818848219961055, 37.333780233734672 ], [ -121.816556272357275, 37.335164169767701 ] ] } },
{ "type": "Feature", "properties": { "id": 853.0, "osm_id": 285611198.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.818299708217381, 37.333203558796328 ], [ -121.816371116116173, 37.334366464042645 ] ] } },
{ "type": "Feature", "properties": { "id": 854.0, "osm_id": 285611199.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.818085550591277, 37.332978337058066 ], [ -121.816156539394939, 37.334134033867656 ] ] } },
{ "type": "Feature", "properties": { "id": 855.0, "osm_id": 285611197.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.818540436476511, 37.333456692272179 ], [ -121.816553506329257, 37.334654466235655 ] ] } },
{ "type": "Feature", "properties": { "id": 856.0, "osm_id": 285611200.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.817867872565884, 37.332749427282408 ], [ -121.81594464488272, 37.333882325315344 ] ] } },
{ "type": "Feature", "properties": { "id": 857.0, "osm_id": 285611185.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.822616639808814, 37.337740850622247 ], [ -121.821787921042059, 37.336870976710884 ], [ -121.821399336010955, 37.336462358931172 ], [ -121.81985673055091, 37.334840628305173 ], [ -121.819789926782605, 37.334770471775578 ], [ -121.819598232657029, 37.334568887004309 ], [ -121.819373010918753, 37.334332098239628 ], [ -121.819125577137072, 37.334071840146088 ], [ -121.818848219961055, 37.333780233734672 ], [ -121.818540436476511, 37.333456692272179 ], [ -121.818299708217381, 37.333203558796328 ], [ -121.818085550591277, 37.332978337058066 ], [ -121.817867872565884, 37.332749427282408 ], [ -121.817631670534453, 37.332501071491357 ], [ -121.817500912844963, 37.332363692098347 ], [ -121.817379878163095, 37.332236370989143 ], [ -121.817139401361075, 37.33198357278944 ], [ -121.816906803548008, 37.331738988854845 ], [ -121.816699183806421, 37.331520472639092 ], [ -121.81615980833719, 37.330953436889416 ], [ -121.816095854415977, 37.330849333651997 ], [ -121.816087137236678, 37.330753277041637 ], [ -121.81611312113651, 37.330689155482332 ], [ -121.816314538269751, 37.330565690048594 ] ] } },
{ "type": "Feature", "properties": { "id": 858.0, "osm_id": 285611205.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.817139401361075, 37.33198357278944 ], [ -121.816104236319148, 37.332608192213947 ], [ -121.815174850895247, 37.333168941536229 ] ] } },
{ "type": "Feature", "properties": { "id": 859.0, "osm_id": 285611212.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.817956301644344, 37.330065877162355 ], [ -121.817747173160186, 37.330187498577395 ], [ -121.822304162458508, 37.334986557239404 ], [ -121.82249996371668, 37.33486233743438 ], [ -121.817956301644344, 37.330065877162355 ] ] } },
{ "type": "Feature", "properties": { "id": 860.0, "osm_id": 285608828.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.404604339204113, 36.887648994915715 ], [ -121.404281635931937, 36.887317071550051 ], [ -121.4021850704911, 36.885183374278199 ], [ -121.402100077992941, 36.885101818360312 ] ] } },
{ "type": "Feature", "properties": { "id": 861.0, "osm_id": 285611208.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.816699183806421, 37.331520472639092 ], [ -121.816632044762002, 37.331561124869523 ], [ -121.815670556648953, 37.332143667140073 ], [ -121.814724239780645, 37.332716821679057 ] ] } },
{ "type": "Feature", "properties": { "id": 862.0, "osm_id": 285608535.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.401991783803979, 36.886328677527835 ], [ -121.402113740495153, 36.886826730214388 ], [ -121.402336280024386, 36.88775904930435 ] ] } },
{ "type": "Feature", "properties": { "id": 863.0, "osm_id": 285611191.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.821035477594194, 37.336682551527552 ], [ -121.819466469139144, 37.33505746814027 ] ] } },
{ "type": "Feature", "properties": { "id": 864.0, "osm_id": 285608538.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.402113740495153, 36.886826730214388 ], [ -121.40212187094123, 36.88680049485744 ], [ -121.402138550928512, 36.886766967244768 ], [ -121.402190183452063, 36.886740228973643 ], [ -121.402238966128564, 36.886732349984634 ], [ -121.402296046889163, 36.886741318621027 ], [ -121.402344829565635, 36.886758082427392 ], [ -121.402478018007059, 36.886824634738574 ] ] } },
{ "type": "Feature", "properties": { "id": 865.0, "osm_id": 285612053.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.819631341174556, 37.336651454666772 ], [ -121.820239112973667, 37.337217065492936 ] ] } },
{ "type": "Feature", "properties": { "id": 866.0, "osm_id": 285612054.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.820032247603351, 37.336637540707521 ], [ -121.820481936708589, 37.337054037476172 ] ] } },
{ "type": "Feature", "properties": { "id": 867.0, "osm_id": 285611192.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.81985673055091, 37.334840628305173 ], [ -121.819466469139144, 37.33505746814027 ], [ -121.81755137190207, 37.336181397536812 ] ] } },
{ "type": "Feature", "properties": { "id": 868.0, "osm_id": 285611193.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.819598232657029, 37.334568887004309 ], [ -121.817323300316701, 37.335925498032921 ] ] } },
{ "type": "Feature", "properties": { "id": 869.0, "osm_id": 285612055.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.820454779342313, 37.336621531272449 ], [ -121.820736914203152, 37.336882962832448 ] ] } },
{ "type": "Feature", "properties": { "id": 870.0, "osm_id": 285609118.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.401566569855973, 36.886381986431985 ], [ -121.401692968955828, 36.886884230070152 ] ] } },
{ "type": "Feature", "properties": { "id": 871.0, "osm_id": 285611210.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.817143676131707, 37.330560660906706 ], [ -121.816929015591398, 37.33068228232176 ], [ -121.8214740187682, 37.33548343645954 ], [ -121.821679207757896, 37.33536139594932 ], [ -121.817143676131707, 37.330560660906706 ] ] } },
{ "type": "Feature", "properties": { "id": 872.0, "osm_id": 285609119.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.401521139940755, 36.886908286132268 ], [ -121.401692968955828, 36.886884230070152 ], [ -121.402113740495153, 36.886826730214388 ] ] } },
{ "type": "Feature", "properties": { "id": 873.0, "osm_id": 285612052.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.819391283467652, 37.336807190427749 ], [ -121.820007101893808, 37.33737271743486 ] ] } },
{ "type": "Feature", "properties": { "id": 874.0, "osm_id": 285611195.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.819125577137072, 37.334071840146088 ], [ -121.816832456066876, 37.335460553863868 ] ] } },
{ "type": "Feature", "properties": { "id": 875.0, "osm_id": 285608537.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.403165920800504, 36.887983181395214 ], [ -121.403047735965757, 36.888056774505095 ], [ -121.402766606933284, 36.888225334577896 ] ] } },
{ "type": "Feature", "properties": { "id": 876.0, "osm_id": 285608539.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.404835428274566, 36.890697996014119 ], [ -121.404763763002478, 36.890672682666541 ], [ -121.404624539590756, 36.890603029051164 ], [ -121.404468049458472, 36.890491717376996 ], [ -121.402319851494141, 36.888265986808328 ], [ -121.402285150415025, 36.888224161111467 ], [ -121.402285150415025, 36.88815467513416 ], [ -121.402345500117917, 36.887870863892701 ], [ -121.402341812080465, 36.887772125073354 ] ] } },
{ "type": "Feature", "properties": { "id": 877.0, "osm_id": 285611203.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.817379878163095, 37.332236370989143 ], [ -121.816338007598645, 37.332858475842698 ], [ -121.815389427616509, 37.333424924859152 ] ] } },
{ "type": "Feature", "properties": { "id": 878.0, "osm_id": 285807413.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.91544764237905, 37.352116820393185 ], [ -121.915064924680166, 37.352392836464688 ], [ -121.939998236774272, 37.375133358869611 ], [ -121.940384139596361, 37.374866562891604 ], [ -121.91544764237905, 37.352116820393185 ] ] } },
{ "type": "Feature", "properties": { "id": 879.0, "osm_id": 285609117.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.404835428274566, 36.890697996014119 ], [ -121.405280758790212, 36.891140476682637 ] ] } },
{ "type": "Feature", "properties": { "id": 880.0, "osm_id": 285611206.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.816906803548008, 37.331738988854845 ], [ -121.81586912393513, 37.332356399842595 ], [ -121.814922723247804, 37.332919496097794 ] ] } },
{ "type": "Feature", "properties": { "id": 881.0, "osm_id": 285611202.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.817631670534453, 37.332501071491357 ], [ -121.81658301062842, 37.333120997050109 ], [ -121.815657648518055, 37.333668083870243 ] ] } },
{ "type": "Feature", "properties": { "id": 882.0, "osm_id": 285804701.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.917267605015113, 37.350848051709832 ], [ -121.916872901194665, 37.35112188848651 ], [ -121.941811577706844, 37.373870289880379 ], [ -121.942201168566314, 37.37359997350304 ], [ -121.917267605015113, 37.350848051709832 ] ] } },
{ "type": "Feature", "properties": { "id": 883.0, "osm_id": 285611194.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.819373010918753, 37.334332098239628 ], [ -121.817103359177409, 37.335695163333725 ] ] } },
{ "type": "Feature", "properties": { "id": 884.0, "osm_id": 285816684.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.599081172816952, 37.085434249530174 ], [ -121.598835750692004, 37.085516643638364 ], [ -121.594565673939314, 37.077741087340414 ], [ -121.594804474360728, 37.077655424289993 ], [ -121.599081172816952, 37.085434249530174 ] ] } },
{ "type": "Feature", "properties": { "id": 885.0, "osm_id": 285805319.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.926318216423809, 37.356296121134527 ], [ -121.926058545063512, 37.356477589338219 ], [ -121.936435927925544, 37.365947547362701 ], [ -121.936698281494884, 37.365762558759677 ], [ -121.926318216423809, 37.356296121134527 ] ] } },
{ "type": "Feature", "properties": { "id": 886.0, "osm_id": 285608533.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.405309341080013, 36.891132932969768 ], [ -121.4092872246881, 36.890086955272771 ], [ -121.410827567034318, 36.889681941711409 ], [ -121.414337572807256, 36.888764290951983 ], [ -121.414437233635979, 36.888740737804078 ], [ -121.414537062102795, 36.888726656206728 ], [ -121.414662706831351, 36.888734199919611 ], [ -121.415485725903963, 36.888878033378056 ], [ -121.415541800836195, 36.888897647031484 ], [ -121.415583961809162, 36.888940730013765 ], [ -121.415609107518662, 36.888986579024142 ], [ -121.415615980679263, 36.889035026424452 ], [ -121.415604162195791, 36.88908758095738 ], [ -121.415573819706324, 36.889126556807142 ], [ -121.415513218546394, 36.889166957580422 ], [ -121.415435769761061, 36.889188582890611 ], [ -121.413444900119302, 36.88971613987637 ] ] } },
{ "type": "Feature", "properties": { "id": 887.0, "osm_id": 285608059.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.417910442854009, 36.901281322237146 ], [ -121.417229077945052, 36.901705781813803 ], [ -121.417170739898935, 36.901728161495306 ], [ -121.417122879231812, 36.901734950836868 ], [ -121.417078371325985, 36.901728161495306 ], [ -121.417023553679186, 36.901706284727993 ], [ -121.416985835114914, 36.90167191892499 ], [ -121.412186105900687, 36.896761464769824 ], [ -121.409054459236984, 36.893554632434657 ], [ -121.406974406145451, 36.891418923506052 ], [ -121.403441936872014, 36.887807748161812 ], [ -121.402478018007059, 36.886824634738574 ], [ -121.401991783803979, 36.886328677527835 ], [ -121.401850381097404, 36.88570447719848 ], [ -121.401811153790575, 36.885531726174094 ], [ -121.401804783544165, 36.885468861900264 ], [ -121.401813249266354, 36.885414463348688 ], [ -121.401881226501104, 36.88536014861613 ], [ -121.4021850704911, 36.885183374278199 ] ] } },
{ "type": "Feature", "properties": { "id": 888.0, "osm_id": 285809228.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.915266509451456, 37.352251852853321 ], [ -121.915430040382375, 37.352401050729775 ], [ -121.916174353384179, 37.353079817248805 ], [ -121.917147157066481, 37.353967125518722 ], [ -121.920493883365637, 37.357019479378422 ], [ -121.921022613817826, 37.357503869562819 ], [ -121.922659934783724, 37.358995093956416 ], [ -121.924426923791771, 37.360606598660539 ], [ -121.926198019932286, 37.362221791402085 ], [ -121.930328370359121, 37.365988451050193 ], [ -121.932784435626999, 37.368228179397185 ], [ -121.934627029401653, 37.369908499526382 ], [ -121.937147551504935, 37.372206733557526 ], [ -121.937235477669233, 37.372286277818667 ], [ -121.939188377289653, 37.374067683700098 ], [ -121.940058754115185, 37.374861282292606 ], [ -121.940204347773303, 37.374994051638886 ] ] } },
{ "type": "Feature", "properties": { "id": 889.0, "osm_id": 285808979.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.917092171781675, 37.350989957330576 ], [ -121.91724891337104, 37.351133036417714 ], [ -121.917990879439941, 37.35180995891799 ], [ -121.91897198120644, 37.35270514617693 ], [ -121.922307140479148, 37.355748363762132 ], [ -121.922841067711317, 37.356235939069734 ], [ -121.924474030087566, 37.357725487082725 ], [ -121.928014210711922, 37.360955453470623 ], [ -121.930003823068247, 37.362770638421857 ], [ -121.932143136215217, 37.364722364575854 ], [ -121.934594926712478, 37.366959075437677 ], [ -121.934740604189628, 37.367092096241066 ], [ -121.936441124705496, 37.368643335061392 ], [ -121.938959383694936, 37.370940563264128 ], [ -121.939064660398799, 37.371036619874516 ], [ -121.941005741535704, 37.372807380738962 ], [ -121.941899336233078, 37.373622437003519 ], [ -121.941997823595344, 37.373712374824571 ] ] } },
{ "type": "Feature", "properties": { "id": 890.0, "osm_id": 289802244.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.249982641441022, 37.513102334952727 ], [ -122.249961016130854, 37.513092528126023 ], [ -122.249944252324482, 37.513087918079279 ], [ -122.249921705004951, 37.513085822603472 ], [ -122.249903180998928, 37.513085822603472 ], [ -122.249885746640331, 37.513087498984099 ], [ -122.249868479919812, 37.513089929736026 ], [ -122.249853057217948, 37.513094539782792 ], [ -122.24977762008939, 37.513147681048878 ], [ -122.248914451700571, 37.513756961590566 ] ] } },
{ "type": "Feature", "properties": { "id": 891.0, "osm_id": 289802248.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.24903473201114, 37.511115153348356 ], [ -122.249010927406104, 37.511139796143659 ], [ -122.248989050638826, 37.511167875519305 ], [ -122.24897748361245, 37.511195954894937 ], [ -122.248972957384723, 37.511221435880586 ], [ -122.248971029546993, 37.511242893552712 ], [ -122.248971448642152, 37.511278265184117 ], [ -122.24897605868891, 37.511306428378766 ], [ -122.24898745807721, 37.511338279610811 ], [ -122.2490074070068, 37.511372142499638 ], [ -122.249031714525998, 37.511410196340066 ] ] } },
{ "type": "Feature", "properties": { "id": 892.0, "osm_id": 289802249.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.250398719114557, 37.513184980518012 ], [ -122.250367203158618, 37.513169138721025 ], [ -122.250341554534927, 37.51316301993171 ], [ -122.250314564806686, 37.513164025760062 ], [ -122.250283635583983, 37.513169138721025 ], [ -122.2502585736935, 37.513178861728683 ], [ -122.250234182355285, 37.513194116792462 ], [ -122.250223034424025, 37.513203672162092 ], [ -122.250152710256401, 37.513253041571787 ], [ -122.250081547898475, 37.513304171181126 ], [ -122.250010469359552, 37.51335228330538 ], [ -122.249172111404121, 37.513946392602293 ] ] } },
{ "type": "Feature", "properties": { "id": 893.0, "osm_id": 289802242.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.249272442785141, 37.51196323431143 ], [ -122.249258445006816, 37.511987038916438 ], [ -122.249241345924347, 37.512002461618302 ], [ -122.249219469157069, 37.512016291758542 ], [ -122.249191725057543, 37.512024841299805 ], [ -122.249162723672598, 37.512028277880063 ], [ -122.249131878268898, 37.51202878079426 ], [ -122.249105475273893, 37.512023332557192 ], [ -122.249076138612807, 37.512011849349854 ], [ -122.24905644114034, 37.512000366142516 ] ] } },
{ "type": "Feature", "properties": { "id": 894.0, "osm_id": 289802243.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.252086582956593, 37.514680144406121 ], [ -122.252097730887797, 37.514693471632157 ], [ -122.252100916011003, 37.514706128305939 ], [ -122.252102424753602, 37.514716438046847 ], [ -122.252102424753602, 37.514728759444509 ], [ -122.252100161639746, 37.514743092498911 ], [ -122.252096054507192, 37.5147557491727 ], [ -122.252088929889496, 37.514768824941704 ], [ -122.252078620148566, 37.514784499100635 ], [ -122.25205582137194, 37.514804867125342 ] ] } },
{ "type": "Feature", "properties": { "id": 895.0, "osm_id": 289802253.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.252155817476819, 37.514876616216462 ], [ -122.252127319006036, 37.514856332010815 ], [ -122.252106783343251, 37.514845184079583 ], [ -122.252085409490135, 37.514836131624151 ], [ -122.252065125284489, 37.514830096653881 ], [ -122.25203805173723, 37.514825821883264 ], [ -122.251984742833059, 37.51482515133101 ], [ -122.2519439229646, 37.51482515133101 ], [ -122.251918441978958, 37.514828336454215 ], [ -122.251894134459732, 37.514835125795798 ], [ -122.251874017892106, 37.514845938450875 ], [ -122.251851554391607, 37.514861193514648 ], [ -122.251784666804312, 37.514911568752737 ], [ -122.250978662995124, 37.515484555653657 ] ] } },
{ "type": "Feature", "properties": { "id": 896.0, "osm_id": 289802257.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.249800251227967, 37.5127778714809 ], [ -122.249831431907765, 37.512766388273526 ], [ -122.249850039732834, 37.51276169440775 ], [ -122.24987367669975, 37.512762029683891 ], [ -122.249899157685391, 37.5127652986261 ], [ -122.249916843501083, 37.51276999249189 ], [ -122.249940815744196, 37.51278088896602 ], [ -122.249924554852015, 37.512758425465499 ], [ -122.249919106614954, 37.512736464879204 ], [ -122.249919525710098, 37.512724562576715 ], [ -122.249923213747522, 37.512708385503537 ], [ -122.249938049716121, 37.512683155975026 ] ] } },
{ "type": "Feature", "properties": { "id": 897.0, "osm_id": 289802259.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.250888222259888, 37.51377607232979 ], [ -122.2508740568435, 37.513792249402947 ], [ -122.250865842578378, 37.51380448698157 ], [ -122.250859975246186, 37.513821418425998 ], [ -122.250859053236852, 37.513840529165215 ], [ -122.250863663283567, 37.513865088141507 ], [ -122.25088436658443, 37.513900878868064 ], [ -122.25085134188592, 37.513880175567216 ], [ -122.250833656070228, 37.513874056777908 ], [ -122.250812701312285, 37.513870871654696 ], [ -122.250789902535658, 37.513871542206957 ], [ -122.250771378529635, 37.513872967130482 ], [ -122.250746819553342, 37.513878499186582 ] ] } },
{ "type": "Feature", "properties": { "id": 898.0, "osm_id": 289802260.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.251508566913728, 37.514321063674146 ], [ -122.251490964917096, 37.514343275717565 ], [ -122.251484007937464, 37.514360961533264 ], [ -122.251479900804881, 37.514380072272495 ], [ -122.251480403719071, 37.514396333164648 ], [ -122.251481828642639, 37.514414018980375 ], [ -122.251488115070003, 37.514427765301548 ], [ -122.25149674843027, 37.514442936546317 ], [ -122.251467244131106, 37.51442667565415 ], [ -122.251447127563495, 37.514421227417088 ], [ -122.251426256624597, 37.514418796665169 ], [ -122.251403038752798, 37.514420137769683 ], [ -122.251378815052632, 37.514424161083184 ], [ -122.25134587417314, 37.514438158861488 ] ] } },
{ "type": "Feature", "properties": { "id": 899.0, "osm_id": 289802261.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.25196026767577, 37.513011056027175 ], [ -122.251930763376606, 37.513021449587079 ], [ -122.251905701486137, 37.513024467072263 ], [ -122.251880052862376, 37.513024467072263 ], [ -122.251860020113796, 37.513022958329685 ], [ -122.251842082841009, 37.513017845368722 ], [ -122.251811824170559, 37.51300552397106 ], [ -122.251822720644711, 37.513025472900615 ], [ -122.251826073405979, 37.513039554497951 ], [ -122.251826408682078, 37.513050534791098 ], [ -122.251825738129838, 37.513066544226163 ], [ -122.251823558835014, 37.513081547832869 ], [ -122.251817523864716, 37.513097138172782 ], [ -122.251800508601292, 37.513119350216144 ] ] } },
{ "type": "Feature", "properties": { "id": 900.0, "osm_id": 289802262.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.250223034424025, 37.513203672162092 ], [ -122.250213227597342, 37.513222531444264 ], [ -122.250206270617696, 37.513242648011847 ], [ -122.250205264789315, 37.513259747094338 ], [ -122.250207527903171, 37.513276846176794 ], [ -122.250213646692487, 37.513293945259271 ], [ -122.250228147384973, 37.51331967770205 ], [ -122.250199313638035, 37.513301321334055 ], [ -122.250186656964246, 37.513297298020547 ], [ -122.250167630044032, 37.513292855611866 ], [ -122.250139634487439, 37.5132910954122 ], [ -122.250116835710841, 37.513292352697661 ], [ -122.250099568990294, 37.513296124554117 ], [ -122.250081547898475, 37.513304171181126 ] ] } },
{ "type": "Feature", "properties": { "id": 901.0, "osm_id": 289802265.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.25103985088829, 37.513667359045648 ], [ -122.251026775119357, 37.513679261348145 ], [ -122.251023170900979, 37.513688984355845 ], [ -122.251021578339362, 37.513702982134141 ], [ -122.251023422358074, 37.513716728455336 ], [ -122.251027948585772, 37.513728966033973 ], [ -122.251036079031849, 37.513741287431642 ], [ -122.25104890334373, 37.513758889428289 ], [ -122.251036079031849, 37.513754782295742 ], [ -122.251018979949379, 37.513748328230292 ], [ -122.250998444286623, 37.513744724011943 ], [ -122.250981764299311, 37.513744221097738 ], [ -122.250962737379098, 37.513744053459689 ], [ -122.250944129554057, 37.513746568030655 ], [ -122.250929377404475, 37.513751178077392 ], [ -122.250907332999105, 37.513762242189571 ] ] } },
{ "type": "Feature", "properties": { "id": 902.0, "osm_id": 289802266.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.251753150848344, 37.514547458878887 ], [ -122.251730268252686, 37.514558271533986 ], [ -122.251711576608599, 37.514561875752335 ], [ -122.251693806973904, 37.51456229484748 ], [ -122.251673774225296, 37.514560869923955 ], [ -122.251658016247362, 37.514559277362338 ], [ -122.251643180278734, 37.514554667315593 ], [ -122.251627422300757, 37.514548045612116 ], [ -122.251604707343148, 37.514538657880557 ], [ -122.251617783112081, 37.514556259877217 ], [ -122.251625745920137, 37.514569251827133 ], [ -122.25162775757687, 37.514581237948654 ], [ -122.251626416472376, 37.514602947077861 ], [ -122.251623566625284, 37.514618369779733 ], [ -122.251620968235315, 37.514630523539303 ], [ -122.251615100903066, 37.514640246546975 ], [ -122.251596828354167, 37.514659776381407 ] ] } },
{ "type": "Feature", "properties": { "id": 903.0, "osm_id": 289802250.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.247539400484982, 37.509509683614496 ], [ -122.24755884650034, 37.509521334459912 ], [ -122.247576951411205, 37.50952829143953 ], [ -122.247592374113012, 37.509531225105647 ], [ -122.247612323042574, 37.50953172801983 ], [ -122.24763235579114, 37.509530219277281 ], [ -122.24765297527297, 37.509527788525361 ], [ -122.247669319984169, 37.509521837374074 ], [ -122.247718857031913, 37.509485124638189 ], [ -122.247850117635579, 37.509392336970052 ], [ -122.247885656905083, 37.509367358898615 ], [ -122.248849827227133, 37.508675097515521 ] ] } },
{ "type": "Feature", "properties": { "id": 904.0, "osm_id": 289802256.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.251142277745075, 37.513842289364902 ], [ -122.251154012409515, 37.513867351255378 ], [ -122.251156024066248, 37.513887719280071 ], [ -122.251152168390831, 37.51390817112383 ], [ -122.251143702668585, 37.51393264628112 ], [ -122.251130123985462, 37.513948571897139 ], [ -122.251106822294645, 37.513968772283775 ], [ -122.251089723212189, 37.51397732182501 ], [ -122.251068852273292, 37.51398318915723 ], [ -122.251044209477953, 37.513987044832696 ], [ -122.251018309397139, 37.513985619909135 ], [ -122.250991068211803, 37.51398025549112 ], [ -122.250962737379098, 37.513970281026346 ], [ -122.250971035463238, 37.513987883022999 ], [ -122.250976567519317, 37.514006993762237 ], [ -122.250974220586443, 37.514033983490449 ], [ -122.250966928330655, 37.514058458647753 ], [ -122.250956534770737, 37.514077820844044 ] ] } },
{ "type": "Feature", "properties": { "id": 905.0, "osm_id": 289802245.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.250848911134, 37.512152497685101 ], [ -122.25082762109993, 37.512140846839714 ], [ -122.250814042416806, 37.512135817697796 ], [ -122.250794009668212, 37.512130788555886 ], [ -122.250779928070898, 37.512128273984921 ], [ -122.250761739340987, 37.512126765242371 ], [ -122.25074086840209, 37.512128273984921 ], [ -122.250723601681543, 37.512130788555886 ], [ -122.250706754056168, 37.51213615297393 ], [ -122.250695857582073, 37.512138751363906 ] ] } },
{ "type": "Feature", "properties": { "id": 906.0, "osm_id": 289802247.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.249708134112069, 37.511651846608551 ], [ -122.249733615097739, 37.511648745304385 ], [ -122.249749708351814, 37.51164103395346 ], [ -122.249762616482712, 37.511630556574502 ], [ -122.249775859889752, 37.511616558796185 ], [ -122.249790612039305, 37.511596358409527 ], [ -122.249799748313777, 37.511575152194517 ], [ -122.249802262884728, 37.511556795826586 ], [ -122.249801927608573, 37.511535086697343 ], [ -122.249799329218604, 37.511517652338746 ], [ -122.249793378067366, 37.511502816370097 ] ] } },
{ "type": "Feature", "properties": { "id": 907.0, "osm_id": 289802264.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.251787013737157, 37.513128989404827 ], [ -122.251757509438022, 37.51314449592568 ], [ -122.251733537194909, 37.513150279438889 ], [ -122.251711660427645, 37.513152039638534 ], [ -122.251691627679079, 37.513152374914668 ], [ -122.251680312109784, 37.513151620543375 ], [ -122.251667571616949, 37.513148770696311 ], [ -122.251644521383227, 37.513137538946062 ], [ -122.251653070924462, 37.513154889485612 ], [ -122.251658016247362, 37.513171485653892 ], [ -122.251658938256696, 37.513188417098299 ], [ -122.251656675142868, 37.513201073772123 ], [ -122.25165030489643, 37.513215825921705 ], [ -122.251630355966867, 37.513241139269269 ] ] } },
{ "type": "Feature", "properties": { "id": 908.0, "osm_id": 289802275.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.249775608432628, 37.511095958790094 ], [ -122.249748283428275, 37.511106771445156 ], [ -122.249721880433299, 37.511107441997432 ], [ -122.249694555428931, 37.511106352350005 ], [ -122.249671421376163, 37.511100987931968 ], [ -122.249652562094028, 37.511092857485899 ] ] } },
{ "type": "Feature", "properties": { "id": 909.0, "osm_id": 289802276.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.248629047897523, 37.510086274733787 ], [ -122.248602058169311, 37.510095494827304 ], [ -122.248571883317865, 37.510099518140834 ], [ -122.248547408160633, 37.510097925579224 ], [ -122.248530057621053, 37.510093818446677 ], [ -122.248509438139251, 37.510083760162864 ] ] } },
{ "type": "Feature", "properties": { "id": 910.0, "osm_id": 289802280.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.249853057217948, 37.513094539782792 ], [ -122.24986177439726, 37.513081799289971 ], [ -122.249868144643671, 37.513067382416494 ], [ -122.249872670871397, 37.513049361324661 ], [ -122.2498735090617, 37.51302832274768 ], [ -122.249869904843322, 37.513011475122347 ], [ -122.249860936206943, 37.512994627496944 ] ] } },
{ "type": "Feature", "properties": { "id": 911.0, "osm_id": 289802254.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.250415315282822, 37.512344778543891 ], [ -122.25037902164209, 37.512384173488833 ], [ -122.250360916731253, 37.512424574262106 ], [ -122.250357228693829, 37.512464220664128 ], [ -122.250360916731253, 37.512516859016053 ], [ -122.250381871489168, 37.512566647520899 ], [ -122.250419003320246, 37.512621465167683 ], [ -122.25045387203744, 37.512667230359007 ], [ -122.250394528162971, 37.51262724868085 ], [ -122.250341805991994, 37.512600594228779 ], [ -122.250289922011348, 37.512581734946593 ], [ -122.250233679441067, 37.512572347215055 ], [ -122.250186321688147, 37.512570922291523 ], [ -122.250104514313179, 37.512585339164971 ], [ -122.250057743293439, 37.512602438247463 ] ] } },
{ "type": "Feature", "properties": { "id": 912.0, "osm_id": 289802251.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.251119143692321, 37.512674271157628 ], [ -122.251136242774777, 37.51268273687986 ], [ -122.25115426386661, 37.512685838184012 ], [ -122.251172871691665, 37.512686844012421 ], [ -122.251201118705339, 37.51268508381272 ], [ -122.25122366602487, 37.512681563413409 ], [ -122.251242609126038, 37.512674354976674 ], [ -122.251258618561124, 37.512664464330925 ], [ -122.251349562210564, 37.512595984182035 ], [ -122.251431201947469, 37.512536137393376 ], [ -122.251465064836253, 37.512511326959945 ], [ -122.251487779793891, 37.512495317524916 ], [ -122.252099323449414, 37.512061386397605 ] ] } },
{ "type": "Feature", "properties": { "id": 913.0, "osm_id": 289802284.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.248357474234695, 37.509834398543447 ], [ -122.248329478678087, 37.509847139036275 ], [ -122.248311457586283, 37.509850994711712 ], [ -122.248288910266751, 37.509852587273336 ], [ -122.248262339633698, 37.50984998888336 ], [ -122.248243983265724, 37.509844121551112 ], [ -122.248220430117797, 37.509828866487332 ] ] } },
{ "type": "Feature", "properties": { "id": 914.0, "osm_id": 289802252.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.250434928936244, 37.513502989924419 ], [ -122.250409280312525, 37.513489746517401 ], [ -122.250392432687164, 37.513485136470663 ], [ -122.250362257835747, 37.513482035166469 ], [ -122.250341722173005, 37.513484130642269 ], [ -122.250321102691146, 37.513488153955791 ], [ -122.250298639190689, 37.513496368220906 ], [ -122.250230913413006, 37.51354607290672 ], [ -122.249352406141398, 37.514170273236076 ], [ -122.249334720325706, 37.514189383975307 ], [ -122.249325667870281, 37.514208075619386 ], [ -122.24931242446327, 37.514228946558283 ], [ -122.2491593709113, 37.514343694812723 ] ] } },
{ "type": "Feature", "properties": { "id": 915.0, "osm_id": 289802282.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.248941106152657, 37.515526129893402 ], [ -122.249460616511371, 37.516011358268123 ], [ -122.249480649259965, 37.516044550604704 ], [ -122.24948970171539, 37.51607045068549 ], [ -122.249496910152118, 37.516123843408735 ], [ -122.249491461915056, 37.516193329386006 ], [ -122.249262468320367, 37.517945398606393 ] ] } },
{ "type": "Feature", "properties": { "id": 916.0, "osm_id": 289802278.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.249125675660579, 37.511052959626817 ], [ -122.249152916845858, 37.511037620743991 ], [ -122.249163310405805, 37.511033848887578 ], [ -122.249179571297958, 37.511030496126331 ], [ -122.249197424751713, 37.511028652107619 ], [ -122.249215445843532, 37.511028484469563 ], [ -122.249235227135017, 37.5110302446692 ], [ -122.249247967627852, 37.511032088687926 ], [ -122.249271856051905, 37.511041644057528 ], [ -122.2492652343484, 37.511027730098242 ], [ -122.249262049225166, 37.511014067596058 ], [ -122.249262468320367, 37.510999063989402 ], [ -122.249263557967751, 37.510983222192394 ], [ -122.249267832738369, 37.510967380395385 ], [ -122.24928040559314, 37.510948940208429 ], [ -122.249303874922035, 37.510926476707908 ], [ -122.249328182441232, 37.510913987672183 ], [ -122.249352406141398, 37.510906276321286 ], [ -122.24936900230972, 37.510903594112243 ], [ -122.249387023401496, 37.510902755921911 ], [ -122.249405212131379, 37.51090409702644 ], [ -122.249421137747404, 37.510906024864155 ], [ -122.249433626783159, 37.510909042349319 ], [ -122.249444774714377, 37.510913736215095 ], [ -122.249456760835912, 37.510919435909258 ], [ -122.249450642046597, 37.510907198330628 ], [ -122.249447205466282, 37.510897391503889 ], [ -122.249445948180792, 37.510886159753618 ], [ -122.24944561290468, 37.510873251622748 ], [ -122.249446367275979, 37.510856655454482 ], [ -122.249451144960773, 37.510838969638783 ], [ -122.249459359225895, 37.510826396784026 ], [ -122.249472267356794, 37.510811225539285 ] ] } },
{ "type": "Feature", "properties": { "id": 917.0, "osm_id": 289802287.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.25000502112249, 37.5113012315988 ], [ -122.249984569278766, 37.511308942949732 ], [ -122.249965877634693, 37.511311541339701 ], [ -122.249951712218305, 37.511312547168075 ], [ -122.249931763288757, 37.51131112224455 ], [ -122.249911730540163, 37.511307937121323 ], [ -122.249883818802601, 37.511297795018507 ] ] } },
{ "type": "Feature", "properties": { "id": 918.0, "osm_id": 289802270.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.251273035434579, 37.513958378723864 ], [ -122.251245375154099, 37.513943878031334 ], [ -122.251219726530394, 37.51393809451816 ], [ -122.251197430667972, 37.513936250499476 ], [ -122.251164657426528, 37.513938765070442 ], [ -122.251141439554743, 37.513947063154554 ], [ -122.251125430119686, 37.513956450886106 ], [ -122.251106822294645, 37.513968772283775 ], [ -122.251092237783112, 37.51398243478593 ], [ -122.251079078195147, 37.514001629344207 ], [ -122.25107404905323, 37.514024092844728 ], [ -122.251073127043895, 37.51404387413622 ], [ -122.251082263318352, 37.514065918541554 ], [ -122.251094081801824, 37.514086538023363 ], [ -122.251062146750741, 37.51407203733087 ], [ -122.251030714613819, 37.514067762560266 ], [ -122.251012022969746, 37.514067762560266 ], [ -122.250985200879612, 37.514069941855084 ], [ -122.250956534770737, 37.514077820844044 ], [ -122.250928203938017, 37.51409374646007 ], [ -122.250887132612462, 37.514122747845043 ], [ -122.249671840471365, 37.51499915964088 ], [ -122.249174625975087, 37.515357737458629 ], [ -122.248941106152657, 37.515526129893402 ], [ -122.248898358446496, 37.515556975297095 ], [ -122.248870027613762, 37.515583545930134 ], [ -122.248848150846484, 37.515612128219985 ], [ -122.248837841105583, 37.515647918946527 ], [ -122.248836500001062, 37.515693935594953 ], [ -122.248853263807433, 37.515862579486807 ], [ -122.248858460587385, 37.515878924197992 ], [ -122.248870027613762, 37.51589627473755 ], [ -122.249010424491914, 37.516020997456792 ], [ -122.249043952104628, 37.516032145387996 ], [ -122.249071025651872, 37.516035246692176 ] ] } },
{ "type": "Feature", "properties": { "id": 919.0, "osm_id": 289802288.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.250648667467175, 37.51369216947905 ], [ -122.250622851205407, 37.513680937728793 ], [ -122.250593263087197, 37.513677836424606 ], [ -122.250555376884876, 37.513678339338803 ], [ -122.250526375499859, 37.513686050689735 ], [ -122.25044926199071, 37.51373776703231 ], [ -122.249344024238212, 37.514533125824457 ] ] } },
{ "type": "Feature", "properties": { "id": 920.0, "osm_id": 289802285.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.250526375499859, 37.513686050689735 ], [ -122.250536601421757, 37.513672891101749 ], [ -122.250543977496548, 37.513652271619939 ], [ -122.250544312772675, 37.513637435651333 ], [ -122.250544480410738, 37.513621929130466 ], [ -122.250541211468487, 37.513607428437943 ], [ -122.250535930869503, 37.513592341012249 ] ] } },
{ "type": "Feature", "properties": { "id": 921.0, "osm_id": 289802286.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.249174625975087, 37.515357737458629 ], [ -122.249876861822955, 37.515990235872138 ], [ -122.249911059987909, 37.516036252520536 ], [ -122.249932852936183, 37.516095428756962 ], [ -122.249932852936183, 37.51615167132725 ], [ -122.249927404699108, 37.516191569186333 ], [ -122.24968743081125, 37.517951517395694 ] ] } },
{ "type": "Feature", "properties": { "id": 922.0, "osm_id": 289802277.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.249241513562438, 37.510631936630396 ], [ -122.249220223528354, 37.510640737628719 ], [ -122.249191976514666, 37.510644090389988 ], [ -122.249167249900296, 37.510643336018695 ], [ -122.249147971523001, 37.510637468686483 ], [ -122.249119808328359, 37.510622297441742 ] ] } },
{ "type": "Feature", "properties": { "id": 923.0, "osm_id": 289802290.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.250298639190689, 37.513496368220906 ], [ -122.250312301692844, 37.51348237044261 ], [ -122.250318252844082, 37.513466863921735 ], [ -122.250321857062431, 37.513453536695707 ], [ -122.25032235997665, 37.51343409068032 ], [ -122.250319174853431, 37.51341389029367 ], [ -122.25030861365542, 37.513391175336082 ] ] } },
{ "type": "Feature", "properties": { "id": 924.0, "osm_id": 289802279.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.250981764299311, 37.512174793547544 ], [ -122.250965838683285, 37.512182337260391 ], [ -122.25094723085823, 37.512185941478748 ], [ -122.250930802328014, 37.512185522383582 ], [ -122.250910434303307, 37.512183762183952 ], [ -122.250889982459526, 37.512179068318169 ], [ -122.250871039358373, 37.51217202751949 ] ] } },
{ "type": "Feature", "properties": { "id": 925.0, "osm_id": 289802289.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.249413007301357, 37.512705619475518 ], [ -122.249423149404194, 37.512693884811085 ], [ -122.249429016736386, 37.512684580898529 ], [ -122.249434045878303, 37.512667230359007 ], [ -122.249435806077969, 37.512646694696215 ], [ -122.249433626783159, 37.512627919233125 ], [ -122.249425244879959, 37.512608976131951 ] ] } },
{ "type": "Feature", "properties": { "id": 926.0, "osm_id": 289802295.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.249336312887294, 37.512530186242081 ], [ -122.249310077530367, 37.512517781025402 ], [ -122.249277304288952, 37.512512081331259 ], [ -122.249239166629536, 37.512512081331259 ], [ -122.249214775291293, 37.512516775197007 ], [ -122.249194155809491, 37.512526498204693 ], [ -122.249126262393787, 37.512575280881165 ], [ -122.248575738993338, 37.512958836770409 ] ] } },
{ "type": "Feature", "properties": { "id": 927.0, "osm_id": 289802291.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.249194155809491, 37.512526498204693 ], [ -122.249208405044882, 37.512508560931913 ], [ -122.249216116395814, 37.512490875116242 ], [ -122.249220223528354, 37.512476458242773 ], [ -122.249222905737369, 37.512456593132228 ], [ -122.249220223528354, 37.512442595353939 ], [ -122.249214523834198, 37.512422394967281 ] ] } },
{ "type": "Feature", "properties": { "id": 928.0, "osm_id": 289802292.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.249688101363503, 37.509333579828812 ], [ -122.248629047897523, 37.510086274733787 ], [ -122.248613625195688, 37.510103541454342 ], [ -122.248607254949277, 37.510119383251322 ], [ -122.248606500577992, 37.510137739619296 ], [ -122.248610440072483, 37.510157185634654 ], [ -122.248621671822733, 37.510182750439355 ] ] } },
{ "type": "Feature", "properties": { "id": 929.0, "osm_id": 289802294.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.24812546315485, 37.509644045522364 ], [ -122.248108280253348, 37.509652092149409 ], [ -122.248085732933831, 37.509656450739051 ], [ -122.24806880148941, 37.509656786015192 ], [ -122.248048601102766, 37.509654941996473 ], [ -122.248029741820602, 37.509648487931045 ], [ -122.248013145652337, 37.509639686932722 ], [ -122.247993112903742, 37.509628287544395 ] ] } },
{ "type": "Feature", "properties": { "id": 930.0, "osm_id": 289802297.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.247669319984169, 37.509521837374074 ], [ -122.247659345519381, 37.509537427713987 ], [ -122.247653562006207, 37.509550252025839 ], [ -122.247651550349445, 37.509564585080284 ], [ -122.247652556177826, 37.509579840144063 ], [ -122.24765440019651, 37.509594424655589 ], [ -122.247659345519381, 37.509608590071949 ], [ -122.247668230336728, 37.509623258402492 ] ] } },
{ "type": "Feature", "properties": { "id": 931.0, "osm_id": 289802281.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.251529773128794, 37.514305557153278 ], [ -122.25154393854514, 37.5142992707259 ], [ -122.251562378732118, 37.514294828317247 ], [ -122.251589368460358, 37.514292397565335 ], [ -122.251617364016937, 37.51429256520337 ], [ -122.251638654050979, 37.514296169421733 ], [ -122.251660782275408, 37.514302372030066 ] ] } },
{ "type": "Feature", "properties": { "id": 932.0, "osm_id": 289802267.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.250666856197057, 37.51216079576924 ], [ -122.250649924752636, 37.512167585110795 ], [ -122.250629556727915, 37.512173368624005 ], [ -122.250608182874828, 37.512174374452393 ], [ -122.250589910325928, 37.512174374452393 ], [ -122.25056996139638, 37.512172530433674 ], [ -122.250554538694544, 37.512167920386936 ], [ -122.250528219518571, 37.512152749142203 ], [ -122.250538110164328, 37.512167920386936 ], [ -122.250544061315566, 37.512180157965567 ], [ -122.250546743524595, 37.512193820467729 ], [ -122.250548168448134, 37.512204633122842 ], [ -122.250548168448134, 37.512216283968243 ], [ -122.250545402420073, 37.51222919209912 ], [ -122.250542217296868, 37.512239669478141 ], [ -122.250535847050472, 37.512249392485792 ], [ -122.250526543137951, 37.512264479911515 ] ] } },
{ "type": "Feature", "properties": { "id": 933.0, "osm_id": 289802302.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.2488017151029, 37.510223821764889 ], [ -122.248785202753652, 37.510232455125156 ], [ -122.248764331814769, 37.510239663561876 ], [ -122.248745723989686, 37.510241842856686 ], [ -122.248725272145961, 37.510240753209288 ], [ -122.248703479197701, 37.51023672989578 ], [ -122.248685709562992, 37.510231030201616 ], [ -122.248662575510224, 37.510218792622972 ] ] } },
{ "type": "Feature", "properties": { "id": 934.0, "osm_id": 289802258.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.249625572365815, 37.512899241438838 ], [ -122.249646359485681, 37.512892535916293 ], [ -122.249674103585207, 37.512886417126985 ], [ -122.249699500751831, 37.512887590593415 ], [ -122.249724562642314, 37.51289077571662 ], [ -122.249742751372196, 37.512896894505936 ], [ -122.249762113568494, 37.512907120427798 ], [ -122.249752139103762, 37.512887674412461 ], [ -122.249749540713765, 37.512862947798077 ], [ -122.249749121618606, 37.512844256154033 ], [ -122.249754569855682, 37.512823636672202 ], [ -122.249768148538791, 37.512800251162346 ] ] } },
{ "type": "Feature", "properties": { "id": 935.0, "osm_id": 289802255.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.249671840471365, 37.51499915964088 ], [ -122.249643844914743, 37.515005781344392 ], [ -122.249625153270671, 37.515005781344392 ], [ -122.249602438313062, 37.515003518230522 ], [ -122.249582908478658, 37.514997818536365 ], [ -122.249556170207541, 37.51498222819648 ], [ -122.249437482458603, 37.514871251798439 ], [ -122.249416527700689, 37.514855326182428 ], [ -122.249396159675982, 37.514844262070227 ], [ -122.249372941804182, 37.514835963986108 ], [ -122.249346538809178, 37.514832359767738 ], [ -122.249318878528697, 37.514831270120318 ], [ -122.249298342865899, 37.514833365596104 ], [ -122.249278310117333, 37.514839819661553 ], [ -122.248834739801396, 37.515162271476633 ] ] } },
{ "type": "Feature", "properties": { "id": 936.0, "osm_id": 289802307.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.249239753362758, 37.510727993240756 ], [ -122.249225252670243, 37.510705865016412 ], [ -122.249220223528354, 37.51068742482942 ], [ -122.249220642623513, 37.51067015810888 ], [ -122.249227934879258, 37.510648951893813 ], [ -122.249241513562438, 37.510631936630396 ], [ -122.249287530210808, 37.510596229722871 ], [ -122.250025975880433, 37.51007638408808 ] ] } },
{ "type": "Feature", "properties": { "id": 937.0, "osm_id": 289802272.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.251231125918721, 37.512773177615102 ], [ -122.251224923310374, 37.512762532598067 ], [ -122.251222324920377, 37.512751384666849 ], [ -122.251222073463282, 37.512735794326957 ], [ -122.251222911653599, 37.512716348311585 ], [ -122.251229449538073, 37.512698746314918 ], [ -122.251240010736069, 37.512682233965663 ], [ -122.251258618561124, 37.512664464330925 ], [ -122.251281752613863, 37.512650382733604 ], [ -122.251303964657311, 37.512642922839774 ], [ -122.251324248862971, 37.512639318621424 ], [ -122.251342269954776, 37.512639318621424 ], [ -122.251360542503704, 37.512639989173671 ], [ -122.251383676556472, 37.512641497916242 ], [ -122.251400440362815, 37.512645018315581 ], [ -122.251413516131777, 37.512652645847453 ], [ -122.251406140056957, 37.512638899526273 ], [ -122.251402032924432, 37.512624398833779 ], [ -122.251401027096023, 37.512608557036771 ], [ -122.251401613829259, 37.512591960868477 ], [ -122.251404966590542, 37.512577460175983 ], [ -122.251411001560825, 37.512561869836091 ], [ -122.251419634921092, 37.512548123514875 ], [ -122.251431201947469, 37.512536137393376 ] ] } },
{ "type": "Feature", "properties": { "id": 938.0, "osm_id": 289802308.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.249030373421476, 37.51041107348177 ], [ -122.249001372036503, 37.510427418192968 ], [ -122.248984440592096, 37.510432447334892 ], [ -122.248963150557984, 37.510435716277108 ], [ -122.24894496182813, 37.510435716277108 ], [ -122.248928114202755, 37.510433536982283 ], [ -122.248910847482222, 37.51042926221168 ], [ -122.248893245485561, 37.510422389051023 ] ] } },
{ "type": "Feature", "properties": { "id": 939.0, "osm_id": 289802309.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.248123116221976, 37.509742951979817 ], [ -122.248112471204919, 37.509724427973808 ], [ -122.248110543367218, 37.509703557034911 ], [ -122.248111213919458, 37.509679081877621 ], [ -122.248115069594917, 37.509658127119714 ], [ -122.24812546315485, 37.509644045522364 ], [ -122.248166283023309, 37.509613367756778 ], [ -122.249196335104315, 37.50888145997164 ] ] } },
{ "type": "Feature", "properties": { "id": 940.0, "osm_id": 289802296.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.248806073692549, 37.510345359360912 ], [ -122.248785035115588, 37.510316525613987 ], [ -122.24877807813597, 37.510291547542508 ], [ -122.248779922154668, 37.510271179517801 ], [ -122.248785705667842, 37.510250224759901 ], [ -122.2488017151029, 37.510223821764889 ], [ -122.248835326534618, 37.510199849521811 ], [ -122.249537227106359, 37.509714537328051 ] ] } },
{ "type": "Feature", "properties": { "id": 941.0, "osm_id": 289802314.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.250455213141933, 37.511805235436611 ], [ -122.250440712449446, 37.511784196859672 ], [ -122.250437108231068, 37.511767516872354 ], [ -122.250436270040765, 37.511752429446666 ], [ -122.250440712449446, 37.511735162726076 ], [ -122.250445657772318, 37.51172217077616 ], [ -122.250457643893853, 37.511708424454973 ], [ -122.250509863150612, 37.511668945691007 ], [ -122.251485935775179, 37.510969392052147 ] ] } },
{ "type": "Feature", "properties": { "id": 942.0, "osm_id": 289802304.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.249021153327973, 37.510535125648715 ], [ -122.249002042588771, 37.51050645953989 ], [ -122.248996845808804, 37.510476871421709 ], [ -122.248997516361044, 37.510452396264412 ], [ -122.249007155549705, 37.510431944420652 ], [ -122.249030373421476, 37.51041107348177 ], [ -122.249056357321336, 37.510393555304127 ], [ -122.249737973687402, 37.50991436189971 ] ] } },
{ "type": "Feature", "properties": { "id": 943.0, "osm_id": 289802283.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.250457643893853, 37.511708424454973 ], [ -122.250439958078161, 37.511715632891686 ], [ -122.250420344424739, 37.511718985652969 ], [ -122.250399138209701, 37.511720159119406 ], [ -122.250379859832393, 37.511718482738779 ], [ -122.250362174016729, 37.511714878520408 ], [ -122.250339039963961, 37.511702976217897 ] ] } },
{ "type": "Feature", "properties": { "id": 944.0, "osm_id": 289802293.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.251160215017848, 37.514266246027397 ], [ -122.251176140633888, 37.514250571868438 ], [ -122.251187540022215, 37.514230371481808 ], [ -122.251190641326403, 37.514216960436748 ], [ -122.251192904440273, 37.514202459744268 ], [ -122.251192569164132, 37.514190557441744 ], [ -122.251187540022215, 37.514176894939581 ], [ -122.251174464253282, 37.514157616562244 ] ] } },
{ "type": "Feature", "properties": { "id": 945.0, "osm_id": 289802271.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.250082721364905, 37.511609937092679 ], [ -122.250101413008991, 37.511600465542081 ], [ -122.250121613395635, 37.511593424743424 ], [ -122.250140305039693, 37.511588730877669 ], [ -122.250159248140861, 37.511587892687331 ], [ -122.250178861794311, 37.511588395601528 ], [ -122.250194116858083, 37.511589652886997 ], [ -122.250213059959265, 37.511594849666977 ], [ -122.250229069394294, 37.511606165236238 ], [ -122.250222531509863, 37.511588227963436 ], [ -122.2502174185489, 37.511577331489335 ], [ -122.250214736339885, 37.511564088082331 ], [ -122.250215155435072, 37.511551096132408 ], [ -122.250216412720548, 37.511535254335435 ], [ -122.250220938948246, 37.51152092128099 ], [ -122.250228063565942, 37.511509186616529 ], [ -122.250242061344238, 37.511493428638538 ] ] } },
{ "type": "Feature", "properties": { "id": 946.0, "osm_id": 289802303.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.24784072990407, 37.509493925636548 ], [ -122.247831928905725, 37.509481017505649 ], [ -122.247827151220903, 37.509469031384114 ], [ -122.247823547002554, 37.509453692501282 ], [ -122.247823547002554, 37.5094375992472 ], [ -122.247828073230266, 37.509422763278572 ], [ -122.247835114028931, 37.509410441880895 ], [ -122.247850117635579, 37.509392336970052 ] ] } },
{ "type": "Feature", "properties": { "id": 947.0, "osm_id": 289802246.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.252022880492504, 37.5114322407454 ], [ -122.251726580215291, 37.511643548524411 ], [ -122.251038342145705, 37.512135063326504 ], [ -122.250981764299311, 37.512174793547544 ], [ -122.250971706015477, 37.512188036954555 ], [ -122.250964916673922, 37.512202118551897 ], [ -122.250963156474242, 37.512213350302133 ], [ -122.250962737379098, 37.512225252604622 ], [ -122.250965838683285, 37.512238244554588 ], [ -122.250971706015477, 37.512252996704163 ], [ -122.250983775956044, 37.512271939805323 ] ] } },
{ "type": "Feature", "properties": { "id": 948.0, "osm_id": 289802310.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.249555415836227, 37.512724143481542 ], [ -122.249524821889651, 37.512707463494202 ], [ -122.249503950950782, 37.512700171238457 ], [ -122.249482074183504, 37.512696567020086 ], [ -122.249459359225895, 37.512697321391357 ], [ -122.249432537135732, 37.512699416867164 ], [ -122.249413007301357, 37.512705619475518 ], [ -122.249336061430199, 37.512759682750982 ], [ -122.248683865544251, 37.513219430140069 ] ] } },
{ "type": "Feature", "properties": { "id": 949.0, "osm_id": 289802313.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.2502585736935, 37.513178861728683 ], [ -122.250269553986641, 37.513165618321665 ], [ -122.250276678604337, 37.513154470390468 ], [ -122.250282713574606, 37.513142735725999 ], [ -122.250286569250093, 37.513124882272258 ], [ -122.250286569250093, 37.513111890322335 ], [ -122.250282378298508, 37.513095042696975 ], [ -122.250275924233051, 37.513081799289971 ], [ -122.250270140719849, 37.51306914261616 ] ] } },
{ "type": "Feature", "properties": { "id": 950.0, "osm_id": 289802300.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.251851135296462, 37.514756755001116 ], [ -122.251861612675413, 37.514774859911981 ], [ -122.25186647417928, 37.514788019499946 ], [ -122.25186957548344, 37.514802436373422 ], [ -122.251868904931172, 37.514817859075258 ], [ -122.251867312369555, 37.514833197958048 ], [ -122.251863205237001, 37.514844764984424 ], [ -122.251851554391607, 37.514861193514648 ] ] } },
{ "type": "Feature", "properties": { "id": 951.0, "osm_id": 289802305.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.251779805300444, 37.51452809668254 ], [ -122.251803274629353, 37.514518876589037 ], [ -122.251818781150192, 37.514513344532951 ], [ -122.251836466965912, 37.51451191960939 ], [ -122.251858343733204, 37.514511584333285 ], [ -122.251877454472421, 37.514514434180349 ], [ -122.251896649030698, 37.514518457493885 ], [ -122.25191240700866, 37.514525665930613 ] ] } },
{ "type": "Feature", "properties": { "id": 952.0, "osm_id": 289802263.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.252336782766307, 37.512259031674454 ], [ -122.251812159446686, 37.512630349985038 ], [ -122.251792629612311, 37.512642922839774 ], [ -122.251777123091443, 37.512648622533945 ], [ -122.251756252152518, 37.512651556200048 ], [ -122.251737141413287, 37.512650885647808 ], [ -122.251721215797232, 37.512647281429423 ], [ -122.25169850083968, 37.512637558421751 ], [ -122.251674444777578, 37.512618782958654 ], [ -122.251540837240952, 37.512500598123928 ], [ -122.251528934938491, 37.512496155715212 ], [ -122.251515356255311, 37.512492970592014 ], [ -122.251500604105729, 37.512491629487513 ], [ -122.251487779793891, 37.512495317524916 ], [ -122.251494652954463, 37.51248131974662 ], [ -122.251494652954463, 37.512468663072774 ], [ -122.251492054564494, 37.512455168208675 ], [ -122.251481828642639, 37.512443852639421 ], [ -122.251327266348099, 37.51231024510281 ], [ -122.251319135902023, 37.512299516266772 ], [ -122.251316202235941, 37.512289122706825 ], [ -122.251316537512054, 37.512276130756909 ], [ -122.251317878616561, 37.512261043331193 ], [ -122.251324919415225, 37.512249895399997 ], [ -122.251338162822236, 37.512239166563944 ], [ -122.251368002397513, 37.512219552910459 ], [ -122.25188541728042, 37.511847061133437 ] ] } },
{ "type": "Feature", "properties": { "id": 953.0, "osm_id": 289802306.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.249783068326437, 37.511208443930663 ], [ -122.249762867939808, 37.511183130583078 ], [ -122.249757838797919, 37.511162678739353 ], [ -122.249758760807268, 37.511141640162371 ], [ -122.249763706130111, 37.511117584100283 ], [ -122.249775608432628, 37.511095958790094 ], [ -122.249820200157501, 37.5110631855487 ], [ -122.250554119599386, 37.510538729867079 ] ] } },
{ "type": "Feature", "properties": { "id": 954.0, "osm_id": 289802312.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.252150369239757, 37.514734794414792 ], [ -122.252211640951927, 37.514691040880244 ], [ -122.252505342839171, 37.514480738929628 ], [ -122.252836176557423, 37.514244453079137 ], [ -122.252850258154751, 37.514235735899845 ], [ -122.252873224569441, 37.514227437815698 ], [ -122.252894766060578, 37.514223163045081 ], [ -122.252909853486301, 37.514221151388313 ], [ -122.252934244824516, 37.514220480836073 ] ] } },
{ "type": "Feature", "properties": { "id": 955.0, "osm_id": 289802315.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.2500079547886, 37.511405753931378 ], [ -122.24999504665773, 37.511388654848894 ], [ -122.24999085570613, 37.51137599817509 ], [ -122.249988341135179, 37.511358647635532 ], [ -122.249989682239701, 37.511337441420501 ], [ -122.249994711381618, 37.511318582138365 ], [ -122.25000502112249, 37.5113012315988 ], [ -122.250051875961248, 37.511266279062568 ], [ -122.250728547004442, 37.510782475611364 ] ] } },
{ "type": "Feature", "properties": { "id": 956.0, "osm_id": 289802298.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.24834112952351, 37.5099352328386 ], [ -122.248333334353546, 37.509916457375475 ], [ -122.248330819782609, 37.509894580608226 ], [ -122.248334004905814, 37.509872536202863 ], [ -122.248342302989954, 37.509850156521388 ], [ -122.248357474234695, 37.509834398543447 ], [ -122.248389157828683, 37.509808749919706 ], [ -122.249407223788154, 37.509086648961308 ] ] } },
{ "type": "Feature", "properties": { "id": 957.0, "osm_id": 289802311.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.25131050254177, 37.514278148329879 ], [ -122.251278651309704, 37.514260462514187 ], [ -122.251253505600175, 37.514253254077481 ], [ -122.251231712651929, 37.514253254077481 ], [ -122.251196257201499, 37.514254343724865 ], [ -122.251178403747758, 37.514257947943236 ], [ -122.251160215017848, 37.514266246027397 ], [ -122.25110003295309, 37.514309748104857 ], [ -122.250368041348921, 37.514838646195109 ] ] } },
{ "type": "Feature", "properties": { "id": 958.0, "osm_id": 289802268.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.251800173325179, 37.514426088920921 ], [ -122.251809477237671, 37.51445048025915 ], [ -122.251808722866414, 37.514469842455483 ], [ -122.251804280457733, 37.514492892689205 ], [ -122.25179522800228, 37.514510746142953 ], [ -122.251779805300444, 37.51452809668254 ], [ -122.251753150848344, 37.514547458878887 ], [ -122.251677210805596, 37.514602863258844 ], [ -122.251596828354167, 37.514659776381407 ], [ -122.251542262164506, 37.514698584593091 ], [ -122.250921079320307, 37.515143244556455 ], [ -122.250901717124009, 37.515150955907366 ], [ -122.250879253623481, 37.515151961735747 ], [ -122.25085285062849, 37.515147854603207 ], [ -122.250834158984446, 37.515140646166465 ], [ -122.250814880607109, 37.515127486578471 ], [ -122.250684039098559, 37.515011983952768 ], [ -122.250666604739962, 37.514991448289969 ], [ -122.250658222836819, 37.514971080265248 ], [ -122.250658222836819, 37.514951634249883 ], [ -122.250663419616757, 37.514932774967761 ], [ -122.250678255585385, 37.514914334780791 ], [ -122.251290721250299, 37.514477469987362 ], [ -122.25134587417314, 37.514438158861488 ], [ -122.251426424262675, 37.514380742824741 ], [ -122.251508566913728, 37.514321063674146 ], [ -122.251529773128794, 37.514305557153278 ], [ -122.251543351811932, 37.514291894651109 ], [ -122.251552907181548, 37.514276471949266 ], [ -122.251558103961514, 37.51425962432387 ], [ -122.251559445066007, 37.514243782526897 ], [ -122.251557433409275, 37.514222324854785 ], [ -122.251546034020947, 37.514200531906532 ] ] } },
{ "type": "Feature", "properties": { "id": 959.0, "osm_id": 289802273.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.248743125599717, 37.51172133258585 ], [ -122.248959965434778, 37.512172865709822 ], [ -122.248967760604785, 37.512191222077753 ], [ -122.248978657078879, 37.512208656436357 ], [ -122.248987625715287, 37.512221983662386 ], [ -122.249008915749343, 37.512240340030381 ], [ -122.249214523834198, 37.512422394967281 ], [ -122.249336312887294, 37.512530186242081 ], [ -122.249425244879959, 37.512608976131951 ], [ -122.249555415836227, 37.512724143481542 ], [ -122.249628338393876, 37.512788767955001 ], [ -122.24969723763796, 37.512849788210104 ], [ -122.249762113568494, 37.512907120427798 ], [ -122.249860936206943, 37.512994627496944 ], [ -122.249982641441022, 37.513102334952727 ], [ -122.250084146288444, 37.51319218895474 ], [ -122.250152710256401, 37.513253041571787 ], [ -122.250228147384973, 37.51331967770205 ], [ -122.25030861365542, 37.513391175336082 ], [ -122.250434928936244, 37.513502989924419 ], [ -122.250535930869503, 37.513592341012249 ], [ -122.250648667467175, 37.51369216947905 ], [ -122.250742628601756, 37.513775317958505 ], [ -122.25088436658443, 37.513900878868064 ], [ -122.250962737379098, 37.513970281026346 ], [ -122.251094081801824, 37.514086538023363 ], [ -122.251174464253282, 37.514157616562244 ], [ -122.25131050254177, 37.514278148329879 ], [ -122.251368002397513, 37.514329194120258 ], [ -122.251426424262675, 37.514380742824741 ], [ -122.25149674843027, 37.514442936546317 ], [ -122.251604707343148, 37.514538657880557 ], [ -122.251677210805596, 37.514602863258844 ], [ -122.251739320708111, 37.514657764724639 ], [ -122.251851135296462, 37.514756755001116 ], [ -122.251900337068093, 37.514800340897608 ], [ -122.251924812225369, 37.514814673952053 ], [ -122.251943420050409, 37.51481928399879 ], [ -122.251964123351229, 37.514822888217168 ], [ -122.251984742833059, 37.51482515133101 ], [ -122.252004607943576, 37.514823391131337 ], [ -122.252032352043102, 37.514817775256212 ], [ -122.25205582137194, 37.514804867125342 ], [ -122.252150369239757, 37.514734794414792 ] ] } },
{ "type": "Feature", "properties": { "id": 960.0, "osm_id": 289802274.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.247718857031913, 37.509485124638189 ], [ -122.247734950286002, 37.509479257305983 ], [ -122.247753306653934, 37.509476742735053 ], [ -122.247771327745767, 37.509475988363725 ], [ -122.247786163714395, 37.509476239820849 ], [ -122.247805525910721, 37.509478754391807 ], [ -122.247820361879363, 37.509483867352714 ], [ -122.24784072990407, 37.509493925636548 ], [ -122.247993112903742, 37.509628287544395 ], [ -122.248123116221976, 37.509742951979817 ], [ -122.248220430117797, 37.509828866487332 ], [ -122.24834112952351, 37.5099352328386 ], [ -122.248509438139251, 37.510083760162864 ], [ -122.248621671822733, 37.510182750439355 ], [ -122.248662575510224, 37.510218792622972 ], [ -122.248806073692549, 37.510345359360912 ], [ -122.248893245485561, 37.510422389051023 ], [ -122.249021153327973, 37.510535125648715 ], [ -122.249119808328359, 37.510622297441742 ], [ -122.249239753362758, 37.510727993240756 ], [ -122.249333630678308, 37.510810890263151 ], [ -122.249394567114365, 37.510864534443428 ], [ -122.249456760835912, 37.510919435909258 ], [ -122.249652562094028, 37.511092857485899 ], [ -122.249783068326437, 37.511208443930663 ], [ -122.249883818802601, 37.511297795018507 ], [ -122.2500079547886, 37.511405753931378 ], [ -122.250105603960577, 37.511491836076949 ], [ -122.250165283111158, 37.511550425580154 ], [ -122.250229069394294, 37.511606165236238 ], [ -122.250339039963961, 37.511702976217897 ], [ -122.250455213141933, 37.511805235436611 ], [ -122.250706837875214, 37.512026517680432 ], [ -122.250848911134, 37.512152497685101 ], [ -122.250871039358373, 37.51217202751949 ], [ -122.250983775956044, 37.512271939805323 ], [ -122.251282004070958, 37.512536137393376 ], [ -122.251349562210564, 37.512595984182035 ], [ -122.251413516131777, 37.512652645847453 ], [ -122.251811824170559, 37.51300552397106 ], [ -122.25187837648177, 37.513064448750356 ], [ -122.251943336231363, 37.513122451520346 ], [ -122.252460834933288, 37.513584881118419 ], [ -122.252469300655505, 37.513598962715754 ], [ -122.252475251806771, 37.513618660188207 ], [ -122.252475251806771, 37.513639028212921 ], [ -122.252470641759999, 37.513659228599572 ], [ -122.25245723071491, 37.513679848081352 ], [ -122.252433509928949, 37.513701054296412 ], [ -122.252411716980703, 37.513726535282046 ], [ -122.252403083620436, 37.513746568030655 ], [ -122.252398473573692, 37.513770540273711 ], [ -122.252400066135309, 37.513790237746164 ], [ -122.252404843820131, 37.513807253009631 ], [ -122.252416578484556, 37.513823597720823 ] ] } },
{ "type": "Feature", "properties": { "id": 961.0, "osm_id": 289805535.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.249768148538791, 37.512800251162346 ], [ -122.249736800220944, 37.512809638893899 ], [ -122.249712744158842, 37.512812572560009 ], [ -122.249690029201233, 37.512812153464857 ], [ -122.249661866006548, 37.512806369951662 ], [ -122.249628338393876, 37.512788767955001 ], [ -122.249640911248633, 37.512812153464857 ], [ -122.249646359485681, 37.512837718269573 ], [ -122.249642755267317, 37.512863785988408 ], [ -122.249637726125428, 37.51287954396637 ], [ -122.249625572365815, 37.512899241438838 ] ] } },
{ "type": "Feature", "properties": { "id": 962.0, "osm_id": 289802269.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.252150369239757, 37.514734794414792 ], [ -122.252140562413047, 37.514747283450511 ], [ -122.252130839405353, 37.514758934295934 ], [ -122.252122122226041, 37.51477553046422 ], [ -122.252117679817374, 37.5147942221083 ], [ -122.252120278207371, 37.514815931237536 ], [ -122.252125307349274, 37.514833533234182 ], [ -122.252134443623731, 37.514850799954708 ], [ -122.252155817476819, 37.514876616216462 ], [ -122.253037174595534, 37.5156734837512 ], [ -122.253064415780813, 37.515689493186265 ], [ -122.253092243699356, 37.515703993878731 ], [ -122.253110851524411, 37.515711537591599 ], [ -122.253135913414908, 37.515723858989276 ], [ -122.253168267561136, 37.515746238670744 ], [ -122.253209255067645, 37.515763589210337 ], [ -122.253254852620927, 37.515780185378603 ], [ -122.253303132383195, 37.515791752404979 ], [ -122.253349149031635, 37.515796446270762 ], [ -122.253399272812587, 37.515793596423684 ], [ -122.253439338309789, 37.515789237834021 ], [ -122.253464316381255, 37.515779431007317 ], [ -122.253509159563222, 37.515761996648706 ], [ -122.253564563943172, 37.515722182608641 ], [ -122.25410695689753, 37.515247934527061 ], [ -122.254153308822097, 37.515198816574468 ], [ -122.25417132991393, 37.515164199314398 ], [ -122.2541842380448, 37.515123295626886 ], [ -122.254189434824767, 37.51507526732172 ], [ -122.254181639654803, 37.515036459110021 ], [ -122.254158421783032, 37.514991448289969 ], [ -122.254124977989363, 37.514946437469931 ], [ -122.254101341022405, 37.514923638693311 ], [ -122.253179080216228, 37.514109252980951 ] ] } },
{ "type": "Feature", "properties": { "id": 963.0, "osm_id": 289805548.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.251596828354167, 37.514659776381407 ], [ -122.251615519998225, 37.514651981211458 ], [ -122.251635804203914, 37.514645191869846 ], [ -122.251657680971221, 37.514643934584363 ], [ -122.251679641557544, 37.514644269860504 ], [ -122.251705625457348, 37.514646532974403 ], [ -122.251727166948513, 37.51465097538307 ], [ -122.251739320708111, 37.514657764724639 ], [ -122.251734123928131, 37.514646449155371 ], [ -122.251730519709781, 37.514633373386403 ], [ -122.251729430062355, 37.51462096816968 ], [ -122.25172926242432, 37.514608982048159 ], [ -122.251730435890735, 37.514591799146658 ], [ -122.25173261518556, 37.514579980663186 ], [ -122.251738650155858, 37.514567240170365 ], [ -122.251753150848344, 37.514547458878887 ] ] } },
{ "type": "Feature", "properties": { "id": 964.0, "osm_id": 289805540.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.251630355966867, 37.513241139269269 ], [ -122.25165717805703, 37.513231332442558 ], [ -122.25167251693982, 37.513227057671962 ], [ -122.251692549688386, 37.513227057671962 ], [ -122.251710319323124, 37.513228817871607 ], [ -122.251728927148193, 37.513232422089992 ], [ -122.251747115878075, 37.513237451231873 ], [ -122.251771507216347, 37.513250191724701 ], [ -122.251752564115137, 37.513222363806186 ], [ -122.251749881906136, 37.513207527837551 ], [ -122.251749462810977, 37.513192775687962 ], [ -122.251753067029313, 37.5131783588145 ], [ -122.251756671247662, 37.513165366864584 ], [ -122.251764801693767, 37.513151285267227 ], [ -122.251787013737157, 37.513128989404827 ] ] } },
{ "type": "Feature", "properties": { "id": 965.0, "osm_id": 289805542.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.251800508601292, 37.513119350216144 ], [ -122.251822133911475, 37.513110549217856 ], [ -122.251843004850357, 37.513106525904305 ], [ -122.251861612675413, 37.513104430428548 ], [ -122.251894469735873, 37.513107280275605 ], [ -122.251908551333216, 37.513108369923003 ], [ -122.251923554939893, 37.513112728512681 ], [ -122.251943336231363, 37.513122451520346 ], [ -122.251933948499783, 37.513104430428548 ], [ -122.251929422272084, 37.513090348831192 ], [ -122.251926237148879, 37.513074171758028 ], [ -122.251925734234717, 37.513056066847206 ], [ -122.251929841367243, 37.513045254192114 ], [ -122.251938055632351, 37.513033016613491 ], [ -122.25196026767577, 37.513011056027175 ] ] } },
{ "type": "Feature", "properties": { "id": 966.0, "osm_id": 289805556.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.250526543137951, 37.512264479911515 ], [ -122.25055043156199, 37.5122562656464 ], [ -122.250559064922243, 37.512254421627688 ], [ -122.250573146519599, 37.51225266142805 ], [ -122.250589910325928, 37.512252242332899 ], [ -122.250606757951317, 37.512254421627688 ], [ -122.250621761558008, 37.512257355293798 ], [ -122.250639531192718, 37.512261630064422 ], [ -122.250660737407742, 37.51227009578664 ], [ -122.250649002743316, 37.512250146857077 ], [ -122.250645817620111, 37.512235646164591 ], [ -122.250645482343941, 37.51222231893852 ], [ -122.250646739629445, 37.512210835731175 ], [ -122.250649924752636, 37.512195664486448 ], [ -122.250653528971014, 37.512186276754889 ], [ -122.250660402131643, 37.512172530433674 ], [ -122.250666856197057, 37.51216079576924 ] ] } },
{ "type": "Feature", "properties": { "id": 967.0, "osm_id": 289805544.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.25134587417314, 37.514438158861488 ], [ -122.251363811445955, 37.514417623198725 ], [ -122.251372444806194, 37.514399937383004 ], [ -122.251375210834283, 37.514385855785669 ], [ -122.251376551938776, 37.514367834693864 ], [ -122.251375629929427, 37.514353334001378 ], [ -122.251373869729733, 37.514341431698881 ], [ -122.251368002397513, 37.514329194120258 ], [ -122.25138971152677, 37.514335648185686 ], [ -122.251410750103744, 37.514338581851796 ], [ -122.251433548880343, 37.514340342051462 ], [ -122.251455844742779, 37.514337827480503 ], [ -122.251476883319739, 37.514333133614713 ], [ -122.251491300193209, 37.514327685377658 ], [ -122.251508566913728, 37.514321063674146 ] ] } },
{ "type": "Feature", "properties": { "id": 968.0, "osm_id": 289805537.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.249938049716121, 37.512683155975026 ], [ -122.249906449941179, 37.512693549534951 ], [ -122.249883651164524, 37.512694220087191 ], [ -122.249856829074389, 37.512691034963986 ], [ -122.249840400544173, 37.512685922003058 ], [ -122.249808465493061, 37.512667062720922 ], [ -122.249821876538149, 37.512689274764341 ], [ -122.249826402765848, 37.512709726608065 ], [ -122.249825983670718, 37.51273822507887 ], [ -122.249818607595913, 37.512753731599751 ], [ -122.249800251227967, 37.5127778714809 ] ] } },
{ "type": "Feature", "properties": { "id": 969.0, "osm_id": 289805553.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.251431201947469, 37.512536137393376 ], [ -122.251410331008572, 37.512544016382328 ], [ -122.251386945498709, 37.512549380800358 ], [ -122.251359955770482, 37.512551979190356 ], [ -122.251334558603872, 37.512551476276158 ], [ -122.251314525855278, 37.512548123514875 ], [ -122.251298516420249, 37.512543597287177 ], [ -122.251282004070958, 37.512536137393376 ], [ -122.251290469793176, 37.512549129343284 ], [ -122.251294912201857, 37.512561869836091 ], [ -122.251297510591854, 37.512576119071497 ], [ -122.251298516420249, 37.512590452125906 ], [ -122.251299103153471, 37.512605455732611 ], [ -122.251296923858646, 37.51261744185414 ], [ -122.251291727078652, 37.512630266165999 ], [ -122.251284015727748, 37.512640156811756 ], [ -122.251258618561124, 37.512664464330925 ] ] } },
{ "type": "Feature", "properties": { "id": 970.0, "osm_id": 289805538.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.250746819553342, 37.513878499186582 ], [ -122.25075671019907, 37.513860729551858 ], [ -122.250760482055512, 37.513847737601964 ], [ -122.25076081733161, 37.513829716510131 ], [ -122.250759560046163, 37.513811360142185 ], [ -122.250754949999418, 37.513795099250004 ], [ -122.250742628601756, 37.513775317958505 ], [ -122.250765427378411, 37.513785376242332 ], [ -122.250782777917962, 37.513788980460703 ], [ -122.250805828151712, 37.513791495031654 ], [ -122.250824016881566, 37.513790489203252 ], [ -122.25084991696238, 37.513786884984889 ], [ -122.2508740568435, 37.513780682376535 ], [ -122.250888222259888, 37.51377607232979 ] ] } },
{ "type": "Feature", "properties": { "id": 971.0, "osm_id": 289805546.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.250081547898475, 37.513304171181126 ], [ -122.25009277964871, 37.513290089583798 ], [ -122.250101413008991, 37.513275085977135 ], [ -122.25010593923669, 37.513257651618531 ], [ -122.250106274512817, 37.513243653840235 ], [ -122.250102335018354, 37.513227392948103 ], [ -122.250096635324198, 37.513212556979475 ], [ -122.250084146288444, 37.51319218895474 ], [ -122.250107867074433, 37.513204929447582 ], [ -122.250125804347221, 37.513211299693999 ], [ -122.25014701056223, 37.513215323007508 ], [ -122.25017022843403, 37.513216999388149 ], [ -122.250189506811353, 37.513215658283634 ], [ -122.250200738561588, 37.513212556979475 ], [ -122.250223034424025, 37.513203672162092 ] ] } },
{ "type": "Feature", "properties": { "id": 972.0, "osm_id": 289806278.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.249472267356794, 37.510811225539285 ], [ -122.249444355619175, 37.510825055679518 ], [ -122.249424741965782, 37.510829749545266 ], [ -122.249400266808536, 37.51083125828788 ], [ -122.249374702003834, 37.510829078993034 ], [ -122.249357016188128, 37.510823630755958 ], [ -122.249333630678308, 37.510810890263151 ], [ -122.249342012581451, 37.510828324621762 ], [ -122.249345616799815, 37.51084349586651 ], [ -122.249345281523702, 37.510856487816426 ], [ -122.249343856600163, 37.510871994337272 ], [ -122.249339330372464, 37.51088389663979 ], [ -122.249332457211864, 37.510897140046794 ], [ -122.249320638728364, 37.510909880539643 ], [ -122.249303874922035, 37.510926476707908 ], [ -122.249275460270269, 37.510940139210092 ], [ -122.249251320389149, 37.51094734764682 ], [ -122.24923028181216, 37.510948353475193 ], [ -122.249200442236827, 37.510949191665517 ], [ -122.249176134717658, 37.510945335990058 ], [ -122.24916062819679, 37.510939384838807 ], [ -122.249148642075284, 37.510932679316262 ], [ -122.249153335941003, 37.510941564133638 ], [ -122.249157275435522, 37.510955226635794 ], [ -122.24916062819679, 37.510973247727634 ], [ -122.249161382568104, 37.510986072039486 ], [ -122.249159706187442, 37.511002165293554 ], [ -122.249154341769412, 37.511017839452506 ], [ -122.249144367304623, 37.511032088687926 ], [ -122.249125675660579, 37.511052959626817 ] ] } },
{ "type": "Feature", "properties": { "id": 973.0, "osm_id": 289805558.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.250242061344238, 37.511493428638538 ], [ -122.250215071615997, 37.511502732551087 ], [ -122.250195960876795, 37.511505666217197 ], [ -122.250174503204661, 37.511506336769436 ], [ -122.25015581156056, 37.51150524712201 ], [ -122.250135862631026, 37.511502397274946 ], [ -122.250105603960577, 37.511491836076949 ], [ -122.250118009177257, 37.511512455558773 ], [ -122.25011893118662, 37.511527626803527 ], [ -122.250117506263095, 37.511546066990498 ], [ -122.250114404958907, 37.511562663158799 ], [ -122.250108034712497, 37.511577834403518 ], [ -122.250098982257072, 37.511592670372124 ], [ -122.250082721364905, 37.511609937092679 ], [ -122.250057659474422, 37.511631394764827 ], [ -122.250050115761553, 37.511642291238921 ], [ -122.250041733858367, 37.511658384493046 ], [ -122.250038716373254, 37.511675148299368 ], [ -122.250036956173574, 37.511691995924757 ], [ -122.250039470744511, 37.511707083350458 ], [ -122.250050870132867, 37.511728121927405 ] ] } },
{ "type": "Feature", "properties": { "id": 974.0, "osm_id": 289805551.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.250907332999105, 37.513762242189571 ], [ -122.250919905853877, 37.513746316573531 ], [ -122.25092862303319, 37.513730726233632 ], [ -122.250934406546364, 37.513715219712765 ], [ -122.250937675488615, 37.51370013228707 ], [ -122.250938346040854, 37.513688146165507 ], [ -122.250937004936361, 37.51367398074914 ], [ -122.250931221423158, 37.513662162265661 ], [ -122.250921163139353, 37.513645817554483 ], [ -122.250945051563406, 37.513661659351484 ], [ -122.250958127332325, 37.513667945778856 ], [ -122.250972041291618, 37.513672891101749 ], [ -122.250985955250869, 37.51367498657752 ], [ -122.251003808704624, 37.513675070396559 ], [ -122.251019231406474, 37.513672052911417 ], [ -122.25103985088829, 37.513667359045648 ] ] } },
{ "type": "Feature", "properties": { "id": 975.0, "osm_id": 289829583.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.115796502079135, 37.653905483955903 ], [ -122.11536231949475, 37.654502862195102 ], [ -122.115235668937785, 37.654686090598446 ] ] } },
{ "type": "Feature", "properties": { "id": 976.0, "osm_id": 289829578.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.117093936871356, 37.658622399966788 ], [ -122.117045154194898, 37.658603289227557 ], [ -122.117021936323098, 37.658597254257295 ], [ -122.116989833633923, 37.658594572048273 ], [ -122.116955048735775, 37.658597254257295 ], [ -122.11692646644596, 37.658608653645615 ], [ -122.116907355706715, 37.658623238157119 ], [ -122.116890256624231, 37.658644863467302 ], [ -122.116880617435569, 37.658670763548116 ], [ -122.116875923569822, 37.658698256190526 ], [ -122.116878605778822, 37.658725078280682 ] ] } },
{ "type": "Feature", "properties": { "id": 977.0, "osm_id": 289829586.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.123416238797063, 37.664288566512106 ], [ -122.123589241278609, 37.664530132961566 ], [ -122.123619667587093, 37.664556955051701 ], [ -122.123648082238873, 37.664570617553885 ], [ -122.123686638993462, 37.664582436037364 ], [ -122.12372712358578, 37.664590147388296 ], [ -122.123758052808483, 37.664593919244702 ], [ -122.123781270680283, 37.664593164873452 ], [ -122.123810104427207, 37.664590566483461 ] ] } },
{ "type": "Feature", "properties": { "id": 978.0, "osm_id": 289829585.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.123589241278609, 37.664530132961566 ], [ -122.123603658152035, 37.664558463794272 ], [ -122.123609441665238, 37.664582436037364 ], [ -122.123611453321971, 37.664609677222693 ], [ -122.123607513827508, 37.664635158208341 ], [ -122.123599802476576, 37.664662399393649 ], [ -122.12358873836439, 37.6646810910377 ], [ -122.123573064205459, 37.664699866500797 ] ] } },
{ "type": "Feature", "properties": { "id": 979.0, "osm_id": 289829582.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.123577758071249, 37.657932317878497 ], [ -122.123527131376079, 37.657899460818086 ], [ -122.123491759744667, 37.657871884356659 ], [ -122.123455549922951, 37.657839446391371 ], [ -122.123427554366344, 37.657810864101549 ], [ -122.123392769468197, 37.657766020919553 ], [ -122.123366869387382, 37.657721177737578 ], [ -122.123342226592072, 37.657657978187657 ], [ -122.123314817768673, 37.657528645421699 ], [ -122.123272740614752, 37.656221822897912 ], [ -122.123258659017409, 37.656121072421755 ], [ -122.123231082555989, 37.656046222026433 ], [ -122.123188753944959, 37.655973886202041 ], [ -122.123121866357607, 37.655910099918898 ], [ -122.123048105609712, 37.655860479052087 ], [ -122.12296906426279, 37.655821587021386 ], [ -122.122836630192637, 37.655777246753601 ], [ -122.120474609878329, 37.655417663107457 ], [ -122.118386007245576, 37.65510619158551 ], [ -122.116408045734644, 37.654795725891951 ], [ -122.116181315253826, 37.654761360088948 ], [ -122.116038571442772, 37.654741578797477 ], [ -122.115884176786338, 37.654715594897645 ], [ -122.115758532057768, 37.654683827484583 ] ] } },
{ "type": "Feature", "properties": { "id": 980.0, "osm_id": 305220744.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.217798312549547, 37.711695185937955 ], [ -122.217746763845028, 37.711672554799392 ], [ -122.217702172120141, 37.711658221744955 ], [ -122.217656323109793, 37.711650426575019 ], [ -122.217594716121454, 37.711646235623427 ], [ -122.217533779685397, 37.711651097127273 ], [ -122.217479381133785, 37.711661742144308 ], [ -122.217422970925412, 37.711683954187691 ], [ -122.217380558495378, 37.711706920602403 ], [ -122.21734107973144, 37.711737598368011 ] ] } },
{ "type": "Feature", "properties": { "id": 981.0, "osm_id": 305220742.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.217982462962283, 37.715559327119976 ], [ -122.218027473782328, 37.715616994613818 ], [ -122.218061169033064, 37.715680026525668 ], [ -122.218083045800327, 37.715750769788464 ], [ -122.218087320570973, 37.715820591041876 ], [ -122.218081453238739, 37.715882784763451 ], [ -122.218061169033064, 37.715943218285332 ], [ -122.218036023323535, 37.715995772818246 ], [ -122.217995874007386, 37.716049165541421 ], [ -122.217945247312159, 37.716098618770175 ] ] } },
{ "type": "Feature", "properties": { "id": 982.0, "osm_id": 305220738.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.217798312549547, 37.711695185937955 ], [ -122.217753637005629, 37.711662664153643 ], [ -122.21772337833518, 37.711632154026113 ], [ -122.217693874036001, 37.711590831243448 ], [ -122.217676858772563, 37.711549257003711 ], [ -122.21766621375555, 37.71150315653626 ], [ -122.21766621375555, 37.711463929229396 ], [ -122.217671829630675, 37.711420846247073 ], [ -122.217690856550888, 37.71137658979832 ], [ -122.21772337833518, 37.71132872913121 ] ] } },
{ "type": "Feature", "properties": { "id": 983.0, "osm_id": 305220748.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.220137282630134, 37.711746567004425 ], [ -122.220192854648161, 37.711791242548323 ], [ -122.220241050591397, 37.711842875071866 ], [ -122.220282205735984, 37.711908421554682 ], [ -122.220311626216144, 37.711985199787776 ], [ -122.220319672843175, 37.71205577541248 ], [ -122.220313721691952, 37.7121218248095 ], [ -122.220296119695263, 37.712184437626192 ], [ -122.220262927358675, 37.712247553357116 ], [ -122.220218503271866, 37.712302957737037 ], [ -122.220177851041456, 37.712346124538399 ] ] } },
{ "type": "Feature", "properties": { "id": 984.0, "osm_id": 305220753.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.216911926288972, 37.717450452113987 ], [ -122.216866915468898, 37.717418768519998 ], [ -122.216818216611458, 37.717387252564066 ], [ -122.216773373429504, 37.717357832083927 ], [ -122.216718220506607, 37.717328830698946 ], [ -122.216661139745995, 37.717304523179756 ], [ -122.216593078692227, 37.717285328621472 ], [ -122.216512863878847, 37.71727392923313 ], [ -122.216430469770657, 37.717272169033457 ], [ -122.216340364311549, 37.717282981688577 ], [ -122.216263921354596, 37.717302176246882 ], [ -122.216222766210024, 37.717319191510292 ], [ -122.216180353779947, 37.71734106827757 ] ] } },
{ "type": "Feature", "properties": { "id": 985.0, "osm_id": 305220752.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.219118881394522, 37.715272582212435 ], [ -122.219209238310754, 37.715222542250473 ], [ -122.21927553916484, 37.71519429523677 ], [ -122.219353155588237, 37.715170574450809 ], [ -122.219421049003955, 37.71515959415764 ], [ -122.219507214968559, 37.715156995767664 ], [ -122.219581562449719, 37.715162863099884 ], [ -122.21965590993085, 37.715178956353959 ], [ -122.219727156107822, 37.715207371005739 ], [ -122.219795049523526, 37.715239054599699 ], [ -122.219847520237408, 37.715273336583707 ], [ -122.219901834969974, 37.715310719871844 ] ] } },
{ "type": "Feature", "properties": { "id": 986.0, "osm_id": 305220762.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.214184203539176, 37.703930945209287 ], [ -122.215678110141809, 37.702433434388318 ] ] } },
{ "type": "Feature", "properties": { "id": 987.0, "osm_id": 305220741.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.218797267769759, 37.710852637030953 ], [ -122.218725770135691, 37.710819025599221 ], [ -122.218643878941691, 37.710794969537133 ], [ -122.218561401014441, 37.710782229044305 ], [ -122.218476911430471, 37.710778876283037 ], [ -122.218395606969693, 37.710786084719786 ], [ -122.218310530652474, 37.710804692544819 ], [ -122.218237775732931, 37.710834280663008 ], [ -122.218167703022402, 37.710873675607893 ], [ -122.218107772414726, 37.710917848237663 ] ] } },
{ "type": "Feature", "properties": { "id": 988.0, "osm_id": 305220745.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.222537943518049, 37.712779552751492 ], [ -122.22245370539116, 37.712846943253041 ], [ -122.222382543033234, 37.712887846940511 ], [ -122.22229914309662, 37.712918524706126 ], [ -122.222210211103956, 37.712936964893103 ], [ -122.222121111473243, 37.712942832225323 ], [ -122.222029413452475, 37.712937132531167 ], [ -122.221941654926255, 37.712918021791928 ], [ -122.22186303267452, 37.712888266035691 ], [ -122.22181240597935, 37.712864042335504 ] ] } },
{ "type": "Feature", "properties": { "id": 989.0, "osm_id": 305220751.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.220926019718746, 37.712272782885663 ], [ -122.220862736349787, 37.712237327435254 ], [ -122.220783527364816, 37.712205643841223 ], [ -122.220703228732376, 37.712186952197136 ], [ -122.220612368901953, 37.712178151198806 ], [ -122.220527711679949, 37.712179827579462 ], [ -122.220432074164734, 37.712198016309323 ], [ -122.220356050302954, 37.712226347142078 ], [ -122.220283211564364, 37.712261467316374 ], [ -122.220221269299913, 37.712305975222222 ], [ -122.220177851041456, 37.712346124538399 ] ] } },
{ "type": "Feature", "properties": { "id": 990.0, "osm_id": 305247472.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.207852824708027, 38.072262448419124 ], [ -121.207593404804825, 38.062749575050411 ] ] } },
{ "type": "Feature", "properties": { "id": 991.0, "osm_id": 305220739.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.217982462962283, 37.715559327119976 ], [ -122.218034514580992, 37.715599057341002 ], [ -122.218106431310233, 37.715632584953717 ], [ -122.218191256170314, 37.715660077596119 ], [ -122.218268453498524, 37.715674494469589 ], [ -122.218343303893874, 37.715680445620819 ], [ -122.21842427307854, 37.715673237184113 ], [ -122.218500716035507, 37.715658820310637 ], [ -122.218580176477559, 37.715632584953717 ], [ -122.218667851184748, 37.715589921066545 ] ] } },
{ "type": "Feature", "properties": { "id": 992.0, "osm_id": 305220758.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.219881131669098, 37.714735888952205 ], [ -122.219802425598317, 37.714821049088471 ], [ -122.219759510254093, 37.714917357155926 ], [ -122.219742914085785, 37.714995979407675 ], [ -122.21974735649448, 37.715079127887165 ], [ -122.219778369536215, 37.715163868928265 ], [ -122.219815501367307, 37.715224553907234 ], [ -122.219854309578963, 37.715269145632099 ], [ -122.219901834969974, 37.715310719871844 ] ] } },
{ "type": "Feature", "properties": { "id": 993.0, "osm_id": 305220760.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.220177851041456, 37.712346124538399 ], [ -122.219817261566973, 37.712694224977184 ], [ -122.219745512475782, 37.712744935491415 ], [ -122.219651383703123, 37.712777121999579 ], [ -122.219567983766566, 37.71278474953148 ], [ -122.219488942419659, 37.712779971846679 ], [ -122.21941291855785, 37.712762537488075 ], [ -122.219353071769206, 37.712732949369872 ], [ -122.217798312549547, 37.711695185937955 ] ] } },
{ "type": "Feature", "properties": { "id": 994.0, "osm_id": 305220747.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.218216150422748, 37.710315524675593 ], [ -122.218258059938634, 37.710368498303652 ], [ -122.218288821523259, 37.710428177454254 ], [ -122.218306758796075, 37.710491041728048 ], [ -122.218313129042457, 37.710557845496368 ], [ -122.218309943919252, 37.710621799417552 ], [ -122.21828932443745, 37.710684663691367 ], [ -122.218257054110254, 37.710744929575164 ], [ -122.218213468213733, 37.710801255964526 ], [ -122.218154543434409, 37.710867053904423 ], [ -122.218107772414726, 37.710917848237663 ] ] } },
{ "type": "Feature", "properties": { "id": 995.0, "osm_id": 305220743.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.221771753748953, 37.712836968788245 ], [ -122.221828666871502, 37.71289379809177 ], [ -122.221866050159662, 37.712952136137851 ], [ -122.221894464811413, 37.713017347344568 ], [ -122.221909971332281, 37.71308339674156 ], [ -122.221911060979679, 37.713150619604988 ], [ -122.22189605737303, 37.71321884829684 ], [ -122.221870324930265, 37.713279784732904 ], [ -122.221833444556296, 37.71334281664479 ], [ -122.221780554747269, 37.713398891576993 ] ] } },
{ "type": "Feature", "properties": { "id": 996.0, "osm_id": 305220765.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.23996216001612, 37.718620984892176 ], [ -122.240122170547707, 37.718750988210402 ], [ -122.240200206066234, 37.71885006230589 ], [ -122.240259047026512, 37.718969336788042 ], [ -122.240291736448896, 37.719088778908286 ], [ -122.240291149715659, 37.71919246305054 ], [ -122.240270865509999, 37.719300338144365 ], [ -122.240223926852224, 37.719408632333383 ], [ -122.240104652370093, 37.719680792729427 ], [ -122.240084871078565, 37.719703172410867 ], [ -122.239863337377685, 37.719913977275731 ], [ -122.239784128392714, 37.719967286179909 ], [ -122.239692765648115, 37.720002825449335 ], [ -122.239593943009694, 37.720021097998277 ], [ -122.239518002966946, 37.720022942016961 ], [ -122.239432172278427, 37.720015146847011 ], [ -122.239348520884775, 37.719991174603948 ], [ -122.239246513123163, 37.719939877356509 ] ] } },
{ "type": "Feature", "properties": { "id": 997.0, "osm_id": 305220766.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.241724706615429, 37.719795876260001 ], [ -122.241784553404102, 37.719907690848316 ], [ -122.241795114602098, 37.719998634497763 ], [ -122.241773908387088, 37.72011355039028 ], [ -122.241706936980719, 37.720228969196967 ], [ -122.24110821763702, 37.720793322737663 ], [ -122.240962707797934, 37.720844955261207 ], [ -122.240806972036978, 37.720859288315616 ], [ -122.240693481068021, 37.720849732946007 ], [ -122.24054813886697, 37.720807320515959 ] ] } },
{ "type": "Feature", "properties": { "id": 998.0, "osm_id": 305220756.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.215866200049021, 37.708826898671987 ], [ -122.215433274750112, 37.70928857389876 ], [ -122.214122512731848, 37.710680388920743 ] ] } },
{ "type": "Feature", "properties": { "id": 999.0, "osm_id": 305246575.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.318421024040816, 38.084054780355871 ], [ -121.311896047696365, 38.083985294378564 ] ] } },
{ "type": "Feature", "properties": { "id": 1000.0, "osm_id": 305220759.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.214277745578627, 37.701499858012873 ], [ -122.21502692008427, 37.701999251803947 ], [ -122.215678110141809, 37.702433434388318 ], [ -122.219741405343214, 37.70514229785595 ], [ -122.223348305916858, 37.707546730600299 ], [ -122.22407644184554, 37.708032042794045 ], [ -122.229235251791764, 37.711470970028074 ], [ -122.23805334920641, 37.717348779628516 ], [ -122.23996216001612, 37.718620984892176 ], [ -122.240735558221928, 37.71913647193734 ], [ -122.241724706615429, 37.719795876260001 ], [ -122.242121254454588, 37.720060073848011 ] ] } },
{ "type": "Feature", "properties": { "id": 1001.0, "osm_id": 305220757.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.215522542018917, 37.708699745200832 ], [ -122.215602170099061, 37.708711563684297 ], [ -122.21569202410106, 37.708735619746442 ], [ -122.21576637158222, 37.708767722435574 ], [ -122.215866200049021, 37.708826898671987 ] ] } },
{ "type": "Feature", "properties": { "id": 1002.0, "osm_id": 305220740.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.222183305194761, 37.713111559936209 ], [ -122.22253048362424, 37.713343068101878 ], [ -122.222626959329745, 37.713393024244802 ], [ -122.222701977363144, 37.713424037286508 ], [ -122.222779426148477, 37.713450272643463 ], [ -122.222874057835298, 37.71347064066817 ], [ -122.223005066981926, 37.713482962065832 ], [ -122.223142446374922, 37.713477849104919 ], [ -122.22327923903471, 37.713454547414102 ], [ -122.223422401940894, 37.713412051164958 ] ] } },
{ "type": "Feature", "properties": { "id": 1003.0, "osm_id": 305220746.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.224218179828213, 37.711187661700805 ], [ -122.224273248932064, 37.71114147741433 ], [ -122.224349356612848, 37.711096382775239 ], [ -122.224433930015891, 37.711065285914479 ], [ -122.224516324124082, 37.711044666432684 ], [ -122.224602070993541, 37.711034943424984 ], [ -122.224689410424617, 37.711038380005277 ], [ -122.224778007141168, 37.711052629240676 ], [ -122.224861574715803, 37.711079870425984 ], [ -122.224941957167246, 37.711116666980907 ] ] } },
{ "type": "Feature", "properties": { "id": 1004.0, "osm_id": 305246994.0, "name": null, "type": "runway" }, "geometry": { "type": "LineString", "coordinates": [ [ -121.362695158612652, 38.09545458776703 ], [ -121.354560856858882, 38.088869596995849 ] ] } },
{ "type": "Feature", "properties": { "id": 1005.0, "osm_id": 305220761.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.213599314335724, 37.702741720787024 ], [ -122.21356687637045, 37.702602665013416 ], [ -122.21357224078848, 37.702481630331562 ], [ -122.213615156132732, 37.702350118270765 ], [ -122.213711548019234, 37.702204021698449 ], [ -122.213808275181862, 37.702106037250367 ], [ -122.213931656796575, 37.701997826880394 ], [ -122.214079178292423, 37.701917192971869 ], [ -122.214250839669404, 37.701857765278362 ], [ -122.214442869071107, 37.701832787206911 ], [ -122.214604975078487, 37.701840750014895 ], [ -122.214757860992393, 37.701873020342148 ], [ -122.214876129646171, 37.701917947343148 ], [ -122.21502692008427, 37.701999251803947 ] ] } },
{ "type": "Feature", "properties": { "id": 1006.0, "osm_id": 305220750.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.216911926288972, 37.717450452113987 ], [ -122.216871525515643, 37.717413571740053 ], [ -122.216830957104278, 37.717374260614122 ], [ -122.216783264075247, 37.717312150711642 ], [ -122.216752167214437, 37.717242497096244 ], [ -122.216738337074219, 37.717177453527654 ], [ -122.216734900493918, 37.717107296998073 ], [ -122.216747808624817, 37.717035547906875 ], [ -122.216779408399773, 37.716970420519239 ], [ -122.216821820829821, 37.716906550417058 ], [ -122.216875129733992, 37.716851984227397 ] ] } },
{ "type": "Feature", "properties": { "id": 1007.0, "osm_id": 305220754.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.216302478109213, 37.708397158496275 ], [ -122.216254617442075, 37.708455245085254 ], [ -122.21622142510553, 37.708515762426195 ], [ -122.216188903321239, 37.708581392728007 ], [ -122.216173312981297, 37.7086465201157 ], [ -122.216166439820697, 37.708714916445572 ], [ -122.216170211677138, 37.708783061318371 ], [ -122.216185047645737, 37.708850116543772 ], [ -122.216211953554932, 37.708919686340096 ], [ -122.21624556498665, 37.70898263443295 ], [ -122.216289905254442, 37.709039882831632 ], [ -122.216345477272483, 37.709094365202262 ], [ -122.216406078432442, 37.709146416820943 ] ] } },
{ "type": "Feature", "properties": { "id": 1008.0, "osm_id": 305220749.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.224218179828213, 37.711187661700805 ], [ -122.224251958897995, 37.711139046662375 ], [ -122.224286408520044, 37.711077691131159 ], [ -122.224308369106339, 37.711015162133478 ], [ -122.224318511209205, 37.710947184898757 ], [ -122.224317002466606, 37.710880129673356 ], [ -122.224306022173451, 37.710816678666347 ], [ -122.224279954454587, 37.710752976202201 ], [ -122.224241732976125, 37.710692458861324 ], [ -122.224170235342072, 37.710612579324071 ], [ -122.224115082419146, 37.710565473028247 ] ] } },
{ "type": "Feature", "properties": { "id": 1009.0, "osm_id": 305220764.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.22407644184554, 37.708032042794045 ], [ -122.224623277208579, 37.708448288105629 ], [ -122.224934245816314, 37.708708043284972 ], [ -122.225264157525217, 37.709031333290397 ], [ -122.22554863931893, 37.709364178665396 ], [ -122.225807472488938, 37.709720996283508 ], [ -122.225918951801162, 37.70989743534529 ], [ -122.226026826894966, 37.710097427555034 ], [ -122.226191028378139, 37.710434463881654 ], [ -122.226258418879681, 37.710603275411557 ], [ -122.226294461063304, 37.710733697824921 ], [ -122.226306866280012, 37.710826150216946 ], [ -122.226310638136454, 37.710912148543507 ], [ -122.226299238748126, 37.711034859605967 ], [ -122.226275015047946, 37.711148099117828 ], [ -122.226226651466646, 37.711277348064776 ], [ -122.226159931517373, 37.71139628727078 ], [ -122.226076363942738, 37.711511538439439 ], [ -122.225963962621208, 37.711634920054159 ], [ -122.225851226023508, 37.711722762399397 ] ] } },
{ "type": "Feature", "properties": { "id": 1010.0, "osm_id": 335757318.0, "name": "East Line", "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.38701225763549, 37.611597660049533 ], [ -122.387088113859235, 37.61164158122218 ], [ -122.387159360036179, 37.611691453546044 ], [ -122.387210154369399, 37.611739733308326 ], [ -122.387242676153718, 37.611781642824205 ], [ -122.387267067491976, 37.611826737463261 ], [ -122.38728944717343, 37.611887841537417 ], [ -122.387297577619506, 37.611944251745754 ], [ -122.387293470486966, 37.612002254515744 ], [ -122.387277209594799, 37.612065034970485 ], [ -122.387254829913331, 37.612122953921435 ], [ -122.387230438575116, 37.612171233683696 ], [ -122.386447820275777, 37.613351573288597 ] ] } },
{ "type": "Feature", "properties": { "id": 1011.0, "osm_id": 335753369.0, "name": "Z1", "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.393922382430759, 37.625488988178986 ], [ -122.393876365782361, 37.625474487486493 ], [ -122.393842838169661, 37.625465770307216 ], [ -122.393804281415044, 37.625460573527242 ], [ -122.393766311393676, 37.625458226594361 ], [ -122.393729179562598, 37.625457136946935 ], [ -122.393694981397644, 37.625457723680142 ], [ -122.393663549260751, 37.625460573527242 ], [ -122.39363370968546, 37.625465770307216 ], [ -122.393601606996299, 37.625473230201017 ], [ -122.393568163202659, 37.625483120846766 ], [ -122.393532456295105, 37.625496950986978 ], [ -122.393499683053719, 37.625511954593698 ], [ -122.393471268401967, 37.625528718400048 ], [ -122.393444278673726, 37.625545482206398 ], [ -122.393419468240339, 37.625566269326249 ], [ -122.39339616654955, 37.62558697262709 ], [ -122.393366662250358, 37.62561899149722 ] ] } },
{ "type": "Feature", "properties": { "id": 1012.0, "osm_id": 335753368.0, "name": "Z1", "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.393240933702742, 37.625159747022359 ], [ -122.393268677802268, 37.625178019571251 ], [ -122.393300612853352, 37.625200566890804 ], [ -122.393321819068362, 37.625217246878087 ], [ -122.393340762169572, 37.625236357617325 ], [ -122.393360459641997, 37.625257647651424 ], [ -122.393377223448354, 37.625280194970955 ], [ -122.393390383036348, 37.625299724805366 ], [ -122.39340195006271, 37.625321769210693 ], [ -122.393411421613308, 37.625344232711193 ], [ -122.393418043316828, 37.625365019831037 ], [ -122.393423826830016, 37.625390416997696 ], [ -122.393428269238697, 37.625415897983338 ], [ -122.39342961034319, 37.62544003786445 ], [ -122.393428269238697, 37.62546375865044 ], [ -122.393425251753541, 37.625487395617398 ], [ -122.393419468240339, 37.625513379517258 ], [ -122.393411421613308, 37.625538189950639 ], [ -122.393401279510485, 37.625562497469843 ], [ -122.393388874293777, 37.625585463884526 ], [ -122.393366662250358, 37.62561899149722 ], [ -122.39332760258155, 37.625677832457491 ], [ -122.393298517377545, 37.625722256544293 ], [ -122.393275131867725, 37.625756370890258 ], [ -122.393246717215945, 37.625791574883564 ], [ -122.39321687764064, 37.625823258477546 ], [ -122.3931819251044, 37.625854439157358 ], [ -122.393144709454333, 37.625882769990092 ], [ -122.393108331994526, 37.625906993690272 ], [ -122.393068266497366, 37.625930043923994 ], [ -122.393027446628935, 37.625951920691278 ], [ -122.392980005056941, 37.625970444697266 ], [ -122.392931976751811, 37.625987795236881 ], [ -122.39288671447467, 37.626001038643878 ], [ -122.39283063954241, 37.626013779136684 ], [ -122.392776073352749, 37.62602182576375 ], [ -122.392718405858901, 37.626025262344015 ], [ -122.392665767506998, 37.626024675610822 ], [ -122.392605166347039, 37.626021574306627 ], [ -122.392555629299295, 37.626014868784104 ], [ -122.39249276502548, 37.626003972309974 ] ] } },
{ "type": "Feature", "properties": { "id": 1013.0, "osm_id": 335768460.0, "name": "South Line", "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.392283636541308, 37.619698518009628 ], [ -122.389181326538733, 37.618402089045794 ] ] } },
{ "type": "Feature", "properties": { "id": 1014.0, "osm_id": 335768461.0, "name": "North Line", "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.391929501132196, 37.620308552922609 ], [ -122.388667683512253, 37.61894372762886 ] ] } },
{ "type": "Feature", "properties": { "id": 1015.0, "osm_id": 335768459.0, "name": null, "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.393258116604244, 37.620494966449179 ], [ -122.393309162394587, 37.620386336984062 ], [ -122.393311341689412, 37.620291537659178 ], [ -122.393271527649333, 37.620178130509196 ], [ -122.393185780779874, 37.620093138011043 ], [ -122.39304580299688, 37.620011079178973 ], [ -122.392283636541308, 37.619698518009628 ] ] } },
{ "type": "Feature", "properties": { "id": 1016.0, "osm_id": 335759632.0, "name": "S3", "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.393537233979927, 37.627568873632491 ], [ -122.393623064668446, 37.627641041818798 ], [ -122.393681905628711, 37.627727794516638 ], [ -122.393711409927889, 37.627838268000474 ], [ -122.393714259774953, 37.627949160579455 ], [ -122.393676708848744, 37.628038344029221 ], [ -122.393590878160239, 37.628146638218205 ], [ -122.393488954217645, 37.628242275733406 ], [ -122.393373619229976, 37.628316623214594 ], [ -122.393231462152173, 37.628373955432274 ], [ -122.393075726391203, 37.628411757815606 ], [ -122.392909513251269, 37.628424917403606 ], [ -122.392743216292288, 37.62841435620561 ], [ -122.392483125836819, 37.628354425597884 ] ] } },
{ "type": "Feature", "properties": { "id": 1017.0, "osm_id": 335759631.0, "name": "C1", "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.392641208530705, 37.62828435288737 ], [ -122.392913536564819, 37.628796151895166 ], [ -122.393267252878729, 37.629460836816776 ], [ -122.393735046894832, 37.630340098459726 ], [ -122.393839904503523, 37.630545455087436 ], [ -122.393850633339596, 37.630730276052425 ], [ -122.393740914227052, 37.630946864430456 ] ] } },
{ "type": "Feature", "properties": { "id": 1018.0, "osm_id": 335759633.0, "name": "Z", "type": "taxiway" }, "geometry": { "type": "LineString", "coordinates": [ [ -122.393740914227052, 37.630946864430456 ], [ -122.39312375469639, 37.631229418386397 ], [ -122.392249606014417, 37.631571316216863 ], [ -122.391654239432, 37.631766782198845 ], [ -122.391538652987236, 37.631832747776826 ], [ -122.391458102897772, 37.631913465504425 ], [ -122.391409823135447, 37.632000553478363 ], [ -122.391385767073345, 37.63208764145233 ], [ -122.391391047672357, 37.632181099672707 ], [ -122.391420551971535, 37.632276653368912 ], [ -122.391707883612341, 37.63279054785248 ], [ -122.391756163374595, 37.632918036599754 ], [ -122.391750715137533, 37.633075281103281 ], [ -122.391702435375265, 37.633215426524345 ], [ -122.391632781759867, 37.633351380993815 ], [ -122.391514764563212, 37.633517091219559 ], [ -122.39139138294847, 37.633640221377163 ], [ -122.391208908916411, 37.633754969631632 ], [ -122.39080666138311, 37.633929145579543 ], [ -122.389733777776897, 37.634311444183332 ], [ -122.389461114466656, 37.634366261830046 ], [ -122.389111672923349, 37.634416888525216 ], [ -122.38893087527191, 37.63445946859337 ], [ -122.388747982144679, 37.634556195756005 ], [ -122.388277338281455, 37.634928184618822 ], [ -122.388159153446693, 37.635055589547051 ], [ -122.388098636105795, 37.635185257589164 ], [ -122.388092349678431, 37.635339233150461 ], [ -122.388124955281768, 37.635488431026914 ], [ -122.389317951560443, 37.637078980973172 ], [ -122.389798653707473, 37.637439151352488 ], [ -122.390047512412679, 37.637840141600314 ], [ -122.390099061117212, 37.638288741058183 ] ] } }
]
}
================================================
FILE: src/test/resources/geojson/multipolygon/countries.geojson
================================================
{"type":"FeatureCollection","features":[
{"type":"Feature","id":"AFG","properties":{"name":"Afghanistan"},"geometry":{"type":"Polygon","coordinates":[[[61.210817,35.650072],[62.230651,35.270664],[62.984662,35.404041],[63.193538,35.857166],[63.982896,36.007957],[64.546479,36.312073],[64.746105,37.111818],[65.588948,37.305217],[65.745631,37.661164],[66.217385,37.39379],[66.518607,37.362784],[67.075782,37.356144],[67.83,37.144994],[68.135562,37.023115],[68.859446,37.344336],[69.196273,37.151144],[69.518785,37.608997],[70.116578,37.588223],[70.270574,37.735165],[70.376304,38.138396],[70.806821,38.486282],[71.348131,38.258905],[71.239404,37.953265],[71.541918,37.905774],[71.448693,37.065645],[71.844638,36.738171],[72.193041,36.948288],[72.63689,37.047558],[73.260056,37.495257],[73.948696,37.421566],[74.980002,37.41999],[75.158028,37.133031],[74.575893,37.020841],[74.067552,36.836176],[72.920025,36.720007],[71.846292,36.509942],[71.262348,36.074388],[71.498768,35.650563],[71.613076,35.153203],[71.115019,34.733126],[71.156773,34.348911],[70.881803,33.988856],[69.930543,34.02012],[70.323594,33.358533],[69.687147,33.105499],[69.262522,32.501944],[69.317764,31.901412],[68.926677,31.620189],[68.556932,31.71331],[67.792689,31.58293],[67.683394,31.303154],[66.938891,31.304911],[66.381458,30.738899],[66.346473,29.887943],[65.046862,29.472181],[64.350419,29.560031],[64.148002,29.340819],[63.550261,29.468331],[62.549857,29.318572],[60.874248,29.829239],[61.781222,30.73585],[61.699314,31.379506],[60.941945,31.548075],[60.863655,32.18292],[60.536078,32.981269],[60.9637,33.528832],[60.52843,33.676446],[60.803193,34.404102],[61.210817,35.650072]]]}},
{"type":"Feature","id":"AGO","properties":{"name":"Angola"},"geometry":{"type":"MultiPolygon","coordinates":[[[[16.326528,-5.87747],[16.57318,-6.622645],[16.860191,-7.222298],[17.089996,-7.545689],[17.47297,-8.068551],[18.134222,-7.987678],[18.464176,-7.847014],[19.016752,-7.988246],[19.166613,-7.738184],[19.417502,-7.155429],[20.037723,-7.116361],[20.091622,-6.94309],[20.601823,-6.939318],[20.514748,-7.299606],[21.728111,-7.290872],[21.746456,-7.920085],[21.949131,-8.305901],[21.801801,-8.908707],[21.875182,-9.523708],[22.208753,-9.894796],[22.155268,-11.084801],[22.402798,-10.993075],[22.837345,-11.017622],[23.456791,-10.867863],[23.912215,-10.926826],[24.017894,-11.237298],[23.904154,-11.722282],[24.079905,-12.191297],[23.930922,-12.565848],[24.016137,-12.911046],[21.933886,-12.898437],[21.887843,-16.08031],[22.562478,-16.898451],[23.215048,-17.523116],[21.377176,-17.930636],[18.956187,-17.789095],[18.263309,-17.309951],[14.209707,-17.353101],[14.058501,-17.423381],[13.462362,-16.971212],[12.814081,-16.941343],[12.215461,-17.111668],[11.734199,-17.301889],[11.640096,-16.673142],[11.778537,-15.793816],[12.123581,-14.878316],[12.175619,-14.449144],[12.500095,-13.5477],[12.738479,-13.137906],[13.312914,-12.48363],[13.633721,-12.038645],[13.738728,-11.297863],[13.686379,-10.731076],[13.387328,-10.373578],[13.120988,-9.766897],[12.87537,-9.166934],[12.929061,-8.959091],[13.236433,-8.562629],[12.93304,-7.596539],[12.728298,-6.927122],[12.227347,-6.294448],[12.322432,-6.100092],[12.735171,-5.965682],[13.024869,-5.984389],[13.375597,-5.864241],[16.326528,-5.87747]]],[[[12.436688,-5.684304],[12.182337,-5.789931],[11.914963,-5.037987],[12.318608,-4.60623],[12.62076,-4.438023],[12.995517,-4.781103],[12.631612,-4.991271],[12.468004,-5.248362],[12.436688,-5.684304]]]]}},
{"type":"Feature","id":"ALB","properties":{"name":"Albania"},"geometry":{"type":"Polygon","coordinates":[[[20.590247,41.855404],[20.463175,41.515089],[20.605182,41.086226],[21.02004,40.842727],[20.99999,40.580004],[20.674997,40.435],[20.615,40.110007],[20.150016,39.624998],[19.98,39.694993],[19.960002,39.915006],[19.406082,40.250773],[19.319059,40.72723],[19.40355,41.409566],[19.540027,41.719986],[19.371769,41.877548],[19.304486,42.195745],[19.738051,42.688247],[19.801613,42.500093],[20.0707,42.58863],[20.283755,42.32026],[20.52295,42.21787],[20.590247,41.855404]]]}},
{"type":"Feature","id":"ARE","properties":{"name":"United Arab Emirates"},"geometry":{"type":"Polygon","coordinates":[[[51.579519,24.245497],[51.757441,24.294073],[51.794389,24.019826],[52.577081,24.177439],[53.404007,24.151317],[54.008001,24.121758],[54.693024,24.797892],[55.439025,25.439145],[56.070821,26.055464],[56.261042,25.714606],[56.396847,24.924732],[55.886233,24.920831],[55.804119,24.269604],[55.981214,24.130543],[55.528632,23.933604],[55.525841,23.524869],[55.234489,23.110993],[55.208341,22.70833],[55.006803,22.496948],[52.000733,23.001154],[51.617708,24.014219],[51.579519,24.245497]]]}},
{"type":"Feature","id":"ARG","properties":{"name":"Argentina"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-65.5,-55.2],[-66.45,-55.25],[-66.95992,-54.89681],[-67.56244,-54.87001],[-68.63335,-54.8695],[-68.63401,-52.63637],[-68.25,-53.1],[-67.75,-53.85],[-66.45,-54.45],[-65.05,-54.7],[-65.5,-55.2]]],[[[-64.964892,-22.075862],[-64.377021,-22.798091],[-63.986838,-21.993644],[-62.846468,-22.034985],[-62.685057,-22.249029],[-60.846565,-23.880713],[-60.028966,-24.032796],[-58.807128,-24.771459],[-57.777217,-25.16234],[-57.63366,-25.603657],[-58.618174,-27.123719],[-57.60976,-27.395899],[-56.486702,-27.548499],[-55.695846,-27.387837],[-54.788795,-26.621786],[-54.625291,-25.739255],[-54.13005,-25.547639],[-53.628349,-26.124865],[-53.648735,-26.923473],[-54.490725,-27.474757],[-55.162286,-27.881915],[-56.2909,-28.852761],[-57.625133,-30.216295],[-57.874937,-31.016556],[-58.14244,-32.044504],[-58.132648,-33.040567],[-58.349611,-33.263189],[-58.427074,-33.909454],[-58.495442,-34.43149],[-57.22583,-35.288027],[-57.362359,-35.97739],[-56.737487,-36.413126],[-56.788285,-36.901572],[-57.749157,-38.183871],[-59.231857,-38.72022],[-61.237445,-38.928425],[-62.335957,-38.827707],[-62.125763,-39.424105],[-62.330531,-40.172586],[-62.145994,-40.676897],[-62.745803,-41.028761],[-63.770495,-41.166789],[-64.73209,-40.802677],[-65.118035,-41.064315],[-64.978561,-42.058001],[-64.303408,-42.359016],[-63.755948,-42.043687],[-63.458059,-42.563138],[-64.378804,-42.873558],[-65.181804,-43.495381],[-65.328823,-44.501366],[-65.565269,-45.036786],[-66.509966,-45.039628],[-67.293794,-45.551896],[-67.580546,-46.301773],[-66.597066,-47.033925],[-65.641027,-47.236135],[-65.985088,-48.133289],[-67.166179,-48.697337],[-67.816088,-49.869669],[-68.728745,-50.264218],[-69.138539,-50.73251],[-68.815561,-51.771104],[-68.149995,-52.349983],[-68.571545,-52.299444],[-69.498362,-52.142761],[-71.914804,-52.009022],[-72.329404,-51.425956],[-72.309974,-50.67701],[-72.975747,-50.74145],[-73.328051,-50.378785],[-73.415436,-49.318436],[-72.648247,-48.878618],[-72.331161,-48.244238],[-72.447355,-47.738533],[-71.917258,-46.884838],[-71.552009,-45.560733],[-71.659316,-44.973689],[-71.222779,-44.784243],[-71.329801,-44.407522],[-71.793623,-44.207172],[-71.464056,-43.787611],[-71.915424,-43.408565],[-72.148898,-42.254888],[-71.746804,-42.051386],[-71.915734,-40.832339],[-71.680761,-39.808164],[-71.413517,-38.916022],[-70.814664,-38.552995],[-71.118625,-37.576827],[-71.121881,-36.658124],[-70.364769,-36.005089],[-70.388049,-35.169688],[-69.817309,-34.193571],[-69.814777,-33.273886],[-70.074399,-33.09121],[-70.535069,-31.36501],[-69.919008,-30.336339],[-70.01355,-29.367923],[-69.65613,-28.459141],[-69.001235,-27.521214],[-68.295542,-26.89934],[-68.5948,-26.506909],[-68.386001,-26.185016],[-68.417653,-24.518555],[-67.328443,-24.025303],[-66.985234,-22.986349],[-67.106674,-22.735925],[-66.273339,-21.83231],[-64.964892,-22.075862]]]]}},
{"type":"Feature","id":"ARM","properties":{"name":"Armenia"},"geometry":{"type":"Polygon","coordinates":[[[43.582746,41.092143],[44.97248,41.248129],[45.179496,40.985354],[45.560351,40.81229],[45.359175,40.561504],[45.891907,40.218476],[45.610012,39.899994],[46.034534,39.628021],[46.483499,39.464155],[46.50572,38.770605],[46.143623,38.741201],[45.735379,39.319719],[45.739978,39.473999],[45.298145,39.471751],[45.001987,39.740004],[44.79399,39.713003],[44.400009,40.005],[43.656436,40.253564],[43.752658,40.740201],[43.582746,41.092143]]]}},
{"type":"Feature","id":"ATA","properties":{"name":"Antarctica"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-59.572095,-80.040179],[-59.865849,-80.549657],[-60.159656,-81.000327],[-62.255393,-80.863178],[-64.488125,-80.921934],[-65.741666,-80.588827],[-65.741666,-80.549657],[-66.290031,-80.255773],[-64.037688,-80.294944],[-61.883246,-80.39287],[-61.138976,-79.981371],[-60.610119,-79.628679],[-59.572095,-80.040179]]],[[[-159.208184,-79.497059],[-161.127601,-79.634209],[-162.439847,-79.281465],[-163.027408,-78.928774],[-163.066604,-78.869966],[-163.712896,-78.595667],[-163.105801,-78.223338],[-161.245113,-78.380176],[-160.246208,-78.693645],[-159.482405,-79.046338],[-159.208184,-79.497059]]],[[[-45.154758,-78.04707],[-43.920828,-78.478103],[-43.48995,-79.08556],[-43.372438,-79.516645],[-43.333267,-80.026123],[-44.880537,-80.339644],[-46.506174,-80.594357],[-48.386421,-80.829485],[-50.482107,-81.025442],[-52.851988,-80.966685],[-54.164259,-80.633528],[-53.987991,-80.222028],[-51.853134,-79.94773],[-50.991326,-79.614623],[-50.364595,-79.183487],[-49.914131,-78.811209],[-49.306959,-78.458569],[-48.660616,-78.047018],[-48.660616,-78.047019],[-48.151396,-78.04707],[-46.662857,-77.831476],[-45.154758,-78.04707]]],[[[-121.211511,-73.50099],[-119.918851,-73.657725],[-118.724143,-73.481353],[-119.292119,-73.834097],[-120.232217,-74.08881],[-121.62283,-74.010468],[-122.621735,-73.657778],[-122.621735,-73.657777],[-122.406245,-73.324619],[-121.211511,-73.50099]]],[[[-125.559566,-73.481353],[-124.031882,-73.873268],[-124.619469,-73.834097],[-125.912181,-73.736118],[-127.28313,-73.461769],[-127.28313,-73.461768],[-126.558472,-73.246226],[-125.559566,-73.481353]]],[[[-98.98155,-71.933334],[-97.884743,-72.070535],[-96.787937,-71.952971],[-96.20035,-72.521205],[-96.983765,-72.442864],[-98.198083,-72.482035],[-99.432013,-72.442864],[-100.783455,-72.50162],[-101.801868,-72.305663],[-102.330725,-71.894164],[-101.703967,-71.717792],[-100.430919,-71.854993],[-98.98155,-71.933334]]],[[[-68.451346,-70.955823],[-68.333834,-71.406493],[-68.510128,-71.798407],[-68.784297,-72.170736],[-69.959471,-72.307885],[-71.075889,-72.503842],[-72.388134,-72.484257],[-71.8985,-72.092343],[-73.073622,-72.229492],[-74.19004,-72.366693],[-74.953895,-72.072757],[-75.012625,-71.661258],[-73.915819,-71.269345],[-73.915819,-71.269344],[-73.230331,-71.15178],[-72.074717,-71.190951],[-71.780962,-70.681473],[-71.72218,-70.309196],[-71.741791,-69.505782],[-71.173815,-69.035475],[-70.253252,-68.87874],[-69.724447,-69.251017],[-69.489422,-69.623346],[-69.058518,-70.074016],[-68.725541,-70.505153],[-68.451346,-70.955823]]],[[[-58.614143,-64.152467],[-59.045073,-64.36801],[-59.789342,-64.211223],[-60.611928,-64.309202],[-61.297416,-64.54433],[-62.0221,-64.799094],[-62.51176,-65.09303],[-62.648858,-65.484942],[-62.590128,-65.857219],[-62.120079,-66.190326],[-62.805567,-66.425505],[-63.74569,-66.503847],[-64.294106,-66.837004],[-64.881693,-67.150474],[-65.508425,-67.58161],[-65.665082,-67.953887],[-65.312545,-68.365335],[-64.783715,-68.678908],[-63.961103,-68.913984],[-63.1973,-69.227556],[-62.785955,-69.619419],[-62.570516,-69.991747],[-62.276736,-70.383661],[-61.806661,-70.716768],[-61.512906,-71.089045],[-61.375809,-72.010074],[-61.081977,-72.382351],[-61.003661,-72.774265],[-60.690269,-73.166179],[-60.827367,-73.695242],[-61.375809,-74.106742],[-61.96337,-74.439848],[-63.295201,-74.576997],[-63.74569,-74.92974],[-64.352836,-75.262847],[-65.860987,-75.635124],[-67.192818,-75.79191],[-68.446282,-76.007452],[-69.797724,-76.222995],[-70.600724,-76.634494],[-72.206776,-76.673665],[-73.969536,-76.634494],[-75.555977,-76.712887],[-77.24037,-76.712887],[-76.926979,-77.104802],[-75.399294,-77.28107],[-74.282876,-77.55542],[-73.656119,-77.908112],[-74.772536,-78.221633],[-76.4961,-78.123654],[-77.925858,-78.378419],[-77.984666,-78.789918],[-78.023785,-79.181833],[-76.848637,-79.514939],[-76.633224,-79.887216],[-75.360097,-80.259545],[-73.244852,-80.416331],[-71.442946,-80.69063],[-70.013163,-81.004151],[-68.191646,-81.317672],[-65.704279,-81.474458],[-63.25603,-81.748757],[-61.552026,-82.042692],[-59.691416,-82.37585],[-58.712121,-82.846106],[-58.222487,-83.218434],[-57.008117,-82.865691],[-55.362894,-82.571755],[-53.619771,-82.258235],[-51.543644,-82.003521],[-49.76135,-81.729171],[-47.273931,-81.709586],[-44.825708,-81.846735],[-42.808363,-82.081915],[-42.16202,-81.65083],[-40.771433,-81.356894],[-38.244818,-81.337309],[-36.26667,-81.121715],[-34.386397,-80.906172],[-32.310296,-80.769023],[-30.097098,-80.592651],[-28.549802,-80.337938],[-29.254901,-79.985195],[-29.685805,-79.632503],[-29.685805,-79.260226],[-31.624808,-79.299397],[-33.681324,-79.456132],[-35.639912,-79.456132],[-35.914107,-79.083855],[-35.77701,-78.339248],[-35.326546,-78.123654],[-33.896763,-77.888526],[-32.212369,-77.65345],[-30.998051,-77.359515],[-29.783732,-77.065579],[-28.882779,-76.673665],[-27.511752,-76.497345],[-26.160336,-76.360144],[-25.474822,-76.281803],[-23.927552,-76.24258],[-22.458598,-76.105431],[-21.224694,-75.909474],[-20.010375,-75.674346],[-18.913543,-75.439218],[-17.522982,-75.125698],[-16.641589,-74.79254],[-15.701491,-74.498604],[-15.40771,-74.106742],[-16.46532,-73.871614],[-16.112784,-73.460114],[-15.446855,-73.146542],[-14.408805,-72.950585],[-13.311973,-72.715457],[-12.293508,-72.401936],[-11.510067,-72.010074],[-11.020433,-71.539767],[-10.295774,-71.265416],[-9.101015,-71.324224],[-8.611381,-71.65733],[-7.416622,-71.696501],[-7.377451,-71.324224],[-6.868232,-70.93231],[-5.790985,-71.030289],[-5.536375,-71.402617],[-4.341667,-71.461373],[-3.048981,-71.285053],[-1.795492,-71.167438],[-0.659489,-71.226246],[-0.228637,-71.637745],[0.868195,-71.304639],[1.886686,-71.128267],[3.022638,-70.991118],[4.139055,-70.853917],[5.157546,-70.618789],[6.273912,-70.462055],[7.13572,-70.246512],[7.742866,-69.893769],[8.48711,-70.148534],[9.525135,-70.011333],[10.249845,-70.48164],[10.817821,-70.834332],[11.953824,-70.638375],[12.404287,-70.246512],[13.422778,-69.972162],[14.734998,-70.030918],[15.126757,-70.403247],[15.949342,-70.030918],[17.026589,-69.913354],[18.201711,-69.874183],[19.259373,-69.893769],[20.375739,-70.011333],[21.452985,-70.07014],[21.923034,-70.403247],[22.569403,-70.697182],[23.666184,-70.520811],[24.841357,-70.48164],[25.977309,-70.48164],[27.093726,-70.462055],[28.09258,-70.324854],[29.150242,-70.20729],[30.031583,-69.93294],[30.971733,-69.75662],[31.990172,-69.658641],[32.754053,-69.384291],[33.302443,-68.835642],[33.870419,-68.502588],[34.908495,-68.659271],[35.300202,-69.012014],[36.16201,-69.247142],[37.200035,-69.168748],[37.905108,-69.52144],[38.649404,-69.776205],[39.667894,-69.541077],[40.020431,-69.109941],[40.921358,-68.933621],[41.959434,-68.600514],[42.938702,-68.463313],[44.113876,-68.267408],[44.897291,-68.051866],[45.719928,-67.816738],[46.503343,-67.601196],[47.44344,-67.718759],[48.344419,-67.366068],[48.990736,-67.091718],[49.930885,-67.111303],[50.753471,-66.876175],[50.949325,-66.523484],[51.791547,-66.249133],[52.614133,-66.053176],[53.613038,-65.89639],[54.53355,-65.818049],[55.414943,-65.876805],[56.355041,-65.974783],[57.158093,-66.249133],[57.255968,-66.680218],[58.137361,-67.013324],[58.744508,-67.287675],[59.939318,-67.405239],[60.605221,-67.679589],[61.427806,-67.953887],[62.387489,-68.012695],[63.19049,-67.816738],[64.052349,-67.405239],[64.992447,-67.620729],[65.971715,-67.738345],[66.911864,-67.855909],[67.891133,-67.934302],[68.890038,-67.934302],[69.712624,-68.972791],[69.673453,-69.227556],[69.555941,-69.678226],[68.596258,-69.93294],[67.81274,-70.305268],[67.949889,-70.697182],[69.066307,-70.677545],[68.929157,-71.069459],[68.419989,-71.441788],[67.949889,-71.853287],[68.71377,-72.166808],[69.869307,-72.264787],[71.024895,-72.088415],[71.573285,-71.696501],[71.906288,-71.324224],[72.454627,-71.010703],[73.08141,-70.716768],[73.33602,-70.364024],[73.864877,-69.874183],[74.491557,-69.776205],[75.62756,-69.737034],[76.626465,-69.619419],[77.644904,-69.462684],[78.134539,-69.07077],[78.428371,-68.698441],[79.113859,-68.326216],[80.093127,-68.071503],[80.93535,-67.875546],[81.483792,-67.542388],[82.051767,-67.366068],[82.776426,-67.209282],[83.775331,-67.30726],[84.676206,-67.209282],[85.655527,-67.091718],[86.752359,-67.150474],[87.477017,-66.876175],[87.986289,-66.209911],[88.358411,-66.484261],[88.828408,-66.954568],[89.67063,-67.150474],[90.630365,-67.228867],[91.5901,-67.111303],[92.608539,-67.189696],[93.548637,-67.209282],[94.17542,-67.111303],[95.017591,-67.170111],[95.781472,-67.385653],[96.682399,-67.248504],[97.759646,-67.248504],[98.68021,-67.111303],[99.718182,-67.248504],[100.384188,-66.915346],[100.893356,-66.58224],[101.578896,-66.30789],[102.832411,-65.563284],[103.478676,-65.700485],[104.242557,-65.974783],[104.90846,-66.327527],[106.181561,-66.934931],[107.160881,-66.954568],[108.081393,-66.954568],[109.15864,-66.837004],[110.235835,-66.699804],[111.058472,-66.425505],[111.74396,-66.13157],[112.860378,-66.092347],[113.604673,-65.876805],[114.388088,-66.072762],[114.897308,-66.386283],[115.602381,-66.699804],[116.699161,-66.660633],[117.384701,-66.915346],[118.57946,-67.170111],[119.832924,-67.268089],[120.871,-67.189696],[121.654415,-66.876175],[122.320369,-66.562654],[123.221296,-66.484261],[124.122274,-66.621462],[125.160247,-66.719389],[126.100396,-66.562654],[127.001427,-66.562654],[127.882768,-66.660633],[128.80328,-66.758611],[129.704259,-66.58224],[130.781454,-66.425505],[131.799945,-66.386283],[132.935896,-66.386283],[133.85646,-66.288304],[134.757387,-66.209963],[135.031582,-65.72007],[135.070753,-65.308571],[135.697485,-65.582869],[135.873805,-66.033591],[136.206705,-66.44509],[136.618049,-66.778197],[137.460271,-66.954568],[138.596223,-66.895761],[139.908442,-66.876175],[140.809421,-66.817367],[142.121692,-66.817367],[143.061842,-66.797782],[144.374061,-66.837004],[145.490427,-66.915346],[146.195552,-67.228867],[145.999699,-67.601196],[146.646067,-67.895131],[147.723263,-68.130259],[148.839629,-68.385024],[150.132314,-68.561292],[151.483705,-68.71813],[152.502247,-68.874813],[153.638199,-68.894502],[154.284567,-68.561292],[155.165857,-68.835642],[155.92979,-69.149215],[156.811132,-69.384291],[158.025528,-69.482269],[159.181013,-69.599833],[159.670699,-69.991747],[160.80665,-70.226875],[161.570479,-70.579618],[162.686897,-70.736353],[163.842434,-70.716768],[164.919681,-70.775524],[166.11444,-70.755938],[167.309095,-70.834332],[168.425616,-70.971481],[169.463589,-71.20666],[170.501665,-71.402617],[171.20679,-71.696501],[171.089227,-72.088415],[170.560422,-72.441159],[170.109958,-72.891829],[169.75737,-73.24452],[169.287321,-73.65602],[167.975101,-73.812806],[167.387489,-74.165498],[166.094803,-74.38104],[165.644391,-74.772954],[164.958851,-75.145283],[164.234193,-75.458804],[163.822797,-75.870303],[163.568239,-76.24258],[163.47026,-76.693302],[163.489897,-77.065579],[164.057873,-77.457442],[164.273363,-77.82977],[164.743464,-78.182514],[166.604126,-78.319611],[166.995781,-78.750748],[165.193876,-78.907483],[163.666217,-79.123025],[161.766385,-79.162248],[160.924162,-79.730482],[160.747894,-80.200737],[160.316964,-80.573066],[159.788211,-80.945395],[161.120016,-81.278501],[161.629287,-81.690001],[162.490992,-82.062278],[163.705336,-82.395435],[165.095949,-82.708956],[166.604126,-83.022477],[168.895665,-83.335998],[169.404782,-83.825891],[172.283934,-84.041433],[172.477049,-84.117914],[173.224083,-84.41371],[175.985672,-84.158997],[178.277212,-84.472518],[180,-84.71338],[-179.942499,-84.721443],[-179.058677,-84.139412],[-177.256772,-84.452933],[-177.140807,-84.417941],[-176.084673,-84.099259],[-175.947235,-84.110449],[-175.829882,-84.117914],[-174.382503,-84.534323],[-173.116559,-84.117914],[-172.889106,-84.061019],[-169.951223,-83.884647],[-168.999989,-84.117914],[-168.530199,-84.23739],[-167.022099,-84.570497],[-164.182144,-84.82521],[-161.929775,-85.138731],[-158.07138,-85.37391],[-155.192253,-85.09956],[-150.942099,-85.295517],[-148.533073,-85.609038],[-145.888918,-85.315102],[-143.107718,-85.040752],[-142.892279,-84.570497],[-146.829068,-84.531274],[-150.060732,-84.296146],[-150.902928,-83.904232],[-153.586201,-83.68869],[-153.409907,-83.23802],[-153.037759,-82.82652],[-152.665637,-82.454192],[-152.861517,-82.042692],[-154.526299,-81.768394],[-155.29018,-81.41565],[-156.83745,-81.102129],[-154.408787,-81.160937],[-152.097662,-81.004151],[-150.648293,-81.337309],[-148.865998,-81.043373],[-147.22075,-80.671045],[-146.417749,-80.337938],[-146.770286,-79.926439],[-148.062947,-79.652089],[-149.531901,-79.358205],[-151.588416,-79.299397],[-153.390322,-79.162248],[-155.329376,-79.064269],[-155.975668,-78.69194],[-157.268302,-78.378419],[-158.051768,-78.025676],[-158.365134,-76.889207],[-157.875474,-76.987238],[-156.974573,-77.300759],[-155.329376,-77.202728],[-153.742832,-77.065579],[-152.920247,-77.496664],[-151.33378,-77.398737],[-150.00195,-77.183143],[-148.748486,-76.908845],[-147.612483,-76.575738],[-146.104409,-76.47776],[-146.143528,-76.105431],[-146.496091,-75.733154],[-146.20231,-75.380411],[-144.909624,-75.204039],[-144.322037,-75.537197],[-142.794353,-75.34124],[-141.638764,-75.086475],[-140.209007,-75.06689],[-138.85759,-74.968911],[-137.5062,-74.733783],[-136.428901,-74.518241],[-135.214583,-74.302699],[-134.431194,-74.361455],[-133.745654,-74.439848],[-132.257168,-74.302699],[-130.925311,-74.479019],[-129.554284,-74.459433],[-128.242038,-74.322284],[-126.890622,-74.420263],[-125.402082,-74.518241],[-124.011496,-74.479019],[-122.562152,-74.498604],[-121.073613,-74.518241],[-119.70256,-74.479019],[-118.684145,-74.185083],[-117.469801,-74.028348],[-116.216312,-74.243891],[-115.021552,-74.067519],[-113.944331,-73.714828],[-113.297988,-74.028348],[-112.945452,-74.38104],[-112.299083,-74.714198],[-111.261059,-74.420263],[-110.066325,-74.79254],[-108.714909,-74.910103],[-107.559346,-75.184454],[-106.149148,-75.125698],[-104.876074,-74.949326],[-103.367949,-74.988497],[-102.016507,-75.125698],[-100.645531,-75.302018],[-100.1167,-74.870933],[-100.763043,-74.537826],[-101.252703,-74.185083],[-102.545337,-74.106742],[-103.113313,-73.734413],[-103.328752,-73.362084],[-103.681289,-72.61753],[-102.917485,-72.754679],[-101.60524,-72.813436],[-100.312528,-72.754679],[-99.13738,-72.911414],[-98.118889,-73.20535],[-97.688037,-73.558041],[-96.336595,-73.616849],[-95.043961,-73.4797],[-93.672907,-73.283743],[-92.439003,-73.166179],[-91.420564,-73.401307],[-90.088733,-73.322914],[-89.226951,-72.558722],[-88.423951,-73.009393],[-87.268337,-73.185764],[-86.014822,-73.087786],[-85.192236,-73.4797],[-83.879991,-73.518871],[-82.665646,-73.636434],[-81.470913,-73.851977],[-80.687447,-73.4797],[-80.295791,-73.126956],[-79.296886,-73.518871],[-77.925858,-73.420892],[-76.907367,-73.636434],[-76.221879,-73.969541],[-74.890049,-73.871614],[-73.852024,-73.65602],[-72.833533,-73.401307],[-71.619215,-73.264157],[-70.209042,-73.146542],[-68.935916,-73.009393],[-67.956622,-72.79385],[-67.369061,-72.480329],[-67.134036,-72.049244],[-67.251548,-71.637745],[-67.56494,-71.245831],[-67.917477,-70.853917],[-68.230843,-70.462055],[-68.485452,-70.109311],[-68.544209,-69.717397],[-68.446282,-69.325535],[-67.976233,-68.953206],[-67.5845,-68.541707],[-67.427843,-68.149844],[-67.62367,-67.718759],[-67.741183,-67.326845],[-67.251548,-66.876175],[-66.703184,-66.58224],[-66.056815,-66.209963],[-65.371327,-65.89639],[-64.568276,-65.602506],[-64.176542,-65.171423],[-63.628152,-64.897073],[-63.001394,-64.642308],[-62.041686,-64.583552],[-61.414928,-64.270031],[-60.709855,-64.074074],[-59.887269,-63.95651],[-59.162585,-63.701745],[-58.594557,-63.388224],[-57.811143,-63.27066],[-57.223582,-63.525425],[-57.59573,-63.858532],[-58.614143,-64.152467]]]]}},
{"type":"Feature","id":"ATF","properties":{"name":"French Southern and Antarctic Lands"},"geometry":{"type":"Polygon","coordinates":[[[68.935,-48.625],[69.58,-48.94],[70.525,-49.065],[70.56,-49.255],[70.28,-49.71],[68.745,-49.775],[68.72,-49.2425],[68.8675,-48.83],[68.935,-48.625]]]}},
{"type":"Feature","id":"AUS","properties":{"name":"Australia"},"geometry":{"type":"MultiPolygon","coordinates":[[[[145.397978,-40.792549],[146.364121,-41.137695],[146.908584,-41.000546],[147.689259,-40.808258],[148.289068,-40.875438],[148.359865,-42.062445],[148.017301,-42.407024],[147.914052,-43.211522],[147.564564,-42.937689],[146.870343,-43.634597],[146.663327,-43.580854],[146.048378,-43.549745],[145.43193,-42.693776],[145.29509,-42.03361],[144.718071,-41.162552],[144.743755,-40.703975],[145.397978,-40.792549]]],[[[143.561811,-13.763656],[143.922099,-14.548311],[144.563714,-14.171176],[144.894908,-14.594458],[145.374724,-14.984976],[145.271991,-15.428205],[145.48526,-16.285672],[145.637033,-16.784918],[145.888904,-16.906926],[146.160309,-17.761655],[146.063674,-18.280073],[146.387478,-18.958274],[147.471082,-19.480723],[148.177602,-19.955939],[148.848414,-20.39121],[148.717465,-20.633469],[149.28942,-21.260511],[149.678337,-22.342512],[150.077382,-22.122784],[150.482939,-22.556142],[150.727265,-22.402405],[150.899554,-23.462237],[151.609175,-24.076256],[152.07354,-24.457887],[152.855197,-25.267501],[153.136162,-26.071173],[153.161949,-26.641319],[153.092909,-27.2603],[153.569469,-28.110067],[153.512108,-28.995077],[153.339095,-29.458202],[153.069241,-30.35024],[153.089602,-30.923642],[152.891578,-31.640446],[152.450002,-32.550003],[151.709117,-33.041342],[151.343972,-33.816023],[151.010555,-34.31036],[150.714139,-35.17346],[150.32822,-35.671879],[150.075212,-36.420206],[149.946124,-37.109052],[149.997284,-37.425261],[149.423882,-37.772681],[148.304622,-37.809061],[147.381733,-38.219217],[146.922123,-38.606532],[146.317922,-39.035757],[145.489652,-38.593768],[144.876976,-38.417448],[145.032212,-37.896188],[144.485682,-38.085324],[143.609974,-38.809465],[142.745427,-38.538268],[142.17833,-38.380034],[141.606582,-38.308514],[140.638579,-38.019333],[139.992158,-37.402936],[139.806588,-36.643603],[139.574148,-36.138362],[139.082808,-35.732754],[138.120748,-35.612296],[138.449462,-35.127261],[138.207564,-34.384723],[137.71917,-35.076825],[136.829406,-35.260535],[137.352371,-34.707339],[137.503886,-34.130268],[137.890116,-33.640479],[137.810328,-32.900007],[136.996837,-33.752771],[136.372069,-34.094766],[135.989043,-34.890118],[135.208213,-34.47867],[135.239218,-33.947953],[134.613417,-33.222778],[134.085904,-32.848072],[134.273903,-32.617234],[132.990777,-32.011224],[132.288081,-31.982647],[131.326331,-31.495803],[129.535794,-31.590423],[128.240938,-31.948489],[127.102867,-32.282267],[126.148714,-32.215966],[125.088623,-32.728751],[124.221648,-32.959487],[124.028947,-33.483847],[123.659667,-33.890179],[122.811036,-33.914467],[122.183064,-34.003402],[121.299191,-33.821036],[120.580268,-33.930177],[119.893695,-33.976065],[119.298899,-34.509366],[119.007341,-34.464149],[118.505718,-34.746819],[118.024972,-35.064733],[117.295507,-35.025459],[116.625109,-35.025097],[115.564347,-34.386428],[115.026809,-34.196517],[115.048616,-33.623425],[115.545123,-33.487258],[115.714674,-33.259572],[115.679379,-32.900369],[115.801645,-32.205062],[115.689611,-31.612437],[115.160909,-30.601594],[114.997043,-30.030725],[115.040038,-29.461095],[114.641974,-28.810231],[114.616498,-28.516399],[114.173579,-28.118077],[114.048884,-27.334765],[113.477498,-26.543134],[113.338953,-26.116545],[113.778358,-26.549025],[113.440962,-25.621278],[113.936901,-25.911235],[114.232852,-26.298446],[114.216161,-25.786281],[113.721255,-24.998939],[113.625344,-24.683971],[113.393523,-24.384764],[113.502044,-23.80635],[113.706993,-23.560215],[113.843418,-23.059987],[113.736552,-22.475475],[114.149756,-21.755881],[114.225307,-22.517488],[114.647762,-21.82952],[115.460167,-21.495173],[115.947373,-21.068688],[116.711615,-20.701682],[117.166316,-20.623599],[117.441545,-20.746899],[118.229559,-20.374208],[118.836085,-20.263311],[118.987807,-20.044203],[119.252494,-19.952942],[119.805225,-19.976506],[120.85622,-19.683708],[121.399856,-19.239756],[121.655138,-18.705318],[122.241665,-18.197649],[122.286624,-17.798603],[122.312772,-17.254967],[123.012574,-16.4052],[123.433789,-17.268558],[123.859345,-17.069035],[123.503242,-16.596506],[123.817073,-16.111316],[124.258287,-16.327944],[124.379726,-15.56706],[124.926153,-15.0751],[125.167275,-14.680396],[125.670087,-14.51007],[125.685796,-14.230656],[126.125149,-14.347341],[126.142823,-14.095987],[126.582589,-13.952791],[127.065867,-13.817968],[127.804633,-14.276906],[128.35969,-14.86917],[128.985543,-14.875991],[129.621473,-14.969784],[129.4096,-14.42067],[129.888641,-13.618703],[130.339466,-13.357376],[130.183506,-13.10752],[130.617795,-12.536392],[131.223495,-12.183649],[131.735091,-12.302453],[132.575298,-12.114041],[132.557212,-11.603012],[131.824698,-11.273782],[132.357224,-11.128519],[133.019561,-11.376411],[133.550846,-11.786515],[134.393068,-12.042365],[134.678632,-11.941183],[135.298491,-12.248606],[135.882693,-11.962267],[136.258381,-12.049342],[136.492475,-11.857209],[136.95162,-12.351959],[136.685125,-12.887223],[136.305407,-13.29123],[135.961758,-13.324509],[136.077617,-13.724278],[135.783836,-14.223989],[135.428664,-14.715432],[135.500184,-14.997741],[136.295175,-15.550265],[137.06536,-15.870762],[137.580471,-16.215082],[138.303217,-16.807604],[138.585164,-16.806622],[139.108543,-17.062679],[139.260575,-17.371601],[140.215245,-17.710805],[140.875463,-17.369069],[141.07111,-16.832047],[141.274095,-16.38887],[141.398222,-15.840532],[141.702183,-15.044921],[141.56338,-14.561333],[141.63552,-14.270395],[141.519869,-13.698078],[141.65092,-12.944688],[141.842691,-12.741548],[141.68699,-12.407614],[141.928629,-11.877466],[142.118488,-11.328042],[142.143706,-11.042737],[142.51526,-10.668186],[142.79731,-11.157355],[142.866763,-11.784707],[143.115947,-11.90563],[143.158632,-12.325656],[143.522124,-12.834358],[143.597158,-13.400422],[143.561811,-13.763656]]]]}},
{"type":"Feature","id":"AUT","properties":{"name":"Austria"},"geometry":{"type":"Polygon","coordinates":[[[16.979667,48.123497],[16.903754,47.714866],[16.340584,47.712902],[16.534268,47.496171],[16.202298,46.852386],[16.011664,46.683611],[15.137092,46.658703],[14.632472,46.431817],[13.806475,46.509306],[12.376485,46.767559],[12.153088,47.115393],[11.164828,46.941579],[11.048556,46.751359],[10.442701,46.893546],[9.932448,46.920728],[9.47997,47.10281],[9.632932,47.347601],[9.594226,47.525058],[9.896068,47.580197],[10.402084,47.302488],[10.544504,47.566399],[11.426414,47.523766],[12.141357,47.703083],[12.62076,47.672388],[12.932627,47.467646],[13.025851,47.637584],[12.884103,48.289146],[13.243357,48.416115],[13.595946,48.877172],[14.338898,48.555305],[14.901447,48.964402],[15.253416,49.039074],[16.029647,48.733899],[16.499283,48.785808],[16.960288,48.596982],[16.879983,48.470013],[16.979667,48.123497]]]}},
{"type":"Feature","id":"AZE","properties":{"name":"Azerbaijan"},"geometry":{"type":"MultiPolygon","coordinates":[[[[45.001987,39.740004],[45.298145,39.471751],[45.739978,39.473999],[45.735379,39.319719],[46.143623,38.741201],[45.457722,38.874139],[44.952688,39.335765],[44.79399,39.713003],[45.001987,39.740004]]],[[[47.373315,41.219732],[47.815666,41.151416],[47.987283,41.405819],[48.584353,41.80887],[49.110264,41.282287],[49.618915,40.572924],[50.08483,40.526157],[50.392821,40.256561],[49.569202,40.176101],[49.395259,39.399482],[49.223228,39.049219],[48.856532,38.815486],[48.883249,38.320245],[48.634375,38.270378],[48.010744,38.794015],[48.355529,39.288765],[48.060095,39.582235],[47.685079,39.508364],[46.50572,38.770605],[46.483499,39.464155],[46.034534,39.628021],[45.610012,39.899994],[45.891907,40.218476],[45.359175,40.561504],[45.560351,40.81229],[45.179496,40.985354],[44.97248,41.248129],[45.217426,41.411452],[45.962601,41.123873],[46.501637,41.064445],[46.637908,41.181673],[46.145432,41.722802],[46.404951,41.860675],[46.686071,41.827137],[47.373315,41.219732]]]]}},
{"type":"Feature","id":"BDI","properties":{"name":"Burundi"},"geometry":{"type":"Polygon","coordinates":[[[29.339998,-4.499983],[29.276384,-3.293907],[29.024926,-2.839258],[29.632176,-2.917858],[29.938359,-2.348487],[30.469696,-2.413858],[30.527677,-2.807632],[30.743013,-3.034285],[30.752263,-3.35933],[30.50556,-3.568567],[30.116333,-4.090138],[29.753512,-4.452389],[29.339998,-4.499983]]]}},
{"type":"Feature","id":"BEL","properties":{"name":"Belgium"},"geometry":{"type":"Polygon","coordinates":[[[3.314971,51.345781],[4.047071,51.267259],[4.973991,51.475024],[5.606976,51.037298],[6.156658,50.803721],[6.043073,50.128052],[5.782417,50.090328],[5.674052,49.529484],[4.799222,49.985373],[4.286023,49.907497],[3.588184,50.378992],[3.123252,50.780363],[2.658422,50.796848],[2.513573,51.148506],[3.314971,51.345781]]]}},
{"type":"Feature","id":"BEN","properties":{"name":"Benin"},"geometry":{"type":"Polygon","coordinates":[[[2.691702,6.258817],[1.865241,6.142158],[1.618951,6.832038],[1.664478,9.12859],[1.463043,9.334624],[1.425061,9.825395],[1.077795,10.175607],[0.772336,10.470808],[0.899563,10.997339],[1.24347,11.110511],[1.447178,11.547719],[1.935986,11.64115],[2.154474,11.94015],[2.490164,12.233052],[2.848643,12.235636],[3.61118,11.660167],[3.572216,11.327939],[3.797112,10.734746],[3.60007,10.332186],[3.705438,10.06321],[3.220352,9.444153],[2.912308,9.137608],[2.723793,8.506845],[2.749063,7.870734],[2.691702,6.258817]]]}},
{"type":"Feature","id":"BFA","properties":{"name":"Burkina Faso"},"geometry":{"type":"Polygon","coordinates":[[[-2.827496,9.642461],[-3.511899,9.900326],[-3.980449,9.862344],[-4.330247,9.610835],[-4.779884,9.821985],[-4.954653,10.152714],[-5.404342,10.370737],[-5.470565,10.95127],[-5.197843,11.375146],[-5.220942,11.713859],[-4.427166,12.542646],[-4.280405,13.228444],[-4.006391,13.472485],[-3.522803,13.337662],[-3.103707,13.541267],[-2.967694,13.79815],[-2.191825,14.246418],[-2.001035,14.559008],[-1.066363,14.973815],[-0.515854,15.116158],[-0.266257,14.924309],[0.374892,14.928908],[0.295646,14.444235],[0.429928,13.988733],[0.993046,13.33575],[1.024103,12.851826],[2.177108,12.625018],[2.154474,11.94015],[1.935986,11.64115],[1.447178,11.547719],[1.24347,11.110511],[0.899563,10.997339],[0.023803,11.018682],[-0.438702,11.098341],[-0.761576,10.93693],[-1.203358,11.009819],[-2.940409,10.96269],[-2.963896,10.395335],[-2.827496,9.642461]]]}},
{"type":"Feature","id":"BGD","properties":{"name":"Bangladesh"},"geometry":{"type":"Polygon","coordinates":[[[92.672721,22.041239],[92.652257,21.324048],[92.303234,21.475485],[92.368554,20.670883],[92.082886,21.192195],[92.025215,21.70157],[91.834891,22.182936],[91.417087,22.765019],[90.496006,22.805017],[90.586957,22.392794],[90.272971,21.836368],[89.847467,22.039146],[89.70205,21.857116],[89.418863,21.966179],[89.031961,22.055708],[88.876312,22.879146],[88.52977,23.631142],[88.69994,24.233715],[88.084422,24.501657],[88.306373,24.866079],[88.931554,25.238692],[88.209789,25.768066],[88.563049,26.446526],[89.355094,26.014407],[89.832481,25.965082],[89.920693,25.26975],[90.872211,25.132601],[91.799596,25.147432],[92.376202,24.976693],[91.915093,24.130414],[91.46773,24.072639],[91.158963,23.503527],[91.706475,22.985264],[91.869928,23.624346],[92.146035,23.627499],[92.672721,22.041239]]]}},
{"type":"Feature","id":"BGR","properties":{"name":"Bulgaria"},"geometry":{"type":"Polygon","coordinates":[[[22.65715,44.234923],[22.944832,43.823785],[23.332302,43.897011],[24.100679,43.741051],[25.569272,43.688445],[26.065159,43.943494],[27.2424,44.175986],[27.970107,43.812468],[28.558081,43.707462],[28.039095,43.293172],[27.673898,42.577892],[27.99672,42.007359],[27.135739,42.141485],[26.117042,41.826905],[26.106138,41.328899],[25.197201,41.234486],[24.492645,41.583896],[23.692074,41.309081],[22.952377,41.337994],[22.881374,41.999297],[22.380526,42.32026],[22.545012,42.461362],[22.436595,42.580321],[22.604801,42.898519],[22.986019,43.211161],[22.500157,43.642814],[22.410446,44.008063],[22.65715,44.234923]]]}},
{"type":"Feature","id":"BHS","properties":{"name":"The Bahamas"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-77.53466,23.75975],[-77.78,23.71],[-78.03405,24.28615],[-78.40848,24.57564],[-78.19087,25.2103],[-77.89,25.17],[-77.54,24.34],[-77.53466,23.75975]]],[[[-77.82,26.58],[-78.91,26.42],[-78.98,26.79],[-78.51,26.87],[-77.85,26.84],[-77.82,26.58]]],[[[-77,26.59],[-77.17255,25.87918],[-77.35641,26.00735],[-77.34,26.53],[-77.78802,26.92516],[-77.79,27.04],[-77,26.59]]]]}},
{"type":"Feature","id":"BIH","properties":{"name":"Bosnia and Herzegovina"},"geometry":{"type":"Polygon","coordinates":[[[19.005486,44.860234],[19.36803,44.863],[19.11761,44.42307],[19.59976,44.03847],[19.454,43.5681],[19.21852,43.52384],[19.03165,43.43253],[18.70648,43.20011],[18.56,42.65],[17.674922,43.028563],[17.297373,43.446341],[16.916156,43.667722],[16.456443,44.04124],[16.23966,44.351143],[15.750026,44.818712],[15.959367,45.233777],[16.318157,45.004127],[16.534939,45.211608],[17.002146,45.233777],[17.861783,45.06774],[18.553214,45.08159],[19.005486,44.860234]]]}},
{"type":"Feature","id":"BLR","properties":{"name":"Belarus"},"geometry":{"type":"Polygon","coordinates":[[[23.484128,53.912498],[24.450684,53.905702],[25.536354,54.282423],[25.768433,54.846963],[26.588279,55.167176],[26.494331,55.615107],[27.10246,55.783314],[28.176709,56.16913],[29.229513,55.918344],[29.371572,55.670091],[29.896294,55.789463],[30.873909,55.550976],[30.971836,55.081548],[30.757534,54.811771],[31.384472,54.157056],[31.791424,53.974639],[31.731273,53.794029],[32.405599,53.618045],[32.693643,53.351421],[32.304519,53.132726],[31.497644,53.167427],[31.305201,53.073996],[31.540018,52.742052],[31.785998,52.101678],[30.927549,52.042353],[30.619454,51.822806],[30.555117,51.319503],[30.157364,51.416138],[29.254938,51.368234],[28.992835,51.602044],[28.617613,51.427714],[28.241615,51.572227],[27.454066,51.592303],[26.337959,51.832289],[25.327788,51.910656],[24.553106,51.888461],[24.005078,51.617444],[23.527071,51.578454],[23.508002,52.023647],[23.199494,52.486977],[23.799199,52.691099],[23.804935,53.089731],[23.527536,53.470122],[23.484128,53.912498]]]}},
{"type":"Feature","id":"BLZ","properties":{"name":"Belize"},"geometry":{"type":"Polygon","coordinates":[[[-89.14308,17.808319],[-89.150909,17.955468],[-89.029857,18.001511],[-88.848344,17.883198],[-88.490123,18.486831],[-88.300031,18.499982],[-88.296336,18.353273],[-88.106813,18.348674],[-88.123479,18.076675],[-88.285355,17.644143],[-88.197867,17.489475],[-88.302641,17.131694],[-88.239518,17.036066],[-88.355428,16.530774],[-88.551825,16.265467],[-88.732434,16.233635],[-88.930613,15.887273],[-89.229122,15.886938],[-89.150806,17.015577],[-89.14308,17.808319]]]}},
{"type":"Feature","id":"BMU","properties":{"name":"Bermuda"},"geometry":{"type":"Polygon","coordinates":[[[-64.7799734332998,32.3072000581802],[-64.7873319183061,32.3039237143428],[-64.7946942710173,32.3032682700388],[-64.8094297981283,32.3098175728414],[-64.8167896352437,32.3058845718466],[-64.8101968029642,32.3022833180511],[-64.7962291465484,32.2934409732427],[-64.7815086336978,32.2868973114514],[-64.7997025513437,32.2796896417328],[-64.8066707691087,32.2747767569465],[-64.8225587873683,32.2669111289395],[-64.8287548840306,32.2669075473817],[-64.8306732143498,32.2583944840235],[-64.8399924854972,32.254782282336],[-64.8566090462354,32.2547740387514],[-64.8682296789446,32.2616393614322],[-64.8628241459563,32.2724481933959],[-64.8748651338951,32.2757120264753],[-64.8717752856644,32.2819371582026],[-64.8671422127295,32.2930760547989],[-64.8559068764437,32.2960321186471],[-64.8597429072279,32.3015842021933],[-64.8439233486717,32.3140553852543],[-64.8350242329311,32.3242161760006],[-64.8338690593672,32.3294587561557],[-64.8520298651164,32.3110911879954],[-64.8635922932573,32.3048469433363],[-64.8686668994079,32.30910745083],[-64.8721354593415,32.3041908606301],[-64.8779667328485,32.3038632800462],[-64.8780046844321,32.2907757831692],[-64.8849776658292,32.2819261366004],[-64.8783230004629,32.2613001418681],[-64.863194968877,32.2465799485801],[-64.8519819555722,32.2485519134663],[-64.842311980074,32.2492123317296],[-64.8388242605209,32.2475773472534],[-64.8334002575532,32.2462714714698],[-64.8256389530584,32.2472637398594],[-64.8205697556026,32.2531698880328],[-64.8105087275579,32.2561208974156],[-64.7900177727338,32.2659446936992],[-64.7745415970416,32.2718413023427],[-64.7644742436426,32.2855931353214],[-64.7551803442276,32.2908326702531],[-64.7423982971436,32.2996734994024],[-64.7206991797682,32.3137542201258],[-64.7117851247134,32.3176823360806],[-64.6962778813133,32.3275029115532],[-64.6768921127452,32.3324095397555],[-64.6567136927777,32.3451776458469],[-64.6532168823499,32.3494356627941],[-64.6605720384429,32.3589423487763],[-64.65125819471,32.3615600906466],[-64.6462011670816,32.36975169749],[-64.6613227512832,32.3763135008721],[-64.6690666074397,32.388444543924],[-64.6834270548595,32.3854968316788],[-64.6954617672714,32.3763221285869],[-64.70438689565,32.3704254760469],[-64.7117569982798,32.368132600249],[-64.7061764744404,32.3600110593559],[-64.700531552697,32.3590601356818],[-64.6940348033967,32.3640708659835],[-64.6895164826082,32.3633598579866],[-64.6864150099255,32.3547797587266],[-64.6824635995504,32.3540628176846],[-64.6835876652835,32.3626447677968],[-64.6801998697415,32.3631199096979],[-64.6672170444687,32.3597751617473],[-64.6598811264978,32.3497625771755],[-64.6737331235384,32.3390281851635],[-64.6887090648183,32.3342439408053],[-64.706732854446,32.3429010723036],[-64.7149301576112,32.3552188753513],[-64.7185967666669,32.3552239212394],[-64.7214189847314,32.3518830231342],[-64.7270616067222,32.3466461715475],[-64.734962460882,32.3442819830499],[-64.7383521549094,32.3407216514918],[-64.7411729976333,32.3311790864627],[-64.7423019216485,32.323311561213],[-64.7462482354281,32.318538611581],[-64.7566773739613,32.3130509130175],[-64.768738200563,32.3088369816572],[-64.7799734332998,32.3072000581802]]]}},
{"type":"Feature","id":"BOL","properties":{"name":"Bolivia"},"geometry":{"type":"Polygon","coordinates":[[[-62.846468,-22.034985],[-63.986838,-21.993644],[-64.377021,-22.798091],[-64.964892,-22.075862],[-66.273339,-21.83231],[-67.106674,-22.735925],[-67.82818,-22.872919],[-68.219913,-21.494347],[-68.757167,-20.372658],[-68.442225,-19.405068],[-68.966818,-18.981683],[-69.100247,-18.260125],[-69.590424,-17.580012],[-68.959635,-16.500698],[-69.389764,-15.660129],[-69.160347,-15.323974],[-69.339535,-14.953195],[-68.948887,-14.453639],[-68.929224,-13.602684],[-68.88008,-12.899729],[-68.66508,-12.5613],[-69.529678,-10.951734],[-68.786158,-11.03638],[-68.271254,-11.014521],[-68.048192,-10.712059],[-67.173801,-10.306812],[-66.646908,-9.931331],[-65.338435,-9.761988],[-65.444837,-10.511451],[-65.321899,-10.895872],[-65.402281,-11.56627],[-64.316353,-12.461978],[-63.196499,-12.627033],[-62.80306,-13.000653],[-62.127081,-13.198781],[-61.713204,-13.489202],[-61.084121,-13.479384],[-60.503304,-13.775955],[-60.459198,-14.354007],[-60.264326,-14.645979],[-60.251149,-15.077219],[-60.542966,-15.09391],[-60.15839,-16.258284],[-58.24122,-16.299573],[-58.388058,-16.877109],[-58.280804,-17.27171],[-57.734558,-17.552468],[-57.498371,-18.174188],[-57.676009,-18.96184],[-57.949997,-19.400004],[-57.853802,-19.969995],[-58.166392,-20.176701],[-58.183471,-19.868399],[-59.115042,-19.356906],[-60.043565,-19.342747],[-61.786326,-19.633737],[-62.265961,-20.513735],[-62.291179,-21.051635],[-62.685057,-22.249029],[-62.846468,-22.034985]]]}},
{"type":"Feature","id":"BRA","properties":{"name":"Brazil"},"geometry":{"type":"Polygon","coordinates":[[[-57.625133,-30.216295],[-56.2909,-28.852761],[-55.162286,-27.881915],[-54.490725,-27.474757],[-53.648735,-26.923473],[-53.628349,-26.124865],[-54.13005,-25.547639],[-54.625291,-25.739255],[-54.428946,-25.162185],[-54.293476,-24.5708],[-54.29296,-24.021014],[-54.652834,-23.839578],[-55.027902,-24.001274],[-55.400747,-23.956935],[-55.517639,-23.571998],[-55.610683,-22.655619],[-55.797958,-22.35693],[-56.473317,-22.0863],[-56.88151,-22.282154],[-57.937156,-22.090176],[-57.870674,-20.732688],[-58.166392,-20.176701],[-57.853802,-19.969995],[-57.949997,-19.400004],[-57.676009,-18.96184],[-57.498371,-18.174188],[-57.734558,-17.552468],[-58.280804,-17.27171],[-58.388058,-16.877109],[-58.24122,-16.299573],[-60.15839,-16.258284],[-60.542966,-15.09391],[-60.251149,-15.077219],[-60.264326,-14.645979],[-60.459198,-14.354007],[-60.503304,-13.775955],[-61.084121,-13.479384],[-61.713204,-13.489202],[-62.127081,-13.198781],[-62.80306,-13.000653],[-63.196499,-12.627033],[-64.316353,-12.461978],[-65.402281,-11.56627],[-65.321899,-10.895872],[-65.444837,-10.511451],[-65.338435,-9.761988],[-66.646908,-9.931331],[-67.173801,-10.306812],[-68.048192,-10.712059],[-68.271254,-11.014521],[-68.786158,-11.03638],[-69.529678,-10.951734],[-70.093752,-11.123972],[-70.548686,-11.009147],[-70.481894,-9.490118],[-71.302412,-10.079436],[-72.184891,-10.053598],[-72.563033,-9.520194],[-73.226713,-9.462213],[-73.015383,-9.032833],[-73.571059,-8.424447],[-73.987235,-7.52383],[-73.723401,-7.340999],[-73.724487,-6.918595],[-73.120027,-6.629931],[-73.219711,-6.089189],[-72.964507,-5.741251],[-72.891928,-5.274561],[-71.748406,-4.593983],[-70.928843,-4.401591],[-70.794769,-4.251265],[-69.893635,-4.298187],[-69.444102,-1.556287],[-69.420486,-1.122619],[-69.577065,-0.549992],[-70.020656,-0.185156],[-70.015566,0.541414],[-69.452396,0.706159],[-69.252434,0.602651],[-69.218638,0.985677],[-69.804597,1.089081],[-69.816973,1.714805],[-67.868565,1.692455],[-67.53781,2.037163],[-67.259998,1.719999],[-67.065048,1.130112],[-66.876326,1.253361],[-66.325765,0.724452],[-65.548267,0.789254],[-65.354713,1.095282],[-64.611012,1.328731],[-64.199306,1.492855],[-64.083085,1.916369],[-63.368788,2.2009],[-63.422867,2.411068],[-64.269999,2.497006],[-64.408828,3.126786],[-64.368494,3.79721],[-64.816064,4.056445],[-64.628659,4.148481],[-63.888343,4.02053],[-63.093198,3.770571],[-62.804533,4.006965],[-62.08543,4.162124],[-60.966893,4.536468],[-60.601179,4.918098],[-60.733574,5.200277],[-60.213683,5.244486],[-59.980959,5.014061],[-60.111002,4.574967],[-59.767406,4.423503],[-59.53804,3.958803],[-59.815413,3.606499],[-59.974525,2.755233],[-59.718546,2.24963],[-59.646044,1.786894],[-59.030862,1.317698],[-58.540013,1.268088],[-58.429477,1.463942],[-58.11345,1.507195],[-57.660971,1.682585],[-57.335823,1.948538],[-56.782704,1.863711],[-56.539386,1.899523],[-55.995698,1.817667],[-55.9056,2.021996],[-56.073342,2.220795],[-55.973322,2.510364],[-55.569755,2.421506],[-55.097587,2.523748],[-54.524754,2.311849],[-54.088063,2.105557],[-53.778521,2.376703],[-53.554839,2.334897],[-53.418465,2.053389],[-52.939657,2.124858],[-52.556425,2.504705],[-52.249338,3.241094],[-51.657797,4.156232],[-51.317146,4.203491],[-51.069771,3.650398],[-50.508875,1.901564],[-49.974076,1.736483],[-49.947101,1.04619],[-50.699251,0.222984],[-50.388211,-0.078445],[-48.620567,-0.235489],[-48.584497,-1.237805],[-47.824956,-0.581618],[-46.566584,-0.941028],[-44.905703,-1.55174],[-44.417619,-2.13775],[-44.581589,-2.691308],[-43.418791,-2.38311],[-41.472657,-2.912018],[-39.978665,-2.873054],[-38.500383,-3.700652],[-37.223252,-4.820946],[-36.452937,-5.109404],[-35.597796,-5.149504],[-35.235389,-5.464937],[-34.89603,-6.738193],[-34.729993,-7.343221],[-35.128212,-8.996401],[-35.636967,-9.649282],[-37.046519,-11.040721],[-37.683612,-12.171195],[-38.423877,-13.038119],[-38.673887,-13.057652],[-38.953276,-13.79337],[-38.882298,-15.667054],[-39.161092,-17.208407],[-39.267339,-17.867746],[-39.583521,-18.262296],[-39.760823,-19.599113],[-40.774741,-20.904512],[-40.944756,-21.937317],[-41.754164,-22.370676],[-41.988284,-22.97007],[-43.074704,-22.967693],[-44.647812,-23.351959],[-45.352136,-23.796842],[-46.472093,-24.088969],[-47.648972,-24.885199],[-48.495458,-25.877025],[-48.641005,-26.623698],[-48.474736,-27.175912],[-48.66152,-28.186135],[-48.888457,-28.674115],[-49.587329,-29.224469],[-50.696874,-30.984465],[-51.576226,-31.777698],[-52.256081,-32.24537],[-52.7121,-33.196578],[-53.373662,-33.768378],[-53.650544,-33.202004],[-53.209589,-32.727666],[-53.787952,-32.047243],[-54.572452,-31.494511],[-55.60151,-30.853879],[-55.973245,-30.883076],[-56.976026,-30.109686],[-57.625133,-30.216295]]]}},
{"type":"Feature","id":"BRN","properties":{"name":"Brunei"},"geometry":{"type":"Polygon","coordinates":[[[114.204017,4.525874],[114.599961,4.900011],[115.45071,5.44773],[115.4057,4.955228],[115.347461,4.316636],[114.869557,4.348314],[114.659596,4.007637],[114.204017,4.525874]]]}},
{"type":"Feature","id":"BTN","properties":{"name":"Bhutan"},"geometry":{"type":"Polygon","coordinates":[[[91.696657,27.771742],[92.103712,27.452614],[92.033484,26.83831],[91.217513,26.808648],[90.373275,26.875724],[89.744528,26.719403],[88.835643,27.098966],[88.814248,27.299316],[89.47581,28.042759],[90.015829,28.296439],[90.730514,28.064954],[91.258854,28.040614],[91.696657,27.771742]]]}},
{"type":"Feature","id":"BWA","properties":{"name":"Botswana"},"geometry":{"type":"Polygon","coordinates":[[[25.649163,-18.536026],[25.850391,-18.714413],[26.164791,-19.293086],[27.296505,-20.39152],[27.724747,-20.499059],[27.727228,-20.851802],[28.02137,-21.485975],[28.794656,-21.639454],[29.432188,-22.091313],[28.017236,-22.827754],[27.11941,-23.574323],[26.786407,-24.240691],[26.485753,-24.616327],[25.941652,-24.696373],[25.765849,-25.174845],[25.664666,-25.486816],[25.025171,-25.71967],[24.211267,-25.670216],[23.73357,-25.390129],[23.312097,-25.26869],[22.824271,-25.500459],[22.579532,-25.979448],[22.105969,-26.280256],[21.605896,-26.726534],[20.889609,-26.828543],[20.66647,-26.477453],[20.758609,-25.868136],[20.165726,-24.917962],[19.895768,-24.76779],[19.895458,-21.849157],[20.881134,-21.814327],[20.910641,-18.252219],[21.65504,-18.219146],[23.196858,-17.869038],[23.579006,-18.281261],[24.217365,-17.889347],[24.520705,-17.887125],[25.084443,-17.661816],[25.264226,-17.73654],[25.649163,-18.536026]]]}},
{"type":"Feature","id":"CAF","properties":{"name":"Central African Republic"},"geometry":{"type":"Polygon","coordinates":[[[15.27946,7.421925],[16.106232,7.497088],[16.290562,7.754307],[16.456185,7.734774],[16.705988,7.508328],[17.96493,7.890914],[18.389555,8.281304],[18.911022,8.630895],[18.81201,8.982915],[19.094008,9.074847],[20.059685,9.012706],[21.000868,9.475985],[21.723822,10.567056],[22.231129,10.971889],[22.864165,11.142395],[22.977544,10.714463],[23.554304,10.089255],[23.55725,9.681218],[23.394779,9.265068],[23.459013,8.954286],[23.805813,8.666319],[24.567369,8.229188],[25.114932,7.825104],[25.124131,7.500085],[25.796648,6.979316],[26.213418,6.546603],[26.465909,5.946717],[27.213409,5.550953],[27.374226,5.233944],[27.044065,5.127853],[26.402761,5.150875],[25.650455,5.256088],[25.278798,5.170408],[25.128833,4.927245],[24.805029,4.897247],[24.410531,5.108784],[23.297214,4.609693],[22.84148,4.710126],[22.704124,4.633051],[22.405124,4.02916],[21.659123,4.224342],[20.927591,4.322786],[20.290679,4.691678],[19.467784,5.031528],[18.932312,4.709506],[18.542982,4.201785],[18.453065,3.504386],[17.8099,3.560196],[17.133042,3.728197],[16.537058,3.198255],[16.012852,2.26764],[15.907381,2.557389],[15.862732,3.013537],[15.405396,3.335301],[15.03622,3.851367],[14.950953,4.210389],[14.478372,4.732605],[14.558936,5.030598],[14.459407,5.451761],[14.53656,6.226959],[14.776545,6.408498],[15.27946,7.421925]]]}},
{"type":"Feature","id":"CAN","properties":{"name":"Canada"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-63.6645,46.55001],[-62.9393,46.41587],[-62.01208,46.44314],[-62.50391,46.03339],[-62.87433,45.96818],[-64.1428,46.39265],[-64.39261,46.72747],[-64.01486,47.03601],[-63.6645,46.55001]]],[[[-61.806305,49.10506],[-62.29318,49.08717],[-63.58926,49.40069],[-64.51912,49.87304],[-64.17322,49.95718],[-62.85829,49.70641],[-61.835585,49.28855],[-61.806305,49.10506]]],[[[-123.510002,48.510011],[-124.012891,48.370846],[-125.655013,48.825005],[-125.954994,49.179996],[-126.850004,49.53],[-127.029993,49.814996],[-128.059336,49.994959],[-128.444584,50.539138],[-128.358414,50.770648],[-127.308581,50.552574],[-126.695001,50.400903],[-125.755007,50.295018],[-125.415002,49.950001],[-124.920768,49.475275],[-123.922509,49.062484],[-123.510002,48.510011]]],[[[-56.134036,50.68701],[-56.795882,49.812309],[-56.143105,50.150117],[-55.471492,49.935815],[-55.822401,49.587129],[-54.935143,49.313011],[-54.473775,49.556691],[-53.476549,49.249139],[-53.786014,48.516781],[-53.086134,48.687804],[-52.958648,48.157164],[-52.648099,47.535548],[-53.069158,46.655499],[-53.521456,46.618292],[-54.178936,46.807066],[-53.961869,47.625207],[-54.240482,47.752279],[-55.400773,46.884994],[-55.997481,46.91972],[-55.291219,47.389562],[-56.250799,47.632545],[-57.325229,47.572807],[-59.266015,47.603348],[-59.419494,47.899454],[-58.796586,48.251525],[-59.231625,48.523188],[-58.391805,49.125581],[-57.35869,50.718274],[-56.73865,51.287438],[-55.870977,51.632094],[-55.406974,51.588273],[-55.600218,51.317075],[-56.134036,50.68701]]],[[[-132.710008,54.040009],[-131.74999,54.120004],[-132.04948,52.984621],[-131.179043,52.180433],[-131.57783,52.182371],[-132.180428,52.639707],[-132.549992,53.100015],[-133.054611,53.411469],[-133.239664,53.85108],[-133.180004,54.169975],[-132.710008,54.040009]]],[[[-79.26582,62.158675],[-79.65752,61.63308],[-80.09956,61.7181],[-80.36215,62.01649],[-80.315395,62.085565],[-79.92939,62.3856],[-79.52002,62.36371],[-79.26582,62.158675]]],[[[-81.89825,62.7108],[-83.06857,62.15922],[-83.77462,62.18231],[-83.99367,62.4528],[-83.25048,62.91409],[-81.87699,62.90458],[-81.89825,62.7108]]],[[[-85.161308,65.657285],[-84.975764,65.217518],[-84.464012,65.371772],[-83.882626,65.109618],[-82.787577,64.766693],[-81.642014,64.455136],[-81.55344,63.979609],[-80.817361,64.057486],[-80.103451,63.725981],[-80.99102,63.411246],[-82.547178,63.651722],[-83.108798,64.101876],[-84.100417,63.569712],[-85.523405,63.052379],[-85.866769,63.637253],[-87.221983,63.541238],[-86.35276,64.035833],[-86.224886,64.822917],[-85.883848,65.738778],[-85.161308,65.657285]]],[[[-75.86588,67.14886],[-76.98687,67.09873],[-77.2364,67.58809],[-76.81166,68.14856],[-75.89521,68.28721],[-75.1145,68.01036],[-75.10333,67.58202],[-75.21597,67.44425],[-75.86588,67.14886]]],[[[-95.647681,69.10769],[-96.269521,68.75704],[-97.617401,69.06003],[-98.431801,68.9507],[-99.797401,69.40003],[-98.917401,69.71003],[-98.218261,70.14354],[-97.157401,69.86003],[-96.557401,69.68003],[-96.257401,69.49003],[-95.647681,69.10769]]],[[[-90.5471,69.49766],[-90.55151,68.47499],[-89.21515,69.25873],[-88.01966,68.61508],[-88.31749,67.87338],[-87.35017,67.19872],[-86.30607,67.92146],[-85.57664,68.78456],[-85.52197,69.88211],[-84.10081,69.80539],[-82.62258,69.65826],[-81.28043,69.16202],[-81.2202,68.66567],[-81.96436,68.13253],[-81.25928,67.59716],[-81.38653,67.11078],[-83.34456,66.41154],[-84.73542,66.2573],[-85.76943,66.55833],[-86.0676,66.05625],[-87.03143,65.21297],[-87.32324,64.77563],[-88.48296,64.09897],[-89.91444,64.03273],[-90.70398,63.61017],[-90.77004,62.96021],[-91.93342,62.83508],[-93.15698,62.02469],[-94.24153,60.89865],[-94.62931,60.11021],[-94.6846,58.94882],[-93.21502,58.78212],[-92.76462,57.84571],[-92.29703,57.08709],[-90.89769,57.28468],[-89.03953,56.85172],[-88.03978,56.47162],[-87.32421,55.99914],[-86.07121,55.72383],[-85.01181,55.3026],[-83.36055,55.24489],[-82.27285,55.14832],[-82.4362,54.28227],[-82.12502,53.27703],[-81.40075,52.15788],[-79.91289,51.20842],[-79.14301,51.53393],[-78.60191,52.56208],[-79.12421,54.14145],[-79.82958,54.66772],[-78.22874,55.13645],[-77.0956,55.83741],[-76.54137,56.53423],[-76.62319,57.20263],[-77.30226,58.05209],[-78.51688,58.80458],[-77.33676,59.85261],[-77.77272,60.75788],[-78.10687,62.31964],[-77.41067,62.55053],[-75.69621,62.2784],[-74.6682,62.18111],[-73.83988,62.4438],[-72.90853,62.10507],[-71.67708,61.52535],[-71.37369,61.13717],[-69.59042,61.06141],[-69.62033,60.22125],[-69.2879,58.95736],[-68.37455,58.80106],[-67.64976,58.21206],[-66.20178,58.76731],[-65.24517,59.87071],[-64.58352,60.33558],[-63.80475,59.4426],[-62.50236,58.16708],[-61.39655,56.96745],[-61.79866,56.33945],[-60.46853,55.77548],[-59.56962,55.20407],[-57.97508,54.94549],[-57.3332,54.6265],[-56.93689,53.78032],[-56.15811,53.64749],[-55.75632,53.27036],[-55.68338,52.14664],[-56.40916,51.7707],[-57.12691,51.41972],[-58.77482,51.0643],[-60.03309,50.24277],[-61.72366,50.08046],[-63.86251,50.29099],[-65.36331,50.2982],[-66.39905,50.22897],[-67.23631,49.51156],[-68.51114,49.06836],[-69.95362,47.74488],[-71.10458,46.82171],[-70.25522,46.98606],[-68.65,48.3],[-66.55243,49.1331],[-65.05626,49.23278],[-64.17099,48.74248],[-65.11545,48.07085],[-64.79854,46.99297],[-64.47219,46.23849],[-63.17329,45.73902],[-61.52072,45.88377],[-60.51815,47.00793],[-60.4486,46.28264],[-59.80287,45.9204],[-61.03988,45.26525],[-63.25471,44.67014],[-64.24656,44.26553],[-65.36406,43.54523],[-66.1234,43.61867],[-66.16173,44.46512],[-64.42549,45.29204],[-66.02605,45.25931],[-67.13741,45.13753],[-67.79134,45.70281],[-67.79046,47.06636],[-68.23444,47.35486],[-68.905,47.185],[-69.237216,47.447781],[-69.99997,46.69307],[-70.305,45.915],[-70.66,45.46],[-71.08482,45.30524],[-71.405,45.255],[-71.50506,45.0082],[-73.34783,45.00738],[-74.867,45.00048],[-75.31821,44.81645],[-76.375,44.09631],[-76.5,44.018459],[-76.820034,43.628784],[-77.737885,43.629056],[-78.72028,43.625089],[-79.171674,43.466339],[-79.01,43.27],[-78.92,42.965],[-78.939362,42.863611],[-80.247448,42.3662],[-81.277747,42.209026],[-82.439278,41.675105],[-82.690089,41.675105],[-83.02981,41.832796],[-83.142,41.975681],[-83.12,42.08],[-82.9,42.43],[-82.43,42.98],[-82.137642,43.571088],[-82.337763,44.44],[-82.550925,45.347517],[-83.592851,45.816894],[-83.469551,45.994686],[-83.616131,46.116927],[-83.890765,46.116927],[-84.091851,46.275419],[-84.14212,46.512226],[-84.3367,46.40877],[-84.6049,46.4396],[-84.543749,46.538684],[-84.779238,46.637102],[-84.87608,46.900083],[-85.652363,47.220219],[-86.461991,47.553338],[-87.439793,47.94],[-88.378114,48.302918],[-89.272917,48.019808],[-89.6,48.01],[-90.83,48.27],[-91.64,48.14],[-92.61,48.45],[-93.63087,48.60926],[-94.32914,48.67074],[-94.64,48.84],[-94.81758,49.38905],[-95.15609,49.38425],[-95.15907,49],[-97.22872,49.0007],[-100.65,49],[-104.04826,48.99986],[-107.05,49],[-110.05,49],[-113,49],[-116.04818,49],[-117.03121,49],[-120,49],[-122.84,49],[-122.97421,49.002538],[-124.91024,49.98456],[-125.62461,50.41656],[-127.43561,50.83061],[-127.99276,51.71583],[-127.85032,52.32961],[-129.12979,52.75538],[-129.30523,53.56159],[-130.51497,54.28757],[-130.53611,54.80278],[-129.98,55.285],[-130.00778,55.91583],[-131.70781,56.55212],[-132.73042,57.69289],[-133.35556,58.41028],[-134.27111,58.86111],[-134.945,59.27056],[-135.47583,59.78778],[-136.47972,59.46389],[-137.4525,58.905],[-138.34089,59.56211],[-139.039,60],[-140.013,60.27682],[-140.99778,60.30639],[-140.9925,66.00003],[-140.986,69.712],[-139.12052,69.47102],[-137.54636,68.99002],[-136.50358,68.89804],[-135.62576,69.31512],[-134.41464,69.62743],[-132.92925,69.50534],[-131.43136,69.94451],[-129.79471,70.19369],[-129.10773,69.77927],[-128.36156,70.01286],[-128.13817,70.48384],[-127.44712,70.37721],[-125.75632,69.48058],[-124.42483,70.1584],[-124.28968,69.39969],[-123.06108,69.56372],[-122.6835,69.85553],[-121.47226,69.79778],[-119.94288,69.37786],[-117.60268,69.01128],[-116.22643,68.84151],[-115.2469,68.90591],[-113.89794,68.3989],[-115.30489,67.90261],[-113.49727,67.68815],[-110.798,67.80612],[-109.94619,67.98104],[-108.8802,67.38144],[-107.79239,67.88736],[-108.81299,68.31164],[-108.16721,68.65392],[-106.95,68.7],[-106.15,68.8],[-105.34282,68.56122],[-104.33791,68.018],[-103.22115,68.09775],[-101.45433,67.64689],[-99.90195,67.80566],[-98.4432,67.78165],[-98.5586,68.40394],[-97.66948,68.57864],[-96.11991,68.23939],[-96.12588,67.29338],[-95.48943,68.0907],[-94.685,68.06383],[-94.23282,69.06903],[-95.30408,69.68571],[-96.47131,70.08976],[-96.39115,71.19482],[-95.2088,71.92053],[-93.88997,71.76015],[-92.87818,71.31869],[-91.51964,70.19129],[-92.40692,69.69997],[-90.5471,69.49766]]],[[[-114.16717,73.12145],[-114.66634,72.65277],[-112.44102,72.9554],[-111.05039,72.4504],[-109.92035,72.96113],[-109.00654,72.63335],[-108.18835,71.65089],[-107.68599,72.06548],[-108.39639,73.08953],[-107.51645,73.23598],[-106.52259,73.07601],[-105.40246,72.67259],[-104.77484,71.6984],[-104.46476,70.99297],[-102.78537,70.49776],[-100.98078,70.02432],[-101.08929,69.58447],[-102.73116,69.50402],[-102.09329,69.11962],[-102.43024,68.75282],[-104.24,68.91],[-105.96,69.18],[-107.12254,69.11922],[-109,68.78],[-111.534149,68.630059],[-113.3132,68.53554],[-113.85496,69.00744],[-115.22,69.28],[-116.10794,69.16821],[-117.34,69.96],[-116.67473,70.06655],[-115.13112,70.2373],[-113.72141,70.19237],[-112.4161,70.36638],[-114.35,70.6],[-116.48684,70.52045],[-117.9048,70.54056],[-118.43238,70.9092],[-116.11311,71.30918],[-117.65568,71.2952],[-119.40199,71.55859],[-118.56267,72.30785],[-117.86642,72.70594],[-115.18909,73.31459],[-114.16717,73.12145]]],[[[-104.5,73.42],[-105.38,72.76],[-106.94,73.46],[-106.6,73.6],[-105.26,73.64],[-104.5,73.42]]],[[[-76.34,73.102685],[-76.251404,72.826385],[-77.314438,72.855545],[-78.39167,72.876656],[-79.486252,72.742203],[-79.775833,72.802902],[-80.876099,73.333183],[-80.833885,73.693184],[-80.353058,73.75972],[-78.064438,73.651932],[-76.34,73.102685]]],[[[-86.562179,73.157447],[-85.774371,72.534126],[-84.850112,73.340278],[-82.31559,73.750951],[-80.600088,72.716544],[-80.748942,72.061907],[-78.770639,72.352173],[-77.824624,72.749617],[-75.605845,72.243678],[-74.228616,71.767144],[-74.099141,71.33084],[-72.242226,71.556925],[-71.200015,70.920013],[-68.786054,70.525024],[-67.91497,70.121948],[-66.969033,69.186087],[-68.805123,68.720198],[-66.449866,68.067163],[-64.862314,67.847539],[-63.424934,66.928473],[-61.851981,66.862121],[-62.163177,66.160251],[-63.918444,64.998669],[-65.14886,65.426033],[-66.721219,66.388041],[-68.015016,66.262726],[-68.141287,65.689789],[-67.089646,65.108455],[-65.73208,64.648406],[-65.320168,64.382737],[-64.669406,63.392927],[-65.013804,62.674185],[-66.275045,62.945099],[-68.783186,63.74567],[-67.369681,62.883966],[-66.328297,62.280075],[-66.165568,61.930897],[-68.877367,62.330149],[-71.023437,62.910708],[-72.235379,63.397836],[-71.886278,63.679989],[-73.378306,64.193963],[-74.834419,64.679076],[-74.818503,64.389093],[-77.70998,64.229542],[-78.555949,64.572906],[-77.897281,65.309192],[-76.018274,65.326969],[-73.959795,65.454765],[-74.293883,65.811771],[-73.944912,66.310578],[-72.651167,67.284576],[-72.92606,67.726926],[-73.311618,68.069437],[-74.843307,68.554627],[-76.869101,68.894736],[-76.228649,69.147769],[-77.28737,69.76954],[-78.168634,69.826488],[-78.957242,70.16688],[-79.492455,69.871808],[-81.305471,69.743185],[-84.944706,69.966634],[-87.060003,70.260001],[-88.681713,70.410741],[-89.51342,70.762038],[-88.467721,71.218186],[-89.888151,71.222552],[-90.20516,72.235074],[-89.436577,73.129464],[-88.408242,73.537889],[-85.826151,73.803816],[-86.562179,73.157447]]],[[[-100.35642,73.84389],[-99.16387,73.63339],[-97.38,73.76],[-97.12,73.47],[-98.05359,72.99052],[-96.54,72.56],[-96.72,71.66],[-98.35966,71.27285],[-99.32286,71.35639],[-100.01482,71.73827],[-102.5,72.51],[-102.48,72.83],[-100.43836,72.70588],[-101.54,73.36],[-100.35642,73.84389]]],[[[-93.196296,72.771992],[-94.269047,72.024596],[-95.409856,72.061881],[-96.033745,72.940277],[-96.018268,73.43743],[-95.495793,73.862417],[-94.503658,74.134907],[-92.420012,74.100025],[-90.509793,73.856732],[-92.003965,72.966244],[-93.196296,72.771992]]],[[[-120.46,71.383602],[-123.09219,70.90164],[-123.62,71.34],[-125.928949,71.868688],[-125.5,72.292261],[-124.80729,73.02256],[-123.94,73.68],[-124.91775,74.29275],[-121.53788,74.44893],[-120.10978,74.24135],[-117.55564,74.18577],[-116.58442,73.89607],[-115.51081,73.47519],[-116.76794,73.22292],[-119.22,72.52],[-120.46,71.82],[-120.46,71.383602]]],[[[-93.612756,74.979997],[-94.156909,74.592347],[-95.608681,74.666864],[-96.820932,74.927623],[-96.288587,75.377828],[-94.85082,75.647218],[-93.977747,75.29649],[-93.612756,74.979997]]],[[[-98.5,76.72],[-97.735585,76.25656],[-97.704415,75.74344],[-98.16,75],[-99.80874,74.89744],[-100.88366,75.05736],[-100.86292,75.64075],[-102.50209,75.5638],[-102.56552,76.3366],[-101.48973,76.30537],[-99.98349,76.64634],[-98.57699,76.58859],[-98.5,76.72]]],[[[-108.21141,76.20168],[-107.81943,75.84552],[-106.92893,76.01282],[-105.881,75.9694],[-105.70498,75.47951],[-106.31347,75.00527],[-109.7,74.85],[-112.22307,74.41696],[-113.74381,74.39427],[-113.87135,74.72029],[-111.79421,75.1625],[-116.31221,75.04343],[-117.7104,75.2222],[-116.34602,76.19903],[-115.40487,76.47887],[-112.59056,76.14134],[-110.81422,75.54919],[-109.0671,75.47321],[-110.49726,76.42982],[-109.5811,76.79417],[-108.54859,76.67832],[-108.21141,76.20168]]],[[[-94.684086,77.097878],[-93.573921,76.776296],[-91.605023,76.778518],[-90.741846,76.449597],[-90.969661,76.074013],[-89.822238,75.847774],[-89.187083,75.610166],[-87.838276,75.566189],[-86.379192,75.482421],[-84.789625,75.699204],[-82.753445,75.784315],[-81.128531,75.713983],[-80.057511,75.336849],[-79.833933,74.923127],[-80.457771,74.657304],[-81.948843,74.442459],[-83.228894,74.564028],[-86.097452,74.410032],[-88.15035,74.392307],[-89.764722,74.515555],[-92.422441,74.837758],[-92.768285,75.38682],[-92.889906,75.882655],[-93.893824,76.319244],[-95.962457,76.441381],[-97.121379,76.751078],[-96.745123,77.161389],[-94.684086,77.097878]]],[[[-116.198587,77.645287],[-116.335813,76.876962],[-117.106051,76.530032],[-118.040412,76.481172],[-119.899318,76.053213],[-121.499995,75.900019],[-122.854924,76.116543],[-122.854925,76.116543],[-121.157535,76.864508],[-119.103939,77.51222],[-117.570131,77.498319],[-116.198587,77.645287]]],[[[-93.840003,77.519997],[-94.295608,77.491343],[-96.169654,77.555111],[-96.436304,77.834629],[-94.422577,77.820005],[-93.720656,77.634331],[-93.840003,77.519997]]],[[[-110.186938,77.697015],[-112.051191,77.409229],[-113.534279,77.732207],[-112.724587,78.05105],[-111.264443,78.152956],[-109.854452,77.996325],[-110.186938,77.697015]]],[[[-109.663146,78.601973],[-110.881314,78.40692],[-112.542091,78.407902],[-112.525891,78.550555],[-111.50001,78.849994],[-110.963661,78.804441],[-109.663146,78.601973]]],[[[-95.830295,78.056941],[-97.309843,77.850597],[-98.124289,78.082857],[-98.552868,78.458105],[-98.631984,78.87193],[-97.337231,78.831984],[-96.754399,78.765813],[-95.559278,78.418315],[-95.830295,78.056941]]],[[[-100.060192,78.324754],[-99.670939,77.907545],[-101.30394,78.018985],[-102.949809,78.343229],[-105.176133,78.380332],[-104.210429,78.67742],[-105.41958,78.918336],[-105.492289,79.301594],[-103.529282,79.165349],[-100.825158,78.800462],[-100.060192,78.324754]]],[[[-87.02,79.66],[-85.81435,79.3369],[-87.18756,79.0393],[-89.03535,78.28723],[-90.80436,78.21533],[-92.87669,78.34333],[-93.95116,78.75099],[-93.93574,79.11373],[-93.14524,79.3801],[-94.974,79.37248],[-96.07614,79.70502],[-96.70972,80.15777],[-96.01644,80.60233],[-95.32345,80.90729],[-94.29843,80.97727],[-94.73542,81.20646],[-92.40984,81.25739],[-91.13289,80.72345],[-89.45,80.509322],[-87.81,80.32],[-87.02,79.66]]],[[[-68.5,83.106322],[-65.82735,83.02801],[-63.68,82.9],[-61.85,82.6286],[-61.89388,82.36165],[-64.334,81.92775],[-66.75342,81.72527],[-67.65755,81.50141],[-65.48031,81.50657],[-67.84,80.9],[-69.4697,80.61683],[-71.18,79.8],[-73.2428,79.63415],[-73.88,79.430162],[-76.90773,79.32309],[-75.52924,79.19766],[-76.22046,79.01907],[-75.39345,78.52581],[-76.34354,78.18296],[-77.88851,77.89991],[-78.36269,77.50859],[-79.75951,77.20968],[-79.61965,76.98336],[-77.91089,77.022045],[-77.88911,76.777955],[-80.56125,76.17812],[-83.17439,76.45403],[-86.11184,76.29901],[-87.6,76.42],[-89.49068,76.47239],[-89.6161,76.95213],[-87.76739,77.17833],[-88.26,77.9],[-87.65,77.970222],[-84.97634,77.53873],[-86.34,78.18],[-87.96192,78.37181],[-87.15198,78.75867],[-85.37868,78.9969],[-85.09495,79.34543],[-86.50734,79.73624],[-86.93179,80.25145],[-84.19844,80.20836],[-83.408696,80.1],[-81.84823,80.46442],[-84.1,80.58],[-87.59895,80.51627],[-89.36663,80.85569],[-90.2,81.26],[-91.36786,81.5531],[-91.58702,81.89429],[-90.1,82.085],[-88.93227,82.11751],[-86.97024,82.27961],[-85.5,82.652273],[-84.260005,82.6],[-83.18,82.32],[-82.42,82.86],[-81.1,83.02],[-79.30664,83.13056],[-76.25,83.172059],[-75.71878,83.06404],[-72.83153,83.23324],[-70.665765,83.169781],[-68.5,83.106322]]]]}},
{"type":"Feature","id":"CHE","properties":{"name":"Switzerland"},"geometry":{"type":"Polygon","coordinates":[[[9.594226,47.525058],[9.632932,47.347601],[9.47997,47.10281],[9.932448,46.920728],[10.442701,46.893546],[10.363378,46.483571],[9.922837,46.314899],[9.182882,46.440215],[8.966306,46.036932],[8.489952,46.005151],[8.31663,46.163642],[7.755992,45.82449],[7.273851,45.776948],[6.843593,45.991147],[6.5001,46.429673],[6.022609,46.27299],[6.037389,46.725779],[6.768714,47.287708],[6.736571,47.541801],[7.192202,47.449766],[7.466759,47.620582],[8.317301,47.61358],[8.522612,47.830828],[9.594226,47.525058]]]}},
{"type":"Feature","id":"CHL","properties":{"name":"Chile"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-68.63401,-52.63637],[-68.63335,-54.8695],[-67.56244,-54.87001],[-66.95992,-54.89681],[-67.29103,-55.30124],[-68.14863,-55.61183],[-68.639991,-55.580018],[-69.2321,-55.49906],[-69.95809,-55.19843],[-71.00568,-55.05383],[-72.2639,-54.49514],[-73.2852,-53.95752],[-74.66253,-52.83749],[-73.8381,-53.04743],[-72.43418,-53.7154],[-71.10773,-54.07433],[-70.59178,-53.61583],[-70.26748,-52.93123],[-69.34565,-52.5183],[-68.63401,-52.63637]]],[[[-68.219913,-21.494347],[-67.82818,-22.872919],[-67.106674,-22.735925],[-66.985234,-22.986349],[-67.328443,-24.025303],[-68.417653,-24.518555],[-68.386001,-26.185016],[-68.5948,-26.506909],[-68.295542,-26.89934],[-69.001235,-27.521214],[-69.65613,-28.459141],[-70.01355,-29.367923],[-69.919008,-30.336339],[-70.535069,-31.36501],[-70.074399,-33.09121],[-69.814777,-33.273886],[-69.817309,-34.193571],[-70.388049,-35.169688],[-70.364769,-36.005089],[-71.121881,-36.658124],[-71.118625,-37.576827],[-70.814664,-38.552995],[-71.413517,-38.916022],[-71.680761,-39.808164],[-71.915734,-40.832339],[-71.746804,-42.051386],[-72.148898,-42.254888],[-71.915424,-43.408565],[-71.464056,-43.787611],[-71.793623,-44.207172],[-71.329801,-44.407522],[-71.222779,-44.784243],[-71.659316,-44.973689],[-71.552009,-45.560733],[-71.917258,-46.884838],[-72.447355,-47.738533],[-72.331161,-48.244238],[-72.648247,-48.878618],[-73.415436,-49.318436],[-73.328051,-50.378785],[-72.975747,-50.74145],[-72.309974,-50.67701],[-72.329404,-51.425956],[-71.914804,-52.009022],[-69.498362,-52.142761],[-68.571545,-52.299444],[-69.461284,-52.291951],[-69.94278,-52.537931],[-70.845102,-52.899201],[-71.006332,-53.833252],[-71.429795,-53.856455],[-72.557943,-53.53141],[-73.702757,-52.835069],[-73.702757,-52.83507],[-74.946763,-52.262754],[-75.260026,-51.629355],[-74.976632,-51.043396],[-75.479754,-50.378372],[-75.608015,-48.673773],[-75.18277,-47.711919],[-74.126581,-46.939253],[-75.644395,-46.647643],[-74.692154,-45.763976],[-74.351709,-44.103044],[-73.240356,-44.454961],[-72.717804,-42.383356],[-73.3889,-42.117532],[-73.701336,-43.365776],[-74.331943,-43.224958],[-74.017957,-41.794813],[-73.677099,-39.942213],[-73.217593,-39.258689],[-73.505559,-38.282883],[-73.588061,-37.156285],[-73.166717,-37.12378],[-72.553137,-35.50884],[-71.861732,-33.909093],[-71.43845,-32.418899],[-71.668721,-30.920645],[-71.370083,-30.095682],[-71.489894,-28.861442],[-70.905124,-27.64038],[-70.724954,-25.705924],[-70.403966,-23.628997],[-70.091246,-21.393319],[-70.16442,-19.756468],[-70.372572,-18.347975],[-69.858444,-18.092694],[-69.590424,-17.580012],[-69.100247,-18.260125],[-68.966818,-18.981683],[-68.442225,-19.405068],[-68.757167,-20.372658],[-68.219913,-21.494347]]]]}},
{"type":"Feature","id":"CHN","properties":{"name":"China"},"geometry":{"type":"MultiPolygon","coordinates":[[[[110.339188,18.678395],[109.47521,18.197701],[108.655208,18.507682],[108.626217,19.367888],[109.119056,19.821039],[110.211599,20.101254],[110.786551,20.077534],[111.010051,19.69593],[110.570647,19.255879],[110.339188,18.678395]]],[[[127.657407,49.76027],[129.397818,49.4406],[130.582293,48.729687],[130.987282,47.790132],[132.506672,47.78897],[133.373596,48.183442],[135.026311,48.47823],[134.500814,47.57844],[134.112362,47.212467],[133.769644,46.116927],[133.097127,45.144066],[131.883454,45.321162],[131.025212,44.967953],[131.288555,44.11152],[131.144688,42.92999],[130.633866,42.903015],[130.640016,42.395009],[129.994267,42.985387],[129.596669,42.424982],[128.052215,41.994285],[128.208433,41.466772],[127.343783,41.503152],[126.869083,41.816569],[126.182045,41.107336],[125.079942,40.569824],[124.265625,39.928493],[122.86757,39.637788],[122.131388,39.170452],[121.054554,38.897471],[121.585995,39.360854],[121.376757,39.750261],[122.168595,40.422443],[121.640359,40.94639],[120.768629,40.593388],[119.639602,39.898056],[119.023464,39.252333],[118.042749,39.204274],[117.532702,38.737636],[118.059699,38.061476],[118.87815,37.897325],[118.911636,37.448464],[119.702802,37.156389],[120.823457,37.870428],[121.711259,37.481123],[122.357937,37.454484],[122.519995,36.930614],[121.104164,36.651329],[120.637009,36.11144],[119.664562,35.609791],[119.151208,34.909859],[120.227525,34.360332],[120.620369,33.376723],[121.229014,32.460319],[121.908146,31.692174],[121.891919,30.949352],[121.264257,30.676267],[121.503519,30.142915],[122.092114,29.83252],[121.938428,29.018022],[121.684439,28.225513],[121.125661,28.135673],[120.395473,27.053207],[119.585497,25.740781],[118.656871,24.547391],[117.281606,23.624501],[115.890735,22.782873],[114.763827,22.668074],[114.152547,22.22376],[113.80678,22.54834],[113.241078,22.051367],[111.843592,21.550494],[110.785466,21.397144],[110.444039,20.341033],[109.889861,20.282457],[109.627655,21.008227],[109.864488,21.395051],[108.522813,21.715212],[108.05018,21.55238],[107.04342,21.811899],[106.567273,22.218205],[106.725403,22.794268],[105.811247,22.976892],[105.329209,23.352063],[104.476858,22.81915],[103.504515,22.703757],[102.706992,22.708795],[102.170436,22.464753],[101.652018,22.318199],[101.80312,21.174367],[101.270026,21.201652],[101.180005,21.436573],[101.150033,21.849984],[100.416538,21.558839],[99.983489,21.742937],[99.240899,22.118314],[99.531992,22.949039],[98.898749,23.142722],[98.660262,24.063286],[97.60472,23.897405],[97.724609,25.083637],[98.671838,25.918703],[98.712094,26.743536],[98.68269,27.508812],[98.246231,27.747221],[97.911988,28.335945],[97.327114,28.261583],[96.248833,28.411031],[96.586591,28.83098],[96.117679,29.452802],[95.404802,29.031717],[94.56599,29.277438],[93.413348,28.640629],[92.503119,27.896876],[91.696657,27.771742],[91.258854,28.040614],[90.730514,28.064954],[90.015829,28.296439],[89.47581,28.042759],[88.814248,27.299316],[88.730326,28.086865],[88.120441,27.876542],[86.954517,27.974262],[85.82332,28.203576],[85.011638,28.642774],[84.23458,28.839894],[83.898993,29.320226],[83.337115,29.463732],[82.327513,30.115268],[81.525804,30.422717],[81.111256,30.183481],[79.721367,30.882715],[78.738894,31.515906],[78.458446,32.618164],[79.176129,32.48378],[79.208892,32.994395],[78.811086,33.506198],[78.912269,34.321936],[77.837451,35.49401],[76.192848,35.898403],[75.896897,36.666806],[75.158028,37.133031],[74.980002,37.41999],[74.829986,37.990007],[74.864816,38.378846],[74.257514,38.606507],[73.928852,38.505815],[73.675379,39.431237],[73.960013,39.660008],[73.822244,39.893973],[74.776862,40.366425],[75.467828,40.562072],[76.526368,40.427946],[76.904484,41.066486],[78.187197,41.185316],[78.543661,41.582243],[80.11943,42.123941],[80.25999,42.349999],[80.18015,42.920068],[80.866206,43.180362],[79.966106,44.917517],[81.947071,45.317027],[82.458926,45.53965],[83.180484,47.330031],[85.16429,47.000956],[85.720484,47.452969],[85.768233,48.455751],[86.598776,48.549182],[87.35997,49.214981],[87.751264,49.297198],[88.013832,48.599463],[88.854298,48.069082],[90.280826,47.693549],[90.970809,46.888146],[90.585768,45.719716],[90.94554,45.286073],[92.133891,45.115076],[93.480734,44.975472],[94.688929,44.352332],[95.306875,44.241331],[95.762455,43.319449],[96.349396,42.725635],[97.451757,42.74889],[99.515817,42.524691],[100.845866,42.663804],[101.83304,42.514873],[103.312278,41.907468],[104.522282,41.908347],[104.964994,41.59741],[106.129316,42.134328],[107.744773,42.481516],[109.243596,42.519446],[110.412103,42.871234],[111.129682,43.406834],[111.829588,43.743118],[111.667737,44.073176],[111.348377,44.457442],[111.873306,45.102079],[112.436062,45.011646],[113.463907,44.808893],[114.460332,45.339817],[115.985096,45.727235],[116.717868,46.388202],[117.421701,46.672733],[118.874326,46.805412],[119.66327,46.69268],[119.772824,47.048059],[118.866574,47.74706],[118.064143,48.06673],[117.295507,47.697709],[116.308953,47.85341],[115.742837,47.726545],[115.485282,48.135383],[116.191802,49.134598],[116.678801,49.888531],[117.879244,49.510983],[119.288461,50.142883],[119.279366,50.582908],[120.18205,51.643566],[120.738191,51.964115],[120.725789,52.516226],[120.177089,52.753886],[121.003085,53.251401],[122.245748,53.431726],[123.571507,53.458804],[125.068211,53.161045],[125.946349,52.792799],[126.564399,51.784255],[126.939157,51.353894],[127.287456,50.739797],[127.657407,49.76027]]]]}},
{"type":"Feature","id":"CIV","properties":{"name":"Ivory Coast"},"geometry":{"type":"Polygon","coordinates":[[[-2.856125,4.994476],[-3.311084,4.984296],[-4.00882,5.179813],[-4.649917,5.168264],[-5.834496,4.993701],[-6.528769,4.705088],[-7.518941,4.338288],[-7.712159,4.364566],[-7.635368,5.188159],[-7.539715,5.313345],[-7.570153,5.707352],[-7.993693,6.12619],[-8.311348,6.193033],[-8.60288,6.467564],[-8.385452,6.911801],[-8.485446,7.395208],[-8.439298,7.686043],[-8.280703,7.68718],[-8.221792,8.123329],[-8.299049,8.316444],[-8.203499,8.455453],[-7.8321,8.575704],[-8.079114,9.376224],[-8.309616,9.789532],[-8.229337,10.12902],[-8.029944,10.206535],[-7.89959,10.297382],[-7.622759,10.147236],[-6.850507,10.138994],[-6.666461,10.430811],[-6.493965,10.411303],[-6.205223,10.524061],[-6.050452,10.096361],[-5.816926,10.222555],[-5.404342,10.370737],[-4.954653,10.152714],[-4.779884,9.821985],[-4.330247,9.610835],[-3.980449,9.862344],[-3.511899,9.900326],[-2.827496,9.642461],[-2.56219,8.219628],[-2.983585,7.379705],[-3.24437,6.250472],[-2.810701,5.389051],[-2.856125,4.994476]]]}},
{"type":"Feature","id":"CMR","properties":{"name":"Cameroon"},"geometry":{"type":"Polygon","coordinates":[[[13.075822,2.267097],[12.951334,2.321616],[12.35938,2.192812],[11.751665,2.326758],[11.276449,2.261051],[9.649158,2.283866],[9.795196,3.073404],[9.404367,3.734527],[8.948116,3.904129],[8.744924,4.352215],[8.488816,4.495617],[8.500288,4.771983],[8.757533,5.479666],[9.233163,6.444491],[9.522706,6.453482],[10.118277,7.03877],[10.497375,7.055358],[11.058788,6.644427],[11.745774,6.981383],[11.839309,7.397042],[12.063946,7.799808],[12.218872,8.305824],[12.753672,8.717763],[12.955468,9.417772],[13.1676,9.640626],[13.308676,10.160362],[13.57295,10.798566],[14.415379,11.572369],[14.468192,11.904752],[14.577178,12.085361],[14.181336,12.483657],[14.213531,12.802035],[14.495787,12.859396],[14.893386,12.219048],[14.960152,11.555574],[14.923565,10.891325],[15.467873,9.982337],[14.909354,9.992129],[14.627201,9.920919],[14.171466,10.021378],[13.954218,9.549495],[14.544467,8.965861],[14.979996,8.796104],[15.120866,8.38215],[15.436092,7.692812],[15.27946,7.421925],[14.776545,6.408498],[14.53656,6.226959],[14.459407,5.451761],[14.558936,5.030598],[14.478372,4.732605],[14.950953,4.210389],[15.03622,3.851367],[15.405396,3.335301],[15.862732,3.013537],[15.907381,2.557389],[16.012852,2.26764],[15.940919,1.727673],[15.146342,1.964015],[14.337813,2.227875],[13.075822,2.267097]]]}},
{"type":"Feature","id":"COD","properties":{"name":"Democratic Republic of the Congo"},"geometry":{"type":"Polygon","coordinates":[[[30.83386,3.509166],[30.773347,2.339883],[31.174149,2.204465],[30.85267,1.849396],[30.468508,1.583805],[30.086154,1.062313],[29.875779,0.59738],[29.819503,-0.20531],[29.587838,-0.587406],[29.579466,-1.341313],[29.291887,-1.620056],[29.254835,-2.21511],[29.117479,-2.292211],[29.024926,-2.839258],[29.276384,-3.293907],[29.339998,-4.499983],[29.519987,-5.419979],[29.419993,-5.939999],[29.620032,-6.520015],[30.199997,-7.079981],[30.740015,-8.340007],[30.346086,-8.238257],[29.002912,-8.407032],[28.734867,-8.526559],[28.449871,-9.164918],[28.673682,-9.605925],[28.49607,-10.789884],[28.372253,-11.793647],[28.642417,-11.971569],[29.341548,-12.360744],[29.616001,-12.178895],[29.699614,-13.257227],[28.934286,-13.248958],[28.523562,-12.698604],[28.155109,-12.272481],[27.388799,-12.132747],[27.16442,-11.608748],[26.553088,-11.92444],[25.75231,-11.784965],[25.418118,-11.330936],[24.78317,-11.238694],[24.314516,-11.262826],[24.257155,-10.951993],[23.912215,-10.926826],[23.456791,-10.867863],[22.837345,-11.017622],[22.402798,-10.993075],[22.155268,-11.084801],[22.208753,-9.894796],[21.875182,-9.523708],[21.801801,-8.908707],[21.949131,-8.305901],[21.746456,-7.920085],[21.728111,-7.290872],[20.514748,-7.299606],[20.601823,-6.939318],[20.091622,-6.94309],[20.037723,-7.116361],[19.417502,-7.155429],[19.166613,-7.738184],[19.016752,-7.988246],[18.464176,-7.847014],[18.134222,-7.987678],[17.47297,-8.068551],[17.089996,-7.545689],[16.860191,-7.222298],[16.57318,-6.622645],[16.326528,-5.87747],[13.375597,-5.864241],[13.024869,-5.984389],[12.735171,-5.965682],[12.322432,-6.100092],[12.182337,-5.789931],[12.436688,-5.684304],[12.468004,-5.248362],[12.631612,-4.991271],[12.995517,-4.781103],[13.25824,-4.882957],[13.600235,-4.500138],[14.144956,-4.510009],[14.209035,-4.793092],[14.582604,-4.970239],[15.170992,-4.343507],[15.75354,-3.855165],[16.00629,-3.535133],[15.972803,-2.712392],[16.407092,-1.740927],[16.865307,-1.225816],[17.523716,-0.74383],[17.638645,-0.424832],[17.663553,-0.058084],[17.82654,0.288923],[17.774192,0.855659],[17.898835,1.741832],[18.094276,2.365722],[18.393792,2.900443],[18.453065,3.504386],[18.542982,4.201785],[18.932312,4.709506],[19.467784,5.031528],[20.290679,4.691678],[20.927591,4.322786],[21.659123,4.224342],[22.405124,4.02916],[22.704124,4.633051],[22.84148,4.710126],[23.297214,4.609693],[24.410531,5.108784],[24.805029,4.897247],[25.128833,4.927245],[25.278798,5.170408],[25.650455,5.256088],[26.402761,5.150875],[27.044065,5.127853],[27.374226,5.233944],[27.979977,4.408413],[28.428994,4.287155],[28.696678,4.455077],[29.159078,4.389267],[29.715995,4.600805],[29.9535,4.173699],[30.83386,3.509166]]]}},
{"type":"Feature","id":"COG","properties":{"name":"Republic of the Congo"},"geometry":{"type":"Polygon","coordinates":[[[12.995517,-4.781103],[12.62076,-4.438023],[12.318608,-4.60623],[11.914963,-5.037987],[11.093773,-3.978827],[11.855122,-3.426871],[11.478039,-2.765619],[11.820964,-2.514161],[12.495703,-2.391688],[12.575284,-1.948511],[13.109619,-2.42874],[13.992407,-2.470805],[14.29921,-1.998276],[14.425456,-1.333407],[14.316418,-0.552627],[13.843321,0.038758],[14.276266,1.19693],[14.026669,1.395677],[13.282631,1.314184],[13.003114,1.830896],[13.075822,2.267097],[14.337813,2.227875],[15.146342,1.964015],[15.940919,1.727673],[16.012852,2.26764],[16.537058,3.198255],[17.133042,3.728197],[17.8099,3.560196],[18.453065,3.504386],[18.393792,2.900443],[18.094276,2.365722],[17.898835,1.741832],[17.774192,0.855659],[17.82654,0.288923],[17.663553,-0.058084],[17.638645,-0.424832],[17.523716,-0.74383],[16.865307,-1.225816],[16.407092,-1.740927],[15.972803,-2.712392],[16.00629,-3.535133],[15.75354,-3.855165],[15.170992,-4.343507],[14.582604,-4.970239],[14.209035,-4.793092],[14.144956,-4.510009],[13.600235,-4.500138],[13.25824,-4.882957],[12.995517,-4.781103]]]}},
{"type":"Feature","id":"COL","properties":{"name":"Colombia"},"geometry":{"type":"Polygon","coordinates":[[[-75.373223,-0.152032],[-75.801466,0.084801],[-76.292314,0.416047],[-76.57638,0.256936],[-77.424984,0.395687],[-77.668613,0.825893],[-77.855061,0.809925],[-78.855259,1.380924],[-78.990935,1.69137],[-78.617831,1.766404],[-78.662118,2.267355],[-78.42761,2.629556],[-77.931543,2.696606],[-77.510431,3.325017],[-77.12769,3.849636],[-77.496272,4.087606],[-77.307601,4.667984],[-77.533221,5.582812],[-77.318815,5.845354],[-77.476661,6.691116],[-77.881571,7.223771],[-77.753414,7.70984],[-77.431108,7.638061],[-77.242566,7.935278],[-77.474723,8.524286],[-77.353361,8.670505],[-76.836674,8.638749],[-76.086384,9.336821],[-75.6746,9.443248],[-75.664704,9.774003],[-75.480426,10.61899],[-74.906895,11.083045],[-74.276753,11.102036],[-74.197223,11.310473],[-73.414764,11.227015],[-72.627835,11.731972],[-72.238195,11.95555],[-71.75409,12.437303],[-71.399822,12.376041],[-71.137461,12.112982],[-71.331584,11.776284],[-71.973922,11.608672],[-72.227575,11.108702],[-72.614658,10.821975],[-72.905286,10.450344],[-73.027604,9.73677],[-73.304952,9.152],[-72.78873,9.085027],[-72.660495,8.625288],[-72.439862,8.405275],[-72.360901,8.002638],[-72.479679,7.632506],[-72.444487,7.423785],[-72.198352,7.340431],[-71.960176,6.991615],[-70.674234,7.087785],[-70.093313,6.960376],[-69.38948,6.099861],[-68.985319,6.206805],[-68.265052,6.153268],[-67.695087,6.267318],[-67.34144,6.095468],[-67.521532,5.55687],[-67.744697,5.221129],[-67.823012,4.503937],[-67.621836,3.839482],[-67.337564,3.542342],[-67.303173,3.318454],[-67.809938,2.820655],[-67.447092,2.600281],[-67.181294,2.250638],[-66.876326,1.253361],[-67.065048,1.130112],[-67.259998,1.719999],[-67.53781,2.037163],[-67.868565,1.692455],[-69.816973,1.714805],[-69.804597,1.089081],[-69.218638,0.985677],[-69.252434,0.602651],[-69.452396,0.706159],[-70.015566,0.541414],[-70.020656,-0.185156],[-69.577065,-0.549992],[-69.420486,-1.122619],[-69.444102,-1.556287],[-69.893635,-4.298187],[-70.394044,-3.766591],[-70.692682,-3.742872],[-70.047709,-2.725156],[-70.813476,-2.256865],[-71.413646,-2.342802],[-71.774761,-2.16979],[-72.325787,-2.434218],[-73.070392,-2.308954],[-73.659504,-1.260491],[-74.122395,-1.002833],[-74.441601,-0.53082],[-75.106625,-0.057205],[-75.373223,-0.152032]]]}},
{"type":"Feature","id":"CRI","properties":{"name":"Costa Rica"},"geometry":{"type":"Polygon","coordinates":[[[-82.965783,8.225028],[-83.508437,8.446927],[-83.711474,8.656836],[-83.596313,8.830443],[-83.632642,9.051386],[-83.909886,9.290803],[-84.303402,9.487354],[-84.647644,9.615537],[-84.713351,9.908052],[-84.97566,10.086723],[-84.911375,9.795992],[-85.110923,9.55704],[-85.339488,9.834542],[-85.660787,9.933347],[-85.797445,10.134886],[-85.791709,10.439337],[-85.659314,10.754331],[-85.941725,10.895278],[-85.71254,11.088445],[-85.561852,11.217119],[-84.903003,10.952303],[-84.673069,11.082657],[-84.355931,10.999226],[-84.190179,10.79345],[-83.895054,10.726839],[-83.655612,10.938764],[-83.40232,10.395438],[-83.015677,9.992982],[-82.546196,9.566135],[-82.932891,9.476812],[-82.927155,9.07433],[-82.719183,8.925709],[-82.868657,8.807266],[-82.829771,8.626295],[-82.913176,8.423517],[-82.965783,8.225028]]]}},
{"type":"Feature","id":"CUB","properties":{"name":"Cuba"},"geometry":{"type":"Polygon","coordinates":[[[-82.268151,23.188611],[-81.404457,23.117271],[-80.618769,23.10598],[-79.679524,22.765303],[-79.281486,22.399202],[-78.347434,22.512166],[-77.993296,22.277194],[-77.146422,21.657851],[-76.523825,21.20682],[-76.19462,21.220565],[-75.598222,21.016624],[-75.67106,20.735091],[-74.933896,20.693905],[-74.178025,20.284628],[-74.296648,20.050379],[-74.961595,19.923435],[-75.63468,19.873774],[-76.323656,19.952891],[-77.755481,19.855481],[-77.085108,20.413354],[-77.492655,20.673105],[-78.137292,20.739949],[-78.482827,21.028613],[-78.719867,21.598114],[-79.285,21.559175],[-80.217475,21.827324],[-80.517535,22.037079],[-81.820943,22.192057],[-82.169992,22.387109],[-81.795002,22.636965],[-82.775898,22.68815],[-83.494459,22.168518],[-83.9088,22.154565],[-84.052151,21.910575],[-84.54703,21.801228],[-84.974911,21.896028],[-84.447062,22.20495],[-84.230357,22.565755],[-83.77824,22.788118],[-83.267548,22.983042],[-82.510436,23.078747],[-82.268151,23.188611]]]}},
{"type":"Feature","id":"-99","properties":{"name":"Northern Cyprus"},"geometry":{"type":"Polygon","coordinates":[[[32.73178,35.140026],[32.802474,35.145504],[32.946961,35.386703],[33.667227,35.373216],[34.576474,35.671596],[33.900804,35.245756],[33.973617,35.058506],[33.86644,35.093595],[33.675392,35.017863],[33.525685,35.038688],[33.475817,35.000345],[33.455922,35.101424],[33.383833,35.162712],[33.190977,35.173125],[32.919572,35.087833],[32.73178,35.140026]]]}},
{"type":"Feature","id":"CYP","properties":{"name":"Cyprus"},"geometry":{"type":"Polygon","coordinates":[[[33.973617,35.058506],[34.004881,34.978098],[32.979827,34.571869],[32.490296,34.701655],[32.256667,35.103232],[32.73178,35.140026],[32.919572,35.087833],[33.190977,35.173125],[33.383833,35.162712],[33.455922,35.101424],[33.475817,35.000345],[33.525685,35.038688],[33.675392,35.017863],[33.86644,35.093595],[33.973617,35.058506]]]}},
{"type":"Feature","id":"CZE","properties":{"name":"Czech Republic"},"geometry":{"type":"Polygon","coordinates":[[[16.960288,48.596982],[16.499283,48.785808],[16.029647,48.733899],[15.253416,49.039074],[14.901447,48.964402],[14.338898,48.555305],[13.595946,48.877172],[13.031329,49.307068],[12.521024,49.547415],[12.415191,49.969121],[12.240111,50.266338],[12.966837,50.484076],[13.338132,50.733234],[14.056228,50.926918],[14.307013,51.117268],[14.570718,51.002339],[15.016996,51.106674],[15.490972,50.78473],[16.238627,50.697733],[16.176253,50.422607],[16.719476,50.215747],[16.868769,50.473974],[17.554567,50.362146],[17.649445,50.049038],[18.392914,49.988629],[18.853144,49.49623],[18.554971,49.495015],[18.399994,49.315001],[18.170498,49.271515],[18.104973,49.043983],[17.913512,48.996493],[17.886485,48.903475],[17.545007,48.800019],[17.101985,48.816969],[16.960288,48.596982]]]}},
{"type":"Feature","id":"DEU","properties":{"name":"Germany"},"geometry":{"type":"Polygon","coordinates":[[[9.921906,54.983104],[9.93958,54.596642],[10.950112,54.363607],[10.939467,54.008693],[11.956252,54.196486],[12.51844,54.470371],[13.647467,54.075511],[14.119686,53.757029],[14.353315,53.248171],[14.074521,52.981263],[14.4376,52.62485],[14.685026,52.089947],[14.607098,51.745188],[15.016996,51.106674],[14.570718,51.002339],[14.307013,51.117268],[14.056228,50.926918],[13.338132,50.733234],[12.966837,50.484076],[12.240111,50.266338],[12.415191,49.969121],[12.521024,49.547415],[13.031329,49.307068],[13.595946,48.877172],[13.243357,48.416115],[12.884103,48.289146],[13.025851,47.637584],[12.932627,47.467646],[12.62076,47.672388],[12.141357,47.703083],[11.426414,47.523766],[10.544504,47.566399],[10.402084,47.302488],[9.896068,47.580197],[9.594226,47.525058],[8.522612,47.830828],[8.317301,47.61358],[7.466759,47.620582],[7.593676,48.333019],[8.099279,49.017784],[6.65823,49.201958],[6.18632,49.463803],[6.242751,49.902226],[6.043073,50.128052],[6.156658,50.803721],[5.988658,51.851616],[6.589397,51.852029],[6.84287,52.22844],[7.092053,53.144043],[6.90514,53.482162],[7.100425,53.693932],[7.936239,53.748296],[8.121706,53.527792],[8.800734,54.020786],[8.572118,54.395646],[8.526229,54.962744],[9.282049,54.830865],[9.921906,54.983104]]]}},
{"type":"Feature","id":"DJI","properties":{"name":"Djibouti"},"geometry":{"type":"Polygon","coordinates":[[[43.081226,12.699639],[43.317852,12.390148],[43.286381,11.974928],[42.715874,11.735641],[43.145305,11.46204],[42.776852,10.926879],[42.55493,11.10511],[42.31414,11.0342],[41.75557,11.05091],[41.73959,11.35511],[41.66176,11.6312],[42,12.1],[42.35156,12.54223],[42.779642,12.455416],[43.081226,12.699639]]]}},
{"type":"Feature","id":"DNK","properties":{"name":"Denmark"},"geometry":{"type":"MultiPolygon","coordinates":[[[[12.690006,55.609991],[12.089991,54.800015],[11.043543,55.364864],[10.903914,55.779955],[12.370904,56.111407],[12.690006,55.609991]]],[[[10.912182,56.458621],[10.667804,56.081383],[10.369993,56.190007],[9.649985,55.469999],[9.921906,54.983104],[9.282049,54.830865],[8.526229,54.962744],[8.120311,55.517723],[8.089977,56.540012],[8.256582,56.809969],[8.543438,57.110003],[9.424469,57.172066],[9.775559,57.447941],[10.580006,57.730017],[10.546106,57.215733],[10.25,56.890016],[10.369993,56.609982],[10.912182,56.458621]]]]}},
{"type":"Feature","id":"DOM","properties":{"name":"Dominican Republic"},"geometry":{"type":"Polygon","coordinates":[[[-71.712361,19.714456],[-71.587304,19.884911],[-70.806706,19.880286],[-70.214365,19.622885],[-69.950815,19.648],[-69.76925,19.293267],[-69.222126,19.313214],[-69.254346,19.015196],[-68.809412,18.979074],[-68.317943,18.612198],[-68.689316,18.205142],[-69.164946,18.422648],[-69.623988,18.380713],[-69.952934,18.428307],[-70.133233,18.245915],[-70.517137,18.184291],[-70.669298,18.426886],[-70.99995,18.283329],[-71.40021,17.598564],[-71.657662,17.757573],[-71.708305,18.044997],[-71.687738,18.31666],[-71.945112,18.6169],[-71.701303,18.785417],[-71.624873,19.169838],[-71.712361,19.714456]]]}},
{"type":"Feature","id":"DZA","properties":{"name":"Algeria"},"geometry":{"type":"Polygon","coordinates":[[[11.999506,23.471668],[8.572893,21.565661],[5.677566,19.601207],[4.267419,19.155265],[3.158133,19.057364],[3.146661,19.693579],[2.683588,19.85623],[2.060991,20.142233],[1.823228,20.610809],[-1.550055,22.792666],[-4.923337,24.974574],[-8.6844,27.395744],[-8.665124,27.589479],[-8.66559,27.656426],[-8.674116,28.841289],[-7.059228,29.579228],[-6.060632,29.7317],[-5.242129,30.000443],[-4.859646,30.501188],[-3.690441,30.896952],[-3.647498,31.637294],[-3.06898,31.724498],[-2.616605,32.094346],[-1.307899,32.262889],[-1.124551,32.651522],[-1.388049,32.864015],[-1.733455,33.919713],[-1.792986,34.527919],[-2.169914,35.168396],[-1.208603,35.714849],[-0.127454,35.888662],[0.503877,36.301273],[1.466919,36.605647],[3.161699,36.783905],[4.815758,36.865037],[5.32012,36.716519],[6.26182,37.110655],[7.330385,37.118381],[7.737078,36.885708],[8.420964,36.946427],[8.217824,36.433177],[8.376368,35.479876],[8.140981,34.655146],[7.524482,34.097376],[7.612642,33.344115],[8.430473,32.748337],[8.439103,32.506285],[9.055603,32.102692],[9.48214,30.307556],[9.805634,29.424638],[9.859998,28.95999],[9.683885,28.144174],[9.756128,27.688259],[9.629056,27.140953],[9.716286,26.512206],[9.319411,26.094325],[9.910693,25.365455],[9.948261,24.936954],[10.303847,24.379313],[10.771364,24.562532],[11.560669,24.097909],[11.999506,23.471668]]]}},
{"type":"Feature","id":"ECU","properties":{"name":"Ecuador"},"geometry":{"type":"Polygon","coordinates":[[[-80.302561,-3.404856],[-79.770293,-2.657512],[-79.986559,-2.220794],[-80.368784,-2.685159],[-80.967765,-2.246943],[-80.764806,-1.965048],[-80.933659,-1.057455],[-80.58337,-0.906663],[-80.399325,-0.283703],[-80.020898,0.36034],[-80.09061,0.768429],[-79.542762,0.982938],[-78.855259,1.380924],[-77.855061,0.809925],[-77.668613,0.825893],[-77.424984,0.395687],[-76.57638,0.256936],[-76.292314,0.416047],[-75.801466,0.084801],[-75.373223,-0.152032],[-75.233723,-0.911417],[-75.544996,-1.56161],[-76.635394,-2.608678],[-77.837905,-3.003021],[-78.450684,-3.873097],[-78.639897,-4.547784],[-79.205289,-4.959129],[-79.624979,-4.454198],[-80.028908,-4.346091],[-80.442242,-4.425724],[-80.469295,-4.059287],[-80.184015,-3.821162],[-80.302561,-3.404856]]]}},
{"type":"Feature","id":"EGY","properties":{"name":"Egypt"},"geometry":{"type":"Polygon","coordinates":[[[34.9226,29.50133],[34.64174,29.09942],[34.42655,28.34399],[34.15451,27.8233],[33.92136,27.6487],[33.58811,27.97136],[33.13676,28.41765],[32.42323,29.85108],[32.32046,29.76043],[32.73482,28.70523],[33.34876,27.69989],[34.10455,26.14227],[34.47387,25.59856],[34.79507,25.03375],[35.69241,23.92671],[35.49372,23.75237],[35.52598,23.10244],[36.69069,22.20485],[36.86623,22],[32.9,22],[29.02,22],[25,22],[25,25.6825],[25,29.238655],[24.70007,30.04419],[24.95762,30.6616],[24.80287,31.08929],[25.16482,31.56915],[26.49533,31.58568],[27.45762,31.32126],[28.45048,31.02577],[28.91353,30.87005],[29.68342,31.18686],[30.09503,31.4734],[30.97693,31.55586],[31.68796,31.4296],[31.96041,30.9336],[32.19247,31.26034],[32.99392,31.02407],[33.7734,30.96746],[34.26544,31.21936],[34.9226,29.50133]]]}},
{"type":"Feature","id":"ERI","properties":{"name":"Eritrea"},"geometry":{"type":"Polygon","coordinates":[[[42.35156,12.54223],[42.00975,12.86582],[41.59856,13.45209],[41.155194,13.77332],[40.8966,14.11864],[40.026219,14.519579],[39.34061,14.53155],[39.0994,14.74064],[38.51295,14.50547],[37.90607,14.95943],[37.59377,14.2131],[36.42951,14.42211],[36.323189,14.822481],[36.75386,16.291874],[36.85253,16.95655],[37.16747,17.26314],[37.904,17.42754],[38.41009,17.998307],[38.990623,16.840626],[39.26611,15.922723],[39.814294,15.435647],[41.179275,14.49108],[41.734952,13.921037],[42.276831,13.343992],[42.589576,13.000421],[43.081226,12.699639],[42.779642,12.455416],[42.35156,12.54223]]]}},
{"type":"Feature","id":"ESP","properties":{"name":"Spain"},"geometry":{"type":"Polygon","coordinates":[[[-9.034818,41.880571],[-8.984433,42.592775],[-9.392884,43.026625],[-7.97819,43.748338],[-6.754492,43.567909],[-5.411886,43.57424],[-4.347843,43.403449],[-3.517532,43.455901],[-1.901351,43.422802],[-1.502771,43.034014],[0.338047,42.579546],[0.701591,42.795734],[1.826793,42.343385],[2.985999,42.473015],[3.039484,41.89212],[2.091842,41.226089],[0.810525,41.014732],[0.721331,40.678318],[0.106692,40.123934],[-0.278711,39.309978],[0.111291,38.738514],[-0.467124,38.292366],[-0.683389,37.642354],[-1.438382,37.443064],[-2.146453,36.674144],[-3.415781,36.6589],[-4.368901,36.677839],[-4.995219,36.324708],[-5.37716,35.94685],[-5.866432,36.029817],[-6.236694,36.367677],[-6.520191,36.942913],[-7.453726,37.097788],[-7.537105,37.428904],[-7.166508,37.803894],[-7.029281,38.075764],[-7.374092,38.373059],[-7.098037,39.030073],[-7.498632,39.629571],[-7.066592,39.711892],[-7.026413,40.184524],[-6.86402,40.330872],[-6.851127,41.111083],[-6.389088,41.381815],[-6.668606,41.883387],[-7.251309,41.918346],[-7.422513,41.792075],[-8.013175,41.790886],[-8.263857,42.280469],[-8.671946,42.134689],[-9.034818,41.880571]]]}},
{"type":"Feature","id":"EST","properties":{"name":"Estonia"},"geometry":{"type":"Polygon","coordinates":[[[24.312863,57.793424],[24.428928,58.383413],[24.061198,58.257375],[23.42656,58.612753],[23.339795,59.18724],[24.604214,59.465854],[25.864189,59.61109],[26.949136,59.445803],[27.981114,59.475388],[28.131699,59.300825],[27.420166,58.724581],[27.716686,57.791899],[27.288185,57.474528],[26.463532,57.476389],[25.60281,57.847529],[25.164594,57.970157],[24.312863,57.793424]]]}},
{"type":"Feature","id":"ETH","properties":{"name":"Ethiopia"},"geometry":{"type":"Polygon","coordinates":[[[37.90607,14.95943],[38.51295,14.50547],[39.0994,14.74064],[39.34061,14.53155],[40.02625,14.51959],[40.8966,14.11864],[41.1552,13.77333],[41.59856,13.45209],[42.00975,12.86582],[42.35156,12.54223],[42,12.1],[41.66176,11.6312],[41.73959,11.35511],[41.75557,11.05091],[42.31414,11.0342],[42.55493,11.10511],[42.776852,10.926879],[42.55876,10.57258],[42.92812,10.02194],[43.29699,9.54048],[43.67875,9.18358],[46.94834,7.99688],[47.78942,8.003],[44.9636,5.00162],[43.66087,4.95755],[42.76967,4.25259],[42.12861,4.23413],[41.855083,3.918912],[41.1718,3.91909],[40.76848,4.25702],[39.85494,3.83879],[39.559384,3.42206],[38.89251,3.50074],[38.67114,3.61607],[38.43697,3.58851],[38.120915,3.598605],[36.855093,4.447864],[36.159079,4.447864],[35.817448,4.776966],[35.817448,5.338232],[35.298007,5.506],[34.70702,6.59422],[34.25032,6.82607],[34.0751,7.22595],[33.56829,7.71334],[32.95418,7.78497],[33.2948,8.35458],[33.8255,8.37916],[33.97498,8.68456],[33.96162,9.58358],[34.25745,10.63009],[34.73115,10.91017],[34.83163,11.31896],[35.26049,12.08286],[35.86363,12.57828],[36.27022,13.56333],[36.42951,14.42211],[37.59377,14.2131],[37.90607,14.95943]]]}},
{"type":"Feature","id":"FIN","properties":{"name":"Finland"},"geometry":{"type":"Polygon","coordinates":[[[28.59193,69.064777],[28.445944,68.364613],[29.977426,67.698297],[29.054589,66.944286],[30.21765,65.80598],[29.54443,64.948672],[30.444685,64.204453],[30.035872,63.552814],[31.516092,62.867687],[31.139991,62.357693],[30.211107,61.780028],[28.069998,60.503517],[26.255173,60.423961],[24.496624,60.057316],[22.869695,59.846373],[22.290764,60.391921],[21.322244,60.72017],[21.544866,61.705329],[21.059211,62.607393],[21.536029,63.189735],[22.442744,63.81781],[24.730512,64.902344],[25.398068,65.111427],[25.294043,65.534346],[23.903379,66.006927],[23.56588,66.396051],[23.539473,67.936009],[21.978535,68.616846],[20.645593,69.106247],[21.244936,69.370443],[22.356238,68.841741],[23.66205,68.891247],[24.735679,68.649557],[25.689213,69.092114],[26.179622,69.825299],[27.732292,70.164193],[29.015573,69.766491],[28.59193,69.064777]]]}},
{"type":"Feature","id":"FJI","properties":{"name":"Fiji"},"geometry":{"type":"MultiPolygon","coordinates":[[[[178.3736,-17.33992],[178.71806,-17.62846],[178.55271,-18.15059],[177.93266,-18.28799],[177.38146,-18.16432],[177.28504,-17.72465],[177.67087,-17.38114],[178.12557,-17.50481],[178.3736,-17.33992]]],[[[179.364143,-16.801354],[178.725059,-17.012042],[178.596839,-16.63915],[179.096609,-16.433984],[179.413509,-16.379054],[180,-16.067133],[180,-16.555217],[179.364143,-16.801354]]],[[[-179.917369,-16.501783],[-180,-16.555217],[-180,-16.067133],[-179.79332,-16.020882],[-179.917369,-16.501783]]]]}},
{"type":"Feature","id":"FLK","properties":{"name":"Falkland Islands"},"geometry":{"type":"Polygon","coordinates":[[[-61.2,-51.85],[-60,-51.25],[-59.15,-51.5],[-58.55,-51.1],[-57.75,-51.55],[-58.05,-51.9],[-59.4,-52.2],[-59.85,-51.85],[-60.7,-52.3],[-61.2,-51.85]]]}},
{"type":"Feature","id":"FRA","properties":{"name":"France"},"geometry":{"type":"MultiPolygon","coordinates":[[[[9.560016,42.152492],[9.229752,41.380007],[8.775723,41.583612],[8.544213,42.256517],[8.746009,42.628122],[9.390001,43.009985],[9.560016,42.152492]]],[[[3.588184,50.378992],[4.286023,49.907497],[4.799222,49.985373],[5.674052,49.529484],[5.897759,49.442667],[6.18632,49.463803],[6.65823,49.201958],[8.099279,49.017784],[7.593676,48.333019],[7.466759,47.620582],[7.192202,47.449766],[6.736571,47.541801],[6.768714,47.287708],[6.037389,46.725779],[6.022609,46.27299],[6.5001,46.429673],[6.843593,45.991147],[6.802355,45.70858],[7.096652,45.333099],[6.749955,45.028518],[7.007562,44.254767],[7.549596,44.127901],[7.435185,43.693845],[6.529245,43.128892],[4.556963,43.399651],[3.100411,43.075201],[2.985999,42.473015],[1.826793,42.343385],[0.701591,42.795734],[0.338047,42.579546],[-1.502771,43.034014],[-1.901351,43.422802],[-1.384225,44.02261],[-1.193798,46.014918],[-2.225724,47.064363],[-2.963276,47.570327],[-4.491555,47.954954],[-4.59235,48.68416],[-3.295814,48.901692],[-1.616511,48.644421],[-1.933494,49.776342],[-0.989469,49.347376],[1.338761,50.127173],[1.639001,50.946606],[2.513573,51.148506],[2.658422,50.796848],[3.123252,50.780363],[3.588184,50.378992]]]]}},
{"type":"Feature","id":"GAB","properties":{"name":"Gabon"},"geometry":{"type":"Polygon","coordinates":[[[11.093773,-3.978827],[10.066135,-2.969483],[9.405245,-2.144313],[8.797996,-1.111301],[8.830087,-0.779074],[9.04842,-0.459351],[9.291351,0.268666],[9.492889,1.01012],[9.830284,1.067894],[11.285079,1.057662],[11.276449,2.261051],[11.751665,2.326758],[12.35938,2.192812],[12.951334,2.321616],[13.075822,2.267097],[13.003114,1.830896],[13.282631,1.314184],[14.026669,1.395677],[14.276266,1.19693],[13.843321,0.038758],[14.316418,-0.552627],[14.425456,-1.333407],[14.29921,-1.998276],[13.992407,-2.470805],[13.109619,-2.42874],[12.575284,-1.948511],[12.495703,-2.391688],[11.820964,-2.514161],[11.478039,-2.765619],[11.855122,-3.426871],[11.093773,-3.978827]]]}},
{"type":"Feature","id":"GBR","properties":{"name":"United Kingdom"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-5.661949,54.554603],[-6.197885,53.867565],[-6.95373,54.073702],[-7.572168,54.059956],[-7.366031,54.595841],[-7.572168,55.131622],[-6.733847,55.17286],[-5.661949,54.554603]]],[[[-3.005005,58.635],[-4.073828,57.553025],[-3.055002,57.690019],[-1.959281,57.6848],[-2.219988,56.870017],[-3.119003,55.973793],[-2.085009,55.909998],[-2.005676,55.804903],[-1.114991,54.624986],[-0.430485,54.464376],[0.184981,53.325014],[0.469977,52.929999],[1.681531,52.73952],[1.559988,52.099998],[1.050562,51.806761],[1.449865,51.289428],[0.550334,50.765739],[-0.787517,50.774989],[-2.489998,50.500019],[-2.956274,50.69688],[-3.617448,50.228356],[-4.542508,50.341837],[-5.245023,49.96],[-5.776567,50.159678],[-4.30999,51.210001],[-3.414851,51.426009],[-3.422719,51.426848],[-4.984367,51.593466],[-5.267296,51.9914],[-4.222347,52.301356],[-4.770013,52.840005],[-4.579999,53.495004],[-3.093831,53.404547],[-3.09208,53.404441],[-2.945009,53.985],[-3.614701,54.600937],[-3.630005,54.615013],[-4.844169,54.790971],[-5.082527,55.061601],[-4.719112,55.508473],[-5.047981,55.783986],[-5.586398,55.311146],[-5.644999,56.275015],[-6.149981,56.78501],[-5.786825,57.818848],[-5.009999,58.630013],[-4.211495,58.550845],[-3.005005,58.635]]]]}},
{"type":"Feature","id":"GEO","properties":{"name":"Georgia"},"geometry":{"type":"Polygon","coordinates":[[[41.554084,41.535656],[41.703171,41.962943],[41.45347,42.645123],[40.875469,43.013628],[40.321394,43.128634],[39.955009,43.434998],[40.076965,43.553104],[40.922185,43.382159],[42.394395,43.220308],[43.756017,42.740828],[43.9312,42.554974],[44.537623,42.711993],[45.470279,42.502781],[45.77641,42.092444],[46.404951,41.860675],[46.145432,41.722802],[46.637908,41.181673],[46.501637,41.064445],[45.962601,41.123873],[45.217426,41.411452],[44.97248,41.248129],[43.582746,41.092143],[42.619549,41.583173],[41.554084,41.535656]]]}},
{"type":"Feature","id":"GHA","properties":{"name":"Ghana"},"geometry":{"type":"Polygon","coordinates":[[[1.060122,5.928837],[-0.507638,5.343473],[-1.063625,5.000548],[-1.964707,4.710462],[-2.856125,4.994476],[-2.810701,5.389051],[-3.24437,6.250472],[-2.983585,7.379705],[-2.56219,8.219628],[-2.827496,9.642461],[-2.963896,10.395335],[-2.940409,10.96269],[-1.203358,11.009819],[-0.761576,10.93693],[-0.438702,11.098341],[0.023803,11.018682],[-0.049785,10.706918],[0.36758,10.191213],[0.365901,9.465004],[0.461192,8.677223],[0.712029,8.312465],[0.490957,7.411744],[0.570384,6.914359],[0.836931,6.279979],[1.060122,5.928837]]]}},
{"type":"Feature","id":"GIN","properties":{"name":"Guinea"},"geometry":{"type":"Polygon","coordinates":[[[-8.439298,7.686043],[-8.722124,7.711674],[-8.926065,7.309037],[-9.208786,7.313921],[-9.403348,7.526905],[-9.33728,7.928534],[-9.755342,8.541055],[-10.016567,8.428504],[-10.230094,8.406206],[-10.505477,8.348896],[-10.494315,8.715541],[-10.65477,8.977178],[-10.622395,9.26791],[-10.839152,9.688246],[-11.117481,10.045873],[-11.917277,10.046984],[-12.150338,9.858572],[-12.425929,9.835834],[-12.596719,9.620188],[-12.711958,9.342712],[-13.24655,8.903049],[-13.685154,9.494744],[-14.074045,9.886167],[-14.330076,10.01572],[-14.579699,10.214467],[-14.693232,10.656301],[-14.839554,10.876572],[-15.130311,11.040412],[-14.685687,11.527824],[-14.382192,11.509272],[-14.121406,11.677117],[-13.9008,11.678719],[-13.743161,11.811269],[-13.828272,12.142644],[-13.718744,12.247186],[-13.700476,12.586183],[-13.217818,12.575874],[-12.499051,12.33209],[-12.278599,12.35444],[-12.203565,12.465648],[-11.658301,12.386583],[-11.513943,12.442988],[-11.456169,12.076834],[-11.297574,12.077971],[-11.036556,12.211245],[-10.87083,12.177887],[-10.593224,11.923975],[-10.165214,11.844084],[-9.890993,12.060479],[-9.567912,12.194243],[-9.327616,12.334286],[-9.127474,12.30806],[-8.905265,12.088358],[-8.786099,11.812561],[-8.376305,11.393646],[-8.581305,11.136246],[-8.620321,10.810891],[-8.407311,10.909257],[-8.282357,10.792597],[-8.335377,10.494812],[-8.029944,10.206535],[-8.229337,10.12902],[-8.309616,9.789532],[-8.079114,9.376224],[-7.8321,8.575704],[-8.203499,8.455453],[-8.299049,8.316444],[-8.221792,8.123329],[-8.280703,7.68718],[-8.439298,7.686043]]]}},
{"type":"Feature","id":"GMB","properties":{"name":"Gambia"},"geometry":{"type":"Polygon","coordinates":[[[-16.841525,13.151394],[-16.713729,13.594959],[-15.624596,13.623587],[-15.39877,13.860369],[-15.081735,13.876492],[-14.687031,13.630357],[-14.376714,13.62568],[-14.046992,13.794068],[-13.844963,13.505042],[-14.277702,13.280585],[-14.712197,13.298207],[-15.141163,13.509512],[-15.511813,13.27857],[-15.691001,13.270353],[-15.931296,13.130284],[-16.841525,13.151394]]]}},
{"type":"Feature","id":"GNB","properties":{"name":"Guinea Bissau"},"geometry":{"type":"Polygon","coordinates":[[[-15.130311,11.040412],[-15.66418,11.458474],[-16.085214,11.524594],[-16.314787,11.806515],[-16.308947,11.958702],[-16.613838,12.170911],[-16.677452,12.384852],[-16.147717,12.547762],[-15.816574,12.515567],[-15.548477,12.62817],[-13.700476,12.586183],[-13.718744,12.247186],[-13.828272,12.142644],[-13.743161,11.811269],[-13.9008,11.678719],[-14.121406,11.677117],[-14.382192,11.509272],[-14.685687,11.527824],[-15.130311,11.040412]]]}},
{"type":"Feature","id":"GNQ","properties":{"name":"Equatorial Guinea"},"geometry":{"type":"Polygon","coordinates":[[[9.492889,1.01012],[9.305613,1.160911],[9.649158,2.283866],[11.276449,2.261051],[11.285079,1.057662],[9.830284,1.067894],[9.492889,1.01012]]]}},
{"type":"Feature","id":"GRC","properties":{"name":"Greece"},"geometry":{"type":"MultiPolygon","coordinates":[[[[23.69998,35.705004],[24.246665,35.368022],[25.025015,35.424996],[25.769208,35.354018],[25.745023,35.179998],[26.290003,35.29999],[26.164998,35.004995],[24.724982,34.919988],[24.735007,35.084991],[23.514978,35.279992],[23.69998,35.705004]]],[[[26.604196,41.562115],[26.294602,40.936261],[26.056942,40.824123],[25.447677,40.852545],[24.925848,40.947062],[23.714811,40.687129],[24.407999,40.124993],[23.899968,39.962006],[23.342999,39.960998],[22.813988,40.476005],[22.626299,40.256561],[22.849748,39.659311],[23.350027,39.190011],[22.973099,38.970903],[23.530016,38.510001],[24.025025,38.219993],[24.040011,37.655015],[23.115003,37.920011],[23.409972,37.409991],[22.774972,37.30501],[23.154225,36.422506],[22.490028,36.41],[21.670026,36.844986],[21.295011,37.644989],[21.120034,38.310323],[20.730032,38.769985],[20.217712,39.340235],[20.150016,39.624998],[20.615,40.110007],[20.674997,40.435],[20.99999,40.580004],[21.02004,40.842727],[21.674161,40.931275],[22.055378,41.149866],[22.597308,41.130487],[22.76177,41.3048],[22.952377,41.337994],[23.692074,41.309081],[24.492645,41.583896],[25.197201,41.234486],[26.106138,41.328899],[26.117042,41.826905],[26.604196,41.562115]]]]}},
{"type":"Feature","id":"GRL","properties":{"name":"Greenland"},"geometry":{"type":"Polygon","coordinates":[[[-46.76379,82.62796],[-43.40644,83.22516],[-39.89753,83.18018],[-38.62214,83.54905],[-35.08787,83.64513],[-27.10046,83.51966],[-20.84539,82.72669],[-22.69182,82.34165],[-26.51753,82.29765],[-31.9,82.2],[-31.39646,82.02154],[-27.85666,82.13178],[-24.84448,81.78697],[-22.90328,82.09317],[-22.07175,81.73449],[-23.16961,81.15271],[-20.62363,81.52462],[-15.76818,81.91245],[-12.77018,81.71885],[-12.20855,81.29154],[-16.28533,80.58004],[-16.85,80.35],[-20.04624,80.17708],[-17.73035,80.12912],[-18.9,79.4],[-19.70499,78.75128],[-19.67353,77.63859],[-18.47285,76.98565],[-20.03503,76.94434],[-21.67944,76.62795],[-19.83407,76.09808],[-19.59896,75.24838],[-20.66818,75.15585],[-19.37281,74.29561],[-21.59422,74.22382],[-20.43454,73.81713],[-20.76234,73.46436],[-22.17221,73.30955],[-23.56593,73.30663],[-22.31311,72.62928],[-22.29954,72.18409],[-24.27834,72.59788],[-24.79296,72.3302],[-23.44296,72.08016],[-22.13281,71.46898],[-21.75356,70.66369],[-23.53603,70.471],[-24.30702,70.85649],[-25.54341,71.43094],[-25.20135,70.75226],[-26.36276,70.22646],[-23.72742,70.18401],[-22.34902,70.12946],[-25.02927,69.2588],[-27.74737,68.47046],[-30.67371,68.12503],[-31.77665,68.12078],[-32.81105,67.73547],[-34.20196,66.67974],[-36.35284,65.9789],[-37.04378,65.93768],[-38.37505,65.69213],[-39.81222,65.45848],[-40.66899,64.83997],[-40.68281,64.13902],[-41.1887,63.48246],[-42.81938,62.68233],[-42.41666,61.90093],[-42.86619,61.07404],[-43.3784,60.09772],[-44.7875,60.03676],[-46.26364,60.85328],[-48.26294,60.85843],[-49.23308,61.40681],[-49.90039,62.38336],[-51.63325,63.62691],[-52.14014,64.27842],[-52.27659,65.1767],[-53.66166,66.09957],[-53.30161,66.8365],[-53.96911,67.18899],[-52.9804,68.35759],[-51.47536,68.72958],[-51.08041,69.14781],[-50.87122,69.9291],[-52.013585,69.574925],[-52.55792,69.42616],[-53.45629,69.283625],[-54.68336,69.61003],[-54.75001,70.28932],[-54.35884,70.821315],[-53.431315,70.835755],[-51.39014,70.56978],[-53.10937,71.20485],[-54.00422,71.54719],[-55,71.406537],[-55.83468,71.65444],[-54.71819,72.58625],[-55.32634,72.95861],[-56.12003,73.64977],[-57.32363,74.71026],[-58.59679,75.09861],[-58.58516,75.51727],[-61.26861,76.10238],[-63.39165,76.1752],[-66.06427,76.13486],[-68.50438,76.06141],[-69.66485,76.37975],[-71.40257,77.00857],[-68.77671,77.32312],[-66.76397,77.37595],[-71.04293,77.63595],[-73.297,78.04419],[-73.15938,78.43271],[-69.37345,78.91388],[-65.7107,79.39436],[-65.3239,79.75814],[-68.02298,80.11721],[-67.15129,80.51582],[-63.68925,81.21396],[-62.23444,81.3211],[-62.65116,81.77042],[-60.28249,82.03363],[-57.20744,82.19074],[-54.13442,82.19962],[-53.04328,81.88833],[-50.39061,82.43883],[-48.00386,82.06481],[-46.59984,81.985945],[-44.523,81.6607],[-46.9007,82.19979],[-46.76379,82.62796]]]}},
{"type":"Feature","id":"GTM","properties":{"name":"Guatemala"},"geometry":{"type":"Polygon","coordinates":[[[-90.095555,13.735338],[-90.608624,13.909771],[-91.23241,13.927832],[-91.689747,14.126218],[-92.22775,14.538829],[-92.20323,14.830103],[-92.087216,15.064585],[-92.229249,15.251447],[-91.74796,16.066565],[-90.464473,16.069562],[-90.438867,16.41011],[-90.600847,16.470778],[-90.711822,16.687483],[-91.08167,16.918477],[-91.453921,17.252177],[-91.002269,17.254658],[-91.00152,17.817595],[-90.067934,17.819326],[-89.14308,17.808319],[-89.150806,17.015577],[-89.229122,15.886938],[-88.930613,15.887273],[-88.604586,15.70638],[-88.518364,15.855389],[-88.225023,15.727722],[-88.68068,15.346247],[-89.154811,15.066419],[-89.22522,14.874286],[-89.145535,14.678019],[-89.353326,14.424133],[-89.587343,14.362586],[-89.534219,14.244816],[-89.721934,14.134228],[-90.064678,13.88197],[-90.095555,13.735338]]]}},
{"type":"Feature","id":"GUF","properties":{"name":"French Guiana"},"geometry":{"type":"Polygon","coordinates":[[[-52.556425,2.504705],[-52.939657,2.124858],[-53.418465,2.053389],[-53.554839,2.334897],[-53.778521,2.376703],[-54.088063,2.105557],[-54.524754,2.311849],[-54.27123,2.738748],[-54.184284,3.194172],[-54.011504,3.62257],[-54.399542,4.212611],[-54.478633,4.896756],[-53.958045,5.756548],[-53.618453,5.646529],[-52.882141,5.409851],[-51.823343,4.565768],[-51.657797,4.156232],[-52.249338,3.241094],[-52.556425,2.504705]]]}},
{"type":"Feature","id":"GUY","properties":{"name":"Guyana"},"geometry":{"type":"Polygon","coordinates":[[[-59.758285,8.367035],[-59.101684,7.999202],[-58.482962,7.347691],[-58.454876,6.832787],[-58.078103,6.809094],[-57.542219,6.321268],[-57.147436,5.97315],[-57.307246,5.073567],[-57.914289,4.812626],[-57.86021,4.576801],[-58.044694,4.060864],[-57.601569,3.334655],[-57.281433,3.333492],[-57.150098,2.768927],[-56.539386,1.899523],[-56.782704,1.863711],[-57.335823,1.948538],[-57.660971,1.682585],[-58.11345,1.507195],[-58.429477,1.463942],[-58.540013,1.268088],[-59.030862,1.317698],[-59.646044,1.786894],[-59.718546,2.24963],[-59.974525,2.755233],[-59.815413,3.606499],[-59.53804,3.958803],[-59.767406,4.423503],[-60.111002,4.574967],[-59.980959,5.014061],[-60.213683,5.244486],[-60.733574,5.200277],[-61.410303,5.959068],[-61.139415,6.234297],[-61.159336,6.696077],[-60.543999,6.856584],[-60.295668,7.043911],[-60.637973,7.415],[-60.550588,7.779603],[-59.758285,8.367035]]]}},
{"type":"Feature","id":"HND","properties":{"name":"Honduras"},"geometry":{"type":"Polygon","coordinates":[[[-87.316654,12.984686],[-87.489409,13.297535],[-87.793111,13.38448],[-87.723503,13.78505],[-87.859515,13.893312],[-88.065343,13.964626],[-88.503998,13.845486],[-88.541231,13.980155],[-88.843073,14.140507],[-89.058512,14.340029],[-89.353326,14.424133],[-89.145535,14.678019],[-89.22522,14.874286],[-89.154811,15.066419],[-88.68068,15.346247],[-88.225023,15.727722],[-88.121153,15.688655],[-87.901813,15.864458],[-87.61568,15.878799],[-87.522921,15.797279],[-87.367762,15.84694],[-86.903191,15.756713],[-86.440946,15.782835],[-86.119234,15.893449],[-86.001954,16.005406],[-85.683317,15.953652],[-85.444004,15.885749],[-85.182444,15.909158],[-84.983722,15.995923],[-84.52698,15.857224],[-84.368256,15.835158],[-84.063055,15.648244],[-83.773977,15.424072],[-83.410381,15.270903],[-83.147219,14.995829],[-83.489989,15.016267],[-83.628585,14.880074],[-83.975721,14.749436],[-84.228342,14.748764],[-84.449336,14.621614],[-84.649582,14.666805],[-84.820037,14.819587],[-84.924501,14.790493],[-85.052787,14.551541],[-85.148751,14.560197],[-85.165365,14.35437],[-85.514413,14.079012],[-85.698665,13.960078],[-85.801295,13.836055],[-86.096264,14.038187],[-86.312142,13.771356],[-86.520708,13.778487],[-86.755087,13.754845],[-86.733822,13.263093],[-86.880557,13.254204],[-87.005769,13.025794],[-87.316654,12.984686]]]}},
{"type":"Feature","id":"HRV","properties":{"name":"Croatia"},"geometry":{"type":"Polygon","coordinates":[[[18.829838,45.908878],[19.072769,45.521511],[19.390476,45.236516],[19.005486,44.860234],[18.553214,45.08159],[17.861783,45.06774],[17.002146,45.233777],[16.534939,45.211608],[16.318157,45.004127],[15.959367,45.233777],[15.750026,44.818712],[16.23966,44.351143],[16.456443,44.04124],[16.916156,43.667722],[17.297373,43.446341],[17.674922,43.028563],[18.56,42.65],[18.450016,42.479991],[17.50997,42.849995],[16.930006,43.209998],[16.015385,43.507215],[15.174454,44.243191],[15.37625,44.317915],[14.920309,44.738484],[14.901602,45.07606],[14.258748,45.233777],[13.952255,44.802124],[13.656976,45.136935],[13.679403,45.484149],[13.71506,45.500324],[14.411968,45.466166],[14.595109,45.634941],[14.935244,45.471695],[15.327675,45.452316],[15.323954,45.731783],[15.67153,45.834154],[15.768733,46.238108],[16.564808,46.503751],[16.882515,46.380632],[17.630066,45.951769],[18.456062,45.759481],[18.829838,45.908878]]]}},
{"type":"Feature","id":"HTI","properties":{"name":"Haiti"},"geometry":{"type":"Polygon","coordinates":[[[-73.189791,19.915684],[-72.579673,19.871501],[-71.712361,19.714456],[-71.624873,19.169838],[-71.701303,18.785417],[-71.945112,18.6169],[-71.687738,18.31666],[-71.708305,18.044997],[-72.372476,18.214961],[-72.844411,18.145611],[-73.454555,18.217906],[-73.922433,18.030993],[-74.458034,18.34255],[-74.369925,18.664908],[-73.449542,18.526053],[-72.694937,18.445799],[-72.334882,18.668422],[-72.79165,19.101625],[-72.784105,19.483591],[-73.415022,19.639551],[-73.189791,19.915684]]]}},
{"type":"Feature","id":"HUN","properties":{"name":"Hungary"},"geometry":{"type":"Polygon","coordinates":[[[16.202298,46.852386],[16.534268,47.496171],[16.340584,47.712902],[16.903754,47.714866],[16.979667,48.123497],[17.488473,47.867466],[17.857133,47.758429],[18.696513,47.880954],[18.777025,48.081768],[19.174365,48.111379],[19.661364,48.266615],[19.769471,48.202691],[20.239054,48.327567],[20.473562,48.56285],[20.801294,48.623854],[21.872236,48.319971],[22.085608,48.422264],[22.64082,48.15024],[22.710531,47.882194],[22.099768,47.672439],[21.626515,46.994238],[21.021952,46.316088],[20.220192,46.127469],[19.596045,46.17173],[18.829838,45.908878],[18.456062,45.759481],[17.630066,45.951769],[16.882515,46.380632],[16.564808,46.503751],[16.370505,46.841327],[16.202298,46.852386]]]}},
{"type":"Feature","id":"IDN","properties":{"name":"Indonesia"},"geometry":{"type":"MultiPolygon","coordinates":[[[[120.715609,-10.239581],[120.295014,-10.25865],[118.967808,-9.557969],[119.90031,-9.36134],[120.425756,-9.665921],[120.775502,-9.969675],[120.715609,-10.239581]]],[[[124.43595,-10.140001],[123.579982,-10.359987],[123.459989,-10.239995],[123.550009,-9.900016],[123.980009,-9.290027],[124.968682,-8.89279],[125.07002,-9.089987],[125.08852,-9.393173],[124.43595,-10.140001]]],[[[117.900018,-8.095681],[118.260616,-8.362383],[118.87846,-8.280683],[119.126507,-8.705825],[117.970402,-8.906639],[117.277731,-9.040895],[116.740141,-9.032937],[117.083737,-8.457158],[117.632024,-8.449303],[117.900018,-8.095681]]],[[[122.903537,-8.094234],[122.756983,-8.649808],[121.254491,-8.933666],[119.924391,-8.810418],[119.920929,-8.444859],[120.715092,-8.236965],[121.341669,-8.53674],[122.007365,-8.46062],[122.903537,-8.094234]]],[[[108.623479,-6.777674],[110.539227,-6.877358],[110.759576,-6.465186],[112.614811,-6.946036],[112.978768,-7.594213],[114.478935,-7.776528],[115.705527,-8.370807],[114.564511,-8.751817],[113.464734,-8.348947],[112.559672,-8.376181],[111.522061,-8.302129],[110.58615,-8.122605],[109.427667,-7.740664],[108.693655,-7.6416],[108.277763,-7.766657],[106.454102,-7.3549],[106.280624,-6.9249],[105.365486,-6.851416],[106.051646,-5.895919],[107.265009,-5.954985],[108.072091,-6.345762],[108.486846,-6.421985],[108.623479,-6.777674]]],[[[134.724624,-6.214401],[134.210134,-6.895238],[134.112776,-6.142467],[134.290336,-5.783058],[134.499625,-5.445042],[134.727002,-5.737582],[134.724624,-6.214401]]],[[[127.249215,-3.459065],[126.874923,-3.790983],[126.183802,-3.607376],[125.989034,-3.177273],[127.000651,-3.129318],[127.249215,-3.459065]]],[[[130.471344,-3.093764],[130.834836,-3.858472],[129.990547,-3.446301],[129.155249,-3.362637],[128.590684,-3.428679],[127.898891,-3.393436],[128.135879,-2.84365],[129.370998,-2.802154],[130.471344,-3.093764]]],[[[134.143368,-1.151867],[134.422627,-2.769185],[135.457603,-3.367753],[136.293314,-2.307042],[137.440738,-1.703513],[138.329727,-1.702686],[139.184921,-2.051296],[139.926684,-2.409052],[141.00021,-2.600151],[141.017057,-5.859022],[141.033852,-9.117893],[140.143415,-8.297168],[139.127767,-8.096043],[138.881477,-8.380935],[137.614474,-8.411683],[138.039099,-7.597882],[138.668621,-7.320225],[138.407914,-6.232849],[137.92784,-5.393366],[135.98925,-4.546544],[135.164598,-4.462931],[133.66288,-3.538853],[133.367705,-4.024819],[132.983956,-4.112979],[132.756941,-3.746283],[132.753789,-3.311787],[131.989804,-2.820551],[133.066845,-2.460418],[133.780031,-2.479848],[133.696212,-2.214542],[132.232373,-2.212526],[131.836222,-1.617162],[130.94284,-1.432522],[130.519558,-0.93772],[131.867538,-0.695461],[132.380116,-0.369538],[133.985548,-0.78021],[134.143368,-1.151867]]],[[[125.240501,1.419836],[124.437035,0.427881],[123.685505,0.235593],[122.723083,0.431137],[121.056725,0.381217],[120.183083,0.237247],[120.04087,-0.519658],[120.935905,-1.408906],[121.475821,-0.955962],[123.340565,-0.615673],[123.258399,-1.076213],[122.822715,-0.930951],[122.38853,-1.516858],[121.508274,-1.904483],[122.454572,-3.186058],[122.271896,-3.5295],[123.170963,-4.683693],[123.162333,-5.340604],[122.628515,-5.634591],[122.236394,-5.282933],[122.719569,-4.464172],[121.738234,-4.851331],[121.489463,-4.574553],[121.619171,-4.188478],[120.898182,-3.602105],[120.972389,-2.627643],[120.305453,-2.931604],[120.390047,-4.097579],[120.430717,-5.528241],[119.796543,-5.6734],[119.366906,-5.379878],[119.653606,-4.459417],[119.498835,-3.494412],[119.078344,-3.487022],[118.767769,-2.801999],[119.180974,-2.147104],[119.323394,-1.353147],[119.825999,0.154254],[120.035702,0.566477],[120.885779,1.309223],[121.666817,1.013944],[122.927567,0.875192],[124.077522,0.917102],[125.065989,1.643259],[125.240501,1.419836]]],[[[128.688249,1.132386],[128.635952,0.258486],[128.12017,0.356413],[127.968034,-0.252077],[128.379999,-0.780004],[128.100016,-0.899996],[127.696475,-0.266598],[127.39949,1.011722],[127.600512,1.810691],[127.932378,2.174596],[128.004156,1.628531],[128.594559,1.540811],[128.688249,1.132386]]],[[[117.875627,1.827641],[118.996747,0.902219],[117.811858,0.784242],[117.478339,0.102475],[117.521644,-0.803723],[116.560048,-1.487661],[116.533797,-2.483517],[116.148084,-4.012726],[116.000858,-3.657037],[114.864803,-4.106984],[114.468652,-3.495704],[113.755672,-3.43917],[113.256994,-3.118776],[112.068126,-3.478392],[111.703291,-2.994442],[111.04824,-3.049426],[110.223846,-2.934032],[110.070936,-1.592874],[109.571948,-1.314907],[109.091874,-0.459507],[108.952658,0.415375],[109.069136,1.341934],[109.66326,2.006467],[109.830227,1.338136],[110.514061,0.773131],[111.159138,0.976478],[111.797548,0.904441],[112.380252,1.410121],[112.859809,1.49779],[113.80585,1.217549],[114.621355,1.430688],[115.134037,2.821482],[115.519078,3.169238],[115.865517,4.306559],[117.015214,4.306094],[117.882035,4.137551],[117.313232,3.234428],[118.04833,2.28769],[117.875627,1.827641]]],[[[105.817655,-5.852356],[104.710384,-5.873285],[103.868213,-5.037315],[102.584261,-4.220259],[102.156173,-3.614146],[101.399113,-2.799777],[100.902503,-2.050262],[100.141981,-0.650348],[99.26374,0.183142],[98.970011,1.042882],[98.601351,1.823507],[97.699598,2.453184],[97.176942,3.308791],[96.424017,3.86886],[95.380876,4.970782],[95.293026,5.479821],[95.936863,5.439513],[97.484882,5.246321],[98.369169,4.26837],[99.142559,3.59035],[99.693998,3.174329],[100.641434,2.099381],[101.658012,2.083697],[102.498271,1.3987],[103.07684,0.561361],[103.838396,0.104542],[103.437645,-0.711946],[104.010789,-1.059212],[104.369991,-1.084843],[104.53949,-1.782372],[104.887893,-2.340425],[105.622111,-2.428844],[106.108593,-3.061777],[105.857446,-4.305525],[105.817655,-5.852356]]]]}},
{"type":"Feature","id":"IND","properties":{"name":"India"},"geometry":{"type":"Polygon","coordinates":[[[77.837451,35.49401],[78.912269,34.321936],[78.811086,33.506198],[79.208892,32.994395],[79.176129,32.48378],[78.458446,32.618164],[78.738894,31.515906],[79.721367,30.882715],[81.111256,30.183481],[80.476721,29.729865],[80.088425,28.79447],[81.057203,28.416095],[81.999987,27.925479],[83.304249,27.364506],[84.675018,27.234901],[85.251779,26.726198],[86.024393,26.630985],[87.227472,26.397898],[88.060238,26.414615],[88.174804,26.810405],[88.043133,27.445819],[88.120441,27.876542],[88.730326,28.086865],[88.814248,27.299316],[88.835643,27.098966],[89.744528,26.719403],[90.373275,26.875724],[91.217513,26.808648],[92.033484,26.83831],[92.103712,27.452614],[91.696657,27.771742],[92.503119,27.896876],[93.413348,28.640629],[94.56599,29.277438],[95.404802,29.031717],[96.117679,29.452802],[96.586591,28.83098],[96.248833,28.411031],[97.327114,28.261583],[97.402561,27.882536],[97.051989,27.699059],[97.133999,27.083774],[96.419366,27.264589],[95.124768,26.573572],[95.155153,26.001307],[94.603249,25.162495],[94.552658,24.675238],[94.106742,23.850741],[93.325188,24.078556],[93.286327,23.043658],[93.060294,22.703111],[93.166128,22.27846],[92.672721,22.041239],[92.146035,23.627499],[91.869928,23.624346],[91.706475,22.985264],[91.158963,23.503527],[91.46773,24.072639],[91.915093,24.130414],[92.376202,24.976693],[91.799596,25.147432],[90.872211,25.132601],[89.920693,25.26975],[89.832481,25.965082],[89.355094,26.014407],[88.563049,26.446526],[88.209789,25.768066],[88.931554,25.238692],[88.306373,24.866079],[88.084422,24.501657],[88.69994,24.233715],[88.52977,23.631142],[88.876312,22.879146],[89.031961,22.055708],[88.888766,21.690588],[88.208497,21.703172],[86.975704,21.495562],[87.033169,20.743308],[86.499351,20.151638],[85.060266,19.478579],[83.941006,18.30201],[83.189217,17.671221],[82.192792,17.016636],[82.191242,16.556664],[81.692719,16.310219],[80.791999,15.951972],[80.324896,15.899185],[80.025069,15.136415],[80.233274,13.835771],[80.286294,13.006261],[79.862547,12.056215],[79.857999,10.357275],[79.340512,10.308854],[78.885345,9.546136],[79.18972,9.216544],[78.277941,8.933047],[77.941165,8.252959],[77.539898,7.965535],[76.592979,8.899276],[76.130061,10.29963],[75.746467,11.308251],[75.396101,11.781245],[74.864816,12.741936],[74.616717,13.992583],[74.443859,14.617222],[73.534199,15.990652],[73.119909,17.92857],[72.820909,19.208234],[72.824475,20.419503],[72.630533,21.356009],[71.175273,20.757441],[70.470459,20.877331],[69.16413,22.089298],[69.644928,22.450775],[69.349597,22.84318],[68.176645,23.691965],[68.842599,24.359134],[71.04324,24.356524],[70.844699,25.215102],[70.282873,25.722229],[70.168927,26.491872],[69.514393,26.940966],[70.616496,27.989196],[71.777666,27.91318],[72.823752,28.961592],[73.450638,29.976413],[74.42138,30.979815],[74.405929,31.692639],[75.258642,32.271105],[74.451559,32.7649],[74.104294,33.441473],[73.749948,34.317699],[74.240203,34.748887],[75.757061,34.504923],[76.871722,34.653544],[77.837451,35.49401]]]}},
{"type":"Feature","id":"IRL","properties":{"name":"Ireland"},"geometry":{"type":"Polygon","coordinates":[[[-6.197885,53.867565],[-6.032985,53.153164],[-6.788857,52.260118],[-8.561617,51.669301],[-9.977086,51.820455],[-9.166283,52.864629],[-9.688525,53.881363],[-8.327987,54.664519],[-7.572168,55.131622],[-7.366031,54.595841],[-7.572168,54.059956],[-6.95373,54.073702],[-6.197885,53.867565]]]}},
{"type":"Feature","id":"IRN","properties":{"name":"Iran"},"geometry":{"type":"Polygon","coordinates":[[[53.921598,37.198918],[54.800304,37.392421],[55.511578,37.964117],[56.180375,37.935127],[56.619366,38.121394],[57.330434,38.029229],[58.436154,37.522309],[59.234762,37.412988],[60.377638,36.527383],[61.123071,36.491597],[61.210817,35.650072],[60.803193,34.404102],[60.52843,33.676446],[60.9637,33.528832],[60.536078,32.981269],[60.863655,32.18292],[60.941945,31.548075],[61.699314,31.379506],[61.781222,30.73585],[60.874248,29.829239],[61.369309,29.303276],[61.771868,28.699334],[62.72783,28.259645],[62.755426,27.378923],[63.233898,27.217047],[63.316632,26.756532],[61.874187,26.239975],[61.497363,25.078237],[59.616134,25.380157],[58.525761,25.609962],[57.397251,25.739902],[56.970766,26.966106],[56.492139,27.143305],[55.72371,26.964633],[54.71509,26.480658],[53.493097,26.812369],[52.483598,27.580849],[51.520763,27.86569],[50.852948,28.814521],[50.115009,30.147773],[49.57685,29.985715],[48.941333,30.31709],[48.567971,29.926778],[48.014568,30.452457],[48.004698,30.985137],[47.685286,30.984853],[47.849204,31.709176],[47.334661,32.469155],[46.109362,33.017287],[45.416691,33.967798],[45.64846,34.748138],[46.151788,35.093259],[46.07634,35.677383],[45.420618,35.977546],[44.77267,37.17045],[44.225756,37.971584],[44.421403,38.281281],[44.109225,39.428136],[44.79399,39.713003],[44.952688,39.335765],[45.457722,38.874139],[46.143623,38.741201],[46.50572,38.770605],[47.685079,39.508364],[48.060095,39.582235],[48.355529,39.288765],[48.010744,38.794015],[48.634375,38.270378],[48.883249,38.320245],[49.199612,37.582874],[50.147771,37.374567],[50.842354,36.872814],[52.264025,36.700422],[53.82579,36.965031],[53.921598,37.198918]]]}},
{"type":"Feature","id":"IRQ","properties":{"name":"Iraq"},"geometry":{"type":"Polygon","coordinates":[[[45.420618,35.977546],[46.07634,35.677383],[46.151788,35.093259],[45.64846,34.748138],[45.416691,33.967798],[46.109362,33.017287],[47.334661,32.469155],[47.849204,31.709176],[47.685286,30.984853],[48.004698,30.985137],[48.014568,30.452457],[48.567971,29.926778],[47.974519,29.975819],[47.302622,30.05907],[46.568713,29.099025],[44.709499,29.178891],[41.889981,31.190009],[40.399994,31.889992],[39.195468,32.161009],[38.792341,33.378686],[41.006159,34.419372],[41.383965,35.628317],[41.289707,36.358815],[41.837064,36.605854],[42.349591,37.229873],[42.779126,37.385264],[43.942259,37.256228],[44.293452,37.001514],[44.772699,37.170445],[45.420618,35.977546]]]}},
{"type":"Feature","id":"ISL","properties":{"name":"Iceland"},"geometry":{"type":"Polygon","coordinates":[[[-14.508695,66.455892],[-14.739637,65.808748],[-13.609732,65.126671],[-14.909834,64.364082],[-17.794438,63.678749],[-18.656246,63.496383],[-19.972755,63.643635],[-22.762972,63.960179],[-21.778484,64.402116],[-23.955044,64.89113],[-22.184403,65.084968],[-22.227423,65.378594],[-24.326184,65.611189],[-23.650515,66.262519],[-22.134922,66.410469],[-20.576284,65.732112],[-19.056842,66.276601],[-17.798624,65.993853],[-16.167819,66.526792],[-14.508695,66.455892]]]}},
{"type":"Feature","id":"ISR","properties":{"name":"Israel"},"geometry":{"type":"Polygon","coordinates":[[[35.719918,32.709192],[35.545665,32.393992],[35.18393,32.532511],[34.974641,31.866582],[35.225892,31.754341],[34.970507,31.616778],[34.927408,31.353435],[35.397561,31.489086],[35.420918,31.100066],[34.922603,29.501326],[34.265433,31.219361],[34.556372,31.548824],[34.488107,31.605539],[34.752587,32.072926],[34.955417,32.827376],[35.098457,33.080539],[35.126053,33.0909],[35.460709,33.08904],[35.552797,33.264275],[35.821101,33.277426],[35.836397,32.868123],[35.700798,32.716014],[35.719918,32.709192]]]}},
{"type":"Feature","id":"ITA","properties":{"name":"Italy"},"geometry":{"type":"MultiPolygon","coordinates":[[[[15.520376,38.231155],[15.160243,37.444046],[15.309898,37.134219],[15.099988,36.619987],[14.335229,36.996631],[13.826733,37.104531],[12.431004,37.61295],[12.570944,38.126381],[13.741156,38.034966],[14.761249,38.143874],[15.520376,38.231155]]],[[[9.210012,41.209991],[9.809975,40.500009],[9.669519,39.177376],[9.214818,39.240473],[8.806936,38.906618],[8.428302,39.171847],[8.388253,40.378311],[8.159998,40.950007],[8.709991,40.899984],[9.210012,41.209991]]],[[[12.376485,46.767559],[13.806475,46.509306],[13.69811,46.016778],[13.93763,45.591016],[13.141606,45.736692],[12.328581,45.381778],[12.383875,44.885374],[12.261453,44.600482],[12.589237,44.091366],[13.526906,43.587727],[14.029821,42.761008],[15.14257,41.95514],[15.926191,41.961315],[16.169897,41.740295],[15.889346,41.541082],[16.785002,41.179606],[17.519169,40.877143],[18.376687,40.355625],[18.480247,40.168866],[18.293385,39.810774],[17.73838,40.277671],[16.869596,40.442235],[16.448743,39.795401],[17.17149,39.4247],[17.052841,38.902871],[16.635088,38.843572],[16.100961,37.985899],[15.684087,37.908849],[15.687963,38.214593],[15.891981,38.750942],[16.109332,38.964547],[15.718814,39.544072],[15.413613,40.048357],[14.998496,40.172949],[14.703268,40.60455],[14.060672,40.786348],[13.627985,41.188287],[12.888082,41.25309],[12.106683,41.704535],[11.191906,42.355425],[10.511948,42.931463],[10.200029,43.920007],[9.702488,44.036279],[8.888946,44.366336],[8.428561,44.231228],[7.850767,43.767148],[7.435185,43.693845],[7.549596,44.127901],[7.007562,44.254767],[6.749955,45.028518],[7.096652,45.333099],[6.802355,45.70858],[6.843593,45.991147],[7.273851,45.776948],[7.755992,45.82449],[8.31663,46.163642],[8.489952,46.005151],[8.966306,46.036932],[9.182882,46.440215],[9.922837,46.314899],[10.363378,46.483571],[10.442701,46.893546],[11.048556,46.751359],[11.164828,46.941579],[12.153088,47.115393],[12.376485,46.767559]]]]}},
{"type":"Feature","id":"JAM","properties":{"name":"Jamaica"},"geometry":{"type":"Polygon","coordinates":[[[-77.569601,18.490525],[-76.896619,18.400867],[-76.365359,18.160701],[-76.199659,17.886867],[-76.902561,17.868238],[-77.206341,17.701116],[-77.766023,17.861597],[-78.337719,18.225968],[-78.217727,18.454533],[-77.797365,18.524218],[-77.569601,18.490525]]]}},
{"type":"Feature","id":"JOR","properties":{"name":"Jordan"},"geometry":{"type":"Polygon","coordinates":[[[35.545665,32.393992],[35.719918,32.709192],[36.834062,32.312938],[38.792341,33.378686],[39.195468,32.161009],[39.004886,32.010217],[37.002166,31.508413],[37.998849,30.5085],[37.66812,30.338665],[37.503582,30.003776],[36.740528,29.865283],[36.501214,29.505254],[36.068941,29.197495],[34.956037,29.356555],[34.922603,29.501326],[35.420918,31.100066],[35.397561,31.489086],[35.545252,31.782505],[35.545665,32.393992]]]}},
{"type":"Feature","id":"JPN","properties":{"name":"Japan"},"geometry":{"type":"MultiPolygon","coordinates":[[[[134.638428,34.149234],[134.766379,33.806335],[134.203416,33.201178],[133.79295,33.521985],[133.280268,33.28957],[133.014858,32.704567],[132.363115,32.989382],[132.371176,33.463642],[132.924373,34.060299],[133.492968,33.944621],[133.904106,34.364931],[134.638428,34.149234]]],[[[140.976388,37.142074],[140.59977,36.343983],[140.774074,35.842877],[140.253279,35.138114],[138.975528,34.6676],[137.217599,34.606286],[135.792983,33.464805],[135.120983,33.849071],[135.079435,34.596545],[133.340316,34.375938],[132.156771,33.904933],[130.986145,33.885761],[132.000036,33.149992],[131.33279,31.450355],[130.686318,31.029579],[130.20242,31.418238],[130.447676,32.319475],[129.814692,32.61031],[129.408463,33.296056],[130.353935,33.604151],[130.878451,34.232743],[131.884229,34.749714],[132.617673,35.433393],[134.608301,35.731618],[135.677538,35.527134],[136.723831,37.304984],[137.390612,36.827391],[138.857602,37.827485],[139.426405,38.215962],[140.05479,39.438807],[139.883379,40.563312],[140.305783,41.195005],[141.368973,41.37856],[141.914263,39.991616],[141.884601,39.180865],[140.959489,38.174001],[140.976388,37.142074]]],[[[143.910162,44.1741],[144.613427,43.960883],[145.320825,44.384733],[145.543137,43.262088],[144.059662,42.988358],[143.18385,41.995215],[141.611491,42.678791],[141.067286,41.584594],[139.955106,41.569556],[139.817544,42.563759],[140.312087,43.333273],[141.380549,43.388825],[141.671952,44.772125],[141.967645,45.551483],[143.14287,44.510358],[143.910162,44.1741]]]]}},
{"type":"Feature","id":"KAZ","properties":{"name":"Kazakhstan"},"geometry":{"type":"Polygon","coordinates":[[[70.962315,42.266154],[70.388965,42.081308],[69.070027,41.384244],[68.632483,40.668681],[68.259896,40.662325],[67.985856,41.135991],[66.714047,41.168444],[66.510649,41.987644],[66.023392,41.994646],[66.098012,42.99766],[64.900824,43.728081],[63.185787,43.650075],[62.0133,43.504477],[61.05832,44.405817],[60.239972,44.784037],[58.689989,45.500014],[58.503127,45.586804],[55.928917,44.995858],[55.968191,41.308642],[55.455251,41.259859],[54.755345,42.043971],[54.079418,42.324109],[52.944293,42.116034],[52.50246,41.783316],[52.446339,42.027151],[52.692112,42.443895],[52.501426,42.792298],[51.342427,43.132975],[50.891292,44.031034],[50.339129,44.284016],[50.305643,44.609836],[51.278503,44.514854],[51.316899,45.245998],[52.16739,45.408391],[53.040876,45.259047],[53.220866,46.234646],[53.042737,46.853006],[52.042023,46.804637],[51.191945,47.048705],[50.034083,46.60899],[49.10116,46.39933],[48.593241,46.561034],[48.694734,47.075628],[48.057253,47.743753],[47.315231,47.715847],[46.466446,48.394152],[47.043672,49.152039],[46.751596,49.356006],[47.54948,50.454698],[48.577841,49.87476],[48.702382,50.605128],[50.766648,51.692762],[52.328724,51.718652],[54.532878,51.02624],[55.716941,50.621717],[56.777961,51.043551],[58.363291,51.063653],[59.642282,50.545442],[59.932807,50.842194],[61.337424,50.79907],[61.588003,51.272659],[59.967534,51.96042],[60.927269,52.447548],[60.739993,52.719986],[61.699986,52.979996],[60.978066,53.664993],[61.436591,54.006265],[65.178534,54.354228],[65.666876,54.601267],[68.1691,54.970392],[69.068167,55.38525],[70.865267,55.169734],[71.180131,54.133285],[72.22415,54.376655],[73.508516,54.035617],[73.425679,53.48981],[74.384845,53.546861],[76.8911,54.490524],[76.525179,54.177003],[77.800916,53.404415],[80.03556,50.864751],[80.568447,51.388336],[81.945986,50.812196],[83.383004,51.069183],[83.935115,50.889246],[84.416377,50.3114],[85.11556,50.117303],[85.54127,49.692859],[86.829357,49.826675],[87.35997,49.214981],[86.598776,48.549182],[85.768233,48.455751],[85.720484,47.452969],[85.16429,47.000956],[83.180484,47.330031],[82.458926,45.53965],[81.947071,45.317027],[79.966106,44.917517],[80.866206,43.180362],[80.18015,42.920068],[80.25999,42.349999],[79.643645,42.496683],[79.142177,42.856092],[77.658392,42.960686],[76.000354,42.988022],[75.636965,42.8779],[74.212866,43.298339],[73.645304,43.091272],[73.489758,42.500894],[71.844638,42.845395],[71.186281,42.704293],[70.962315,42.266154]]]}},
{"type":"Feature","id":"KEN","properties":{"name":"Kenya"},"geometry":{"type":"Polygon","coordinates":[[[40.993,-0.85829],[41.58513,-1.68325],[40.88477,-2.08255],[40.63785,-2.49979],[40.26304,-2.57309],[40.12119,-3.27768],[39.80006,-3.68116],[39.60489,-4.34653],[39.20222,-4.67677],[37.7669,-3.67712],[37.69869,-3.09699],[34.07262,-1.05982],[33.903711,-0.95],[33.893569,0.109814],[34.18,0.515],[34.6721,1.17694],[35.03599,1.90584],[34.59607,3.05374],[34.47913,3.5556],[34.005,4.249885],[34.620196,4.847123],[35.298007,5.506],[35.817448,5.338232],[35.817448,4.776966],[36.159079,4.447864],[36.855093,4.447864],[38.120915,3.598605],[38.43697,3.58851],[38.67114,3.61607],[38.89251,3.50074],[39.559384,3.42206],[39.85494,3.83879],[40.76848,4.25702],[41.1718,3.91909],[41.855083,3.918912],[40.98105,2.78452],[40.993,-0.85829]]]}},
{"type":"Feature","id":"KGZ","properties":{"name":"Kyrgyzstan"},"geometry":{"type":"Polygon","coordinates":[[[70.962315,42.266154],[71.186281,42.704293],[71.844638,42.845395],[73.489758,42.500894],[73.645304,43.091272],[74.212866,43.298339],[75.636965,42.8779],[76.000354,42.988022],[77.658392,42.960686],[79.142177,42.856092],[79.643645,42.496683],[80.25999,42.349999],[80.11943,42.123941],[78.543661,41.582243],[78.187197,41.185316],[76.904484,41.066486],[76.526368,40.427946],[75.467828,40.562072],[74.776862,40.366425],[73.822244,39.893973],[73.960013,39.660008],[73.675379,39.431237],[71.784694,39.279463],[70.549162,39.604198],[69.464887,39.526683],[69.55961,40.103211],[70.648019,39.935754],[71.014198,40.244366],[71.774875,40.145844],[73.055417,40.866033],[71.870115,41.3929],[71.157859,41.143587],[70.420022,41.519998],[71.259248,42.167711],[70.962315,42.266154]]]}},
{"type":"Feature","id":"KHM","properties":{"name":"Cambodia"},"geometry":{"type":"Polygon","coordinates":[[[103.49728,10.632555],[103.09069,11.153661],[102.584932,12.186595],[102.348099,13.394247],[102.988422,14.225721],[104.281418,14.416743],[105.218777,14.273212],[106.043946,13.881091],[106.496373,14.570584],[107.382727,14.202441],[107.614548,13.535531],[107.491403,12.337206],[105.810524,11.567615],[106.24967,10.961812],[105.199915,10.88931],[104.334335,10.486544],[103.49728,10.632555]]]}},
{"type":"Feature","id":"KOR","properties":{"name":"South Korea"},"geometry":{"type":"Polygon","coordinates":[[[128.349716,38.612243],[129.21292,37.432392],[129.46045,36.784189],[129.468304,35.632141],[129.091377,35.082484],[128.18585,34.890377],[127.386519,34.475674],[126.485748,34.390046],[126.37392,34.93456],[126.559231,35.684541],[126.117398,36.725485],[126.860143,36.893924],[126.174759,37.749686],[126.237339,37.840378],[126.68372,37.804773],[127.073309,38.256115],[127.780035,38.304536],[128.205746,38.370397],[128.349716,38.612243]]]}},
{"type":"Feature","id":"CS-KM","properties":{"name":"Kosovo"},"geometry":{"type":"Polygon","coordinates":[[[20.76216,42.05186],[20.71731,41.84711],[20.59023,41.85541],[20.52295,42.21787],[20.28374,42.32025],[20.0707,42.58863],[20.25758,42.81275],[20.49679,42.88469],[20.63508,43.21671],[20.81448,43.27205],[20.95651,43.13094],[21.143395,43.068685],[21.27421,42.90959],[21.43866,42.86255],[21.63302,42.67717],[21.77505,42.6827],[21.66292,42.43922],[21.54332,42.32025],[21.576636,42.245224],[21.3527,42.2068],[20.76216,42.05186]]]}},
{"type":"Feature","id":"KWT","properties":{"name":"Kuwait"},"geometry":{"type":"Polygon","coordinates":[[[47.974519,29.975819],[48.183189,29.534477],[48.093943,29.306299],[48.416094,28.552004],[47.708851,28.526063],[47.459822,29.002519],[46.568713,29.099025],[47.302622,30.05907],[47.974519,29.975819]]]}},
{"type":"Feature","id":"LAO","properties":{"name":"Laos"},"geometry":{"type":"Polygon","coordinates":[[[105.218777,14.273212],[105.544338,14.723934],[105.589039,15.570316],[104.779321,16.441865],[104.716947,17.428859],[103.956477,18.240954],[103.200192,18.309632],[102.998706,17.961695],[102.413005,17.932782],[102.113592,18.109102],[101.059548,17.512497],[101.035931,18.408928],[101.282015,19.462585],[100.606294,19.508344],[100.548881,20.109238],[100.115988,20.41785],[100.329101,20.786122],[101.180005,21.436573],[101.270026,21.201652],[101.80312,21.174367],[101.652018,22.318199],[102.170436,22.464753],[102.754896,21.675137],[103.203861,20.766562],[104.435,20.758733],[104.822574,19.886642],[104.183388,19.624668],[103.896532,19.265181],[105.094598,18.666975],[105.925762,17.485315],[106.556008,16.604284],[107.312706,15.908538],[107.564525,15.202173],[107.382727,14.202441],[106.496373,14.570584],[106.043946,13.881091],[105.218777,14.273212]]]}},
{"type":"Feature","id":"LBN","properties":{"name":"Lebanon"},"geometry":{"type":"Polygon","coordinates":[[[35.821101,33.277426],[35.552797,33.264275],[35.460709,33.08904],[35.126053,33.0909],[35.482207,33.90545],[35.979592,34.610058],[35.998403,34.644914],[36.448194,34.593935],[36.61175,34.201789],[36.06646,33.824912],[35.821101,33.277426]]]}},
{"type":"Feature","id":"LBR","properties":{"name":"Liberia"},"geometry":{"type":"Polygon","coordinates":[[[-7.712159,4.364566],[-7.974107,4.355755],[-9.004794,4.832419],[-9.91342,5.593561],[-10.765384,6.140711],[-11.438779,6.785917],[-11.199802,7.105846],[-11.146704,7.396706],[-10.695595,7.939464],[-10.230094,8.406206],[-10.016567,8.428504],[-9.755342,8.541055],[-9.33728,7.928534],[-9.403348,7.526905],[-9.208786,7.313921],[-8.926065,7.309037],[-8.722124,7.711674],[-8.439298,7.686043],[-8.485446,7.395208],[-8.385452,6.911801],[-8.60288,6.467564],[-8.311348,6.193033],[-7.993693,6.12619],[-7.570153,5.707352],[-7.539715,5.313345],[-7.635368,5.188159],[-7.712159,4.364566]]]}},
{"type":"Feature","id":"LBY","properties":{"name":"Libya"},"geometry":{"type":"Polygon","coordinates":[[[14.8513,22.86295],[14.143871,22.491289],[13.581425,23.040506],[11.999506,23.471668],[11.560669,24.097909],[10.771364,24.562532],[10.303847,24.379313],[9.948261,24.936954],[9.910693,25.365455],[9.319411,26.094325],[9.716286,26.512206],[9.629056,27.140953],[9.756128,27.688259],[9.683885,28.144174],[9.859998,28.95999],[9.805634,29.424638],[9.48214,30.307556],[9.970017,30.539325],[10.056575,30.961831],[9.950225,31.37607],[10.636901,31.761421],[10.94479,32.081815],[11.432253,32.368903],[11.488787,33.136996],[12.66331,32.79278],[13.08326,32.87882],[13.91868,32.71196],[15.24563,32.26508],[15.71394,31.37626],[16.61162,31.18218],[18.02109,30.76357],[19.08641,30.26639],[19.57404,30.52582],[20.05335,30.98576],[19.82033,31.75179],[20.13397,32.2382],[20.85452,32.7068],[21.54298,32.8432],[22.89576,32.63858],[23.2368,32.19149],[23.60913,32.18726],[23.9275,32.01667],[24.92114,31.89936],[25.16482,31.56915],[24.80287,31.08929],[24.95762,30.6616],[24.70007,30.04419],[25,29.238655],[25,25.6825],[25,22],[25,20.00304],[23.85,20],[23.83766,19.58047],[19.84926,21.49509],[15.86085,23.40972],[14.8513,22.86295]]]}},
{"type":"Feature","id":"LKA","properties":{"name":"Sri Lanka"},"geometry":{"type":"Polygon","coordinates":[[[81.787959,7.523055],[81.637322,6.481775],[81.21802,6.197141],[80.348357,5.96837],[79.872469,6.763463],[79.695167,8.200843],[80.147801,9.824078],[80.838818,9.268427],[81.304319,8.564206],[81.787959,7.523055]]]}},
{"type":"Feature","id":"LSO","properties":{"name":"Lesotho"},"geometry":{"type":"Polygon","coordinates":[[[28.978263,-28.955597],[29.325166,-29.257387],[29.018415,-29.743766],[28.8484,-30.070051],[28.291069,-30.226217],[28.107205,-30.545732],[27.749397,-30.645106],[26.999262,-29.875954],[27.532511,-29.242711],[28.074338,-28.851469],[28.5417,-28.647502],[28.978263,-28.955597]]]}},
{"type":"Feature","id":"LTU","properties":{"name":"Lithuania"},"geometry":{"type":"Polygon","coordinates":[[[22.731099,54.327537],[22.651052,54.582741],[22.757764,54.856574],[22.315724,55.015299],[21.268449,55.190482],[21.0558,56.031076],[22.201157,56.337802],[23.878264,56.273671],[24.860684,56.372528],[25.000934,56.164531],[25.533047,56.100297],[26.494331,55.615107],[26.588279,55.167176],[25.768433,54.846963],[25.536354,54.282423],[24.450684,53.905702],[23.484128,53.912498],[23.243987,54.220567],[22.731099,54.327537]]]}},
{"type":"Feature","id":"LUX","properties":{"name":"Luxembourg"},"geometry":{"type":"Polygon","coordinates":[[[6.043073,50.128052],[6.242751,49.902226],[6.18632,49.463803],[5.897759,49.442667],[5.674052,49.529484],[5.782417,50.090328],[6.043073,50.128052]]]}},
{"type":"Feature","id":"LVA","properties":{"name":"Latvia"},"geometry":{"type":"Polygon","coordinates":[[[21.0558,56.031076],[21.090424,56.783873],[21.581866,57.411871],[22.524341,57.753374],[23.318453,57.006236],[24.12073,57.025693],[24.312863,57.793424],[25.164594,57.970157],[25.60281,57.847529],[26.463532,57.476389],[27.288185,57.474528],[27.770016,57.244258],[27.855282,56.759326],[28.176709,56.16913],[27.10246,55.783314],[26.494331,55.615107],[25.533047,56.100297],[25.000934,56.164531],[24.860684,56.372528],[23.878264,56.273671],[22.201157,56.337802],[21.0558,56.031076]]]}},
{"type":"Feature","id":"MAR","properties":{"name":"Morocco"},"geometry":{"type":"Polygon","coordinates":[[[-5.193863,35.755182],[-4.591006,35.330712],[-3.640057,35.399855],[-2.604306,35.179093],[-2.169914,35.168396],[-1.792986,34.527919],[-1.733455,33.919713],[-1.388049,32.864015],[-1.124551,32.651522],[-1.307899,32.262889],[-2.616605,32.094346],[-3.06898,31.724498],[-3.647498,31.637294],[-3.690441,30.896952],[-4.859646,30.501188],[-5.242129,30.000443],[-6.060632,29.7317],[-7.059228,29.579228],[-8.674116,28.841289],[-8.66559,27.656426],[-8.817809,27.656426],[-8.817828,27.656426],[-8.794884,27.120696],[-9.413037,27.088476],[-9.735343,26.860945],[-10.189424,26.860945],[-10.551263,26.990808],[-11.392555,26.883424],[-11.71822,26.104092],[-12.030759,26.030866],[-12.500963,24.770116],[-13.89111,23.691009],[-14.221168,22.310163],[-14.630833,21.86094],[-14.750955,21.5006],[-17.002962,21.420734],[-17.020428,21.42231],[-16.973248,21.885745],[-16.589137,22.158234],[-16.261922,22.67934],[-16.326414,23.017768],[-15.982611,23.723358],[-15.426004,24.359134],[-15.089332,24.520261],[-14.824645,25.103533],[-14.800926,25.636265],[-14.43994,26.254418],[-13.773805,26.618892],[-13.139942,27.640148],[-13.121613,27.654148],[-12.618837,28.038186],[-11.688919,28.148644],[-10.900957,28.832142],[-10.399592,29.098586],[-9.564811,29.933574],[-9.814718,31.177736],[-9.434793,32.038096],[-9.300693,32.564679],[-8.657476,33.240245],[-7.654178,33.697065],[-6.912544,34.110476],[-6.244342,35.145865],[-5.929994,35.759988],[-5.193863,35.755182]]]}},
{"type":"Feature","id":"MDA","properties":{"name":"Moldova"},"geometry":{"type":"Polygon","coordinates":[[[26.619337,48.220726],[26.857824,48.368211],[27.522537,48.467119],[28.259547,48.155562],[28.670891,48.118149],[29.122698,47.849095],[29.050868,47.510227],[29.415135,47.346645],[29.559674,46.928583],[29.908852,46.674361],[29.83821,46.525326],[30.024659,46.423937],[29.759972,46.349988],[29.170654,46.379262],[29.072107,46.517678],[28.862972,46.437889],[28.933717,46.25883],[28.659987,45.939987],[28.485269,45.596907],[28.233554,45.488283],[28.054443,45.944586],[28.160018,46.371563],[28.12803,46.810476],[27.551166,47.405117],[27.233873,47.826771],[26.924176,48.123264],[26.619337,48.220726]]]}},
{"type":"Feature","id":"MDG","properties":{"name":"Madagascar"},"geometry":{"type":"Polygon","coordinates":[[[49.543519,-12.469833],[49.808981,-12.895285],[50.056511,-13.555761],[50.217431,-14.758789],[50.476537,-15.226512],[50.377111,-15.706069],[50.200275,-16.000263],[49.860606,-15.414253],[49.672607,-15.710204],[49.863344,-16.451037],[49.774564,-16.875042],[49.498612,-17.106036],[49.435619,-17.953064],[49.041792,-19.118781],[48.548541,-20.496888],[47.930749,-22.391501],[47.547723,-23.781959],[47.095761,-24.94163],[46.282478,-25.178463],[45.409508,-25.601434],[44.833574,-25.346101],[44.03972,-24.988345],[43.763768,-24.460677],[43.697778,-23.574116],[43.345654,-22.776904],[43.254187,-22.057413],[43.433298,-21.336475],[43.893683,-21.163307],[43.89637,-20.830459],[44.374325,-20.072366],[44.464397,-19.435454],[44.232422,-18.961995],[44.042976,-18.331387],[43.963084,-17.409945],[44.312469,-16.850496],[44.446517,-16.216219],[44.944937,-16.179374],[45.502732,-15.974373],[45.872994,-15.793454],[46.312243,-15.780018],[46.882183,-15.210182],[47.70513,-14.594303],[48.005215,-14.091233],[47.869047,-13.663869],[48.293828,-13.784068],[48.84506,-13.089175],[48.863509,-12.487868],[49.194651,-12.040557],[49.543519,-12.469833]]]}},
{"type":"Feature","id":"MEX","properties":{"name":"Mexico"},"geometry":{"type":"Polygon","coordinates":[[[-97.140008,25.869997],[-97.528072,24.992144],[-97.702946,24.272343],[-97.776042,22.93258],[-97.872367,22.444212],[-97.699044,21.898689],[-97.38896,21.411019],[-97.189333,20.635433],[-96.525576,19.890931],[-96.292127,19.320371],[-95.900885,18.828024],[-94.839063,18.562717],[-94.42573,18.144371],[-93.548651,18.423837],[-92.786114,18.524839],[-92.037348,18.704569],[-91.407903,18.876083],[-90.77187,19.28412],[-90.53359,19.867418],[-90.451476,20.707522],[-90.278618,20.999855],[-89.601321,21.261726],[-88.543866,21.493675],[-87.658417,21.458846],[-87.05189,21.543543],[-86.811982,21.331515],[-86.845908,20.849865],[-87.383291,20.255405],[-87.621054,19.646553],[-87.43675,19.472403],[-87.58656,19.04013],[-87.837191,18.259816],[-88.090664,18.516648],[-88.300031,18.499982],[-88.490123,18.486831],[-88.848344,17.883198],[-89.029857,18.001511],[-89.150909,17.955468],[-89.14308,17.808319],[-90.067934,17.819326],[-91.00152,17.817595],[-91.002269,17.254658],[-91.453921,17.252177],[-91.08167,16.918477],[-90.711822,16.687483],[-90.600847,16.470778],[-90.438867,16.41011],[-90.464473,16.069562],[-91.74796,16.066565],[-92.229249,15.251447],[-92.087216,15.064585],[-92.20323,14.830103],[-92.22775,14.538829],[-93.359464,15.61543],[-93.875169,15.940164],[-94.691656,16.200975],[-95.250227,16.128318],[-96.053382,15.752088],[-96.557434,15.653515],[-97.263592,15.917065],[-98.01303,16.107312],[-98.947676,16.566043],[-99.697397,16.706164],[-100.829499,17.171071],[-101.666089,17.649026],[-101.918528,17.91609],[-102.478132,17.975751],[-103.50099,18.292295],[-103.917527,18.748572],[-104.99201,19.316134],[-105.493038,19.946767],[-105.731396,20.434102],[-105.397773,20.531719],[-105.500661,20.816895],[-105.270752,21.076285],[-105.265817,21.422104],[-105.603161,21.871146],[-105.693414,22.26908],[-106.028716,22.773752],[-106.90998,23.767774],[-107.915449,24.548915],[-108.401905,25.172314],[-109.260199,25.580609],[-109.444089,25.824884],[-109.291644,26.442934],[-109.801458,26.676176],[-110.391732,27.162115],[-110.641019,27.859876],[-111.178919,27.941241],[-111.759607,28.467953],[-112.228235,28.954409],[-112.271824,29.266844],[-112.809594,30.021114],[-113.163811,30.786881],[-113.148669,31.170966],[-113.871881,31.567608],[-114.205737,31.524045],[-114.776451,31.799532],[-114.9367,31.393485],[-114.771232,30.913617],[-114.673899,30.162681],[-114.330974,29.750432],[-113.588875,29.061611],[-113.424053,28.826174],[-113.271969,28.754783],[-113.140039,28.411289],[-112.962298,28.42519],[-112.761587,27.780217],[-112.457911,27.525814],[-112.244952,27.171727],[-111.616489,26.662817],[-111.284675,25.73259],[-110.987819,25.294606],[-110.710007,24.826004],[-110.655049,24.298595],[-110.172856,24.265548],[-109.771847,23.811183],[-109.409104,23.364672],[-109.433392,23.185588],[-109.854219,22.818272],[-110.031392,22.823078],[-110.295071,23.430973],[-110.949501,24.000964],[-111.670568,24.484423],[-112.182036,24.738413],[-112.148989,25.470125],[-112.300711,26.012004],[-112.777297,26.32196],[-113.464671,26.768186],[-113.59673,26.63946],[-113.848937,26.900064],[-114.465747,27.14209],[-115.055142,27.722727],[-114.982253,27.7982],[-114.570366,27.741485],[-114.199329,28.115003],[-114.162018,28.566112],[-114.931842,29.279479],[-115.518654,29.556362],[-115.887365,30.180794],[-116.25835,30.836464],[-116.721526,31.635744],[-117.12776,32.53534],[-115.99135,32.61239],[-114.72139,32.72083],[-114.815,32.52528],[-113.30498,32.03914],[-111.02361,31.33472],[-109.035,31.34194],[-108.24194,31.34222],[-108.24,31.754854],[-106.50759,31.75452],[-106.1429,31.39995],[-105.63159,31.08383],[-105.03737,30.64402],[-104.70575,30.12173],[-104.45697,29.57196],[-103.94,29.27],[-103.11,28.97],[-102.48,29.76],[-101.6624,29.7793],[-100.9576,29.38071],[-100.45584,28.69612],[-100.11,28.11],[-99.52,27.54],[-99.3,26.84],[-99.02,26.37],[-98.24,26.06],[-97.53,25.84],[-97.140008,25.869997]]]}},
{"type":"Feature","id":"MKD","properties":{"name":"Macedonia"},"geometry":{"type":"Polygon","coordinates":[[[20.59023,41.85541],[20.71731,41.84711],[20.76216,42.05186],[21.3527,42.2068],[21.576636,42.245224],[21.91708,42.30364],[22.380526,42.32026],[22.881374,41.999297],[22.952377,41.337994],[22.76177,41.3048],[22.597308,41.130487],[22.055378,41.149866],[21.674161,40.931275],[21.02004,40.842727],[20.60518,41.08622],[20.46315,41.51509],[20.59023,41.85541]]]}},
{"type":"Feature","id":"MLI","properties":{"name":"Mali"},"geometry":{"type":"Polygon","coordinates":[[[-12.17075,14.616834],[-11.834208,14.799097],[-11.666078,15.388208],[-11.349095,15.411256],[-10.650791,15.132746],[-10.086846,15.330486],[-9.700255,15.264107],[-9.550238,15.486497],[-5.537744,15.50169],[-5.315277,16.201854],[-5.488523,16.325102],[-5.971129,20.640833],[-6.453787,24.956591],[-4.923337,24.974574],[-1.550055,22.792666],[1.823228,20.610809],[2.060991,20.142233],[2.683588,19.85623],[3.146661,19.693579],[3.158133,19.057364],[4.267419,19.155265],[4.27021,16.852227],[3.723422,16.184284],[3.638259,15.56812],[2.749993,15.409525],[1.385528,15.323561],[1.015783,14.968182],[0.374892,14.928908],[-0.266257,14.924309],[-0.515854,15.116158],[-1.066363,14.973815],[-2.001035,14.559008],[-2.191825,14.246418],[-2.967694,13.79815],[-3.103707,13.541267],[-3.522803,13.337662],[-4.006391,13.472485],[-4.280405,13.228444],[-4.427166,12.542646],[-5.220942,11.713859],[-5.197843,11.375146],[-5.470565,10.95127],[-5.404342,10.370737],[-5.816926,10.222555],[-6.050452,10.096361],[-6.205223,10.524061],[-6.493965,10.411303],[-6.666461,10.430811],[-6.850507,10.138994],[-7.622759,10.147236],[-7.89959,10.297382],[-8.029944,10.206535],[-8.335377,10.494812],[-8.282357,10.792597],[-8.407311,10.909257],[-8.620321,10.810891],[-8.581305,11.136246],[-8.376305,11.393646],[-8.786099,11.812561],[-8.905265,12.088358],[-9.127474,12.30806],[-9.327616,12.334286],[-9.567912,12.194243],[-9.890993,12.060479],[-10.165214,11.844084],[-10.593224,11.923975],[-10.87083,12.177887],[-11.036556,12.211245],[-11.297574,12.077971],[-11.456169,12.076834],[-11.513943,12.442988],[-11.467899,12.754519],[-11.553398,13.141214],[-11.927716,13.422075],[-12.124887,13.994727],[-12.17075,14.616834]]]}},
{"type":"Feature","id":"MLT","properties":{"name":"Malta"},"geometry":{"type":"MultiPolygon","coordinates":[[[[14.566171,35.852721],[14.532684,35.820191],[14.436463,35.821664],[14.352334,35.872281],[14.3513,35.978399],[14.448348,35.957444],[14.537025,35.886285],[14.566171,35.852721]]],[[[14.313473,36.027569],[14.253632,36.012143],[14.194204,36.042245],[14.180354,36.060383],[14.263243,36.075809],[14.303758,36.062295],[14.320914,36.03625],[14.313473,36.027569]]]]}},
{"type":"Feature","id":"MMR","properties":{"name":"Myanmar"},"geometry":{"type":"Polygon","coordinates":[[[99.543309,20.186598],[98.959676,19.752981],[98.253724,19.708203],[97.797783,18.62708],[97.375896,18.445438],[97.859123,17.567946],[98.493761,16.837836],[98.903348,16.177824],[98.537376,15.308497],[98.192074,15.123703],[98.430819,14.622028],[99.097755,13.827503],[99.212012,13.269294],[99.196354,12.804748],[99.587286,11.892763],[99.038121,10.960546],[98.553551,9.93296],[98.457174,10.675266],[98.764546,11.441292],[98.428339,12.032987],[98.509574,13.122378],[98.103604,13.64046],[97.777732,14.837286],[97.597072,16.100568],[97.16454,16.928734],[96.505769,16.427241],[95.369352,15.71439],[94.808405,15.803454],[94.188804,16.037936],[94.533486,17.27724],[94.324817,18.213514],[93.540988,19.366493],[93.663255,19.726962],[93.078278,19.855145],[92.368554,20.670883],[92.303234,21.475485],[92.652257,21.324048],[92.672721,22.041239],[93.166128,22.27846],[93.060294,22.703111],[93.286327,23.043658],[93.325188,24.078556],[94.106742,23.850741],[94.552658,24.675238],[94.603249,25.162495],[95.155153,26.001307],[95.124768,26.573572],[96.419366,27.264589],[97.133999,27.083774],[97.051989,27.699059],[97.402561,27.882536],[97.327114,28.261583],[97.911988,28.335945],[98.246231,27.747221],[98.68269,27.508812],[98.712094,26.743536],[98.671838,25.918703],[97.724609,25.083637],[97.60472,23.897405],[98.660262,24.063286],[98.898749,23.142722],[99.531992,22.949039],[99.240899,22.118314],[99.983489,21.742937],[100.416538,21.558839],[101.150033,21.849984],[101.180005,21.436573],[100.329101,20.786122],[100.115988,20.41785],[99.543309,20.186598]]]}},
{"type":"Feature","id":"MNE","properties":{"name":"Montenegro"},"geometry":{"type":"Polygon","coordinates":[[[19.801613,42.500093],[19.738051,42.688247],[19.30449,42.19574],[19.37177,41.87755],[19.16246,41.95502],[18.88214,42.28151],[18.45,42.48],[18.56,42.65],[18.70648,43.20011],[19.03165,43.43253],[19.21852,43.52384],[19.48389,43.35229],[19.63,43.21378],[19.95857,43.10604],[20.3398,42.89852],[20.25758,42.81275],[20.0707,42.58863],[19.801613,42.500093]]]}},
{"type":"Feature","id":"MNG","properties":{"name":"Mongolia"},"geometry":{"type":"Polygon","coordinates":[[[87.751264,49.297198],[88.805567,49.470521],[90.713667,50.331812],[92.234712,50.802171],[93.104219,50.49529],[94.147566,50.480537],[94.815949,50.013433],[95.814028,49.977467],[97.259728,49.726061],[98.231762,50.422401],[97.82574,51.010995],[98.861491,52.047366],[99.981732,51.634006],[100.88948,51.516856],[102.065223,51.259921],[102.255909,50.510561],[103.676545,50.089966],[104.621552,50.275329],[105.886591,50.406019],[106.888804,50.274296],[107.868176,49.793705],[108.475167,49.282548],[109.402449,49.292961],[110.662011,49.130128],[111.581231,49.377968],[112.89774,49.543565],[114.362456,50.248303],[114.96211,50.140247],[115.485695,49.805177],[116.678801,49.888531],[116.191802,49.134598],[115.485282,48.135383],[115.742837,47.726545],[116.308953,47.85341],[117.295507,47.697709],[118.064143,48.06673],[118.866574,47.74706],[119.772824,47.048059],[119.66327,46.69268],[118.874326,46.805412],[117.421701,46.672733],[116.717868,46.388202],[115.985096,45.727235],[114.460332,45.339817],[113.463907,44.808893],[112.436062,45.011646],[111.873306,45.102079],[111.348377,44.457442],[111.667737,44.073176],[111.829588,43.743118],[111.129682,43.406834],[110.412103,42.871234],[109.243596,42.519446],[107.744773,42.481516],[106.129316,42.134328],[104.964994,41.59741],[104.522282,41.908347],[103.312278,41.907468],[101.83304,42.514873],[100.845866,42.663804],[99.515817,42.524691],[97.451757,42.74889],[96.349396,42.725635],[95.762455,43.319449],[95.306875,44.241331],[94.688929,44.352332],[93.480734,44.975472],[92.133891,45.115076],[90.94554,45.286073],[90.585768,45.719716],[90.970809,46.888146],[90.280826,47.693549],[88.854298,48.069082],[88.013832,48.599463],[87.751264,49.297198]]]}},
{"type":"Feature","id":"MOZ","properties":{"name":"Mozambique"},"geometry":{"type":"Polygon","coordinates":[[[34.559989,-11.52002],[35.312398,-11.439146],[36.514082,-11.720938],[36.775151,-11.594537],[37.471284,-11.568751],[37.827645,-11.268769],[38.427557,-11.285202],[39.52103,-10.896854],[40.316589,-10.317096],[40.478387,-10.765441],[40.437253,-11.761711],[40.560811,-12.639177],[40.59962,-14.201975],[40.775475,-14.691764],[40.477251,-15.406294],[40.089264,-16.100774],[39.452559,-16.720891],[38.538351,-17.101023],[37.411133,-17.586368],[36.281279,-18.659688],[35.896497,-18.84226],[35.1984,-19.552811],[34.786383,-19.784012],[34.701893,-20.497043],[35.176127,-21.254361],[35.373428,-21.840837],[35.385848,-22.14],[35.562546,-22.09],[35.533935,-23.070788],[35.371774,-23.535359],[35.60747,-23.706563],[35.458746,-24.12261],[35.040735,-24.478351],[34.215824,-24.816314],[33.01321,-25.357573],[32.574632,-25.727318],[32.660363,-26.148584],[32.915955,-26.215867],[32.83012,-26.742192],[32.071665,-26.73382],[31.985779,-26.29178],[31.837778,-25.843332],[31.752408,-25.484284],[31.930589,-24.369417],[31.670398,-23.658969],[31.191409,-22.25151],[32.244988,-21.116489],[32.508693,-20.395292],[32.659743,-20.30429],[32.772708,-19.715592],[32.611994,-19.419383],[32.654886,-18.67209],[32.849861,-17.979057],[32.847639,-16.713398],[32.328239,-16.392074],[31.852041,-16.319417],[31.636498,-16.07199],[31.173064,-15.860944],[30.338955,-15.880839],[30.274256,-15.507787],[30.179481,-14.796099],[33.214025,-13.97186],[33.7897,-14.451831],[34.064825,-14.35995],[34.459633,-14.61301],[34.517666,-15.013709],[34.307291,-15.478641],[34.381292,-16.18356],[35.03381,-16.8013],[35.339063,-16.10744],[35.771905,-15.896859],[35.686845,-14.611046],[35.267956,-13.887834],[34.907151,-13.565425],[34.559989,-13.579998],[34.280006,-12.280025],[34.559989,-11.52002]]]}},
{"type":"Feature","id":"MRT","properties":{"name":"Mauritania"},"geometry":{"type":"Polygon","coordinates":[[[-12.17075,14.616834],[-12.830658,15.303692],[-13.435738,16.039383],[-14.099521,16.304302],[-14.577348,16.598264],[-15.135737,16.587282],[-15.623666,16.369337],[-16.12069,16.455663],[-16.463098,16.135036],[-16.549708,16.673892],[-16.270552,17.166963],[-16.146347,18.108482],[-16.256883,19.096716],[-16.377651,19.593817],[-16.277838,20.092521],[-16.536324,20.567866],[-17.063423,20.999752],[-16.845194,21.333323],[-12.929102,21.327071],[-13.118754,22.77122],[-12.874222,23.284832],[-11.937224,23.374594],[-11.969419,25.933353],[-8.687294,25.881056],[-8.6844,27.395744],[-4.923337,24.974574],[-6.453787,24.956591],[-5.971129,20.640833],[-5.488523,16.325102],[-5.315277,16.201854],[-5.537744,15.50169],[-9.550238,15.486497],[-9.700255,15.264107],[-10.086846,15.330486],[-10.650791,15.132746],[-11.349095,15.411256],[-11.666078,15.388208],[-11.834208,14.799097],[-12.17075,14.616834]]]}},
{"type":"Feature","id":"MWI","properties":{"name":"Malawi"},"geometry":{"type":"Polygon","coordinates":[[[34.559989,-11.52002],[34.280006,-12.280025],[34.559989,-13.579998],[34.907151,-13.565425],[35.267956,-13.887834],[35.686845,-14.611046],[35.771905,-15.896859],[35.339063,-16.10744],[35.03381,-16.8013],[34.381292,-16.18356],[34.307291,-15.478641],[34.517666,-15.013709],[34.459633,-14.61301],[34.064825,-14.35995],[33.7897,-14.451831],[33.214025,-13.97186],[32.688165,-13.712858],[32.991764,-12.783871],[33.306422,-12.435778],[33.114289,-11.607198],[33.31531,-10.79655],[33.485688,-10.525559],[33.231388,-9.676722],[32.759375,-9.230599],[33.739729,-9.417151],[33.940838,-9.693674],[34.280006,-10.16],[34.559989,-11.52002]]]}},
{"type":"Feature","id":"MYS","properties":{"name":"Malaysia"},"geometry":{"type":"MultiPolygon","coordinates":[[[[101.075516,6.204867],[101.154219,5.691384],[101.814282,5.810808],[102.141187,6.221636],[102.371147,6.128205],[102.961705,5.524495],[103.381215,4.855001],[103.438575,4.181606],[103.332122,3.726698],[103.429429,3.382869],[103.502448,2.791019],[103.854674,2.515454],[104.247932,1.631141],[104.228811,1.293048],[103.519707,1.226334],[102.573615,1.967115],[101.390638,2.760814],[101.27354,3.270292],[100.695435,3.93914],[100.557408,4.76728],[100.196706,5.312493],[100.30626,6.040562],[100.085757,6.464489],[100.259596,6.642825],[101.075516,6.204867]]],[[[118.618321,4.478202],[117.882035,4.137551],[117.015214,4.306094],[115.865517,4.306559],[115.519078,3.169238],[115.134037,2.821482],[114.621355,1.430688],[113.80585,1.217549],[112.859809,1.49779],[112.380252,1.410121],[111.797548,0.904441],[111.159138,0.976478],[110.514061,0.773131],[109.830227,1.338136],[109.66326,2.006467],[110.396135,1.663775],[111.168853,1.850637],[111.370081,2.697303],[111.796928,2.885897],[112.995615,3.102395],[113.712935,3.893509],[114.204017,4.525874],[114.659596,4.007637],[114.869557,4.348314],[115.347461,4.316636],[115.4057,4.955228],[115.45071,5.44773],[116.220741,6.143191],[116.725103,6.924771],[117.129626,6.928053],[117.643393,6.422166],[117.689075,5.98749],[118.347691,5.708696],[119.181904,5.407836],[119.110694,5.016128],[118.439727,4.966519],[118.618321,4.478202]]]]}},
{"type":"Feature","id":"NAM","properties":{"name":"Namibia"},"geometry":{"type":"Polygon","coordinates":[[[16.344977,-28.576705],[15.601818,-27.821247],[15.210472,-27.090956],[14.989711,-26.117372],[14.743214,-25.39292],[14.408144,-23.853014],[14.385717,-22.656653],[14.257714,-22.111208],[13.868642,-21.699037],[13.352498,-20.872834],[12.826845,-19.673166],[12.608564,-19.045349],[11.794919,-18.069129],[11.734199,-17.301889],[12.215461,-17.111668],[12.814081,-16.941343],[13.462362,-16.971212],[14.058501,-17.423381],[14.209707,-17.353101],[18.263309,-17.309951],[18.956187,-17.789095],[21.377176,-17.930636],[23.215048,-17.523116],[24.033862,-17.295843],[24.682349,-17.353411],[25.07695,-17.578823],[25.084443,-17.661816],[24.520705,-17.887125],[24.217365,-17.889347],[23.579006,-18.281261],[23.196858,-17.869038],[21.65504,-18.219146],[20.910641,-18.252219],[20.881134,-21.814327],[19.895458,-21.849157],[19.895768,-24.76779],[19.894734,-28.461105],[19.002127,-28.972443],[18.464899,-29.045462],[17.836152,-28.856378],[17.387497,-28.783514],[17.218929,-28.355943],[16.824017,-28.082162],[16.344977,-28.576705]]]}},
{"type":"Feature","id":"NCL","properties":{"name":"New Caledonia"},"geometry":{"type":"Polygon","coordinates":[[[165.77999,-21.080005],[166.599991,-21.700019],[167.120011,-22.159991],[166.740035,-22.399976],[166.189732,-22.129708],[165.474375,-21.679607],[164.829815,-21.14982],[164.167995,-20.444747],[164.029606,-20.105646],[164.459967,-20.120012],[165.020036,-20.459991],[165.460009,-20.800022],[165.77999,-21.080005]]]}},
{"type":"Feature","id":"NER","properties":{"name":"Niger"},"geometry":{"type":"Polygon","coordinates":[[[2.154474,11.94015],[2.177108,12.625018],[1.024103,12.851826],[0.993046,13.33575],[0.429928,13.988733],[0.295646,14.444235],[0.374892,14.928908],[1.015783,14.968182],[1.385528,15.323561],[2.749993,15.409525],[3.638259,15.56812],[3.723422,16.184284],[4.27021,16.852227],[4.267419,19.155265],[5.677566,19.601207],[8.572893,21.565661],[11.999506,23.471668],[13.581425,23.040506],[14.143871,22.491289],[14.8513,22.86295],[15.096888,21.308519],[15.471077,21.048457],[15.487148,20.730415],[15.903247,20.387619],[15.685741,19.95718],[15.300441,17.92795],[15.247731,16.627306],[13.972202,15.684366],[13.540394,14.367134],[13.956699,13.996691],[13.954477,13.353449],[14.595781,13.330427],[14.495787,12.859396],[14.213531,12.802035],[14.181336,12.483657],[13.995353,12.461565],[13.318702,13.556356],[13.083987,13.596147],[12.302071,13.037189],[11.527803,13.32898],[10.989593,13.387323],[10.701032,13.246918],[10.114814,13.277252],[9.524928,12.851102],[9.014933,12.826659],[7.804671,13.343527],[7.330747,13.098038],[6.820442,13.115091],[6.445426,13.492768],[5.443058,13.865924],[4.368344,13.747482],[4.107946,13.531216],[3.967283,12.956109],[3.680634,12.552903],[3.61118,11.660167],[2.848643,12.235636],[2.490164,12.233052],[2.154474,11.94015]]]}},
{"type":"Feature","id":"NGA","properties":{"name":"Nigeria"},"geometry":{"type":"Polygon","coordinates":[[[8.500288,4.771983],[7.462108,4.412108],[7.082596,4.464689],[6.698072,4.240594],[5.898173,4.262453],[5.362805,4.887971],[5.033574,5.611802],[4.325607,6.270651],[3.57418,6.2583],[2.691702,6.258817],[2.749063,7.870734],[2.723793,8.506845],[2.912308,9.137608],[3.220352,9.444153],[3.705438,10.06321],[3.60007,10.332186],[3.797112,10.734746],[3.572216,11.327939],[3.61118,11.660167],[3.680634,12.552903],[3.967283,12.956109],[4.107946,13.531216],[4.368344,13.747482],[5.443058,13.865924],[6.445426,13.492768],[6.820442,13.115091],[7.330747,13.098038],[7.804671,13.343527],[9.014933,12.826659],[9.524928,12.851102],[10.114814,13.277252],[10.701032,13.246918],[10.989593,13.387323],[11.527803,13.32898],[12.302071,13.037189],[13.083987,13.596147],[13.318702,13.556356],[13.995353,12.461565],[14.181336,12.483657],[14.577178,12.085361],[14.468192,11.904752],[14.415379,11.572369],[13.57295,10.798566],[13.308676,10.160362],[13.1676,9.640626],[12.955468,9.417772],[12.753672,8.717763],[12.218872,8.305824],[12.063946,7.799808],[11.839309,7.397042],[11.745774,6.981383],[11.058788,6.644427],[10.497375,7.055358],[10.118277,7.03877],[9.522706,6.453482],[9.233163,6.444491],[8.757533,5.479666],[8.500288,4.771983]]]}},
{"type":"Feature","id":"NIC","properties":{"name":"Nicaragua"},"geometry":{"type":"Polygon","coordinates":[[[-85.71254,11.088445],[-86.058488,11.403439],[-86.52585,11.806877],[-86.745992,12.143962],[-87.167516,12.458258],[-87.668493,12.90991],[-87.557467,13.064552],[-87.392386,12.914018],[-87.316654,12.984686],[-87.005769,13.025794],[-86.880557,13.254204],[-86.733822,13.263093],[-86.755087,13.754845],[-86.520708,13.778487],[-86.312142,13.771356],[-86.096264,14.038187],[-85.801295,13.836055],[-85.698665,13.960078],[-85.514413,14.079012],[-85.165365,14.35437],[-85.148751,14.560197],[-85.052787,14.551541],[-84.924501,14.790493],[-84.820037,14.819587],[-84.649582,14.666805],[-84.449336,14.621614],[-84.228342,14.748764],[-83.975721,14.749436],[-83.628585,14.880074],[-83.489989,15.016267],[-83.147219,14.995829],[-83.233234,14.899866],[-83.284162,14.676624],[-83.182126,14.310703],[-83.4125,13.970078],[-83.519832,13.567699],[-83.552207,13.127054],[-83.498515,12.869292],[-83.473323,12.419087],[-83.626104,12.32085],[-83.719613,11.893124],[-83.650858,11.629032],[-83.85547,11.373311],[-83.808936,11.103044],[-83.655612,10.938764],[-83.895054,10.726839],[-84.190179,10.79345],[-84.355931,10.999226],[-84.673069,11.082657],[-84.903003,10.952303],[-85.561852,11.217119],[-85.71254,11.088445]]]}},
{"type":"Feature","id":"NLD","properties":{"name":"Netherlands"},"geometry":{"type":"Polygon","coordinates":[[[6.074183,53.510403],[6.90514,53.482162],[7.092053,53.144043],[6.84287,52.22844],[6.589397,51.852029],[5.988658,51.851616],[6.156658,50.803721],[5.606976,51.037298],[4.973991,51.475024],[4.047071,51.267259],[3.314971,51.345755],[3.830289,51.620545],[4.705997,53.091798],[6.074183,53.510403]]]}},
{"type":"Feature","id":"NOR","properties":{"name":"Norway"},"geometry":{"type":"MultiPolygon","coordinates":[[[[28.165547,71.185474],[31.293418,70.453788],[30.005435,70.186259],[31.101079,69.55808],[29.399581,69.156916],[28.59193,69.064777],[29.015573,69.766491],[27.732292,70.164193],[26.179622,69.825299],[25.689213,69.092114],[24.735679,68.649557],[23.66205,68.891247],[22.356238,68.841741],[21.244936,69.370443],[20.645593,69.106247],[20.025269,69.065139],[19.87856,68.407194],[17.993868,68.567391],[17.729182,68.010552],[16.768879,68.013937],[16.108712,67.302456],[15.108411,66.193867],[13.55569,64.787028],[13.919905,64.445421],[13.571916,64.049114],[12.579935,64.066219],[11.930569,63.128318],[11.992064,61.800362],[12.631147,61.293572],[12.300366,60.117933],[11.468272,59.432393],[11.027369,58.856149],[10.356557,59.469807],[8.382,58.313288],[7.048748,58.078884],[5.665835,58.588155],[5.308234,59.663232],[4.992078,61.970998],[5.9129,62.614473],[8.553411,63.454008],[10.527709,64.486038],[12.358347,65.879726],[14.761146,67.810642],[16.435927,68.563205],[19.184028,69.817444],[21.378416,70.255169],[23.023742,70.202072],[24.546543,71.030497],[26.37005,70.986262],[28.165547,71.185474]]],[[[24.72412,77.85385],[22.49032,77.44493],[20.72601,77.67704],[21.41611,77.93504],[20.8119,78.25463],[22.88426,78.45494],[23.28134,78.07954],[24.72412,77.85385]]],[[[18.25183,79.70175],[21.54383,78.95611],[19.02737,78.5626],[18.47172,77.82669],[17.59441,77.63796],[17.1182,76.80941],[15.91315,76.77045],[13.76259,77.38035],[14.66956,77.73565],[13.1706,78.02493],[11.22231,78.8693],[10.44453,79.65239],[13.17077,80.01046],[13.71852,79.66039],[15.14282,79.67431],[15.52255,80.01608],[16.99085,80.05086],[18.25183,79.70175]]],[[[25.447625,80.40734],[27.407506,80.056406],[25.924651,79.517834],[23.024466,79.400012],[20.075188,79.566823],[19.897266,79.842362],[18.462264,79.85988],[17.368015,80.318896],[20.455992,80.598156],[21.907945,80.357679],[22.919253,80.657144],[25.447625,80.40734]]]]}},
{"type":"Feature","id":"NPL","properties":{"name":"Nepal"},"geometry":{"type":"Polygon","coordinates":[[[88.120441,27.876542],[88.043133,27.445819],[88.174804,26.810405],[88.060238,26.414615],[87.227472,26.397898],[86.024393,26.630985],[85.251779,26.726198],[84.675018,27.234901],[83.304249,27.364506],[81.999987,27.925479],[81.057203,28.416095],[80.088425,28.79447],[80.476721,29.729865],[81.111256,30.183481],[81.525804,30.422717],[82.327513,30.115268],[83.337115,29.463732],[83.898993,29.320226],[84.23458,28.839894],[85.011638,28.642774],[85.82332,28.203576],[86.954517,27.974262],[88.120441,27.876542]]]}},
{"type":"Feature","id":"NZL","properties":{"name":"New Zealand"},"geometry":{"type":"MultiPolygon","coordinates":[[[[173.020375,-40.919052],[173.247234,-41.331999],[173.958405,-40.926701],[174.247587,-41.349155],[174.248517,-41.770008],[173.876447,-42.233184],[173.22274,-42.970038],[172.711246,-43.372288],[173.080113,-43.853344],[172.308584,-43.865694],[171.452925,-44.242519],[171.185138,-44.897104],[170.616697,-45.908929],[169.831422,-46.355775],[169.332331,-46.641235],[168.411354,-46.619945],[167.763745,-46.290197],[166.676886,-46.219917],[166.509144,-45.852705],[167.046424,-45.110941],[168.303763,-44.123973],[168.949409,-43.935819],[169.667815,-43.555326],[170.52492,-43.031688],[171.12509,-42.512754],[171.569714,-41.767424],[171.948709,-41.514417],[172.097227,-40.956104],[172.79858,-40.493962],[173.020375,-40.919052]]],[[[174.612009,-36.156397],[175.336616,-37.209098],[175.357596,-36.526194],[175.808887,-36.798942],[175.95849,-37.555382],[176.763195,-37.881253],[177.438813,-37.961248],[178.010354,-37.579825],[178.517094,-37.695373],[178.274731,-38.582813],[177.97046,-39.166343],[177.206993,-39.145776],[176.939981,-39.449736],[177.032946,-39.879943],[176.885824,-40.065978],[176.508017,-40.604808],[176.01244,-41.289624],[175.239567,-41.688308],[175.067898,-41.425895],[174.650973,-41.281821],[175.22763,-40.459236],[174.900157,-39.908933],[173.824047,-39.508854],[173.852262,-39.146602],[174.574802,-38.797683],[174.743474,-38.027808],[174.697017,-37.381129],[174.292028,-36.711092],[174.319004,-36.534824],[173.840997,-36.121981],[173.054171,-35.237125],[172.636005,-34.529107],[173.007042,-34.450662],[173.551298,-35.006183],[174.32939,-35.265496],[174.612009,-36.156397]]]]}},
{"type":"Feature","id":"OMN","properties":{"name":"Oman"},"geometry":{"type":"MultiPolygon","coordinates":[[[[58.861141,21.114035],[58.487986,20.428986],[58.034318,20.481437],[57.826373,20.243002],[57.665762,19.736005],[57.7887,19.06757],[57.694391,18.94471],[57.234264,18.947991],[56.609651,18.574267],[56.512189,18.087113],[56.283521,17.876067],[55.661492,17.884128],[55.269939,17.632309],[55.2749,17.228354],[54.791002,16.950697],[54.239253,17.044981],[53.570508,16.707663],[53.108573,16.651051],[52.782184,17.349742],[52.00001,19.000003],[54.999982,19.999994],[55.666659,22.000001],[55.208341,22.70833],[55.234489,23.110993],[55.525841,23.524869],[55.528632,23.933604],[55.981214,24.130543],[55.804119,24.269604],[55.886233,24.920831],[56.396847,24.924732],[56.84514,24.241673],[57.403453,23.878594],[58.136948,23.747931],[58.729211,23.565668],[59.180502,22.992395],[59.450098,22.660271],[59.80806,22.533612],[59.806148,22.310525],[59.442191,21.714541],[59.282408,21.433886],[58.861141,21.114035]]],[[[56.391421,25.895991],[56.261042,25.714606],[56.070821,26.055464],[56.362017,26.395934],[56.485679,26.309118],[56.391421,25.895991]]]]}},
{"type":"Feature","id":"PAK","properties":{"name":"Pakistan"},"geometry":{"type":"Polygon","coordinates":[[[75.158028,37.133031],[75.896897,36.666806],[76.192848,35.898403],[77.837451,35.49401],[76.871722,34.653544],[75.757061,34.504923],[74.240203,34.748887],[73.749948,34.317699],[74.104294,33.441473],[74.451559,32.7649],[75.258642,32.271105],[74.405929,31.692639],[74.42138,30.979815],[73.450638,29.976413],[72.823752,28.961592],[71.777666,27.91318],[70.616496,27.989196],[69.514393,26.940966],[70.168927,26.491872],[70.282873,25.722229],[70.844699,25.215102],[71.04324,24.356524],[68.842599,24.359134],[68.176645,23.691965],[67.443667,23.944844],[67.145442,24.663611],[66.372828,25.425141],[64.530408,25.237039],[62.905701,25.218409],[61.497363,25.078237],[61.874187,26.239975],[63.316632,26.756532],[63.233898,27.217047],[62.755426,27.378923],[62.72783,28.259645],[61.771868,28.699334],[61.369309,29.303276],[60.874248,29.829239],[62.549857,29.318572],[63.550261,29.468331],[64.148002,29.340819],[64.350419,29.560031],[65.046862,29.472181],[66.346473,29.887943],[66.381458,30.738899],[66.938891,31.304911],[67.683394,31.303154],[67.792689,31.58293],[68.556932,31.71331],[68.926677,31.620189],[69.317764,31.901412],[69.262522,32.501944],[69.687147,33.105499],[70.323594,33.358533],[69.930543,34.02012],[70.881803,33.988856],[71.156773,34.348911],[71.115019,34.733126],[71.613076,35.153203],[71.498768,35.650563],[71.262348,36.074388],[71.846292,36.509942],[72.920025,36.720007],[74.067552,36.836176],[74.575893,37.020841],[75.158028,37.133031]]]}},
{"type":"Feature","id":"PAN","properties":{"name":"Panama"},"geometry":{"type":"Polygon","coordinates":[[[-77.881571,7.223771],[-78.214936,7.512255],[-78.429161,8.052041],[-78.182096,8.319182],[-78.435465,8.387705],[-78.622121,8.718124],[-79.120307,8.996092],[-79.557877,8.932375],[-79.760578,8.584515],[-80.164481,8.333316],[-80.382659,8.298409],[-80.480689,8.090308],[-80.00369,7.547524],[-80.276671,7.419754],[-80.421158,7.271572],[-80.886401,7.220541],[-81.059543,7.817921],[-81.189716,7.647906],[-81.519515,7.70661],[-81.721311,8.108963],[-82.131441,8.175393],[-82.390934,8.292362],[-82.820081,8.290864],[-82.850958,8.073823],[-82.965783,8.225028],[-82.913176,8.423517],[-82.829771,8.626295],[-82.868657,8.807266],[-82.719183,8.925709],[-82.927155,9.07433],[-82.932891,9.476812],[-82.546196,9.566135],[-82.187123,9.207449],[-82.207586,8.995575],[-81.808567,8.950617],[-81.714154,9.031955],[-81.439287,8.786234],[-80.947302,8.858504],[-80.521901,9.111072],[-79.9146,9.312765],[-79.573303,9.61161],[-79.021192,9.552931],[-79.05845,9.454565],[-78.500888,9.420459],[-78.055928,9.24773],[-77.729514,8.946844],[-77.353361,8.670505],[-77.474723,8.524286],[-77.242566,7.935278],[-77.431108,7.638061],[-77.753414,7.70984],[-77.881571,7.223771]]]}},
{"type":"Feature","id":"PER","properties":{"name":"Peru"},"geometry":{"type":"Polygon","coordinates":[[[-69.590424,-17.580012],[-69.858444,-18.092694],[-70.372572,-18.347975],[-71.37525,-17.773799],[-71.462041,-17.363488],[-73.44453,-16.359363],[-75.237883,-15.265683],[-76.009205,-14.649286],[-76.423469,-13.823187],[-76.259242,-13.535039],[-77.106192,-12.222716],[-78.092153,-10.377712],[-79.036953,-8.386568],[-79.44592,-7.930833],[-79.760578,-7.194341],[-80.537482,-6.541668],[-81.249996,-6.136834],[-80.926347,-5.690557],[-81.410943,-4.736765],[-81.09967,-4.036394],[-80.302561,-3.404856],[-80.184015,-3.821162],[-80.469295,-4.059287],[-80.442242,-4.425724],[-80.028908,-4.346091],[-79.624979,-4.454198],[-79.205289,-4.959129],[-78.639897,-4.547784],[-78.450684,-3.873097],[-77.837905,-3.003021],[-76.635394,-2.608678],[-75.544996,-1.56161],[-75.233723,-0.911417],[-75.373223,-0.152032],[-75.106625,-0.057205],[-74.441601,-0.53082],[-74.122395,-1.002833],[-73.659504,-1.260491],[-73.070392,-2.308954],[-72.325787,-2.434218],[-71.774761,-2.16979],[-71.413646,-2.342802],[-70.813476,-2.256865],[-70.047709,-2.725156],[-70.692682,-3.742872],[-70.394044,-3.766591],[-69.893635,-4.298187],[-70.794769,-4.251265],[-70.928843,-4.401591],[-71.748406,-4.593983],[-72.891928,-5.274561],[-72.964507,-5.741251],[-73.219711,-6.089189],[-73.120027,-6.629931],[-73.724487,-6.918595],[-73.723401,-7.340999],[-73.987235,-7.52383],[-73.571059,-8.424447],[-73.015383,-9.032833],[-73.226713,-9.462213],[-72.563033,-9.520194],[-72.184891,-10.053598],[-71.302412,-10.079436],[-70.481894,-9.490118],[-70.548686,-11.009147],[-70.093752,-11.123972],[-69.529678,-10.951734],[-68.66508,-12.5613],[-68.88008,-12.899729],[-68.929224,-13.602684],[-68.948887,-14.453639],[-69.339535,-14.953195],[-69.160347,-15.323974],[-69.389764,-15.660129],[-68.959635,-16.500698],[-69.590424,-17.580012]]]}},
{"type":"Feature","id":"PHL","properties":{"name":"Philippines"},"geometry":{"type":"MultiPolygon","coordinates":[[[[126.376814,8.414706],[126.478513,7.750354],[126.537424,7.189381],[126.196773,6.274294],[125.831421,7.293715],[125.363852,6.786485],[125.683161,6.049657],[125.396512,5.581003],[124.219788,6.161355],[123.93872,6.885136],[124.243662,7.36061],[123.610212,7.833527],[123.296071,7.418876],[122.825506,7.457375],[122.085499,6.899424],[121.919928,7.192119],[122.312359,8.034962],[122.942398,8.316237],[123.487688,8.69301],[123.841154,8.240324],[124.60147,8.514158],[124.764612,8.960409],[125.471391,8.986997],[125.412118,9.760335],[126.222714,9.286074],[126.306637,8.782487],[126.376814,8.414706]]],[[[123.982438,10.278779],[123.623183,9.950091],[123.309921,9.318269],[122.995883,9.022189],[122.380055,9.713361],[122.586089,9.981045],[122.837081,10.261157],[122.947411,10.881868],[123.49885,10.940624],[123.337774,10.267384],[124.077936,11.232726],[123.982438,10.278779]]],[[[118.504581,9.316383],[117.174275,8.3675],[117.664477,9.066889],[118.386914,9.6845],[118.987342,10.376292],[119.511496,11.369668],[119.689677,10.554291],[119.029458,10.003653],[118.504581,9.316383]]],[[[121.883548,11.891755],[122.483821,11.582187],[123.120217,11.58366],[123.100838,11.165934],[122.637714,10.741308],[122.00261,10.441017],[121.967367,10.905691],[122.03837,11.415841],[121.883548,11.891755]]],[[[125.502552,12.162695],[125.783465,11.046122],[125.011884,11.311455],[125.032761,10.975816],[125.277449,10.358722],[124.801819,10.134679],[124.760168,10.837995],[124.459101,10.88993],[124.302522,11.495371],[124.891013,11.415583],[124.87799,11.79419],[124.266762,12.557761],[125.227116,12.535721],[125.502552,12.162695]]],[[[121.527394,13.06959],[121.26219,12.20556],[120.833896,12.704496],[120.323436,13.466413],[121.180128,13.429697],[121.527394,13.06959]]],[[[121.321308,18.504065],[121.937601,18.218552],[122.246006,18.47895],[122.336957,18.224883],[122.174279,17.810283],[122.515654,17.093505],[122.252311,16.262444],[121.662786,15.931018],[121.50507,15.124814],[121.728829,14.328376],[122.258925,14.218202],[122.701276,14.336541],[123.950295,13.782131],[123.855107,13.237771],[124.181289,12.997527],[124.077419,12.536677],[123.298035,13.027526],[122.928652,13.55292],[122.671355,13.185836],[122.03465,13.784482],[121.126385,13.636687],[120.628637,13.857656],[120.679384,14.271016],[120.991819,14.525393],[120.693336,14.756671],[120.564145,14.396279],[120.070429,14.970869],[119.920929,15.406347],[119.883773,16.363704],[120.286488,16.034629],[120.390047,17.599081],[120.715867,18.505227],[121.321308,18.504065]]]]}},
{"type":"Feature","id":"PNG","properties":{"name":"Papua New Guinea"},"geometry":{"type":"MultiPolygon","coordinates":[[[[155.880026,-6.819997],[155.599991,-6.919991],[155.166994,-6.535931],[154.729192,-5.900828],[154.514114,-5.139118],[154.652504,-5.042431],[154.759991,-5.339984],[155.062918,-5.566792],[155.547746,-6.200655],[156.019965,-6.540014],[155.880026,-6.819997]]],[[[151.982796,-5.478063],[151.459107,-5.56028],[151.30139,-5.840728],[150.754447,-6.083763],[150.241197,-6.317754],[149.709963,-6.316513],[148.890065,-6.02604],[148.318937,-5.747142],[148.401826,-5.437756],[149.298412,-5.583742],[149.845562,-5.505503],[149.99625,-5.026101],[150.139756,-5.001348],[150.236908,-5.53222],[150.807467,-5.455842],[151.089672,-5.113693],[151.647881,-4.757074],[151.537862,-4.167807],[152.136792,-4.14879],[152.338743,-4.312966],[152.318693,-4.867661],[151.982796,-5.478063]]],[[[147.191874,-7.388024],[148.084636,-8.044108],[148.734105,-9.104664],[149.306835,-9.071436],[149.266631,-9.514406],[150.038728,-9.684318],[149.738798,-9.872937],[150.801628,-10.293687],[150.690575,-10.582713],[150.028393,-10.652476],[149.78231,-10.393267],[148.923138,-10.280923],[147.913018,-10.130441],[147.135443,-9.492444],[146.567881,-8.942555],[146.048481,-8.067414],[144.744168,-7.630128],[143.897088,-7.91533],[143.286376,-8.245491],[143.413913,-8.983069],[142.628431,-9.326821],[142.068259,-9.159596],[141.033852,-9.117893],[141.017057,-5.859022],[141.00021,-2.600151],[142.735247,-3.289153],[144.583971,-3.861418],[145.27318,-4.373738],[145.829786,-4.876498],[145.981922,-5.465609],[147.648073,-6.083659],[147.891108,-6.614015],[146.970905,-6.721657],[147.191874,-7.388024]]],[[[153.140038,-4.499983],[152.827292,-4.766427],[152.638673,-4.176127],[152.406026,-3.789743],[151.953237,-3.462062],[151.384279,-3.035422],[150.66205,-2.741486],[150.939965,-2.500002],[151.479984,-2.779985],[151.820015,-2.999972],[152.239989,-3.240009],[152.640017,-3.659983],[153.019994,-3.980015],[153.140038,-4.499983]]]]}},
{"type":"Feature","id":"POL","properties":{"name":"Poland"},"geometry":{"type":"Polygon","coordinates":[[[15.016996,51.106674],[14.607098,51.745188],[14.685026,52.089947],[14.4376,52.62485],[14.074521,52.981263],[14.353315,53.248171],[14.119686,53.757029],[14.8029,54.050706],[16.363477,54.513159],[17.622832,54.851536],[18.620859,54.682606],[18.696255,54.438719],[19.66064,54.426084],[20.892245,54.312525],[22.731099,54.327537],[23.243987,54.220567],[23.484128,53.912498],[23.527536,53.470122],[23.804935,53.089731],[23.799199,52.691099],[23.199494,52.486977],[23.508002,52.023647],[23.527071,51.578454],[24.029986,50.705407],[23.922757,50.424881],[23.426508,50.308506],[22.51845,49.476774],[22.776419,49.027395],[22.558138,49.085738],[21.607808,49.470107],[20.887955,49.328772],[20.415839,49.431453],[19.825023,49.217125],[19.320713,49.571574],[18.909575,49.435846],[18.853144,49.49623],[18.392914,49.988629],[17.649445,50.049038],[17.554567,50.362146],[16.868769,50.473974],[16.719476,50.215747],[16.176253,50.422607],[16.238627,50.697733],[15.490972,50.78473],[15.016996,51.106674]]]}},
{"type":"Feature","id":"PRI","properties":{"name":"Puerto Rico"},"geometry":{"type":"Polygon","coordinates":[[[-66.282434,18.514762],[-65.771303,18.426679],[-65.591004,18.228035],[-65.847164,17.975906],[-66.599934,17.981823],[-67.184162,17.946553],[-67.242428,18.37446],[-67.100679,18.520601],[-66.282434,18.514762]]]}},
{"type":"Feature","id":"PRK","properties":{"name":"North Korea"},"geometry":{"type":"Polygon","coordinates":[[[130.640016,42.395009],[130.780007,42.220007],[130.400031,42.280004],[129.965949,41.941368],[129.667362,41.601104],[129.705189,40.882828],[129.188115,40.661808],[129.0104,40.485436],[128.633368,40.189847],[127.967414,40.025413],[127.533436,39.75685],[127.50212,39.323931],[127.385434,39.213472],[127.783343,39.050898],[128.349716,38.612243],[128.205746,38.370397],[127.780035,38.304536],[127.073309,38.256115],[126.68372,37.804773],[126.237339,37.840378],[126.174759,37.749686],[125.689104,37.94001],[125.568439,37.752089],[125.27533,37.669071],[125.240087,37.857224],[124.981033,37.948821],[124.712161,38.108346],[124.985994,38.548474],[125.221949,38.665857],[125.132859,38.848559],[125.38659,39.387958],[125.321116,39.551385],[124.737482,39.660344],[124.265625,39.928493],[125.079942,40.569824],[126.182045,41.107336],[126.869083,41.816569],[127.343783,41.503152],[128.208433,41.466772],[128.052215,41.994285],[129.596669,42.424982],[129.994267,42.985387],[130.640016,42.395009]]]}},
{"type":"Feature","id":"PRT","properties":{"name":"Portugal"},"geometry":{"type":"Polygon","coordinates":[[[-9.034818,41.880571],[-8.671946,42.134689],[-8.263857,42.280469],[-8.013175,41.790886],[-7.422513,41.792075],[-7.251309,41.918346],[-6.668606,41.883387],[-6.389088,41.381815],[-6.851127,41.111083],[-6.86402,40.330872],[-7.026413,40.184524],[-7.066592,39.711892],[-7.498632,39.629571],[-7.098037,39.030073],[-7.374092,38.373059],[-7.029281,38.075764],[-7.166508,37.803894],[-7.537105,37.428904],[-7.453726,37.097788],[-7.855613,36.838269],[-8.382816,36.97888],[-8.898857,36.868809],[-8.746101,37.651346],[-8.839998,38.266243],[-9.287464,38.358486],[-9.526571,38.737429],[-9.446989,39.392066],[-9.048305,39.755093],[-8.977353,40.159306],[-8.768684,40.760639],[-8.790853,41.184334],[-8.990789,41.543459],[-9.034818,41.880571]]]}},
{"type":"Feature","id":"PRY","properties":{"name":"Paraguay"},"geometry":{"type":"Polygon","coordinates":[[[-62.685057,-22.249029],[-62.291179,-21.051635],[-62.265961,-20.513735],[-61.786326,-19.633737],[-60.043565,-19.342747],[-59.115042,-19.356906],[-58.183471,-19.868399],[-58.166392,-20.176701],[-57.870674,-20.732688],[-57.937156,-22.090176],[-56.88151,-22.282154],[-56.473317,-22.0863],[-55.797958,-22.35693],[-55.610683,-22.655619],[-55.517639,-23.571998],[-55.400747,-23.956935],[-55.027902,-24.001274],[-54.652834,-23.839578],[-54.29296,-24.021014],[-54.293476,-24.5708],[-54.428946,-25.162185],[-54.625291,-25.739255],[-54.788795,-26.621786],[-55.695846,-27.387837],[-56.486702,-27.548499],[-57.60976,-27.395899],[-58.618174,-27.123719],[-57.63366,-25.603657],[-57.777217,-25.16234],[-58.807128,-24.771459],[-60.028966,-24.032796],[-60.846565,-23.880713],[-62.685057,-22.249029]]]}},
{"type":"Feature","id":"QAT","properties":{"name":"Qatar"},"geometry":{"type":"Polygon","coordinates":[[[50.810108,24.754743],[50.743911,25.482424],[51.013352,26.006992],[51.286462,26.114582],[51.589079,25.801113],[51.6067,25.21567],[51.389608,24.627386],[51.112415,24.556331],[50.810108,24.754743]]]}},
{"type":"Feature","id":"ROU","properties":{"name":"Romania"},"geometry":{"type":"Polygon","coordinates":[[[22.710531,47.882194],[23.142236,48.096341],[23.760958,47.985598],[24.402056,47.981878],[24.866317,47.737526],[25.207743,47.891056],[25.945941,47.987149],[26.19745,48.220881],[26.619337,48.220726],[26.924176,48.123264],[27.233873,47.826771],[27.551166,47.405117],[28.12803,46.810476],[28.160018,46.371563],[28.054443,45.944586],[28.233554,45.488283],[28.679779,45.304031],[29.149725,45.464925],[29.603289,45.293308],[29.626543,45.035391],[29.141612,44.82021],[28.837858,44.913874],[28.558081,43.707462],[27.970107,43.812468],[27.2424,44.175986],[26.065159,43.943494],[25.569272,43.688445],[24.100679,43.741051],[23.332302,43.897011],[22.944832,43.823785],[22.65715,44.234923],[22.474008,44.409228],[22.705726,44.578003],[22.459022,44.702517],[22.145088,44.478422],[21.562023,44.768947],[21.483526,45.18117],[20.874313,45.416375],[20.762175,45.734573],[20.220192,46.127469],[21.021952,46.316088],[21.626515,46.994238],[22.099768,47.672439],[22.710531,47.882194]]]}},
{"type":"Feature","id":"RUS","properties":{"name":"Russia"},"geometry":{"type":"MultiPolygon","coordinates":[[[[143.648007,50.7476],[144.654148,48.976391],[143.173928,49.306551],[142.558668,47.861575],[143.533492,46.836728],[143.505277,46.137908],[142.747701,46.740765],[142.09203,45.966755],[141.906925,46.805929],[142.018443,47.780133],[141.904445,48.859189],[142.1358,49.615163],[142.179983,50.952342],[141.594076,51.935435],[141.682546,53.301966],[142.606934,53.762145],[142.209749,54.225476],[142.654786,54.365881],[142.914616,53.704578],[143.260848,52.74076],[143.235268,51.75666],[143.648007,50.7476]]],[[[22.731099,54.327537],[20.892245,54.312525],[19.66064,54.426084],[19.888481,54.86616],[21.268449,55.190482],[22.315724,55.015299],[22.757764,54.856574],[22.651052,54.582741],[22.731099,54.327537]]],[[[-175.01425,66.58435],[-174.33983,66.33556],[-174.57182,67.06219],[-171.85731,66.91308],[-169.89958,65.97724],[-170.89107,65.54139],[-172.53025,65.43791],[-172.555,64.46079],[-172.95533,64.25269],[-173.89184,64.2826],[-174.65392,64.63125],[-175.98353,64.92288],[-176.20716,65.35667],[-177.22266,65.52024],[-178.35993,65.39052],[-178.90332,65.74044],[-178.68611,66.11211],[-179.88377,65.87456],[-179.43268,65.40411],[-180,64.979709],[-180,68.963636],[-177.55,68.2],[-174.92825,67.20589],[-175.01425,66.58435]]],[[[180,70.832199],[178.903425,70.78114],[178.7253,71.0988],[180,71.515714],[180,70.832199]]],[[[-178.69378,70.89302],[-180,70.832199],[-180,71.515714],[-179.871875,71.55762],[-179.02433,71.55553],[-177.577945,71.26948],[-177.663575,71.13277],[-178.69378,70.89302]]],[[[143.60385,73.21244],[142.08763,73.20544],[140.038155,73.31692],[139.86312,73.36983],[140.81171,73.76506],[142.06207,73.85758],[143.48283,73.47525],[143.60385,73.21244]]],[[[150.73167,75.08406],[149.575925,74.68892],[147.977465,74.778355],[146.11919,75.17298],[146.358485,75.49682],[148.22223,75.345845],[150.73167,75.08406]]],[[[145.086285,75.562625],[144.3,74.82],[140.61381,74.84768],[138.95544,74.61148],[136.97439,75.26167],[137.51176,75.94917],[138.831075,76.13676],[141.471615,76.09289],[145.086285,75.562625]]],[[[57.535693,70.720464],[56.944979,70.632743],[53.677375,70.762658],[53.412017,71.206662],[51.601895,71.474759],[51.455754,72.014881],[52.478275,72.229442],[52.444169,72.774731],[54.427614,73.627548],[53.50829,73.749814],[55.902459,74.627486],[55.631933,75.081412],[57.868644,75.60939],[61.170044,76.251883],[64.498368,76.439055],[66.210977,76.809782],[68.15706,76.939697],[68.852211,76.544811],[68.180573,76.233642],[64.637326,75.737755],[61.583508,75.260885],[58.477082,74.309056],[56.986786,73.333044],[55.419336,72.371268],[55.622838,71.540595],[57.535693,70.720464]]],[[[106.97013,76.97419],[107.24,76.48],[108.1538,76.72335],[111.07726,76.71],[113.33151,76.22224],[114.13417,75.84764],[113.88539,75.32779],[112.77918,75.03186],[110.15125,74.47673],[109.4,74.18],[110.64,74.04],[112.11919,73.78774],[113.01954,73.97693],[113.52958,73.33505],[113.96881,73.59488],[115.56782,73.75285],[118.77633,73.58772],[119.02,73.12],[123.20066,72.97122],[123.25777,73.73503],[125.38,73.56],[126.97644,73.56549],[128.59126,73.03871],[129.05157,72.39872],[128.46,71.98],[129.71599,71.19304],[131.28858,70.78699],[132.2535,71.8363],[133.85766,71.38642],[135.56193,71.65525],[137.49755,71.34763],[138.23409,71.62803],[139.86983,71.48783],[139.14791,72.41619],[140.46817,72.84941],[149.5,72.2],[150.35118,71.60643],[152.9689,70.84222],[157.00688,71.03141],[158.99779,70.86672],[159.83031,70.45324],[159.70866,69.72198],[160.94053,69.43728],[162.27907,69.64204],[164.05248,69.66823],[165.94037,69.47199],[167.83567,69.58269],[169.57763,68.6938],[170.81688,69.01363],[170.0082,69.65276],[170.45345,70.09703],[173.64391,69.81743],[175.72403,69.87725],[178.6,69.4],[180,68.963636],[180,64.979709],[179.99281,64.97433],[178.7072,64.53493],[177.41128,64.60821],[178.313,64.07593],[178.90825,63.25197],[179.37034,62.98262],[179.48636,62.56894],[179.22825,62.3041],[177.3643,62.5219],[174.56929,61.76915],[173.68013,61.65261],[172.15,60.95],[170.6985,60.33618],[170.33085,59.88177],[168.90046,60.57355],[166.29498,59.78855],[165.84,60.16],[164.87674,59.7316],[163.53929,59.86871],[163.21711,59.21101],[162.01733,58.24328],[162.05297,57.83912],[163.19191,57.61503],[163.05794,56.15924],[162.12958,56.12219],[161.70146,55.28568],[162.11749,54.85514],[160.36877,54.34433],[160.02173,53.20257],[158.53094,52.95868],[158.23118,51.94269],[156.78979,51.01105],[156.42,51.7],[155.99182,53.15895],[155.43366,55.38103],[155.91442,56.76792],[156.75815,57.3647],[156.81035,57.83204],[158.36433,58.05575],[160.15064,59.31477],[161.87204,60.343],[163.66969,61.1409],[164.47355,62.55061],[163.25842,62.46627],[162.65791,61.6425],[160.12148,60.54423],[159.30232,61.77396],[156.72068,61.43442],[154.21806,59.75818],[155.04375,59.14495],[152.81185,58.88385],[151.26573,58.78089],[151.33815,59.50396],[149.78371,59.65573],[148.54481,59.16448],[145.48722,59.33637],[142.19782,59.03998],[138.95848,57.08805],[135.12619,54.72959],[136.70171,54.60355],[137.19342,53.97732],[138.1647,53.75501],[138.80463,54.25455],[139.90151,54.18968],[141.34531,53.08957],[141.37923,52.23877],[140.59742,51.23967],[140.51308,50.04553],[140.06193,48.44671],[138.55472,46.99965],[138.21971,46.30795],[136.86232,45.1435],[135.51535,43.989],[134.86939,43.39821],[133.53687,42.81147],[132.90627,42.79849],[132.27807,43.28456],[130.93587,42.55274],[130.78,42.22],[130.64,42.395],[130.633866,42.903015],[131.144688,42.92999],[131.288555,44.11152],[131.02519,44.96796],[131.883454,45.321162],[133.09712,45.14409],[133.769644,46.116927],[134.11235,47.21248],[134.50081,47.57845],[135.026311,48.47823],[133.373596,48.183442],[132.50669,47.78896],[130.98726,47.79013],[130.582293,48.729687],[129.397818,49.4406],[127.6574,49.76027],[127.287456,50.739797],[126.939157,51.353894],[126.564399,51.784255],[125.946349,52.792799],[125.068211,53.161045],[123.57147,53.4588],[122.245748,53.431726],[121.003085,53.251401],[120.177089,52.753886],[120.725789,52.516226],[120.7382,51.96411],[120.18208,51.64355],[119.27939,50.58292],[119.288461,50.142883],[117.879244,49.510983],[116.678801,49.888531],[115.485695,49.805177],[114.96211,50.140247],[114.362456,50.248303],[112.89774,49.543565],[111.581231,49.377968],[110.662011,49.130128],[109.402449,49.292961],[108.475167,49.282548],[107.868176,49.793705],[106.888804,50.274296],[105.886591,50.406019],[104.62158,50.27532],[103.676545,50.089966],[102.25589,50.51056],[102.06521,51.25991],[100.88948,51.516856],[99.981732,51.634006],[98.861491,52.047366],[97.82574,51.010995],[98.231762,50.422401],[97.25976,49.72605],[95.81402,49.97746],[94.815949,50.013433],[94.147566,50.480537],[93.10421,50.49529],[92.234712,50.802171],[90.713667,50.331812],[88.805567,49.470521],[87.751264,49.297198],[87.35997,49.214981],[86.829357,49.826675],[85.54127,49.692859],[85.11556,50.117303],[84.416377,50.3114],[83.935115,50.889246],[83.383004,51.069183],[81.945986,50.812196],[80.568447,51.388336],[80.03556,50.864751],[77.800916,53.404415],[76.525179,54.177003],[76.8911,54.490524],[74.38482,53.54685],[73.425679,53.48981],[73.508516,54.035617],[72.22415,54.376655],[71.180131,54.133285],[70.865267,55.169734],[69.068167,55.38525],[68.1691,54.970392],[65.66687,54.60125],[65.178534,54.354228],[61.4366,54.00625],[60.978066,53.664993],[61.699986,52.979996],[60.739993,52.719986],[60.927269,52.447548],[59.967534,51.96042],[61.588003,51.272659],[61.337424,50.79907],[59.932807,50.842194],[59.642282,50.545442],[58.36332,51.06364],[56.77798,51.04355],[55.71694,50.62171],[54.532878,51.02624],[52.328724,51.718652],[50.766648,51.692762],[48.702382,50.605128],[48.577841,49.87476],[47.54948,50.454698],[46.751596,49.356006],[47.043672,49.152039],[46.466446,48.394152],[47.31524,47.71585],[48.05725,47.74377],[48.694734,47.075628],[48.59325,46.56104],[49.10116,46.39933],[48.64541,45.80629],[47.67591,45.64149],[46.68201,44.6092],[47.59094,43.66016],[47.49252,42.98658],[48.58437,41.80888],[47.987283,41.405819],[47.815666,41.151416],[47.373315,41.219732],[46.686071,41.827137],[46.404951,41.860675],[45.7764,42.09244],[45.470279,42.502781],[44.537623,42.711993],[43.93121,42.55496],[43.75599,42.74083],[42.3944,43.2203],[40.92219,43.38215],[40.076965,43.553104],[39.955009,43.434998],[38.68,44.28],[37.53912,44.65721],[36.67546,45.24469],[37.40317,45.40451],[38.23295,46.24087],[37.67372,46.63657],[39.14767,47.04475],[39.1212,47.26336],[38.223538,47.10219],[38.255112,47.5464],[38.77057,47.82562],[39.738278,47.898937],[39.89562,48.23241],[39.67465,48.78382],[40.080789,49.30743],[40.06904,49.60105],[38.594988,49.926462],[38.010631,49.915662],[37.39346,50.383953],[36.626168,50.225591],[35.356116,50.577197],[35.37791,50.77394],[35.022183,51.207572],[34.224816,51.255993],[34.141978,51.566413],[34.391731,51.768882],[33.7527,52.335075],[32.715761,52.238465],[32.412058,52.288695],[32.15944,52.06125],[31.78597,52.10168],[31.540018,52.742052],[31.305201,53.073996],[31.49764,53.16743],[32.304519,53.132726],[32.693643,53.351421],[32.405599,53.618045],[31.731273,53.794029],[31.791424,53.974639],[31.384472,54.157056],[30.757534,54.811771],[30.971836,55.081548],[30.873909,55.550976],[29.896294,55.789463],[29.371572,55.670091],[29.229513,55.918344],[28.176709,56.16913],[27.855282,56.759326],[27.770016,57.244258],[27.288185,57.474528],[27.716686,57.791899],[27.42015,58.72457],[28.131699,59.300825],[27.98112,59.47537],[29.1177,60.02805],[28.07,60.50352],[30.211107,61.780028],[31.139991,62.357693],[31.516092,62.867687],[30.035872,63.552814],[30.444685,64.204453],[29.54443,64.948672],[30.21765,65.80598],[29.054589,66.944286],[29.977426,67.698297],[28.445944,68.364613],[28.59193,69.064777],[29.39955,69.15692],[31.10108,69.55811],[32.13272,69.90595],[33.77547,69.30142],[36.51396,69.06342],[40.29234,67.9324],[41.05987,67.45713],[41.12595,66.79158],[40.01583,66.26618],[38.38295,65.99953],[33.91871,66.75961],[33.18444,66.63253],[34.81477,65.90015],[34.878574,65.436213],[34.94391,64.41437],[36.23129,64.10945],[37.01273,63.84983],[37.14197,64.33471],[36.539579,64.76446],[37.17604,65.14322],[39.59345,64.52079],[40.4356,64.76446],[39.7626,65.49682],[42.09309,66.47623],[43.01604,66.41858],[43.94975,66.06908],[44.53226,66.75634],[43.69839,67.35245],[44.18795,67.95051],[43.45282,68.57079],[46.25,68.25],[46.82134,67.68997],[45.55517,67.56652],[45.56202,67.01005],[46.34915,66.66767],[47.89416,66.88455],[48.13876,67.52238],[50.22766,67.99867],[53.71743,68.85738],[54.47171,68.80815],[53.48582,68.20131],[54.72628,68.09702],[55.44268,68.43866],[57.31702,68.46628],[58.802,68.88082],[59.94142,68.27844],[61.07784,68.94069],[60.03,69.52],[60.55,69.85],[63.504,69.54739],[64.888115,69.234835],[68.51216,68.09233],[69.18068,68.61563],[68.16444,69.14436],[68.13522,69.35649],[66.93008,69.45461],[67.25976,69.92873],[66.72492,70.70889],[66.69466,71.02897],[68.54006,71.9345],[69.19636,72.84336],[69.94,73.04],[72.58754,72.77629],[72.79603,72.22006],[71.84811,71.40898],[72.47011,71.09019],[72.79188,70.39114],[72.5647,69.02085],[73.66787,68.4079],[73.2387,67.7404],[71.28,66.32],[72.42301,66.17267],[72.82077,66.53267],[73.92099,66.78946],[74.18651,67.28429],[75.052,67.76047],[74.46926,68.32899],[74.93584,68.98918],[73.84236,69.07146],[73.60187,69.62763],[74.3998,70.63175],[73.1011,71.44717],[74.89082,72.12119],[74.65926,72.83227],[75.15801,72.85497],[75.68351,72.30056],[75.28898,71.33556],[76.35911,71.15287],[75.90313,71.87401],[77.57665,72.26717],[79.65202,72.32011],[81.5,71.75],[80.61071,72.58285],[80.51109,73.6482],[82.25,73.85],[84.65526,73.80591],[86.8223,73.93688],[86.00956,74.45967],[87.16682,75.11643],[88.31571,75.14393],[90.26,75.64],[92.90058,75.77333],[93.23421,76.0472],[95.86,76.14],[96.67821,75.91548],[98.92254,76.44689],[100.75967,76.43028],[101.03532,76.86189],[101.99084,77.28754],[104.3516,77.69792],[106.06664,77.37389],[104.705,77.1274],[106.97013,76.97419]]],[[[105.07547,78.30689],[99.43814,77.921],[101.2649,79.23399],[102.08635,79.34641],[102.837815,79.28129],[105.37243,78.71334],[105.07547,78.30689]]],[[[51.136187,80.54728],[49.793685,80.415428],[48.894411,80.339567],[48.754937,80.175468],[47.586119,80.010181],[46.502826,80.247247],[47.072455,80.559424],[44.846958,80.58981],[46.799139,80.771918],[48.318477,80.78401],[48.522806,80.514569],[49.09719,80.753986],[50.039768,80.918885],[51.522933,80.699726],[51.136187,80.54728]]],[[[99.93976,78.88094],[97.75794,78.7562],[94.97259,79.044745],[93.31288,79.4265],[92.5454,80.14379],[91.18107,80.34146],[93.77766,81.0246],[95.940895,81.2504],[97.88385,80.746975],[100.186655,79.780135],[99.93976,78.88094]]]]}},
{"type":"Feature","id":"RWA","properties":{"name":"Rwanda"},"geometry":{"type":"Polygon","coordinates":[[[30.419105,-1.134659],[30.816135,-1.698914],[30.758309,-2.28725],[30.469696,-2.413858],[29.938359,-2.348487],[29.632176,-2.917858],[29.024926,-2.839258],[29.117479,-2.292211],[29.254835,-2.21511],[29.291887,-1.620056],[29.579466,-1.341313],[29.821519,-1.443322],[30.419105,-1.134659]]]}},
{"type":"Feature","id":"ESH","properties":{"name":"Western Sahara"},"geometry":{"type":"Polygon","coordinates":[[[-8.794884,27.120696],[-8.817828,27.656426],[-8.66559,27.656426],[-8.665124,27.589479],[-8.6844,27.395744],[-8.687294,25.881056],[-11.969419,25.933353],[-11.937224,23.374594],[-12.874222,23.284832],[-13.118754,22.77122],[-12.929102,21.327071],[-16.845194,21.333323],[-17.063423,20.999752],[-17.020428,21.42231],[-17.002962,21.420734],[-14.750955,21.5006],[-14.630833,21.86094],[-14.221168,22.310163],[-13.89111,23.691009],[-12.500963,24.770116],[-12.030759,26.030866],[-11.71822,26.104092],[-11.392555,26.883424],[-10.551263,26.990808],[-10.189424,26.860945],[-9.735343,26.860945],[-9.413037,27.088476],[-8.794884,27.120696]]]}},
{"type":"Feature","id":"SAU","properties":{"name":"Saudi Arabia"},"geometry":{"type":"Polygon","coordinates":[[[42.779332,16.347891],[42.649573,16.774635],[42.347989,17.075806],[42.270888,17.474722],[41.754382,17.833046],[41.221391,18.6716],[40.939341,19.486485],[40.247652,20.174635],[39.801685,20.338862],[39.139399,21.291905],[39.023696,21.986875],[39.066329,22.579656],[38.492772,23.688451],[38.02386,24.078686],[37.483635,24.285495],[37.154818,24.858483],[37.209491,25.084542],[36.931627,25.602959],[36.639604,25.826228],[36.249137,26.570136],[35.640182,27.37652],[35.130187,28.063352],[34.632336,28.058546],[34.787779,28.607427],[34.83222,28.957483],[34.956037,29.356555],[36.068941,29.197495],[36.501214,29.505254],[36.740528,29.865283],[37.503582,30.003776],[37.66812,30.338665],[37.998849,30.5085],[37.002166,31.508413],[39.004886,32.010217],[39.195468,32.161009],[40.399994,31.889992],[41.889981,31.190009],[44.709499,29.178891],[46.568713,29.099025],[47.459822,29.002519],[47.708851,28.526063],[48.416094,28.552004],[48.807595,27.689628],[49.299554,27.461218],[49.470914,27.109999],[50.152422,26.689663],[50.212935,26.277027],[50.113303,25.943972],[50.239859,25.60805],[50.527387,25.327808],[50.660557,24.999896],[50.810108,24.754743],[51.112415,24.556331],[51.389608,24.627386],[51.579519,24.245497],[51.617708,24.014219],[52.000733,23.001154],[55.006803,22.496948],[55.208341,22.70833],[55.666659,22.000001],[54.999982,19.999994],[52.00001,19.000003],[49.116672,18.616668],[48.183344,18.166669],[47.466695,17.116682],[47.000005,16.949999],[46.749994,17.283338],[46.366659,17.233315],[45.399999,17.333335],[45.216651,17.433329],[44.062613,17.410359],[43.791519,17.319977],[43.380794,17.579987],[43.115798,17.08844],[43.218375,16.66689],[42.779332,16.347891]]]}},
{"type":"Feature","id":"SDN","properties":{"name":"Sudan"},"geometry":{"type":"Polygon","coordinates":[[[33.963393,9.464285],[33.824963,9.484061],[33.842131,9.981915],[33.721959,10.325262],[33.206938,10.720112],[33.086766,11.441141],[33.206938,12.179338],[32.743419,12.248008],[32.67475,12.024832],[32.073892,11.97333],[32.314235,11.681484],[32.400072,11.080626],[31.850716,10.531271],[31.352862,9.810241],[30.837841,9.707237],[29.996639,10.290927],[29.618957,10.084919],[29.515953,9.793074],[29.000932,9.604232],[28.966597,9.398224],[27.97089,9.398224],[27.833551,9.604232],[27.112521,9.638567],[26.752006,9.466893],[26.477328,9.55273],[25.962307,10.136421],[25.790633,10.411099],[25.069604,10.27376],[24.794926,9.810241],[24.537415,8.917538],[24.194068,8.728696],[23.88698,8.61973],[23.805813,8.666319],[23.459013,8.954286],[23.394779,9.265068],[23.55725,9.681218],[23.554304,10.089255],[22.977544,10.714463],[22.864165,11.142395],[22.87622,11.38461],[22.50869,11.67936],[22.49762,12.26024],[22.28801,12.64605],[21.93681,12.58818],[22.03759,12.95546],[22.29658,13.37232],[22.18329,13.78648],[22.51202,14.09318],[22.30351,14.32682],[22.56795,14.94429],[23.02459,15.68072],[23.88689,15.61084],[23.83766,19.58047],[23.85,20],[25,20.00304],[25,22],[29.02,22],[32.9,22],[36.86623,22],[37.18872,21.01885],[36.96941,20.83744],[37.1147,19.80796],[37.48179,18.61409],[37.86276,18.36786],[38.41009,17.998307],[37.904,17.42754],[37.16747,17.26314],[36.85253,16.95655],[36.75389,16.29186],[36.32322,14.82249],[36.42951,14.42211],[36.27022,13.56333],[35.86363,12.57828],[35.26049,12.08286],[34.83163,11.31896],[34.73115,10.91017],[34.25745,10.63009],[33.96162,9.58358],[33.963393,9.464285]]]}},
{"type":"Feature","id":"SSD","properties":{"name":"South Sudan"},"geometry":{"type":"Polygon","coordinates":[[[33.963393,9.464285],[33.97498,8.68456],[33.8255,8.37916],[33.2948,8.35458],[32.95418,7.78497],[33.56829,7.71334],[34.0751,7.22595],[34.25032,6.82607],[34.70702,6.59422],[35.298007,5.506],[34.620196,4.847123],[34.005,4.249885],[33.39,3.79],[32.68642,3.79232],[31.88145,3.55827],[31.24556,3.7819],[30.83385,3.50917],[29.95349,4.1737],[29.715995,4.600805],[29.159078,4.389267],[28.696678,4.455077],[28.428994,4.287155],[27.979977,4.408413],[27.374226,5.233944],[27.213409,5.550953],[26.465909,5.946717],[26.213418,6.546603],[25.796648,6.979316],[25.124131,7.500085],[25.114932,7.825104],[24.567369,8.229188],[23.88698,8.61973],[24.194068,8.728696],[24.537415,8.917538],[24.794926,9.810241],[25.069604,10.27376],[25.790633,10.411099],[25.962307,10.136421],[26.477328,9.55273],[26.752006,9.466893],[27.112521,9.638567],[27.833551,9.604232],[27.97089,9.398224],[28.966597,9.398224],[29.000932,9.604232],[29.515953,9.793074],[29.618957,10.084919],[29.996639,10.290927],[30.837841,9.707237],[31.352862,9.810241],[31.850716,10.531271],[32.400072,11.080626],[32.314235,11.681484],[32.073892,11.97333],[32.67475,12.024832],[32.743419,12.248008],[33.206938,12.179338],[33.086766,11.441141],[33.206938,10.720112],[33.721959,10.325262],[33.842131,9.981915],[33.824963,9.484061],[33.963393,9.464285]]]}},
{"type":"Feature","id":"SEN","properties":{"name":"Senegal"},"geometry":{"type":"Polygon","coordinates":[[[-16.713729,13.594959],[-17.126107,14.373516],[-17.625043,14.729541],[-17.185173,14.919477],[-16.700706,15.621527],[-16.463098,16.135036],[-16.12069,16.455663],[-15.623666,16.369337],[-15.135737,16.587282],[-14.577348,16.598264],[-14.099521,16.304302],[-13.435738,16.039383],[-12.830658,15.303692],[-12.17075,14.616834],[-12.124887,13.994727],[-11.927716,13.422075],[-11.553398,13.141214],[-11.467899,12.754519],[-11.513943,12.442988],[-11.658301,12.386583],[-12.203565,12.465648],[-12.278599,12.35444],[-12.499051,12.33209],[-13.217818,12.575874],[-13.700476,12.586183],[-15.548477,12.62817],[-15.816574,12.515567],[-16.147717,12.547762],[-16.677452,12.384852],[-16.841525,13.151394],[-15.931296,13.130284],[-15.691001,13.270353],[-15.511813,13.27857],[-15.141163,13.509512],[-14.712197,13.298207],[-14.277702,13.280585],[-13.844963,13.505042],[-14.046992,13.794068],[-14.376714,13.62568],[-14.687031,13.630357],[-15.081735,13.876492],[-15.39877,13.860369],[-15.624596,13.623587],[-16.713729,13.594959]]]}},
{"type":"Feature","id":"SLB","properties":{"name":"Solomon Islands"},"geometry":{"type":"MultiPolygon","coordinates":[[[[162.119025,-10.482719],[162.398646,-10.826367],[161.700032,-10.820011],[161.319797,-10.204751],[161.917383,-10.446701],[162.119025,-10.482719]]],[[[160.852229,-9.872937],[160.462588,-9.89521],[159.849447,-9.794027],[159.640003,-9.63998],[159.702945,-9.24295],[160.362956,-9.400304],[160.688518,-9.610162],[160.852229,-9.872937]]],[[[161.679982,-9.599982],[161.529397,-9.784312],[160.788253,-8.917543],[160.579997,-8.320009],[160.920028,-8.320009],[161.280006,-9.120011],[161.679982,-9.599982]]],[[[159.875027,-8.33732],[159.917402,-8.53829],[159.133677,-8.114181],[158.586114,-7.754824],[158.21115,-7.421872],[158.359978,-7.320018],[158.820001,-7.560003],[159.640003,-8.020027],[159.875027,-8.33732]]],[[[157.538426,-7.34782],[157.33942,-7.404767],[156.90203,-7.176874],[156.491358,-6.765943],[156.542828,-6.599338],[157.14,-7.021638],[157.538426,-7.34782]]]]}},
{"type":"Feature","id":"SLE","properties":{"name":"Sierra Leone"},"geometry":{"type":"Polygon","coordinates":[[[-11.438779,6.785917],[-11.708195,6.860098],[-12.428099,7.262942],[-12.949049,7.798646],[-13.124025,8.163946],[-13.24655,8.903049],[-12.711958,9.342712],[-12.596719,9.620188],[-12.425929,9.835834],[-12.150338,9.858572],[-11.917277,10.046984],[-11.117481,10.045873],[-10.839152,9.688246],[-10.622395,9.26791],[-10.65477,8.977178],[-10.494315,8.715541],[-10.505477,8.348896],[-10.230094,8.406206],[-10.695595,7.939464],[-11.146704,7.396706],[-11.199802,7.105846],[-11.438779,6.785917]]]}},
{"type":"Feature","id":"SLV","properties":{"name":"El Salvador"},"geometry":{"type":"Polygon","coordinates":[[[-87.793111,13.38448],[-87.904112,13.149017],[-88.483302,13.163951],[-88.843228,13.259734],[-89.256743,13.458533],[-89.812394,13.520622],[-90.095555,13.735338],[-90.064678,13.88197],[-89.721934,14.134228],[-89.534219,14.244816],[-89.587343,14.362586],[-89.353326,14.424133],[-89.058512,14.340029],[-88.843073,14.140507],[-88.541231,13.980155],[-88.503998,13.845486],[-88.065343,13.964626],[-87.859515,13.893312],[-87.723503,13.78505],[-87.793111,13.38448]]]}},
{"type":"Feature","id":"-99","properties":{"name":"Somaliland"},"geometry":{"type":"Polygon","coordinates":[[[48.93813,9.451749],[48.486736,8.837626],[47.78942,8.003],[46.948328,7.996877],[43.67875,9.18358],[43.296975,9.540477],[42.92812,10.02194],[42.55876,10.57258],[42.776852,10.926879],[43.145305,11.46204],[43.47066,11.27771],[43.666668,10.864169],[44.117804,10.445538],[44.614259,10.442205],[45.556941,10.698029],[46.645401,10.816549],[47.525658,11.127228],[48.021596,11.193064],[48.378784,11.375482],[48.948206,11.410622],[48.942005,11.394266],[48.938491,10.982327],[48.938233,9.9735],[48.93813,9.451749]]]}},
{"type":"Feature","id":"SOM","properties":{"name":"Somalia"},"geometry":{"type":"Polygon","coordinates":[[[49.72862,11.5789],[50.25878,11.67957],[50.73202,12.0219],[51.1112,12.02464],[51.13387,11.74815],[51.04153,11.16651],[51.04531,10.6409],[50.83418,10.27972],[50.55239,9.19874],[50.07092,8.08173],[49.4527,6.80466],[48.59455,5.33911],[47.74079,4.2194],[46.56476,2.85529],[45.56399,2.04576],[44.06815,1.05283],[43.13597,0.2922],[42.04157,-0.91916],[41.81095,-1.44647],[41.58513,-1.68325],[40.993,-0.85829],[40.98105,2.78452],[41.855083,3.918912],[42.12861,4.23413],[42.76967,4.25259],[43.66087,4.95755],[44.9636,5.00162],[47.78942,8.003],[48.486736,8.837626],[48.93813,9.451749],[48.938233,9.9735],[48.938491,10.982327],[48.942005,11.394266],[48.948205,11.410617],[49.26776,11.43033],[49.72862,11.5789]]]}},
{"type":"Feature","id":"SRB","properties":{"name":"Republic of Serbia"},"geometry":{"type":"Polygon","coordinates":[[[20.874313,45.416375],[21.483526,45.18117],[21.562023,44.768947],[22.145088,44.478422],[22.459022,44.702517],[22.705726,44.578003],[22.474008,44.409228],[22.65715,44.234923],[22.410446,44.008063],[22.500157,43.642814],[22.986019,43.211161],[22.604801,42.898519],[22.436595,42.580321],[22.545012,42.461362],[22.380526,42.32026],[21.91708,42.30364],[21.576636,42.245224],[21.54332,42.32025],[21.66292,42.43922],[21.77505,42.6827],[21.63302,42.67717],[21.43866,42.86255],[21.27421,42.90959],[21.143395,43.068685],[20.95651,43.13094],[20.81448,43.27205],[20.63508,43.21671],[20.49679,42.88469],[20.25758,42.81275],[20.3398,42.89852],[19.95857,43.10604],[19.63,43.21378],[19.48389,43.35229],[19.21852,43.52384],[19.454,43.5681],[19.59976,44.03847],[19.11761,44.42307],[19.36803,44.863],[19.00548,44.86023],[19.390476,45.236516],[19.072769,45.521511],[18.82982,45.90888],[19.596045,46.17173],[20.220192,46.127469],[20.762175,45.734573],[20.874313,45.416375]]]}},
{"type":"Feature","id":"SUR","properties":{"name":"Suriname"},"geometry":{"type":"Polygon","coordinates":[[[-57.147436,5.97315],[-55.949318,5.772878],[-55.84178,5.953125],[-55.03325,6.025291],[-53.958045,5.756548],[-54.478633,4.896756],[-54.399542,4.212611],[-54.006931,3.620038],[-54.181726,3.18978],[-54.269705,2.732392],[-54.524754,2.311849],[-55.097587,2.523748],[-55.569755,2.421506],[-55.973322,2.510364],[-56.073342,2.220795],[-55.9056,2.021996],[-55.995698,1.817667],[-56.539386,1.899523],[-57.150098,2.768927],[-57.281433,3.333492],[-57.601569,3.334655],[-58.044694,4.060864],[-57.86021,4.576801],[-57.914289,4.812626],[-57.307246,5.073567],[-57.147436,5.97315]]]}},
{"type":"Feature","id":"SVK","properties":{"name":"Slovakia"},"geometry":{"type":"Polygon","coordinates":[[[18.853144,49.49623],[18.909575,49.435846],[19.320713,49.571574],[19.825023,49.217125],[20.415839,49.431453],[20.887955,49.328772],[21.607808,49.470107],[22.558138,49.085738],[22.280842,48.825392],[22.085608,48.422264],[21.872236,48.319971],[20.801294,48.623854],[20.473562,48.56285],[20.239054,48.327567],[19.769471,48.202691],[19.661364,48.266615],[19.174365,48.111379],[18.777025,48.081768],[18.696513,47.880954],[17.857133,47.758429],[17.488473,47.867466],[16.979667,48.123497],[16.879983,48.470013],[16.960288,48.596982],[17.101985,48.816969],[17.545007,48.800019],[17.886485,48.903475],[17.913512,48.996493],[18.104973,49.043983],[18.170498,49.271515],[18.399994,49.315001],[18.554971,49.495015],[18.853144,49.49623]]]}},
{"type":"Feature","id":"SVN","properties":{"name":"Slovenia"},"geometry":{"type":"Polygon","coordinates":[[[13.806475,46.509306],[14.632472,46.431817],[15.137092,46.658703],[16.011664,46.683611],[16.202298,46.852386],[16.370505,46.841327],[16.564808,46.503751],[15.768733,46.238108],[15.67153,45.834154],[15.323954,45.731783],[15.327675,45.452316],[14.935244,45.471695],[14.595109,45.634941],[14.411968,45.466166],[13.71506,45.500324],[13.93763,45.591016],[13.69811,46.016778],[13.806475,46.509306]]]}},
{"type":"Feature","id":"SWE","properties":{"name":"Sweden"},"geometry":{"type":"MultiPolygon","coordinates":[[[[22.183173,65.723741],[21.213517,65.026005],[21.369631,64.413588],[19.778876,63.609554],[17.847779,62.7494],[17.119555,61.341166],[17.831346,60.636583],[18.787722,60.081914],[17.869225,58.953766],[16.829185,58.719827],[16.44771,57.041118],[15.879786,56.104302],[14.666681,56.200885],[14.100721,55.407781],[12.942911,55.361737],[12.625101,56.30708],[11.787942,57.441817],[11.027369,58.856149],[11.468272,59.432393],[12.300366,60.117933],[12.631147,61.293572],[11.992064,61.800362],[11.930569,63.128318],[12.579935,64.066219],[13.571916,64.049114],[13.919905,64.445421],[13.55569,64.787028],[15.108411,66.193867],[16.108712,67.302456],[16.768879,68.013937],[17.729182,68.010552],[17.993868,68.567391],[19.87856,68.407194],[20.025269,69.065139],[20.645593,69.106247],[21.978535,68.616846],[23.539473,67.936009],[23.56588,66.396051],[23.903379,66.006927],[22.183173,65.723741]]],[[[17.061767,57.385783],[17.210083,57.326521],[16.430053,56.179196],[16.364135,56.556455],[17.061767,57.385783]]],[[[19.357910,57.958588],[18.803100,57.651279],[18.825073,57.444949],[18.995361,57.441993],[18.951416,57.370976],[18.693237,57.305756],[18.709716,57.204734],[18.462524,57.127295],[18.319702,56.926992],[18.105468,56.891003],[18.187866,57.109402],[18.072509,57.267163],[18.154907,57.394664],[18.094482,57.545312],[18.660278,57.929434],[19.039306,57.941098],[19.105224,57.993543],[19.374389,57.996454],[19.357910,57.958588]]],[[[20.846557,63.823710],[21.066284,63.829768],[20.972900,63.715670],[20.824584,63.579121],[20.695495,63.591340],[20.819091,63.714454],[20.799865,63.780059],[20.846557,63.823710]]]]}},
{"type":"Feature","id":"SWZ","properties":{"name":"Swaziland"},"geometry":{"type":"Polygon","coordinates":[[[32.071665,-26.73382],[31.86806,-27.177927],[31.282773,-27.285879],[30.685962,-26.743845],[30.676609,-26.398078],[30.949667,-26.022649],[31.04408,-25.731452],[31.333158,-25.660191],[31.837778,-25.843332],[31.985779,-26.29178],[32.071665,-26.73382]]]}},
{"type":"Feature","id":"SYR","properties":{"name":"Syria"},"geometry":{"type":"Polygon","coordinates":[[[38.792341,33.378686],[36.834062,32.312938],[35.719918,32.709192],[35.700798,32.716014],[35.836397,32.868123],[35.821101,33.277426],[36.06646,33.824912],[36.61175,34.201789],[36.448194,34.593935],[35.998403,34.644914],[35.905023,35.410009],[36.149763,35.821535],[36.41755,36.040617],[36.685389,36.259699],[36.739494,36.81752],[37.066761,36.623036],[38.167727,36.90121],[38.699891,36.712927],[39.52258,36.716054],[40.673259,37.091276],[41.212089,37.074352],[42.349591,37.229873],[41.837064,36.605854],[41.289707,36.358815],[41.383965,35.628317],[41.006159,34.419372],[38.792341,33.378686]]]}},
{"type":"Feature","id":"TCD","properties":{"name":"Chad"},"geometry":{"type":"Polygon","coordinates":[[[14.495787,12.859396],[14.595781,13.330427],[13.954477,13.353449],[13.956699,13.996691],[13.540394,14.367134],[13.97217,15.68437],[15.247731,16.627306],[15.300441,17.92795],[15.685741,19.95718],[15.903247,20.387619],[15.487148,20.730415],[15.47106,21.04845],[15.096888,21.308519],[14.8513,22.86295],[15.86085,23.40972],[19.84926,21.49509],[23.83766,19.58047],[23.88689,15.61084],[23.02459,15.68072],[22.56795,14.94429],[22.30351,14.32682],[22.51202,14.09318],[22.18329,13.78648],[22.29658,13.37232],[22.03759,12.95546],[21.93681,12.58818],[22.28801,12.64605],[22.49762,12.26024],[22.50869,11.67936],[22.87622,11.38461],[22.864165,11.142395],[22.231129,10.971889],[21.723822,10.567056],[21.000868,9.475985],[20.059685,9.012706],[19.094008,9.074847],[18.81201,8.982915],[18.911022,8.630895],[18.389555,8.281304],[17.96493,7.890914],[16.705988,7.508328],[16.456185,7.734774],[16.290562,7.754307],[16.106232,7.497088],[15.27946,7.421925],[15.436092,7.692812],[15.120866,8.38215],[14.979996,8.796104],[14.544467,8.965861],[13.954218,9.549495],[14.171466,10.021378],[14.627201,9.920919],[14.909354,9.992129],[15.467873,9.982337],[14.923565,10.891325],[14.960152,11.555574],[14.89336,12.21905],[14.495787,12.859396]]]}},
{"type":"Feature","id":"TGO","properties":{"name":"Togo"},"geometry":{"type":"Polygon","coordinates":[[[1.865241,6.142158],[1.060122,5.928837],[0.836931,6.279979],[0.570384,6.914359],[0.490957,7.411744],[0.712029,8.312465],[0.461192,8.677223],[0.365901,9.465004],[0.36758,10.191213],[-0.049785,10.706918],[0.023803,11.018682],[0.899563,10.997339],[0.772336,10.470808],[1.077795,10.175607],[1.425061,9.825395],[1.463043,9.334624],[1.664478,9.12859],[1.618951,6.832038],[1.865241,6.142158]]]}},
{"type":"Feature","id":"THA","properties":{"name":"Thailand"},"geometry":{"type":"Polygon","coordinates":[[[102.584932,12.186595],[101.687158,12.64574],[100.83181,12.627085],[100.978467,13.412722],[100.097797,13.406856],[100.018733,12.307001],[99.478921,10.846367],[99.153772,9.963061],[99.222399,9.239255],[99.873832,9.207862],[100.279647,8.295153],[100.459274,7.429573],[101.017328,6.856869],[101.623079,6.740622],[102.141187,6.221636],[101.814282,5.810808],[101.154219,5.691384],[101.075516,6.204867],[100.259596,6.642825],[100.085757,6.464489],[99.690691,6.848213],[99.519642,7.343454],[98.988253,7.907993],[98.503786,8.382305],[98.339662,7.794512],[98.150009,8.350007],[98.25915,8.973923],[98.553551,9.93296],[99.038121,10.960546],[99.587286,11.892763],[99.196354,12.804748],[99.212012,13.269294],[99.097755,13.827503],[98.430819,14.622028],[98.192074,15.123703],[98.537376,15.308497],[98.903348,16.177824],[98.493761,16.837836],[97.859123,17.567946],[97.375896,18.445438],[97.797783,18.62708],[98.253724,19.708203],[98.959676,19.752981],[99.543309,20.186598],[100.115988,20.41785],[100.548881,20.109238],[100.606294,19.508344],[101.282015,19.462585],[101.035931,18.408928],[101.059548,17.512497],[102.113592,18.109102],[102.413005,17.932782],[102.998706,17.961695],[103.200192,18.309632],[103.956477,18.240954],[104.716947,17.428859],[104.779321,16.441865],[105.589039,15.570316],[105.544338,14.723934],[105.218777,14.273212],[104.281418,14.416743],[102.988422,14.225721],[102.348099,13.394247],[102.584932,12.186595]]]}},
{"type":"Feature","id":"TJK","properties":{"name":"Tajikistan"},"geometry":{"type":"Polygon","coordinates":[[[71.014198,40.244366],[70.648019,39.935754],[69.55961,40.103211],[69.464887,39.526683],[70.549162,39.604198],[71.784694,39.279463],[73.675379,39.431237],[73.928852,38.505815],[74.257514,38.606507],[74.864816,38.378846],[74.829986,37.990007],[74.980002,37.41999],[73.948696,37.421566],[73.260056,37.495257],[72.63689,37.047558],[72.193041,36.948288],[71.844638,36.738171],[71.448693,37.065645],[71.541918,37.905774],[71.239404,37.953265],[71.348131,38.258905],[70.806821,38.486282],[70.376304,38.138396],[70.270574,37.735165],[70.116578,37.588223],[69.518785,37.608997],[69.196273,37.151144],[68.859446,37.344336],[68.135562,37.023115],[67.83,37.144994],[68.392033,38.157025],[68.176025,38.901553],[67.44222,39.140144],[67.701429,39.580478],[68.536416,39.533453],[69.011633,40.086158],[69.329495,40.727824],[70.666622,40.960213],[70.45816,40.496495],[70.601407,40.218527],[71.014198,40.244366]]]}},
{"type":"Feature","id":"TKM","properties":{"name":"Turkmenistan"},"geometry":{"type":"Polygon","coordinates":[[[61.210817,35.650072],[61.123071,36.491597],[60.377638,36.527383],[59.234762,37.412988],[58.436154,37.522309],[57.330434,38.029229],[56.619366,38.121394],[56.180375,37.935127],[55.511578,37.964117],[54.800304,37.392421],[53.921598,37.198918],[53.735511,37.906136],[53.880929,38.952093],[53.101028,39.290574],[53.357808,39.975286],[52.693973,40.033629],[52.915251,40.876523],[53.858139,40.631034],[54.736845,40.951015],[54.008311,41.551211],[53.721713,42.123191],[52.91675,41.868117],[52.814689,41.135371],[52.50246,41.783316],[52.944293,42.116034],[54.079418,42.324109],[54.755345,42.043971],[55.455251,41.259859],[55.968191,41.308642],[57.096391,41.32231],[56.932215,41.826026],[57.78653,42.170553],[58.629011,42.751551],[59.976422,42.223082],[60.083341,41.425146],[60.465953,41.220327],[61.547179,41.26637],[61.882714,41.084857],[62.37426,40.053886],[63.518015,39.363257],[64.170223,38.892407],[65.215999,38.402695],[66.54615,37.974685],[66.518607,37.362784],[66.217385,37.39379],[65.745631,37.661164],[65.588948,37.305217],[64.746105,37.111818],[64.546479,36.312073],[63.982896,36.007957],[63.193538,35.857166],[62.984662,35.404041],[62.230651,35.270664],[61.210817,35.650072]]]}},
{"type":"Feature","id":"TLS","properties":{"name":"East Timor"},"geometry":{"type":"Polygon","coordinates":[[[124.968682,-8.89279],[125.086246,-8.656887],[125.947072,-8.432095],[126.644704,-8.398247],[126.957243,-8.273345],[127.335928,-8.397317],[126.967992,-8.668256],[125.925885,-9.106007],[125.08852,-9.393173],[125.07002,-9.089987],[124.968682,-8.89279]]]}},
{"type":"Feature","id":"TTO","properties":{"name":"Trinidad and Tobago"},"geometry":{"type":"Polygon","coordinates":[[[-61.68,10.76],[-61.105,10.89],[-60.895,10.855],[-60.935,10.11],[-61.77,10],[-61.95,10.09],[-61.66,10.365],[-61.68,10.76]]]}},
{"type":"Feature","id":"TUN","properties":{"name":"Tunisia"},"geometry":{"type":"Polygon","coordinates":[[[9.48214,30.307556],[9.055603,32.102692],[8.439103,32.506285],[8.430473,32.748337],[7.612642,33.344115],[7.524482,34.097376],[8.140981,34.655146],[8.376368,35.479876],[8.217824,36.433177],[8.420964,36.946427],[9.509994,37.349994],[10.210002,37.230002],[10.18065,36.724038],[11.028867,37.092103],[11.100026,36.899996],[10.600005,36.41],[10.593287,35.947444],[10.939519,35.698984],[10.807847,34.833507],[10.149593,34.330773],[10.339659,33.785742],[10.856836,33.76874],[11.108501,33.293343],[11.488787,33.136996],[11.432253,32.368903],[10.94479,32.081815],[10.636901,31.761421],[9.950225,31.37607],[10.056575,30.961831],[9.970017,30.539325],[9.48214,30.307556]]]}},
{"type":"Feature","id":"TUR","properties":{"name":"Turkey"},"geometry":{"type":"MultiPolygon","coordinates":[[[[36.913127,41.335358],[38.347665,40.948586],[39.512607,41.102763],[40.373433,41.013673],[41.554084,41.535656],[42.619549,41.583173],[43.582746,41.092143],[43.752658,40.740201],[43.656436,40.253564],[44.400009,40.005],[44.79399,39.713003],[44.109225,39.428136],[44.421403,38.281281],[44.225756,37.971584],[44.772699,37.170445],[44.293452,37.001514],[43.942259,37.256228],[42.779126,37.385264],[42.349591,37.229873],[41.212089,37.074352],[40.673259,37.091276],[39.52258,36.716054],[38.699891,36.712927],[38.167727,36.90121],[37.066761,36.623036],[36.739494,36.81752],[36.685389,36.259699],[36.41755,36.040617],[36.149763,35.821535],[35.782085,36.274995],[36.160822,36.650606],[35.550936,36.565443],[34.714553,36.795532],[34.026895,36.21996],[32.509158,36.107564],[31.699595,36.644275],[30.621625,36.677865],[30.391096,36.262981],[29.699976,36.144357],[28.732903,36.676831],[27.641187,36.658822],[27.048768,37.653361],[26.318218,38.208133],[26.8047,38.98576],[26.170785,39.463612],[27.28002,40.420014],[28.819978,40.460011],[29.240004,41.219991],[31.145934,41.087622],[32.347979,41.736264],[33.513283,42.01896],[35.167704,42.040225],[36.913127,41.335358]]],[[[27.192377,40.690566],[26.358009,40.151994],[26.043351,40.617754],[26.056942,40.824123],[26.294602,40.936261],[26.604196,41.562115],[26.117042,41.826905],[27.135739,42.141485],[27.99672,42.007359],[28.115525,41.622886],[28.988443,41.299934],[28.806438,41.054962],[27.619017,40.999823],[27.192377,40.690566]]]]}},
{"type":"Feature","id":"TWN","properties":{"name":"Taiwan"},"geometry":{"type":"Polygon","coordinates":[[[121.777818,24.394274],[121.175632,22.790857],[120.74708,21.970571],[120.220083,22.814861],[120.106189,23.556263],[120.69468,24.538451],[121.495044,25.295459],[121.951244,24.997596],[121.777818,24.394274]]]}},
{"type":"Feature","id":"TZA","properties":{"name":"United Republic of Tanzania"},"geometry":{"type":"Polygon","coordinates":[[[33.903711,-0.95],[34.07262,-1.05982],[37.69869,-3.09699],[37.7669,-3.67712],[39.20222,-4.67677],[38.74054,-5.90895],[38.79977,-6.47566],[39.44,-6.84],[39.47,-7.1],[39.19469,-7.7039],[39.25203,-8.00781],[39.18652,-8.48551],[39.53574,-9.11237],[39.9496,-10.0984],[40.31659,-10.3171],[39.521,-10.89688],[38.427557,-11.285202],[37.82764,-11.26879],[37.47129,-11.56876],[36.775151,-11.594537],[36.514082,-11.720938],[35.312398,-11.439146],[34.559989,-11.52002],[34.28,-10.16],[33.940838,-9.693674],[33.73972,-9.41715],[32.759375,-9.230599],[32.191865,-8.930359],[31.556348,-8.762049],[31.157751,-8.594579],[30.74,-8.34],[30.2,-7.08],[29.62,-6.52],[29.419993,-5.939999],[29.519987,-5.419979],[29.339998,-4.499983],[29.753512,-4.452389],[30.11632,-4.09012],[30.50554,-3.56858],[30.75224,-3.35931],[30.74301,-3.03431],[30.52766,-2.80762],[30.46967,-2.41383],[30.758309,-2.28725],[30.816135,-1.698914],[30.419105,-1.134659],[30.76986,-1.01455],[31.86617,-1.02736],[33.903711,-0.95]]]}},
{"type":"Feature","id":"UGA","properties":{"name":"Uganda"},"geometry":{"type":"Polygon","coordinates":[[[31.86617,-1.02736],[30.76986,-1.01455],[30.419105,-1.134659],[29.821519,-1.443322],[29.579466,-1.341313],[29.587838,-0.587406],[29.8195,-0.2053],[29.875779,0.59738],[30.086154,1.062313],[30.468508,1.583805],[30.85267,1.849396],[31.174149,2.204465],[30.77332,2.33989],[30.83385,3.50917],[31.24556,3.7819],[31.88145,3.55827],[32.68642,3.79232],[33.39,3.79],[34.005,4.249885],[34.47913,3.5556],[34.59607,3.05374],[35.03599,1.90584],[34.6721,1.17694],[34.18,0.515],[33.893569,0.109814],[33.903711,-0.95],[31.86617,-1.02736]]]}},
{"type":"Feature","id":"UKR","properties":{"name":"Ukraine"},"geometry":{"type":"Polygon","coordinates":[[[31.785998,52.101678],[32.159412,52.061267],[32.412058,52.288695],[32.715761,52.238465],[33.7527,52.335075],[34.391731,51.768882],[34.141978,51.566413],[34.224816,51.255993],[35.022183,51.207572],[35.377924,50.773955],[35.356116,50.577197],[36.626168,50.225591],[37.39346,50.383953],[38.010631,49.915662],[38.594988,49.926462],[40.069058,49.601055],[40.080789,49.30743],[39.674664,48.783818],[39.895632,48.232405],[39.738278,47.898937],[38.770585,47.825608],[38.255112,47.5464],[38.223538,47.10219],[37.425137,47.022221],[36.759855,46.6987],[35.823685,46.645964],[34.962342,46.273197],[35.020788,45.651219],[35.510009,45.409993],[36.529998,45.46999],[36.334713,45.113216],[35.239999,44.939996],[33.882511,44.361479],[33.326421,44.564877],[33.546924,45.034771],[32.454174,45.327466],[32.630804,45.519186],[33.588162,45.851569],[33.298567,46.080598],[31.74414,46.333348],[31.675307,46.706245],[30.748749,46.5831],[30.377609,46.03241],[29.603289,45.293308],[29.149725,45.464925],[28.679779,45.304031],[28.233554,45.488283],[28.485269,45.596907],[28.659987,45.939987],[28.933717,46.25883],[28.862972,46.437889],[29.072107,46.517678],[29.170654,46.379262],[29.759972,46.349988],[30.024659,46.423937],[29.83821,46.525326],[29.908852,46.674361],[29.559674,46.928583],[29.415135,47.346645],[29.050868,47.510227],[29.122698,47.849095],[28.670891,48.118149],[28.259547,48.155562],[27.522537,48.467119],[26.857824,48.368211],[26.619337,48.220726],[26.19745,48.220881],[25.945941,47.987149],[25.207743,47.891056],[24.866317,47.737526],[24.402056,47.981878],[23.760958,47.985598],[23.142236,48.096341],[22.710531,47.882194],[22.64082,48.15024],[22.085608,48.422264],[22.280842,48.825392],[22.558138,49.085738],[22.776419,49.027395],[22.51845,49.476774],[23.426508,50.308506],[23.922757,50.424881],[24.029986,50.705407],[23.527071,51.578454],[24.005078,51.617444],[24.553106,51.888461],[25.327788,51.910656],[26.337959,51.832289],[27.454066,51.592303],[28.241615,51.572227],[28.617613,51.427714],[28.992835,51.602044],[29.254938,51.368234],[30.157364,51.416138],[30.555117,51.319503],[30.619454,51.822806],[30.927549,52.042353],[31.785998,52.101678]]]}},
{"type":"Feature","id":"URY","properties":{"name":"Uruguay"},"geometry":{"type":"Polygon","coordinates":[[[-57.625133,-30.216295],[-56.976026,-30.109686],[-55.973245,-30.883076],[-55.60151,-30.853879],[-54.572452,-31.494511],[-53.787952,-32.047243],[-53.209589,-32.727666],[-53.650544,-33.202004],[-53.373662,-33.768378],[-53.806426,-34.396815],[-54.935866,-34.952647],[-55.67409,-34.752659],[-56.215297,-34.859836],[-57.139685,-34.430456],[-57.817861,-34.462547],[-58.427074,-33.909454],[-58.349611,-33.263189],[-58.132648,-33.040567],[-58.14244,-32.044504],[-57.874937,-31.016556],[-57.625133,-30.216295]]]}},
{"type":"Feature","id":"USA","properties":{"name":"United States of America"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-155.54211,19.08348],[-155.68817,18.91619],[-155.93665,19.05939],[-155.90806,19.33888],[-156.07347,19.70294],[-156.02368,19.81422],[-155.85008,19.97729],[-155.91907,20.17395],[-155.86108,20.26721],[-155.78505,20.2487],[-155.40214,20.07975],[-155.22452,19.99302],[-155.06226,19.8591],[-154.80741,19.50871],[-154.83147,19.45328],[-155.22217,19.23972],[-155.54211,19.08348]]],[[[-156.07926,20.64397],[-156.41445,20.57241],[-156.58673,20.783],[-156.70167,20.8643],[-156.71055,20.92676],[-156.61258,21.01249],[-156.25711,20.91745],[-155.99566,20.76404],[-156.07926,20.64397]]],[[[-156.75824,21.17684],[-156.78933,21.06873],[-157.32521,21.09777],[-157.25027,21.21958],[-156.75824,21.17684]]],[[[-157.65283,21.32217],[-157.70703,21.26442],[-157.7786,21.27729],[-158.12667,21.31244],[-158.2538,21.53919],[-158.29265,21.57912],[-158.0252,21.71696],[-157.94161,21.65272],[-157.65283,21.32217]]],[[[-159.34512,21.982],[-159.46372,21.88299],[-159.80051,22.06533],[-159.74877,22.1382],[-159.5962,22.23618],[-159.36569,22.21494],[-159.34512,21.982]]],[[[-94.81758,49.38905],[-94.64,48.84],[-94.32914,48.67074],[-93.63087,48.60926],[-92.61,48.45],[-91.64,48.14],[-90.83,48.27],[-89.6,48.01],[-89.272917,48.019808],[-88.378114,48.302918],[-87.439793,47.94],[-86.461991,47.553338],[-85.652363,47.220219],[-84.87608,46.900083],[-84.779238,46.637102],[-84.543749,46.538684],[-84.6049,46.4396],[-84.3367,46.40877],[-84.14212,46.512226],[-84.091851,46.275419],[-83.890765,46.116927],[-83.616131,46.116927],[-83.469551,45.994686],[-83.592851,45.816894],[-82.550925,45.347517],[-82.337763,44.44],[-82.137642,43.571088],[-82.43,42.98],[-82.9,42.43],[-83.12,42.08],[-83.142,41.975681],[-83.02981,41.832796],[-82.690089,41.675105],[-82.439278,41.675105],[-81.277747,42.209026],[-80.247448,42.3662],[-78.939362,42.863611],[-78.92,42.965],[-79.01,43.27],[-79.171674,43.466339],[-78.72028,43.625089],[-77.737885,43.629056],[-76.820034,43.628784],[-76.5,44.018459],[-76.375,44.09631],[-75.31821,44.81645],[-74.867,45.00048],[-73.34783,45.00738],[-71.50506,45.0082],[-71.405,45.255],[-71.08482,45.30524],[-70.66,45.46],[-70.305,45.915],[-69.99997,46.69307],[-69.237216,47.447781],[-68.905,47.185],[-68.23444,47.35486],[-67.79046,47.06636],[-67.79134,45.70281],[-67.13741,45.13753],[-66.96466,44.8097],[-68.03252,44.3252],[-69.06,43.98],[-70.11617,43.68405],[-70.645476,43.090238],[-70.81489,42.8653],[-70.825,42.335],[-70.495,41.805],[-70.08,41.78],[-70.185,42.145],[-69.88497,41.92283],[-69.96503,41.63717],[-70.64,41.475],[-71.12039,41.49445],[-71.86,41.32],[-72.295,41.27],[-72.87643,41.22065],[-73.71,40.931102],[-72.24126,41.11948],[-71.945,40.93],[-73.345,40.63],[-73.982,40.628],[-73.952325,40.75075],[-74.25671,40.47351],[-73.96244,40.42763],[-74.17838,39.70926],[-74.90604,38.93954],[-74.98041,39.1964],[-75.20002,39.24845],[-75.52805,39.4985],[-75.32,38.96],[-75.071835,38.782032],[-75.05673,38.40412],[-75.37747,38.01551],[-75.94023,37.21689],[-76.03127,37.2566],[-75.72205,37.93705],[-76.23287,38.319215],[-76.35,39.15],[-76.542725,38.717615],[-76.32933,38.08326],[-76.989998,38.239992],[-76.30162,37.917945],[-76.25874,36.9664],[-75.9718,36.89726],[-75.86804,36.55125],[-75.72749,35.55074],[-76.36318,34.80854],[-77.397635,34.51201],[-78.05496,33.92547],[-78.55435,33.86133],[-79.06067,33.49395],[-79.20357,33.15839],[-80.301325,32.509355],[-80.86498,32.0333],[-81.33629,31.44049],[-81.49042,30.72999],[-81.31371,30.03552],[-80.98,29.18],[-80.535585,28.47213],[-80.53,28.04],[-80.056539,26.88],[-80.088015,26.205765],[-80.13156,25.816775],[-80.38103,25.20616],[-80.68,25.08],[-81.17213,25.20126],[-81.33,25.64],[-81.71,25.87],[-82.24,26.73],[-82.70515,27.49504],[-82.85526,27.88624],[-82.65,28.55],[-82.93,29.1],[-83.70959,29.93656],[-84.1,30.09],[-85.10882,29.63615],[-85.28784,29.68612],[-85.7731,30.15261],[-86.4,30.4],[-87.53036,30.27433],[-88.41782,30.3849],[-89.18049,30.31598],[-89.593831,30.159994],[-89.413735,29.89419],[-89.43,29.48864],[-89.21767,29.29108],[-89.40823,29.15961],[-89.77928,29.30714],[-90.15463,29.11743],[-90.880225,29.148535],[-91.626785,29.677],[-92.49906,29.5523],[-93.22637,29.78375],[-93.84842,29.71363],[-94.69,29.48],[-95.60026,28.73863],[-96.59404,28.30748],[-97.14,27.83],[-97.37,27.38],[-97.38,26.69],[-97.33,26.21],[-97.14,25.87],[-97.53,25.84],[-98.24,26.06],[-99.02,26.37],[-99.3,26.84],[-99.52,27.54],[-100.11,28.11],[-100.45584,28.69612],[-100.9576,29.38071],[-101.6624,29.7793],[-102.48,29.76],[-103.11,28.97],[-103.94,29.27],[-104.45697,29.57196],[-104.70575,30.12173],[-105.03737,30.64402],[-105.63159,31.08383],[-106.1429,31.39995],[-106.50759,31.75452],[-108.24,31.754854],[-108.24194,31.34222],[-109.035,31.34194],[-111.02361,31.33472],[-113.30498,32.03914],[-114.815,32.52528],[-114.72139,32.72083],[-115.99135,32.61239],[-117.12776,32.53534],[-117.295938,33.046225],[-117.944,33.621236],[-118.410602,33.740909],[-118.519895,34.027782],[-119.081,34.078],[-119.438841,34.348477],[-120.36778,34.44711],[-120.62286,34.60855],[-120.74433,35.15686],[-121.71457,36.16153],[-122.54747,37.55176],[-122.51201,37.78339],[-122.95319,38.11371],[-123.7272,38.95166],[-123.86517,39.76699],[-124.39807,40.3132],[-124.17886,41.14202],[-124.2137,41.99964],[-124.53284,42.76599],[-124.14214,43.70838],[-124.020535,44.615895],[-123.89893,45.52341],[-124.079635,46.86475],[-124.39567,47.72017],[-124.68721,48.184433],[-124.566101,48.379715],[-123.12,48.04],[-122.58736,47.096],[-122.34,47.36],[-122.5,48.18],[-122.84,49],[-120,49],[-117.03121,49],[-116.04818,49],[-113,49],[-110.05,49],[-107.05,49],[-104.04826,48.99986],[-100.65,49],[-97.22872,49.0007],[-95.15907,49],[-95.15609,49.38425],[-94.81758,49.38905]]],[[[-153.006314,57.115842],[-154.00509,56.734677],[-154.516403,56.992749],[-154.670993,57.461196],[-153.76278,57.816575],[-153.228729,57.968968],[-152.564791,57.901427],[-152.141147,57.591059],[-153.006314,57.115842]]],[[[-165.579164,59.909987],[-166.19277,59.754441],[-166.848337,59.941406],[-167.455277,60.213069],[-166.467792,60.38417],[-165.67443,60.293607],[-165.579164,59.909987]]],[[[-171.731657,63.782515],[-171.114434,63.592191],[-170.491112,63.694975],[-169.682505,63.431116],[-168.689439,63.297506],[-168.771941,63.188598],[-169.52944,62.976931],[-170.290556,63.194438],[-170.671386,63.375822],[-171.553063,63.317789],[-171.791111,63.405846],[-171.731657,63.782515]]],[[[-155.06779,71.147776],[-154.344165,70.696409],[-153.900006,70.889989],[-152.210006,70.829992],[-152.270002,70.600006],[-150.739992,70.430017],[-149.720003,70.53001],[-147.613362,70.214035],[-145.68999,70.12001],[-144.920011,69.989992],[-143.589446,70.152514],[-142.07251,69.851938],[-140.985988,69.711998],[-140.992499,66.000029],[-140.99777,60.306397],[-140.012998,60.276838],[-139.039,60.000007],[-138.34089,59.56211],[-137.4525,58.905],[-136.47972,59.46389],[-135.47583,59.78778],[-134.945,59.27056],[-134.27111,58.86111],[-133.355549,58.410285],[-132.73042,57.69289],[-131.70781,56.55212],[-130.00778,55.91583],[-129.979994,55.284998],[-130.53611,54.802753],[-131.085818,55.178906],[-131.967211,55.497776],[-132.250011,56.369996],[-133.539181,57.178887],[-134.078063,58.123068],[-135.038211,58.187715],[-136.628062,58.212209],[-137.800006,58.499995],[-139.867787,59.537762],[-140.825274,59.727517],[-142.574444,60.084447],[-143.958881,59.99918],[-145.925557,60.45861],[-147.114374,60.884656],[-148.224306,60.672989],[-148.018066,59.978329],[-148.570823,59.914173],[-149.727858,59.705658],[-150.608243,59.368211],[-151.716393,59.155821],[-151.859433,59.744984],[-151.409719,60.725803],[-150.346941,61.033588],[-150.621111,61.284425],[-151.895839,60.727198],[-152.57833,60.061657],[-154.019172,59.350279],[-153.287511,58.864728],[-154.232492,58.146374],[-155.307491,57.727795],[-156.308335,57.422774],[-156.556097,56.979985],[-158.117217,56.463608],[-158.433321,55.994154],[-159.603327,55.566686],[-160.28972,55.643581],[-161.223048,55.364735],[-162.237766,55.024187],[-163.069447,54.689737],[-164.785569,54.404173],[-164.942226,54.572225],[-163.84834,55.039431],[-162.870001,55.348043],[-161.804175,55.894986],[-160.563605,56.008055],[-160.07056,56.418055],[-158.684443,57.016675],[-158.461097,57.216921],[-157.72277,57.570001],[-157.550274,58.328326],[-157.041675,58.918885],[-158.194731,58.615802],[-158.517218,58.787781],[-159.058606,58.424186],[-159.711667,58.93139],[-159.981289,58.572549],[-160.355271,59.071123],[-161.355003,58.670838],[-161.968894,58.671665],[-162.054987,59.266925],[-161.874171,59.633621],[-162.518059,59.989724],[-163.818341,59.798056],[-164.662218,60.267484],[-165.346388,60.507496],[-165.350832,61.073895],[-166.121379,61.500019],[-165.734452,62.074997],[-164.919179,62.633076],[-164.562508,63.146378],[-163.753332,63.219449],[-163.067224,63.059459],[-162.260555,63.541936],[-161.53445,63.455817],[-160.772507,63.766108],[-160.958335,64.222799],[-161.518068,64.402788],[-160.777778,64.788604],[-161.391926,64.777235],[-162.45305,64.559445],[-162.757786,64.338605],[-163.546394,64.55916],[-164.96083,64.446945],[-166.425288,64.686672],[-166.845004,65.088896],[-168.11056,65.669997],[-166.705271,66.088318],[-164.47471,66.57666],[-163.652512,66.57666],[-163.788602,66.077207],[-161.677774,66.11612],[-162.489715,66.735565],[-163.719717,67.116395],[-164.430991,67.616338],[-165.390287,68.042772],[-166.764441,68.358877],[-166.204707,68.883031],[-164.430811,68.915535],[-163.168614,69.371115],[-162.930566,69.858062],[-161.908897,70.33333],[-160.934797,70.44769],[-159.039176,70.891642],[-158.119723,70.824721],[-156.580825,71.357764],[-155.06779,71.147776]]]]}},
{"type":"Feature","id":"UZB","properties":{"name":"Uzbekistan"},"geometry":{"type":"Polygon","coordinates":[[[66.518607,37.362784],[66.54615,37.974685],[65.215999,38.402695],[64.170223,38.892407],[63.518015,39.363257],[62.37426,40.053886],[61.882714,41.084857],[61.547179,41.26637],[60.465953,41.220327],[60.083341,41.425146],[59.976422,42.223082],[58.629011,42.751551],[57.78653,42.170553],[56.932215,41.826026],[57.096391,41.32231],[55.968191,41.308642],[55.928917,44.995858],[58.503127,45.586804],[58.689989,45.500014],[60.239972,44.784037],[61.05832,44.405817],[62.0133,43.504477],[63.185787,43.650075],[64.900824,43.728081],[66.098012,42.99766],[66.023392,41.994646],[66.510649,41.987644],[66.714047,41.168444],[67.985856,41.135991],[68.259896,40.662325],[68.632483,40.668681],[69.070027,41.384244],[70.388965,42.081308],[70.962315,42.266154],[71.259248,42.167711],[70.420022,41.519998],[71.157859,41.143587],[71.870115,41.3929],[73.055417,40.866033],[71.774875,40.145844],[71.014198,40.244366],[70.601407,40.218527],[70.45816,40.496495],[70.666622,40.960213],[69.329495,40.727824],[69.011633,40.086158],[68.536416,39.533453],[67.701429,39.580478],[67.44222,39.140144],[68.176025,38.901553],[68.392033,38.157025],[67.83,37.144994],[67.075782,37.356144],[66.518607,37.362784]]]}},
{"type":"Feature","id":"VEN","properties":{"name":"Venezuela"},"geometry":{"type":"Polygon","coordinates":[[[-71.331584,11.776284],[-71.360006,11.539994],[-71.94705,11.423282],[-71.620868,10.96946],[-71.633064,10.446494],[-72.074174,9.865651],[-71.695644,9.072263],[-71.264559,9.137195],[-71.039999,9.859993],[-71.350084,10.211935],[-71.400623,10.968969],[-70.155299,11.375482],[-70.293843,11.846822],[-69.943245,12.162307],[-69.5843,11.459611],[-68.882999,11.443385],[-68.233271,10.885744],[-68.194127,10.554653],[-67.296249,10.545868],[-66.227864,10.648627],[-65.655238,10.200799],[-64.890452,10.077215],[-64.329479,10.389599],[-64.318007,10.641418],[-63.079322,10.701724],[-61.880946,10.715625],[-62.730119,10.420269],[-62.388512,9.948204],[-61.588767,9.873067],[-60.830597,9.38134],[-60.671252,8.580174],[-60.150096,8.602757],[-59.758285,8.367035],[-60.550588,7.779603],[-60.637973,7.415],[-60.295668,7.043911],[-60.543999,6.856584],[-61.159336,6.696077],[-61.139415,6.234297],[-61.410303,5.959068],[-60.733574,5.200277],[-60.601179,4.918098],[-60.966893,4.536468],[-62.08543,4.162124],[-62.804533,4.006965],[-63.093198,3.770571],[-63.888343,4.02053],[-64.628659,4.148481],[-64.816064,4.056445],[-64.368494,3.79721],[-64.408828,3.126786],[-64.269999,2.497006],[-63.422867,2.411068],[-63.368788,2.2009],[-64.083085,1.916369],[-64.199306,1.492855],[-64.611012,1.328731],[-65.354713,1.095282],[-65.548267,0.789254],[-66.325765,0.724452],[-66.876326,1.253361],[-67.181294,2.250638],[-67.447092,2.600281],[-67.809938,2.820655],[-67.303173,3.318454],[-67.337564,3.542342],[-67.621836,3.839482],[-67.823012,4.503937],[-67.744697,5.221129],[-67.521532,5.55687],[-67.34144,6.095468],[-67.695087,6.267318],[-68.265052,6.153268],[-68.985319,6.206805],[-69.38948,6.099861],[-70.093313,6.960376],[-70.674234,7.087785],[-71.960176,6.991615],[-72.198352,7.340431],[-72.444487,7.423785],[-72.479679,7.632506],[-72.360901,8.002638],[-72.439862,8.405275],[-72.660495,8.625288],[-72.78873,9.085027],[-73.304952,9.152],[-73.027604,9.73677],[-72.905286,10.450344],[-72.614658,10.821975],[-72.227575,11.108702],[-71.973922,11.608672],[-71.331584,11.776284]]]}},
{"type":"Feature","id":"VNM","properties":{"name":"Vietnam"},"geometry":{"type":"Polygon","coordinates":[[[108.05018,21.55238],[106.715068,20.696851],[105.881682,19.75205],[105.662006,19.058165],[106.426817,18.004121],[107.361954,16.697457],[108.269495,16.079742],[108.877107,15.276691],[109.33527,13.426028],[109.200136,11.666859],[108.36613,11.008321],[107.220929,10.364484],[106.405113,9.53084],[105.158264,8.59976],[104.795185,9.241038],[105.076202,9.918491],[104.334335,10.486544],[105.199915,10.88931],[106.24967,10.961812],[105.810524,11.567615],[107.491403,12.337206],[107.614548,13.535531],[107.382727,14.202441],[107.564525,15.202173],[107.312706,15.908538],[106.556008,16.604284],[105.925762,17.485315],[105.094598,18.666975],[103.896532,19.265181],[104.183388,19.624668],[104.822574,19.886642],[104.435,20.758733],[103.203861,20.766562],[102.754896,21.675137],[102.170436,22.464753],[102.706992,22.708795],[103.504515,22.703757],[104.476858,22.81915],[105.329209,23.352063],[105.811247,22.976892],[106.725403,22.794268],[106.567273,22.218205],[107.04342,21.811899],[108.05018,21.55238]]]}},
{"type":"Feature","id":"VUT","properties":{"name":"Vanuatu"},"geometry":{"type":"MultiPolygon","coordinates":[[[[167.844877,-16.466333],[167.515181,-16.59785],[167.180008,-16.159995],[167.216801,-15.891846],[167.844877,-16.466333]]],[[[167.107712,-14.93392],[167.270028,-15.740021],[167.001207,-15.614602],[166.793158,-15.668811],[166.649859,-15.392704],[166.629137,-14.626497],[167.107712,-14.93392]]]]}},
{"type":"Feature","id":"PSE","properties":{"name":"West Bank"},"geometry":{"type":"Polygon","coordinates":[[[35.545665,32.393992],[35.545252,31.782505],[35.397561,31.489086],[34.927408,31.353435],[34.970507,31.616778],[35.225892,31.754341],[34.974641,31.866582],[35.18393,32.532511],[35.545665,32.393992]]]}},
{"type":"Feature","id":"YEM","properties":{"name":"Yemen"},"geometry":{"type":"Polygon","coordinates":[[[53.108573,16.651051],[52.385206,16.382411],[52.191729,15.938433],[52.168165,15.59742],[51.172515,15.17525],[49.574576,14.708767],[48.679231,14.003202],[48.238947,13.94809],[47.938914,14.007233],[47.354454,13.59222],[46.717076,13.399699],[45.877593,13.347764],[45.62505,13.290946],[45.406459,13.026905],[45.144356,12.953938],[44.989533,12.699587],[44.494576,12.721653],[44.175113,12.58595],[43.482959,12.6368],[43.222871,13.22095],[43.251448,13.767584],[43.087944,14.06263],[42.892245,14.802249],[42.604873,15.213335],[42.805015,15.261963],[42.702438,15.718886],[42.823671,15.911742],[42.779332,16.347891],[43.218375,16.66689],[43.115798,17.08844],[43.380794,17.579987],[43.791519,17.319977],[44.062613,17.410359],[45.216651,17.433329],[45.399999,17.333335],[46.366659,17.233315],[46.749994,17.283338],[47.000005,16.949999],[47.466695,17.116682],[48.183344,18.166669],[49.116672,18.616668],[52.00001,19.000003],[52.782184,17.349742],[53.108573,16.651051]]]}},
{"type":"Feature","id":"ZAF","properties":{"name":"South Africa"},"geometry":{"type":"Polygon","coordinates":[[[31.521001,-29.257387],[31.325561,-29.401978],[30.901763,-29.909957],[30.622813,-30.423776],[30.055716,-31.140269],[28.925553,-32.172041],[28.219756,-32.771953],[27.464608,-33.226964],[26.419452,-33.61495],[25.909664,-33.66704],[25.780628,-33.944646],[25.172862,-33.796851],[24.677853,-33.987176],[23.594043,-33.794474],[22.988189,-33.916431],[22.574157,-33.864083],[21.542799,-34.258839],[20.689053,-34.417175],[20.071261,-34.795137],[19.616405,-34.819166],[19.193278,-34.462599],[18.855315,-34.444306],[18.424643,-33.997873],[18.377411,-34.136521],[18.244499,-33.867752],[18.25008,-33.281431],[17.92519,-32.611291],[18.24791,-32.429131],[18.221762,-31.661633],[17.566918,-30.725721],[17.064416,-29.878641],[17.062918,-29.875954],[16.344977,-28.576705],[16.824017,-28.082162],[17.218929,-28.355943],[17.387497,-28.783514],[17.836152,-28.856378],[18.464899,-29.045462],[19.002127,-28.972443],[19.894734,-28.461105],[19.895768,-24.76779],[20.165726,-24.917962],[20.758609,-25.868136],[20.66647,-26.477453],[20.889609,-26.828543],[21.605896,-26.726534],[22.105969,-26.280256],[22.579532,-25.979448],[22.824271,-25.500459],[23.312097,-25.26869],[23.73357,-25.390129],[24.211267,-25.670216],[25.025171,-25.71967],[25.664666,-25.486816],[25.765849,-25.174845],[25.941652,-24.696373],[26.485753,-24.616327],[26.786407,-24.240691],[27.11941,-23.574323],[28.017236,-22.827754],[29.432188,-22.091313],[29.839037,-22.102216],[30.322883,-22.271612],[30.659865,-22.151567],[31.191409,-22.25151],[31.670398,-23.658969],[31.930589,-24.369417],[31.752408,-25.484284],[31.837778,-25.843332],[31.333158,-25.660191],[31.04408,-25.731452],[30.949667,-26.022649],[30.676609,-26.398078],[30.685962,-26.743845],[31.282773,-27.285879],[31.86806,-27.177927],[32.071665,-26.73382],[32.83012,-26.742192],[32.580265,-27.470158],[32.462133,-28.301011],[32.203389,-28.752405],[31.521001,-29.257387]],[[28.978263,-28.955597],[28.5417,-28.647502],[28.074338,-28.851469],[27.532511,-29.242711],[26.999262,-29.875954],[27.749397,-30.645106],[28.107205,-30.545732],[28.291069,-30.226217],[28.8484,-30.070051],[29.018415,-29.743766],[29.325166,-29.257387],[28.978263,-28.955597]]]}},
{"type":"Feature","id":"ZMB","properties":{"name":"Zambia"},"geometry":{"type":"Polygon","coordinates":[[[32.759375,-9.230599],[33.231388,-9.676722],[33.485688,-10.525559],[33.31531,-10.79655],[33.114289,-11.607198],[33.306422,-12.435778],[32.991764,-12.783871],[32.688165,-13.712858],[33.214025,-13.97186],[30.179481,-14.796099],[30.274256,-15.507787],[29.516834,-15.644678],[28.947463,-16.043051],[28.825869,-16.389749],[28.467906,-16.4684],[27.598243,-17.290831],[27.044427,-17.938026],[26.706773,-17.961229],[26.381935,-17.846042],[25.264226,-17.73654],[25.084443,-17.661816],[25.07695,-17.578823],[24.682349,-17.353411],[24.033862,-17.295843],[23.215048,-17.523116],[22.562478,-16.898451],[21.887843,-16.08031],[21.933886,-12.898437],[24.016137,-12.911046],[23.930922,-12.565848],[24.079905,-12.191297],[23.904154,-11.722282],[24.017894,-11.237298],[23.912215,-10.926826],[24.257155,-10.951993],[24.314516,-11.262826],[24.78317,-11.238694],[25.418118,-11.330936],[25.75231,-11.784965],[26.553088,-11.92444],[27.16442,-11.608748],[27.388799,-12.132747],[28.155109,-12.272481],[28.523562,-12.698604],[28.934286,-13.248958],[29.699614,-13.257227],[29.616001,-12.178895],[29.341548,-12.360744],[28.642417,-11.971569],[28.372253,-11.793647],[28.49607,-10.789884],[28.673682,-9.605925],[28.449871,-9.164918],[28.734867,-8.526559],[29.002912,-8.407032],[30.346086,-8.238257],[30.740015,-8.340007],[31.157751,-8.594579],[31.556348,-8.762049],[32.191865,-8.930359],[32.759375,-9.230599]]]}},
{"type":"Feature","id":"ZWE","properties":{"name":"Zimbabwe"},"geometry":{"type":"Polygon","coordinates":[[[31.191409,-22.25151],[30.659865,-22.151567],[30.322883,-22.271612],[29.839037,-22.102216],[29.432188,-22.091313],[28.794656,-21.639454],[28.02137,-21.485975],[27.727228,-20.851802],[27.724747,-20.499059],[27.296505,-20.39152],[26.164791,-19.293086],[25.850391,-18.714413],[25.649163,-18.536026],[25.264226,-17.73654],[26.381935,-17.846042],[26.706773,-17.961229],[27.044427,-17.938026],[27.598243,-17.290831],[28.467906,-16.4684],[28.825869,-16.389749],[28.947463,-16.043051],[29.516834,-15.644678],[30.274256,-15.507787],[30.338955,-15.880839],[31.173064,-15.860944],[31.636498,-16.07199],[31.852041,-16.319417],[32.328239,-16.392074],[32.847639,-16.713398],[32.849861,-17.979057],[32.654886,-18.67209],[32.611994,-19.419383],[32.772708,-19.715592],[32.659743,-20.30429],[32.508693,-20.395292],[32.244988,-21.116489],[31.191409,-22.25151]]]}}
]}
================================================
FILE: src/test/resources/geojson/multipolygon/example.geojson
================================================
{ "type": "FeatureCollection",
"features": [
{ "type": "Feature",
"geometry": {
"type": "MultiPolygon",
"coordinates": [
[[[102.0, 2.0], [103.0, 2.0], [103.0, 3.0], [102.0, 3.0], [102.0, 2.0]]],
[
[[100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0]],
[[100.2, 0.2], [100.8, 0.2], [100.8, 0.8], [100.2, 0.8], [100.2, 0.2]]
]
]
},
"properties": {
"prop0": "value0",
"prop1": {"this": "that"}
}
}
]
}
================================================
FILE: src/test/resources/geojson/point/point.geojson
================================================
{ "type": "FeatureCollection",
"features": [
{ "type": "Feature",
"geometry": {"type": "Point", "coordinates": [102.0, 0.5]},
"properties": {"prop0": "value0"}
}
]
}
================================================
FILE: src/test/resources/geojson/point-double-int/point.geojson
================================================
{ "type": "FeatureCollection",
"features": [
{ "type": "Feature",
"geometry": {"type": "Point", "coordinates": [102.0, 1]},
"properties": {"prop0": "value0"}
}
]
}
================================================
FILE: src/test/resources/geojson/point-int-double/point.geojson
================================================
{ "type": "FeatureCollection",
"features": [
{ "type": "Feature",
"geometry": {"type": "Point", "coordinates": [102, 0.5]},
"properties": {"prop0": "value0"}
}
]
}
================================================
FILE: src/test/resources/geojson/point-int-int/point.geojson
================================================
{ "type": "FeatureCollection",
"features": [
{ "type": "Feature",
"geometry": {"type": "Point", "coordinates": [102, 5]},
"properties": {"prop0": "value0"}
}
]
}
================================================
FILE: src/test/resources/geojson/polygon/example.geojson
================================================
{ "type": "FeatureCollection",
"features": [
{ "type": "Feature",
"geometry": {
"type": "Polygon",
"coordinates": [
[ [100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0] ],
[ [100.2, 0.2], [100.8, 0.2], [100.8, 0.8], [100.2, 0.8], [100.2, 0.2] ]
]
},
"properties": {
"prop0": "value0",
"prop1": {"this": "that"}
}
}
]
}
================================================
FILE: src/test/resources/geojson/polygon-double-int/example.geojson
================================================
{ "type": "FeatureCollection",
"features": [
{ "type": "Feature",
"geometry": {
"type": "Polygon",
"coordinates": [
[ [100.0, 0.0], [101.0, 0], [101.0, 1.0], [100.0, 1], [100.0, 0.0] ],
[ [100.2, 0.2], [100.8, 0.2], [100.8, 0.8], [100.2, 0.8], [100.2, 0.2] ]
]
},
"properties": {
"prop0": "value0",
"prop1": {"this": "that"}
}
}
]
}
================================================
FILE: src/test/resources/geojson/polygon-int-double/example.geojson
================================================
{ "type": "FeatureCollection",
"features": [
{ "type": "Feature",
"geometry": {
"type": "Polygon",
"coordinates": [
[ [100, 0.0], [101, 0.0], [101.0, 1.0], [100.0, 1.0], [100, 0.0] ],
[ [100.2, 0.2], [100.8, 0.2], [100.8, 0.8], [100.2, 0.8], [100.2, 0.2] ]
]
},
"properties": {
"prop0": "value0",
"prop1": {"this": "that"}
}
}
]
}
================================================
FILE: src/test/resources/geojson/polygon-int-int/example.geojson
================================================
{ "type": "FeatureCollection",
"features": [
{ "type": "Feature",
"geometry": {
"type": "Polygon",
"coordinates": [
[ [100, 0], [101, 0], [101, 1.0], [100.0, 1.0], [100.0, 0] ],
[ [100.2, 0.2], [100.8, 0.2], [100.8, 0.8], [100.2, 0.8], [100.2, 0.2] ]
]
},
"properties": {
"prop0": "value0",
"prop1": {"this": "that"}
}
}
]
}
================================================
FILE: src/test/resources/osm/combination/example.osm
================================================
================================================
FILE: src/test/resources/osm/linestring/example.osm
================================================
The data included in this document is from www.openstreetmap.org. The data is made available under ODbL.
================================================
FILE: src/test/resources/osm/point/example.osm
================================================
The data included in this document is from www.openstreetmap.org. The data is made available under ODbL.
================================================
FILE: src/test/resources/osm/polygon/example.osm
================================================
The data included in this document is from www.openstreetmap.org. The data is made available under ODbL.
================================================
FILE: src/test/resources/shapefiles/us_states/tl_2016_us_state.cpg
================================================
UTF-8
================================================
FILE: src/test/resources/shapefiles/us_states/tl_2016_us_state.prj
================================================
GEOGCS["GCS_North_American_1983",DATUM["D_North_American_1983",SPHEROID["GRS_1980",6378137,298.257222101]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]]
================================================
FILE: src/test/resources/shapefiles/us_states/tl_2016_us_state.shp
================================================
[File too large to display: 13.9 MB]
================================================
FILE: src/test/resources/shapefiles/us_states/tl_2016_us_state.shp.ea.iso.xml
================================================
Feature Catalog for the Current State and Equivalent National
The Current State and Equivalent National contains attributes for the primary governmental divisions of the United States. In addition to the fifty States, the Census Bureau treats the District of Columbia, Puerto Rico, and each of the Island Areas (American Samoa, the Commonwealth of the Northern Mariana Islands, Guam, and the U.S. Virgin Islands) as the statistical equivalents of States for the purpose of data presentation.
2016
2016-06-01
eng
utf8
STATE.shp
Current State and Equivalent National entities
false
REGION
Current Census region code
1
Northeast
2
Midwest
3
South
4
West
9
Puerto Rico and the Island Areas
DIVISION
Current Census division code
0
Puerto Rico and the Island Areas
1
New England
2
Middle Atlantic
3
East North Central
4
West North Central
5
South Atlantic
6
East South Central
7
West South Central
8
Mountain
9
Pacific
STATEFP
Current state Federal Information Processing Series (FIPS) code
National Standard Codes (ANSI INCITS 38-2009), Federal Information Processing Series (FIPS) - States/State Equivalents
STATENS
Current state GNIS code
INCITS 446:2008 (Geographic Names Information System (GNIS)), Identifying Attributes for Named Physical and Cultural Geographic Features (Except Roads and Highways) of the United States, Its Territories, Outlying Areas, and Freely Associated Areas, and the Waters of the Same to the Limit of the Twelve-Mile Statutory Zone
U.S. Geological Survey (USGS)
resourceProvider
GEOID
State identifier; state FIPS code
National Standard Codes (ANSI INCITS 38-2009), Federal Information Processing
STUSPS
Current United States Postal Service state abbreviation
U.S. Postal Service
resourceProvider
Publication 28 - Postal Addressing Standards
U.S. Postal Service
resourceProvider
NAME
Current state name
National Standard Codes (ANSI INCITS 38-2009), Federal Information Processing Series (FIPS) - States/State Equivalents
LSAD
Current legal/statistical area description code for state
00
Blank
MTFCC
MAF/TIGER feature class code
G4000
State or Equivalent feature
FUNCSTAT
Current functional status
A
Active government providing primary general-purpose functions
ALAND
Current land area (square meters)
Range Domain Minimum: 0
Range Domain Maximum: 9,999,999,999,999
AWATER
Current water area (square meters)
Range Domain Minimum: 0
Range Domain Maximum: 9,999,999,999,999
INTPTLAT
Current latitude of the internal point
Range Domain Minimum: -90.000000
Range Domain Maximum: 90.000000
INTPTLON
Current longitude of the internal point
Range Domain Minimum: -180.000000
Range Domain Maximum: 180.000000
================================================
FILE: src/test/resources/shapefiles/us_states/tl_2016_us_state.shp.iso.xml
================================================
tl_2016_us_state.shp.iso.xml
eng
8859part1
dataset
2016-06-01
ISO 19115 Geographic Information - Metadata
2009-02-15
http://www2.census.gov/geo/tiger/TIGER2016/STATE/tl_2016_us_state.zip
complex
56
Federal Information Processing Series (FIPS), Geographic Names Information System (GNIS), and feature names.
TIGER/Line Shapefile, 2016, nation, U.S., Current State and Equivalent National
2016
publication
2016
The TIGER/Line shapefiles and related database files (.dbf) are an extract of selected geographic and cartographic information from the U.S. Census Bureau's Master Address File / Topologically Integrated Geographic Encoding and Referencing (MAF/TIGER) Database (MTDB). The MTDB represents a seamless national file with no overlaps or gaps between parts, however, each TIGER/Line shapefile is designed to stand alone as an independent data set, or they can be combined to cover the entire nation.
States and equivalent entities are the primary governmental divisions of the United States. In addition to the fifty States, the Census Bureau treats the District of Columbia, Puerto Rico, and each of the Island Areas (American Samoa, the Commonwealth of the Northern Mariana Islands, Guam, and the U.S. Virgin Islands) as the statistical equivalents of States for the purpose of data presentation.
In order for others to use the information in the Census MAF/TIGER database in a geographic information system (GIS) or for other geographic applications, the Census Bureau releases to the public extracts of the database in the form of TIGER/Line Shapefiles.
completed
notPlanned
http://tigerweb.geo.census.gov/arcgis/services/TIGERweb/tigerWMS_Current/MapServer/WmsServer?REQUEST=GetMap&SERVICE=WMS&VERSION=1.3.0&LAYERS=States,States Labels&STYLES=default,default&FORMAT=image/svg+xml&BGCOLOR=0xFFFFFF&TRANSPARENT=TRUE&CRS=EPSG:4326&BBOX=32.860571,-113.5097542,46.389131,-113.509754&WIDTH=891&HEIGHT=751
URL for the TigerWeb Web Mapping Service
URL for the TigerWeb Web Mapping Service
NGDA
Governmental Units and Administrative and Statistical Boundaries Theme
National Geospatial Data Asset
theme
NGDA Portfolio Themes
Nation
Polygon
theme
None
United States
U.S.
place
ANSI INCITS 38:2009 (Formerly FIPS 5-2),
ANSI INCITS 31:2009 (Formerly FIPS 6-4),ANSI
INCITS 454:2009 (Formerly FIPS 8-6), ANSI INCITS
455:2009(Formerly FIPS 9-1), ANSI INCITS 446:2008 (Geographic Names Information System (GNIS))
otherRestrictions
Access Constraints: None
Use Constraints:The TIGER/Line Shapefile products are not copyrighted however TIGER/Line and Census TIGER are registered trademarks of the U.S. Census Bureau. These products are free to use in a product or publication, however acknowledgement must be given to the U.S. Census Bureau as the source.
The boundary information in the TIGER/Line Shapefiles are for statistical data collection and tabulation purposes only; their depiction and designation for statistical purposes does not constitute a determination of jurisdictional authority or rights of ownership or entitlement and they are not legal land descriptions.Coordinates in the TIGER/Line shapefiles have six implied decimal places, but the positional accuracy of these coordinates is not as great as the six decimal places suggest.
vector
eng
8859part1
boundaries
The TIGER/Line shapefiles contain geographic data only and do not include display mapping software or statistical data. For information on how to use the TIGER/Line shapefile data with specific software package users shall contact the company that produced the software.
-179.231086
179.859681
-14.601813
71.441059
Publication Date
2015-06
2016-05
true
Current State and Equivalent
Feature Catalog for the 2016 TIGER/Line Shapefile Current State and Equivalent National
2016
http://meta.geo.census.gov/data/existing/decennial/GEO/GPMB/TIGERline/TIGER2016/state/tl_2016_state.shp.ea.iso.xml
TGRSHP (compressed)
PK-ZIP, version 1.93 A or higher
html
WMS
1.3.0
REST
The online copy of the TIGER/Line Shapefiles may be accessed without charge.
To obtain more information about ordering TIGER/Line Shapefiles visit http://www.census.gov/geo/www/tiger
http://www2.census.gov/geo/tiger/TIGER2016/STATE/tl_2016_us_state.zip
Shapefile Zip File
http://www.census.gov/geo/maps-data/data/tiger-line.html
TIGER/Line® Shapefiles
Should be used for most mapping projects--this is our most comprehensive dataset. Designed for use with GIS (geographic information systems).
http://tigerweb.geo.census.gov/arcgis/services/TIGERweb/tigerWMS_Current/MapServer/WmsServer?REQUEST=GetMap&SERVICE=WMS&VERSION=1.3.0 &LAYERS=States,States Labels&STYLES=default,default&FORMAT=image/svg+xml&BGCOLOR=0xFFFFFF&TRANSPARENT=TRUE&CRS=EPSG:4326&BBOX=41.187053,-72.508142,42.88679,-69.858861&WIDTH=891&HEIGHT=751
http://opengis.net/spec/wms
TIGERweb/tigerWMS_Current (MapServer)
This web mapping service contains the layer for the States and Equivalents. Since this layer displays at scales of 1:36,978,595 or greater, adjusting the BBox coordinates in the URL is necessary
download
https://tigerweb.geo.census.gov/arcgis/rest/services/TIGERweb/State_County/MapServer
http://www.geoplatform.gov/spec/esri-map-rest
TIGERweb/State_County (MapServer)
This Rest Service contains the States and Equivalents Layers
download
dataset
Data completeness of the TIGER/Line Shapefiles reflects the contents of the Census MAF/TIGER database at the time the TIGER/Line Shapefiles were created.
The Census Bureau performed automated tests to ensure logical consistency and limits of shapefiles. Segments making up the outer and inner boundaries of a polygon tie end-to-end to completely enclose the area. All polygons are tested for closure.
The Census Bureau uses its internally developed geographic update system to enhance and modify spatial and attribute data in the Census MAF/TIGER database. Standard geographic codes, such as FIPS codes for states, counties, municipalities, county subdivisions, places, American Indian/Alaska Native/Native Hawaiian areas, and congressional districts are used when encoding spatial entities. The Census Bureau performed spatial data tests for logical consistency of the codes during the compilation of the original Census MAF/TIGER database files. Most of the codes for geographic entities except states, counties, urban areas, Core Based Statistical Areas (CBSAs), American Indian Areas (AIAs), and congressional districts were provided to the Census Bureau by the USGS, the agency responsible for maintaining the Geographic Names Information System (GNIS). Feature attribute information has been examined but has not been fully tested for consistency.
For the TIGER/Line Shapefiles, the Point and Vector Object Count for the G-polygon SDTS Point and Vector Object Type reflects the number of records in the shapefile attribute table. For multi-polygon features, only one attribute record exists for each multi-polygon rather than one attribute record per individual G-polygon component of the multi-polygon feature. TIGER/Line Shapefile multi-polygons are an exception to the G-polygon object type classification. Therefore, when multi-polygons exist in a shapefile, the object count will be less than the actual number of G-polygons.
TIGER/Line Shapefiles are extracted from the Census MAF/TIGER database by nation, state, county, and entity. Census MAF/TIGER data for all of the aforementioned geographic entities are then distributed among the shapefiles each containing attributes for line, polygon, or landmark geographic data.
2016-01-01T00:00:00
online
Census MAF/TIGER database
MAF/TIGER
201605
Publication Date
U.S. Department of Commerce, U.S. Census Bureau, Geography Division
originator
Source Contribution: All line segments
notPlanned
This was transformed from the Census Metadata Import Format
================================================
FILE: src/test/resources/shapefiles/us_states/tl_2016_us_state.shp.xml
================================================
U.S. Department of Commerce, U.S. Census Bureau, Geography
Division
2016
TIGER/Line Shapefile, 2016, nation, U.S., Current State and Equivalent National
2016
vector digital data
http://www2.census.gov/geo/tiger/TIGER2016/STATE/tl_2016_us_state.zip
The TIGER/Line shapefiles and related database files (.dbf) are an extract of selected geographic and cartographic information from the U.S. Census Bureau's Master Address File / Topologically Integrated Geographic Encoding and Referencing (MAF/TIGER) Database (MTDB). The MTDB represents a seamless national file with no overlaps or gaps between parts, however, each TIGER/Line shapefile is designed to stand alone as an independent data set, or they can be combined to cover the entire nation.
States and equivalent entities are the primary governmental divisions of the United States. In addition to the fifty States, the Census Bureau treats the District of Columbia, Puerto Rico, and each of the Island Areas (American Samoa, the Commonwealth of the Northern Mariana Islands, Guam, and the U.S. Virgin Islands) as the statistical equivalents of States for the purpose of data presentation.
In order for others to use the information in the Census MAF/TIGER database in a geographic information system (GIS) or for other geographic applications, the Census Bureau releases to the public extracts of the database in the form of TIGER/Line Shapefiles.
201506
201605
Publication Date
No changes or updates will be made to this version of the TIGER/Line Shapefiles. Future releases of TIGER/Line Shapefiles will reflect updates made to the Census MAF/TIGER database.
-179.231086
179.859681
71.441059
-14.601813
NGDA Portfolio Themes
NGDA
Governmental Units and Administrative and Statistical Boundaries Theme
National Geospatial Data Asset
None
Nation
Polygon
ISO 19115 Topic Categories
Boundaries
ANSI INCITS 38:2009 (Formerly FIPS 5-2),
ANSI INCITS 31:2009 (Formerly FIPS 6-4),ANSI
INCITS 454:2009 (Formerly FIPS 8-6), ANSI INCITS
455:2009(Formerly FIPS 9-1), ANSI INCITS 446:2008 (Geographic Names Information System (GNIS))
United States
U.S.
None
The TIGER/Line Shapefile products are not copyrighted however TIGER/Line and Census TIGER are registered trademarks of the U.S. Census Bureau. These products are free to use in a product or publication, however acknowledgement must be given to the U.S. Census Bureau as the source.
The boundary information in the TIGER/Line Shapefiles are for statistical data collection and tabulation purposes only; their depiction and designation for statistical purposes does not constitute a determination of jurisdictional authority or rights of ownership or entitlement and they are not legal land descriptions.Coordinates in the TIGER/Line shapefiles have six implied decimal places, but the positional accuracy of these coordinates is not as great as the six decimal places suggest.
U.S. Department of Commerce, U.S. Census Bureau,
Geography Division, Spatial Data Collection and Products Branch
mailing
4600 Silver Hill Road, Stop 7400
Washington
DC
20233-7400
United States
301-763-1128
301-763-4710
geo.geography@census.gov
Accurate against National Standard Codes, Federal Information Processing (FIPS) and the Geographic Names Information System (GNIS) at the 100% level for the codes and base names. The remaining attribute information has been examined but has not been fully tested for accuracy.
The Census Bureau performed automated tests to ensure logical consistency and limits of shapefiles. Segments making up the outer and inner boundaries of a polygon tie end-to-end to completely enclose the area. All polygons are tested for closure.
The Census Bureau uses its internally developed geographic update system to enhance and modify spatial and attribute data in the Census MAF/TIGER database. Standard geographic codes, such as FIPS codes for states, counties, municipalities, county subdivisions, places, American Indian/Alaska Native/Native Hawaiian areas, and congressional districts are used when encoding spatial entities. The Census Bureau performed spatial data tests for logical consistency of the codes during the compilation of the original Census MAF/TIGER database files. Most of the codes for geographic entities except states, counties, urban areas, Core Based Statistical Areas (CBSAs), American Indian Areas (AIAs), and congressional districts were provided to the Census Bureau by the USGS, the agency responsible for maintaining the Geographic Names Information System (GNIS). Feature attribute information has been examined but has not been fully tested for consistency.
For the TIGER/Line Shapefiles, the Point and Vector Object Count for the G-polygon SDTS Point and Vector Object Type reflects the number of records in the shapefile attribute table. For multi-polygon features, only one attribute record exists for each multi-polygon rather than one attribute record per individual G-polygon component of the multi-polygon feature. TIGER/Line Shapefile multi-polygons are an exception to the G-polygon object type classification. Therefore, when multi-polygons exist in a shapefile, the object count will be less than the actual number of G-polygons.
Data completeness of the TIGER/Line Shapefiles reflects the contents of the Census MAF/TIGER database at the time the TIGER/Line Shapefiles were created.
U.S. Department of Commerce, U.S. Census Bureau, Geography Division
Unpublished material
Census MAF/TIGER database
online
201506
201605
Publication Date
MAF/TIGER
All line segments
TIGER/Line Shapefiles are extracted from the Census MAF/TIGER database by nation, state, county, and entity. Census MAF/TIGER data for all of the aforementioned geographic entities are then distributed among the shapefiles each containing attributes for line, polygon, or landmark geographic data.
MAF/TIGER
2016
Federal Information Processing Series (FIPS), Geographic Names Information System (GNIS), and feature names.
Vector
G-polygon
56
0.000458
0.000458
Decimal degrees
North American Datum of 1983
Geodetic Reference System 80
6378137
298.257
STATE.shp
Current State and Equivalent National entities
U.S. Census Bureau
REGION
Current Census region code
U.S. Census Bureau
1
Northeast
U.S. Census Bureau
2
Midwest
U.S. Census Bureau
3
South
U.S. Census Bureau
4
West
U.S. Census Bureau
9
Puerto Rico and the Island Areas
U.S. Census Bureau
DIVISION
Current Census division code
U.S. Census Bureau
0
Puerto Rico and the Island Areas
U.S. Census Bureau
1
New England
U.S. Census Bureau
2
Middle Atlantic
U.S. Census Bureau
3
East North Central
U.S. Census Bureau
4
West North Central
U.S. Census Bureau
5
South Atlantic
U.S. Census Bureau
6
East South Central
U.S. Census Bureau
7
West South Central
U.S. Census Bureau
8
Mountain
U.S. Census Bureau
9
Pacific
U.S. Census Bureau
STATEFP
Current state Federal Information Processing Series (FIPS) code
U.S. Census Bureau
National Standard Codes (ANSI INCITS 38-2009), Federal Information Processing Series (FIPS) - States/State Equivalents
U.S. Census Bureau
STATENS
Current state GNIS code
U.S. Census Bureau
INCITS 446:2008 (Geographic Names Information System (GNIS)), Identifying Attributes for Named Physical and Cultural Geographic Features (Except Roads and Highways) of the United States, Its Territories, Outlying Areas, and Freely Associated Areas, and the Waters of the Same to the Limit of the Twelve-Mile Statutory Zone
U.S. Geological Survey (USGS)
GEOID
State identifier; state FIPS code
U.S. Census Bureau
National Standard Codes (ANSI INCITS 38-2009), Federal Information Processing
U.S. Census Bureau
STUSPS
Current United States Postal Service state abbreviation
U.S. Postal Service
Publication 28 - Postal Addressing Standards
U.S. Postal Service
NAME
Current state name
U.S. Census Bureau
National Standard Codes (ANSI INCITS 38-2009), Federal Information Processing Series (FIPS) - States/State Equivalents
U.S. Census Bureau
LSAD
Current legal/statistical area description code for state
U.S. Census Bureau
00
Blank
U.S. Census Bureau
MTFCC
MAF/TIGER feature class code
U.S. Census Bureau
G4000
State or Equivalent feature
U.S. Census Bureau
FUNCSTAT
Current functional status
U.S. Census Bureau
A
Active government providing primary general-purpose functions
U.S. Census Bureau
ALAND
Current land area (square meters)
U.S. Census Bureau
0
9,999,999,999,999
AWATER
Current water area (square meters)
U.S. Census Bureau
0
9,999,999,999,999
INTPTLAT
Current latitude of the internal point
U.S. Census Bureau
-90.000000
90.000000
INTPTLON
Current longitude of the internal point
U.S. Census Bureau
-180.000000
180.000000
U.S. Department of Commerce, U.S. Census Bureau, Geography Division, Spatial Data Collection and Products Branch
mailing
4600 Silver Hill Road, Stop 7400
Washington
DC
20233-7400
United States
301-763-1128
301-763-4710
geo.geography@census.gov
No warranty, expressed or implied is made with regard to the accuracy of these data, and no liability is assumed by the U.S. Government in general or the U.S. Census Bureau in specific as to the spatial or attribute accuracy of the data. The act of distribution shall not constitute any such warranty and no responsibility is assumed by the U.S. government in the use of these files. The boundary information in the TIGER/Line Shapefiles is for statistical data collection and tabulation purposes only; their depiction and designation for statistical purposes do not constitute a determination of jurisdictional authority or rights of ownership or entitlement and they are not legal land descriptions.
TGRSHP (compressed)
PK-ZIP, version 1.93 A or higher
http://www2.census.gov/geo/tiger/TIGER2016/STATE/tl_2016_us_state.zip
The online copy of the TIGER/Line Shapefiles may be accessed without charge.
To obtain more information about ordering TIGER/Line Shapefiles visit http://www.census.gov/geo/www/tiger
The TIGER/Line shapefiles contain geographic data only and do not include display mapping software or statistical data. For information on how to use the TIGER/Line shapefile data with specific software package users shall contact the company that produced the software.
20160601
U.S. Department of Commerce, U.S. Census Bureau, Geography Division, Spatial Data Collection and Products Branch
mailing
4600 Silver Hill Road, Stop 7400
Washington
DC
20233-7400
United States
301-763-1128
301-763-4710
geo.geography@census.gov
FGDC Content Standards for Digital Geospatial Metadata
FGDC-STD-001-1998
================================================
FILE: src/test/resources/testindex/testpolygon.json
================================================
{
"xcoordinates": [
-74.169827,
-74.16982257259502,
-74.16707,
-74.16692298859385,
-74.16689000000012,
-74.16685498300495,
-74.16683,
-74.1662330000002,
-74.16529600000013,
-74.1699239999999,
-74.17728227780447,
-74.177331,
-74.177403,
-74.176498,
-74.180721,
-74.17959,
-74.178814,
-74.17933,
-74.18209,
-74.183181,
-74.18464,
-74.185508,
-74.185657,
-74.186093,
-74.188265,
-74.18781,
-74.187074,
-74.18857617827362,
-74.18931802621998,
-74.19056839422565,
-74.19241693823223,
-74.19769,
-74.19407600000011,
-74.19314744545116,
-74.19259213682304,
-74.19240687109111,
-74.19079421662313,
-74.19033522473757,
-74.18946259017152,
-74.18525400000016,
-74.18437133792581,
-74.18431148049358,
-74.18284596715063,
-74.18263398030697,
-74.18158100000011,
-74.177945,
-74.17659400000012,
-74.174888,
-74.17146300000013,
-74.169827
],
"ycoordinates": [
40.561078000000165,
40.56105732753589,
40.54820500000015,
40.54794186193699,
40.5478470000002,
40.54782013764786,
40.54777900000026,
40.54734300000024,
40.54427300000016,
40.54222500000017,
40.54062956404047,
40.54061900000016,
40.54247900000023,
40.5444870000001,
40.54667300000014,
40.54806600000011,
40.549660000000195,
40.54988800000023,
40.55110400000012,
40.55520100000018,
40.55380700000013,
40.55424,
40.554096000000236,
40.554549000000236,
40.55327500000016,
40.552821,
40.552424,
40.55071411555628,
40.55113349616048,
40.55200231804674,
40.55375447720406,
40.55888700000016,
40.56207900000021,
40.56264434676353,
40.56273278867342,
40.56427223094691,
40.56439166722469,
40.563048806038,
40.56364003245209,
40.5645490000003,
40.56516293058547,
40.566526514507046,
40.56665110451759,
40.565555517513644,
40.56531300000027,
40.56398300000019,
40.56324100000026,
40.5628260000002,
40.561375000000226,
40.561078000000165
],
"boundingBox": {
"xmin": -74.19769,
"ymin": 40.54061900000016,
"xmax": -74.16529600000013,
"ymax": 40.56665110451759
},
"rings": [0]
}
================================================
FILE: src/test/scala/magellan/BoundingBoxSuite.scala
================================================
/**
* Copyright 2015 Ram Sriharsha
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package magellan
import org.scalatest.FunSuite
class BoundingBoxSuite extends FunSuite {
test("contains point") {
val x = BoundingBox(0.0, 0.0, 1.0, 1.0)
val y = BoundingBox(0.0, 0.0, 0.5, 0.5)
assert(x contains Point(0.5, 0.5))
assert(y contains Point(0.5, 0.5))
assert(!(x contains Point(1.5, 0.5)))
}
test("intersects point") {
val x = BoundingBox(0.0, 0.0, 1.0, 1.0)
val y = BoundingBox(0.0, 0.0, 0.5, 0.5)
assert(x intersects Point(0.0, 0.25))
}
test("contains bounding box") {
val x = BoundingBox(0.0, 0.0, 1.0, 1.0)
val y = BoundingBox(0.0, 0.0, 0.5, 0.5)
assert(x.contains(y))
}
test("intersects bounding box") {
val x = BoundingBox(0.0, 0.0, 1.0, 1.0)
val y = BoundingBox(0.0, 0.0, 0.5, 0.5)
assert(x.intersects(y))
val z = BoundingBox(0.5, 0.5, 1.5, 1.5)
assert(z.intersects(z))
val w = BoundingBox(0.0, 1.1, 2.0, 2.0)
assert(!x.intersects(w))
val a = BoundingBox(0.0, 22.5, 45.0, 45.0)
val b = BoundingBox(-122.4517249, 37.765315, -122.4173497, 37.7771202)
assert(!a.intersects(b))
}
test("disjoint bounding box") {
val x = BoundingBox(0.0, 0.0, 1.0, 1.0)
val y = BoundingBox(1.0, 1.0, 2.0, 2.0)
val z = BoundingBox(0.5, 1.0, 2.0, 2.0)
val w = BoundingBox(0.5, 1.1, 2.0, 2.0)
val u = BoundingBox(0.5, -1.0, 1.5, 0.0)
val t = BoundingBox(0.5, -1.0, 1.5, -0.01)
assert(!x.disjoint(y))
assert(!x.disjoint(z))
assert(x.disjoint(w))
assert(!x.disjoint(u))
assert(x.disjoint(t))
}
test("within circle") {
val x = BoundingBox(0.0, 0.0, 1.0, 1.0)
assert(x.withinCircle(Point(0.0, 0.0), 2.0))
assert(!x.withinCircle(Point(0.5, 0.75), 0.5))
assert(!x.withinCircle(Point(0.5, 0.5), 0.2))
}
test("Relate") {
/**
* +---------+ 1,1
* + +----+ +
* + + + +
* + +----+ +
* +---------+
*
*/
val box = BoundingBox(0.0, 0.0, 0.5, 0.5)
val outerPolygon = Polygon(
Array(0),
Array(Point(1.0, 1.0), Point(1.0, -1.0),
Point(-1.0, -1.0), Point(-1.0, 1.0), Point(1.0, 1.0)))
assert(box.relate(outerPolygon) === Relate.Within)
/**
* +---------+ 1,1
* + +
* + +
* + +
* +-----+---+
* +----+
* + +
* +----+
*/
val disjointPolygon = Polygon(
Array(0),
Array(Point(1.1, -1.0), Point(2.0, -1.0),
Point(2.0, -2.0), Point(1.1, -2.0), Point(1.1, -1.0)))
assert(box.relate(disjointPolygon) === Relate.Disjoint)
/**
* +---------+ 1,1
* + +
* + +
* + +
* +-----+---+----+
* + +
* +----+
*/
val touchesPolygon = Polygon(
Array(0),
Array(Point(1.0, -1.0), Point(2.0, -1.0),
Point(2.0, -2.0), Point(1.0, -2.0), Point(1.0, -1.0)))
/**
* +---------+ 1,1
* + +
* + +----+
* + + +
* +-----+---+ +
* +----+
*/
val touchesPolygon2 = Polygon(
Array(0),
Array(Point(1.0, 0.0), Point(2.0, 0.0),
Point(2.0, -2.0), Point(1.0, -2.0), Point(1.0, 0.0)))
assert(box.relate(touchesPolygon2) == Relate.Disjoint)
// the interiors of the boxes do not intersect
assert(box.relate(touchesPolygon) === Relate.Disjoint)
/**
* +---------+ 1,1
* + 0,0 + 2,0
* + +---+----+
* + + + +
* +-----+---+ +
* +--------+
*/
val intersectsPolygon = Polygon(
Array(0),
Array(Point(0.0, 0.0), Point(2.0, 0.0),
Point(2.0, -2.0), Point(0.0, -2.0), Point(0.0, 0.0)))
assert(box.relate(intersectsPolygon) == Relate.Intersects)
}
}
================================================
FILE: src/test/scala/magellan/GeoJSONSuite.scala
================================================
/**
* Copyright 2015 Ram Sriharsha
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package magellan
import org.apache.spark.sql.Row
import org.json4s.jackson.JsonMethods.parse
import org.scalatest.FunSuite
class GeoJSONSuite extends FunSuite with TestSparkContext {
test("Read Point") {
val sqlCtx = this.sqlContext
val path = this.getClass.getClassLoader.getResource("geojson/point").getPath
val df = sqlCtx.read
.format("magellan")
.option("type", "geojson")
.load(path)
assert(df.count() === 1)
import sqlCtx.implicits._
val p = df.select($"point").first()(0)
assert(p.equals(Point(102.0, 0.5)))
}
test("Read Point with Double-Int Coordinates") {
val sqlCtx = this.sqlContext
val path = this.getClass.getClassLoader.getResource("geojson/point-double-int").getPath
val df = sqlCtx.read
.format("magellan")
.option("type", "geojson")
.load(path)
assert(df.count() === 1)
import sqlCtx.implicits._
val p = df.select($"point").first()(0)
assert(p.equals(Point(102.0, 1.0)))
}
test("Read Point with Int-Double Coordinates") {
val sqlCtx = this.sqlContext
val path = this.getClass.getClassLoader.getResource("geojson/point-int-double").getPath
val df = sqlCtx.read
.format("magellan")
.option("type", "geojson")
.load(path)
assert(df.count() === 1)
import sqlCtx.implicits._
val p = df.select($"point").first()(0)
assert(p.equals(Point(102.0, 0.5)))
}
test("Read Point with Int-Int Coordinates") {
val sqlCtx = this.sqlContext
val path = this.getClass.getClassLoader.getResource("geojson/point-int-int").getPath
val df = sqlCtx.read
.format("magellan")
.option("type", "geojson")
.load(path)
assert(df.count() === 1)
import sqlCtx.implicits._
val p = df.select($"point").first()(0)
assert(p.equals(Point(102.0, 5.0)))
}
test("Read Line String") {
val sqlCtx = this.sqlContext
val path = this.getClass.getClassLoader.getResource("geojson/linestring").getPath
val df = sqlCtx.read
.format("magellan")
.option("type", "geojson")
.load(path)
assert(df.count() === 1018)
import sqlCtx.implicits._
val p = df.select($"polyline").first()(0).asInstanceOf[PolyLine]
// [ -122.04864044239585, 37.408617050391001 ], [ -122.047741818556602, 37.408915362324983 ]
assert(p.getNumRings() === 2)
assert(p.getVertex(0) == Point(-122.04864044239585, 37.408617050391001))
assert(p.getVertex(1) == Point(-122.047741818556602, 37.408915362324983))
}
test("Read Polygon") {
val sqlCtx = this.sqlContext
val path = this.getClass.getClassLoader.getResource("geojson/polygon").getPath
val df = sqlCtx.read
.format("magellan")
.option("type", "geojson")
.load(path)
import sqlCtx.implicits._
val p = df.select($"polygon").first()(0).asInstanceOf[Polygon]
assert(p.getRing(0) === 0)
assert(p.getRing(1) === 5)
}
test("Read Polygon with Int-Double coordinate pairs") {
val sqlCtx = this.sqlContext
val path = this.getClass.getClassLoader.getResource("geojson/polygon-int-double").getPath
val df = sqlCtx.read
.format("magellan")
.option("type", "geojson")
.load(path)
import sqlCtx.implicits._
val p = df.select($"polygon").first()(0).asInstanceOf[Polygon]
assert(p.getVertex(1) === Point(101, 0))
}
test("Read Polygon with Double-Int coordinate pairs") {
val sqlCtx = this.sqlContext
val path = this.getClass.getClassLoader.getResource("geojson/polygon-double-int").getPath
val df = sqlCtx.read
.format("magellan")
.option("type", "geojson")
.load(path)
import sqlCtx.implicits._
val p = df.select($"polygon").first()(0).asInstanceOf[Polygon]
assert(p.getVertex(1) === Point(101, 0))
}
test("Read Polygon with Int-Int coordinate pairs") {
val sqlCtx = this.sqlContext
val path = this.getClass.getClassLoader.getResource("geojson/polygon-int-int").getPath
val df = sqlCtx.read
.format("magellan")
.option("type", "geojson")
.load(path)
import sqlCtx.implicits._
val p = df.select($"polygon").first()(0).asInstanceOf[Polygon]
assert(p.getVertex(0) === Point(100, 0))
}
test("Read Multipolygon") {
val sqlCtx = this.sqlContext
import sqlCtx.implicits._
val path = this.getClass.getClassLoader.getResource("geojson/multipolygon/example.geojson").getPath
val df = sqlCtx.read
.format("magellan")
.option("type", "geojson")
.load(path)
.select($"polygon")
assert(df.count() === 2)
// check that the second polygon has holes
assert(df.filter { row => row match { case Row(polygon: Polygon) => polygon.getNumRings() == 2 }}.count() === 1)
}
test("Read Multipolygon: more complex example") {
val sqlCtx = this.sqlContext
import sqlCtx.implicits._
val path = this.getClass.getClassLoader.getResource("geojson/multipolygon/countries.geojson").getPath
val df = sqlCtx.read
.format("magellan")
.option("type", "geojson")
.load(path)
.select($"polygon", $"metadata"("name").as("name"))
assert(df.groupBy($"name").count().count() === 180)
// check if USA is present
val point = Point(-122.5076401, 37.7576793)
val usa = df.filter { row => row match {
case Row(p: Polygon, name: String) => p.contains(point)
}}
assert(usa.count() === 1 && usa.filter($"name" === "United States of America").count() === 1)
// Angola is a Multipolygon.
val angola = df.filter {$"name" === "Angola"}
assert(angola.count() === 2)
// check if Luanda is present here
val luanda = Point(13.2140638, -8.8535258)
assert(angola.filter { row => row match {
case Row(p: Polygon, name: String) => p.contains(luanda)
}}.count() === 1)
}
test("Write GeoJSON Point") {
val point = Point(0.5, 0.0)
val json = s"""
{
"type": "Feature",
"geometry": ${GeoJSON.writeJson(point)},
"properties": {}
}
"""
implicit val formats = org.json4s.DefaultFormats
val result = parse(json).extract[Feature]
val shapes = result.geometry.shapes
// expect a single point
assert(shapes.size == 1)
assert(shapes.head.asInstanceOf[Point] === point)
}
test("Write GeoJSON Polygon") {
val ring1 = Array(Point(1.0, 1.0), Point(1.0, -1.0),
Point(-1.0, -1.0), Point(-1.0, 1.0), Point(1.0, 1.0))
val ring2 = Array(Point(5.0, 5.0), Point(5.0, 4.0),
Point(4.0, 4.0), Point(4.0, 5.0), Point(5.0, 5.0))
val polygon = Polygon(Array(0, 5), ring1 ++ ring2)
val json = s"""
{
"type": "Feature",
"geometry": ${GeoJSON.writeJson(polygon)},
"properties": {}
}
"""
implicit val formats = org.json4s.DefaultFormats
val result = parse(json).extract[Feature]
val shapes = result.geometry.shapes
// expect a single polygon
assert(shapes.size == 1)
assert(shapes.head.asInstanceOf[Polygon] === polygon)
}
test("Write GeoJSON PolyLine") {
val polyline = PolyLine(Array(0), Array(Point(0.0, 1.0), Point(1.0, 0.5)))
val json = s"""
{
"type": "Feature",
"geometry": ${GeoJSON.writeJson(polyline)},
"properties": {}
}
"""
implicit val formats = org.json4s.DefaultFormats
val result = parse(json).extract[Feature]
val shapes = result.geometry.shapes
// expect a single polyline
assert(shapes.size == 1)
assert(shapes.head.asInstanceOf[PolyLine] === polyline)
}
test("Read compressed geojson") {
val sqlCtx = this.sqlContext
val path = this.getClass.getClassLoader.getResource("geojson/compressed/example.geojson.gz").getPath
val df = sqlCtx.read
.format("magellan")
.option("type", "geojson")
.load(path)
import sqlCtx.implicits._
val p = df.select($"polygon").first()(0).asInstanceOf[Polygon]
assert(p.getVertex(0) === Point(100, 0))
}
}
================================================
FILE: src/test/scala/magellan/LineSuite.scala
================================================
/**
* Copyright 2015 Ram Sriharsha
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package magellan
import com.fasterxml.jackson.databind.ObjectMapper
import org.apache.spark.sql.types._
import org.scalatest.FunSuite
class LineSuite extends FunSuite with TestSparkContext {
test("bounding box") {
val line = Line(Point(0.0, 1.0), Point(1.0, 0.5))
val BoundingBox(xmin, ymin, xmax, ymax) = line.boundingBox
assert(xmin === 0.0)
assert(ymin === 0.5)
assert(xmax === 1.0)
assert(ymax === 1.0)
}
test("touches") {
val x = Line(Point(0.0, 0.0), Point(1.0, 1.0))
val y = Line(Point(1.0, 1.0), Point(2.0, 2.0))
val z = Line(Point(0.5, 0.5), Point(0.5, 0.0))
val w = Line(Point(1.0, -1.0), Point(-1.0, -1.0))
// test touches line
assert(x.touches(y))
assert(x.touches(z))
assert(!x.touches(w))
}
test("intersects") {
val x = Line(Point(0.0, 0.0), Point(1.0, 1.0))
val y = Line(Point(1.0, 0.0), Point(0.0, 0.1))
val z = Line(Point(0.5, 0.0), Point(1.0, 0.5))
val w = Line(Point(1.0, -1.0), Point(-1.0, -1.0))
val l = Line(Point(0.0, -1.0), Point(0.0, -1.0))
val t = Line(Point(0.5, 0.5), Point(0.5, 0.0))
val u = Line(Point(1.0, 1.0), Point(2.0, 2.0))
val s = Line(Point(1.0, 1.0), Point(1.0, -1.0))
assert(x.intersects(y))
assert(!x.intersects(z))
assert(w.intersects(l))
assert(x.intersects(t))
assert(u.intersects(s))
}
test("serialization") {
val lineUDT = new LineUDT
val line = Line(Point(0.0, 1.0), Point(1.0, 0.5))
val BoundingBox(xmin, ymin, xmax, ymax) = line.boundingBox
val row = lineUDT.serialize(line)
assert(row.getInt(0) === line.getType())
assert(row.getDouble(1) === xmin)
assert(row.getDouble(2) === ymin)
assert(row.getDouble(3) === xmax)
assert(row.getDouble(4) === ymax)
val serializedLine = lineUDT.deserialize(row)
assert(line.equals(serializedLine))
}
test("contains line") {
val x = Line(Point(0.0, 0.0), Point(1.0, 1.0))
val y = Line(Point(0.0, 0.0), Point(0.5, 0.5))
val z = Line(Point(0.0, 0.0), Point(1.5, 1.5))
val w = Line(Point(0.5, 0.5), Point(0.0, 0.0))
val u = Line(Point(0.0, 0.0), Point(0.0, 1.0))
assert(x.contains(y))
assert(!x.contains(z))
assert(x.contains(w))
assert(!x.contains(u))
}
test("contains point") {
val y = Line(Point(0.5, 0.0), Point(0.0, 0.5))
assert(y.contains(Point(0.5, 0.0)))
}
test("jackson serialization") {
val s = new ObjectMapper().writeValueAsString(Line(Point(0.0, 0.0), Point(1.0, 1.0)))
assert(s.contains("boundingBox"))
assert(s.contains("start"))
assert(s.contains("end"))
}
}
================================================
FILE: src/test/scala/magellan/OsmSuite.scala
================================================
/**
* Copyright 2015 Ram Sriharsha
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package magellan
import magellan.io.{OsmKey, OsmNode, OsmShape, OsmWay}
import org.apache.spark.rdd.RDD
import org.apache.spark.sql.Row
import org.scalatest.FunSuite
class OsmSuite extends FunSuite with TestSparkContext {
def sqlCtx = this.sqlContext
def osmRdd() : RDD[(OsmKey, OsmShape)] = {
val rows = List(
(
new OsmKey("node", "ID1"),
new OsmNode("ID1", 45.4214, 75.6919, Map("foo" -> "bar"))
), (
new OsmKey("node", "ID2"),
new OsmNode("ID2", 43.7000, 79.4000, Map("foo" -> "baz"))
), (
new OsmKey("node", "ID3"),
new OsmNode("ID3", 45.5017, 73.5673, Map("foo" -> "qux", "bar" -> "quux"))
), (
new OsmKey("way", "ID4"),
new OsmWay("ID4", List("ID2", "ID1", "ID3"), Map("type" -> "road"))
)
)
sc.parallelize(rows, 2)
}
def fileRelation = new OsmFileRelation("/test", Map())(sqlContext)
test("nodesRdd filters and casts") {
val nodes = fileRelation.nodesRdd(osmRdd).collect().sortBy({ node => node.id })
assert(nodes.length == 3)
println(nodes(0).toString())
assert(nodes(0).id == "ID1")
assert(nodes(0).point == Point(75.6919, 45.4214))
}
test("waysRdd filters and casts") {
val ways = fileRelation.waysRdd(osmRdd).collect()
assert(ways.length == 1)
assert(ways(0).id == "ID4")
}
test("joinedNodesWays joins nodes and ways") {
val nodes = fileRelation.nodesRdd(osmRdd)
val ways = fileRelation.waysRdd(osmRdd)
val joined = fileRelation
.joinedNodesWays(nodes, ways)
.collect()
.sortBy({ case (key, _) => (key.id, key.index) })
assert(joined.length == 3)
assert(joined(0)._1 == new WayKey("ID4", 0))
assert(joined(1)._2._1 == Point(75.6919, 45.4214))
}
test("read point") {
val path = this.getClass.getClassLoader.getResource("osm/point").getPath
val df = sqlCtx.read
.format("magellan")
.option("type", "osm")
.load(path)
assert(df.count() === 1)
val p = df.select("point").first()(0)
assert(p.equals(Point(-75.6470109, 45.4187480)))
}
test("wayShapes generates polyline") {
val nodes = fileRelation.nodesRdd(osmRdd)
val ways = fileRelation.waysRdd(osmRdd)
val shapes = fileRelation.wayShapes(nodes, ways).collect()
assert(shapes.length == 1)
val points = List(Point(79.4000, 43.7000),
Point(75.6919, 45.4214),
Point(73.5673, 45.5017))
val line: PolyLine = PolyLine(new Array[Int](points.size), points.toArray)
assert(shapes(0)._1 == line)
}
test("read linestring") {
val path = this.getClass.getClassLoader.getResource("osm/linestring").getPath
val df = sqlCtx.read
.format("magellan")
.option("type", "osm")
.load(path)
assert(df.count() === 5)
assert(df.filter(df("polyline").isNotNull).count() === 1)
val p = df
.filter(df("polyline").isNotNull)
.select("polyline")
.first()(0).asInstanceOf[PolyLine]
assert(p.length() == 4)
assert(p.getVertex(0) == Point(-75.6362879, 45.4188896))
assert(p.getVertex(1) == Point(-75.6378443, 45.4191178))
assert(p.getVertex(2) == Point(-75.6382141, 45.4191290))
assert(p.getVertex(3) == Point(-75.6390858, 45.4190782))
}
test("read polygon") {
val path = this.getClass.getClassLoader.getResource("osm/polygon").getPath
val df = sqlCtx.read
.format("magellan")
.option("type", "osm")
.load(path)
assert(df.count() === 4)
val polygons = df.select("polygon")
.filter(df("polygon").isNotNull)
.collect()
.map(_(0))
assert(polygons.length == 1)
val p = polygons(0)
val expectedPoints = Array(
Point(-75.6419079, 45.4200638),
Point(-75.6421911, 45.4217868),
Point(-75.6420795, 45.4220880),
Point(-75.6419079, 45.4200638))
val expected = Polygon(Array(), expectedPoints)
assert(p === expected)
}
}
================================================
FILE: src/test/scala/magellan/PointSuite.scala
================================================
/**
* Copyright 2015 Ram Sriharsha
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package magellan
import com.fasterxml.jackson.databind.ObjectMapper
import org.apache.spark.sql.types._
import org.scalatest.FunSuite
class PointSuite extends FunSuite with TestSparkContext {
test("bounding box") {
val point = Point(1.0, 1.0)
val BoundingBox(xmin, ymin, xmax, ymax) = point.boundingBox
assert(xmin === 1.0)
assert(ymin === 1.0)
assert(xmax === 1.0)
assert(ymax === 1.0)
}
test("serialization") {
val point = Point(1.0, 1.0)
val pointUDT = new PointUDT
val BoundingBox(xmin, ymin, xmax, ymax) = point.boundingBox
val row = pointUDT.serialize(point)
assert(row.getInt(0) === point.getType())
assert(row.getDouble(1) === xmin)
assert(row.getDouble(2) === ymin)
assert(row.getDouble(3) === xmax)
assert(row.getDouble(4) === ymax)
val serializedPoint = pointUDT.deserialize(row)
assert(point.equals(serializedPoint))
}
test("point udf") {
val sqlContext = this.sqlContext
import sqlContext.implicits._
val points = sc.parallelize(Seq((-1.0, -1.0), (-1.0, 1.0), (1.0, -1.0))).toDF("x", "y")
import org.apache.spark.sql.functions.udf
val toPointUDF = udf{(x:Double,y:Double) => Point(x,y) }
val point = points.withColumn("point", toPointUDF('x, 'y))
.select('point)
.first()(0)
.asInstanceOf[Point]
assert(point.getX() === -1.0)
assert(point.getY() === -1.0)
}
test("jackson serialization") {
val s = new ObjectMapper().writeValueAsString(Point(1.0, 1.0))
assert(s.contains("boundingBox"))
assert(s.contains("x"))
assert(s.contains("y"))
}
test("within circle") {
assert(Point(0.0, 0.0) withinCircle (Point(0.5, 0.5), 0.75))
assert(!(Point(0.0, 0.0) withinCircle (Point(0.5, 0.5), 0.5)))
}
test("buffer point") {
val polygon = Point(0.0, 1.0).buffer(0.5)
assert(polygon.getNumRings() === 1)
// check that [0.0, 0.75] is within this polygon
assert(polygon.contains(Point(0.0, 0.75)))
// check that [0.4, 1.0] is within this polygon
assert(polygon.contains(Point(0.4, 1.0)))
// check that [0.6, 1.0] is outside this polygon
assert(!polygon.contains(Point(0.6, 1.0)))
}
}
================================================
FILE: src/test/scala/magellan/PolyLineSuite.scala
================================================
/**
* Copyright 2015 Ram Sriharsha
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package magellan
import magellan.TestingUtils._
import org.apache.spark.sql.types.PolyLineUDT
import org.scalatest.FunSuite
class PolyLineSuite extends FunSuite with TestSparkContext {
test("bounding box") {
val polyline = PolyLine(Array(0),Array(Point(0.0, 1.0), Point(1.0, 0.5)))
val BoundingBox(xmin, ymin, xmax, ymax) = polyline.boundingBox
assert(xmin === 0.0)
assert(ymin === 0.5)
assert(xmax === 1.0)
assert(ymax === 1.0)
}
test("point touches polyline") {
val line = Array(Point(1.0, 1.0), Point(1.0, -1.0),
Point(-1.0, -1.0), Point(-1.0, 1.0))
val polyline = PolyLine(Array(0), line)
assert(polyline.contains(Point(1.0, 1.0)))
assert(polyline.contains(Point(1.0, 0.0)))
}
test("line intersects polyline") {
val line = Array(Point(1.0, 1.0), Point(1.0, -1.0),
Point(-1.0, -1.0), Point(-1.0, 1.0))
val polyline = PolyLine(Array(0), line)
val candidates = Seq(
(true, "0:0,2:0"),
(true, "1:1,2:2"),
(false, "1.1:1.1,2:2"),
(false, "0:0,0:1")
) map {
case (cond, str) =>
(cond, makeLine(str))
}
candidates foreach { case (cond, line) => assert(cond === polyline.intersects(line)) }
}
test("polyline intersects line") {
val x = PolyLine(Array(0),Array(Point(0.0, 0.0), Point(1.0, 1.0)))
val y = Line(Point(1.0, 0.0), Point(0.0, 0.1))
val z = Line(Point(0.5, 0.0), Point(1.0, 0.5))
val w = Line(Point(1.0, -1.0), Point(-1.0, -1.0))
val l = Line(Point(0.0, -1.0), Point(0.0, -1.0))
val t = Line(Point(0.5, 0.5), Point(0.5, 0.0))
val u = Line(Point(1.0, 1.0), Point(2.0, 2.0))
val s = Line(Point(1.0, 1.0), Point(1.0, -1.0))
assert(x.intersects(y))
assert(!x.intersects(z))
assert(w.intersects(l))
assert(x.intersects(t))
assert(u.intersects(s))
}
test("polyline intersects polygon") {
val x = PolyLine(Array(0),Array(Point(0.0, 0.0), Point(1.0, 1.0)))
val w = Polygon(Array(0), Array(Point(1.0, 1.0), Point(1.0, -1.0),
Point(-1.0, -1.0), Point(-1.0, 1.0), Point(1.0, 1.0)))
val l = Polygon(Array(0), Array(Point(3.0, 3.0), Point(3.0, 2.0),
Point(2.0, 2.0), Point(2.0, 3.0), Point(3.0, 3.0)))
val t = Polygon(Array(0), Array(Point(3.0, 3.0), Point(3.0, -3.0),
Point(-3.0, -3.0), Point(-3.0, 3.0), Point(3.0, 3.0)))
assert(x.intersects(w))
assert(!x.intersects(l))
assert(x.intersects(t))
}
test("serialization") {
val polylineUDT = new PolyLineUDT
val polyline = PolyLine(Array(0), Array(Point(0.0, 1.0), Point(1.0, 0.5)))
val BoundingBox(xmin, ymin, xmax, ymax) = polyline.boundingBox
val row = polylineUDT.serialize(polyline)
assert(row.getInt(0) === polyline.getType())
assert(row.getDouble(1) === xmin)
assert(row.getDouble(2) === ymin)
assert(row.getDouble(3) === xmax)
assert(row.getDouble(4) === ymax)
val serializedLine = polylineUDT.deserialize(row)
assert(polyline.equals(serializedLine))
}
test("polyline contains line") {
val x = Line(Point(0.0, 0.0), Point(1.0, 1.0))
val y = Line(Point(0.0, 0.0), Point(0.5, 0.5))
val z = Line(Point(0.0, 0.0), Point(1.5, 1.5))
val w = Line(Point(0.5, 0.5), Point(0.0, 0.0))
val u = Line(Point(0.0, 0.0), Point(0.0, 1.0))
assert(x.contains(y))
assert(!x.contains(z))
assert(x.contains(w))
assert(!x.contains(u))
}
test("polyline contains point") {
val y = PolyLine(Array(0), Array(Point(0.5, 0.0), Point(0.0, 0.5)))
assert(y.contains(Point(0.5, 0.0)))
}
test("buffer polyline") {
/**
* +-------+ 1.5,1.5
* +----+ +
* + +
* +----+ +
* +-------+
*
*/
val ring = Array(Point(-1.0, 1.0), Point(1.0, 1.0),
Point(1.0, -1.0), Point(-1.0, -1.0))
val polyline = PolyLine(Array(0), ring)
val bufferedPolygon = polyline.buffer(0.5)
assert(bufferedPolygon.getNumRings() === 1)
assert(bufferedPolygon.contains(Point(1.3, 1.3)))
assert(!bufferedPolygon.contains(Point(0.5, 0.5)))
}
}
================================================
FILE: src/test/scala/magellan/PolygonSuite.scala
================================================
/**
* Copyright 2015 Ram Sriharsha
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package magellan
import com.esri.core.geometry.{GeometryEngine, Point => ESRIPoint, Polyline => ESRIPolyline}
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.databind.module.SimpleModule
import magellan.TestingUtils._
import magellan.esri.ESRIUtil
import org.scalatest.FunSuite
class PolygonSuite extends FunSuite {
test("bounding box") {
val ring = Array(Point(1.0, 1.0), Point(1.0, -1.0),
Point(-1.0, -1.0), Point(-1.0, 1.0), Point(1.0, 1.0))
val polygon = Polygon(Array(0), ring)
val BoundingBox(xmin, ymin, xmax, ymax) = polygon.boundingBox
assert(xmin === -1.0)
assert(ymin === -1.0)
assert(xmax === 1.0)
assert(ymax === 1.0)
}
test("loops in polyon: no holes") {
val ring = Array(Point(1.0, 1.0), Point(1.0, -1.0),
Point(-1.0, -1.0), Point(-1.0, 1.0), Point(1.0, 1.0))
val polygon = Polygon(Array(0), ring)
val loops = polygon.loops
assert(loops.size === 1)
val loop = loops(0)
assert(loop.iterator().size === 4)
val iter = loop.iterator()
val first = iter.next()
assert(first === Line(Point(1.0, 1.0), Point(1.0, -1.0)))
(0 until 2) foreach { _ => iter.next() }
val last = iter.next()
assert(last === Line(Point(-1.0, 1.0), Point(1.0, 1.0)))
}
test("point in polygon: no holes") {
val ring = Array(Point(1.0, 1.0), Point(1.0, -1.0),
Point(-1.0, -1.0), Point(-1.0, 1.0), Point(1.0, 1.0))
val polygon = Polygon(Array(0), ring)
assert(!polygon.contains(Point(2.0, 0.0)))
assert(polygon.contains(Point(0.0, 0.0)))
// contains is a strict check. agrees with definition in ESRI
val esriPolygon = ESRIUtil.toESRIGeometry(polygon)
assert(!polygon.contains(Point(1.0, 1.0)))
assert(!GeometryEngine.contains(esriPolygon, new ESRIPoint(1.0, 1.0), null))
assert(!polygon.contains(Point(1.0, 0.0)))
assert(!GeometryEngine.contains(esriPolygon, new ESRIPoint(1.0, 0.0), null))
}
test("point in polygon: one hole") {
val ring = Array(Point(1.0, 1.0), Point(1.0, -1.0),
Point(-1.0, -1.0), Point(-1.0, 1.0), Point(1.0, 1.0),
Point(0.5, 0), Point(0, 0.5), Point(-0.5, 0),
Point(0, -0.5), Point(0.5, 0)
)
val polygon = Polygon(Array(0, 5), ring)
assert(!polygon.contains(Point(2.0, 0.0)))
assert(!polygon.contains(Point(0.0, 0.0)))
// contains is a strict check. agrees with definition in ESRI
val esriPolygon = ESRIUtil.toESRIGeometry(polygon)
assert(!polygon.contains(Point(1.0, 1.0)))
assert(!GeometryEngine.contains(esriPolygon, new ESRIPoint(1.0, 1.0), null))
assert(!GeometryEngine.contains(esriPolygon, new ESRIPoint(0.5, 0.0), null))
assert(!polygon.contains(Point(0.5, 0.0)))
}
test("check within matches esri within") {
// no hole
var ring = Array(Point(1.0, 1.0), Point(1.0, -1.0),
Point(-1.0, -1.0), Point(-1.0, 1.0), Point(1.0, 1.0))
var polygon = Polygon(Array(0), ring)
var esriPolygon = ESRIUtil.toESRI(polygon)
val esriPoint = new ESRIPoint()
esriPoint.setXY(0.0, 0.0)
assert(GeometryEngine.contains(esriPolygon, esriPoint, null))
esriPoint.setXY(1.0, 1.0)
// strict contains does not allow for points to lie on the boundary
assert(!GeometryEngine.contains(esriPolygon, esriPoint, null))
// one hole
ring = Array(Point(1.0, 1.0), Point(1.0, -1.0),
Point(-1.0, -1.0), Point(-1.0, 1.0), Point(1.0, 1.0),
Point(0.5, 0), Point(0, 0.5), Point(-0.5, 0),
Point(0, -0.5), Point(0.5, 0)
)
polygon = Polygon(Array(0, 5), ring)
esriPolygon = ESRIUtil.toESRI(polygon)
assert(esriPolygon.calculateRingArea2D(0) ~== 4.0 absTol 0.001)
assert(esriPolygon.calculateRingArea2D(1) ~== -0.5 absTol 0.001)
assert(esriPolygon.calculateArea2D() ~== 3.5 absTol 0.001)
esriPoint.setXY(0.0, 0.0)
assert(!GeometryEngine.contains(esriPolygon, esriPoint, null))
esriPoint.setXY(0.75, 0.75)
assert(GeometryEngine.contains(esriPolygon, esriPoint, null))
var esriPolyLine = new ESRIPolyline()
var polyline = PolyLine(Array(0), Array(Point(0.0, 0.0), Point(3.0, 3.0)))
esriPolyLine = ESRIUtil.toESRI(polyline)
assert(polygon.intersects(polyline))
assert(!GeometryEngine.disjoint(esriPolygon, esriPolyLine, null))
polyline = PolyLine(Array(0), Array(Point(0.75, 0.75), Point(0.90, 0.90)))
esriPolyLine = ESRIUtil.toESRI(polyline)
assert(polygon.intersects(polyline))
assert(!GeometryEngine.disjoint(esriPolygon, esriPolyLine, null))
polyline = PolyLine(Array(0), Array(Point(0.0, 0.0), Point(0.3, 0.0)))
esriPolyLine = ESRIUtil.toESRI(polyline)
assert(!polygon.intersects(polyline))
assert(GeometryEngine.disjoint(esriPolygon, esriPolyLine, null))
}
test("jackson serialization") {
val ring = Array(Point(1.0, 1.0), Point(1.0, -1.0),
Point(-1.0, -1.0), Point(-1.0, 1.0), Point(1.0, 1.0),
Point(0.5, 0), Point(0, 0.5), Point(-0.5, 0),
Point(0, -0.5), Point(0.5, 0)
)
val polygon = Polygon(Array(0, 5), ring)
val s = new ObjectMapper().writeValueAsString(polygon)
assert(s.contains("boundingBox"))
assert(s.contains("xcoordinates"))
assert(s.contains("ycoordinates"))
// read back into Polygon to test deserialization
val mapper = new ObjectMapper()
val module = new SimpleModule()
module.addDeserializer(classOf[Polygon], new PolygonDeserializer())
mapper.registerModule(module)
val deserializedPolygon: Polygon = mapper.readerFor(classOf[Polygon]).readValue(s)
assert(deserializedPolygon === polygon)
assert(deserializedPolygon.boundingBox === polygon.boundingBox)
}
test("point touches polygon: no holes") {
val ring = Array(Point(1.0, 1.0), Point(1.0, -1.0),
Point(-1.0, -1.0), Point(-1.0, 1.0), Point(1.0, 1.0))
val polygon = Polygon(Array(0), ring)
assert(polygon.touches(Point(1.0, 0.0)))
assert(polygon.touches(Point(1.0, 1.0)))
}
test("point touches polygon: holes") {
val ring = Array(Point(1.0, 1.0), Point(1.0, -1.0),
Point(-1.0, -1.0), Point(-1.0, 1.0), Point(1.0, 1.0),
Point(0.5, 0), Point(0, 0.5), Point(-0.5, 0),
Point(0, -0.5), Point(0.5, 0)
)
val polygon = Polygon(Array(0, 5), ring)
assert(polygon.touches(Point(1.0, 0.0)))
assert(polygon.touches(Point(0.5, 0.0)))
}
test("polygon intersects line: no holes") {
val ring = Array(Point(1.0, 1.0), Point(1.0, -1.0),
Point(-1.0, -1.0), Point(-1.0, 1.0), Point(1.0, 1.0))
val polygon = Polygon(Array(0), ring)
var line = Line(Point(-2.0, 0.0), Point(2.0, 0.0))
assert(polygon.intersects(line))
line = Line(Point(1.0, 1.0), Point(1.0, -2.0))
assert(polygon.intersects(line))
line = Line(Point(0.0, 0.0), Point(0.5, 0.5))
assert(polygon.intersects(line))
}
test("polygon intersects line: holes") {
val ring = Array(Point(1.0, 1.0), Point(1.0, -1.0),
Point(-1.0, -1.0), Point(-1.0, 1.0), Point(1.0, 1.0),
Point(0.5, 0), Point(0, 0.5), Point(-0.5, 0),
Point(0, -0.5), Point(0.5, 0)
)
val polygon = Polygon(Array(0, 5), ring)
var line = Line(Point(-2.0, 0.0), Point(2.0, 0.0))
assert(polygon.intersects(line))
line = Line(Point(0.0, 0.0), Point(0.5, 0.0))
assert(polygon.intersects(line))
}
test("polygon intersects polyline: no holes") {
val ring = Array(Point(1.0, 1.0), Point(1.0, -1.0),
Point(-1.0, -1.0), Point(-1.0, 1.0), Point(1.0, 1.0))
val polygon = Polygon(Array(0), ring)
var polyline = PolyLine(Array(0), Array(Point(-2.0, 0.0), Point(2.0, 0.0)))
assert(polygon.intersects(polyline))
polyline = PolyLine(Array(0), Array(Point(1.0, 1.0), Point(1.0, -2.0)))
assert(polygon.intersects(polyline))
polyline = PolyLine(Array(0), Array(Point(0.0, 0.0), Point(0.5, 0.5)))
assert(polygon.intersects(polyline))
}
test("polygon intersects polyline: holes") {
val ring = Array(Point(1.0, 1.0), Point(1.0, -1.0),
Point(-1.0, -1.0), Point(-1.0, 1.0), Point(1.0, 1.0),
Point(0.5, 0), Point(0, 0.5), Point(-0.5, 0),
Point(0, -0.5), Point(0.5, 0)
)
val polygon = Polygon(Array(0, 5), ring)
var polyline = PolyLine(Array(0), Array(Point(-2.0, 0.0), Point(2.0, 0.0)))
assert(polygon.intersects(polyline))
polyline = PolyLine(Array(0), Array(Point(0.0, 0.0), Point(0.5, 0.0)))
assert(polygon.intersects(polyline))
}
test("polygon intersects polygon") {
/**
* +---------+ 1,1
* + 0,0 + 2,0
* + +---+----+
* + + + +
* +-----+---+ +
* +--------+
*/
val ring1 = Array(Point(1.0, 1.0), Point(1.0, -1.0),
Point(-1.0, -1.0), Point(-1.0, 1.0), Point(1.0, 1.0))
val polygon1 = Polygon(Array(0), ring1)
val ring2 = Array(Point(0.0, 0.0), Point(2.0, 0.0),
Point(2.0, -2.0), Point(0.0, -2.0), Point(0.0, 0.0))
val polygon2 = Polygon(Array(0), ring2)
assert(polygon1.intersects(polygon2))
/**
* +---------+ 1,1
* + +
* + +----+
* + + +
* +-----+---+ +
* +----+
*/
val ring3 = Array(Point(1.0, 0.0), Point(2.0, 0.0),
Point(2.0, -2.0), Point(1.0, -2.0), Point(1.0, 0.0))
val polygon3 = Polygon(Array(0), ring3)
assert(polygon1.intersects(polygon3))
/**
* +---------+ 1,1
* + +
* + +
* + +
* +-----+---+----+
* + +
* +----+
*/
val ring4 = Array(Point(1.0, -1.0), Point(2.0, -1.0),
Point(2.0, -2.0), Point(1.0, -2.0), Point(1.0, -1.0))
val polygon4 = Polygon(Array(0), ring4)
assert(polygon1.intersects(polygon4))
/**
* +---------+ 1,1
* + +
* + +
* + +
* +-----+---+
* +----+
* + +
* +----+
*/
val ring5 = Array(Point(1.1, -1.0), Point(2.0, -1.0),
Point(2.0, -2.0), Point(1.1, -2.0), Point(1.1, -1.0))
val polygon5 = Polygon(Array(0), ring5)
assert(!polygon1.intersects(polygon5))
/**
* +---------+ 1,1
* + +----+ +
* + + + +
* + +----+ +
* +---------+
*
*/
val ring6 = Array(Point(0.5, 0.5), Point(0.5, -0.5),
Point(-0.5, -0.5), Point(-0.5, 0.5), Point(0.5, 0.5))
val polygon6 = Polygon(Array(0), ring6)
assert(polygon1.intersects(polygon6))
/**
* +---------+ 1.5,1.5
* + +----+ +
* + + + +
* + +----+ +
* +---------+
*
*/
val ring7 = Array(Point(1.5, 1.5), Point(1.5, -1.5),
Point(-1.5, -1.5), Point(-1.5, 1.5), Point(1.5, 1.5))
val polygon7 = Polygon(Array(0), ring7)
assert(polygon1.intersects(polygon7))
//polygon intesects itself
assert(polygon1.intersects(polygon1))
}
test("get ring as Polygon") {
val ring1 = Array(Point(1.0, 1.0), Point(1.0, -1.0),
Point(-1.0, -1.0), Point(-1.0, 1.0), Point(1.0, 1.0))
val ring2 = Array(Point(5.0, 5.0), Point(5.0, 4.0),
Point(4.0, 4.0), Point(4.0, 5.0), Point(5.0, 5.0))
val polygon = Polygon(Array(0, 5), ring1 ++ ring2)
val polygon1 = Polygon(Array(0),ring1)
val polygon2 = Polygon(Array(0), ring2)
val firstRing = polygon.getRingPolygon(0)
val secondRing = polygon.getRingPolygon(1)
assert(firstRing.equals(polygon1))
assert(secondRing.equals(polygon2))
}
test("buffer polygon") {
/**
* +---------+ 1.5,1.5
* + +----+ +
* + + + +
* + +----+ +
* +---------+
*
*/
val ring = Array(Point(1.0, 1.0), Point(1.0, -1.0),
Point(-1.0, -1.0), Point(-1.0, 1.0), Point(1.0, 1.0))
val polygon = Polygon(Array(0), ring)
val bufferedPolygon = polygon.buffer(0.5)
assert(bufferedPolygon.getNumRings() === 1)
assert(bufferedPolygon.contains(Point(1.3, 1.3)))
}
test("strict intersection") {
// polygon - line
val outerRing = Array(Point(1.0, 1.0), Point(1.0, -1.0),
Point(-1.0, -1.0), Point(-1.0, 1.0), Point(1.0, 1.0))
val outerPolygon = Polygon(Array(0), outerRing)
val innerRing = Array(Point(0.5, 0.5), Point(0.5, -0.5),
Point(-0.5, -0.5), Point(-0.5, 0.5), Point(0.5, 0.5))
val innerPolygon = Polygon(Array(0), innerRing)
assert(outerPolygon.intersects(Line(Point(0.0, 0.0), Point(2.0, 2.0)), strict = true))
assert(outerPolygon.intersects(Line(Point(0.0, 0.0), Point(1.0, 1.0)), strict = true))
assert(outerPolygon.intersects(Line(Point(1.0, 1.0), Point(1.0, -1.0)), strict = true))
// interior of polygon contains line (disallowed in strict intersection)
assert(!outerPolygon.intersects(Line(Point(0.0, 0.0), Point(0.5, 0.5)), strict = true))
// polygon - polygon
assert(!outerPolygon.intersects(innerPolygon, strict = true))
assert(outerPolygon.intersects(innerPolygon))
// polygon - polyline
val innerPolyline = PolyLine(Array(0), innerRing.dropRight(1))
assert(!outerPolygon.intersects(innerPolyline,strict = true))
assert(outerPolygon.intersects(innerPolyline))
}
}
================================================
FILE: src/test/scala/magellan/ShapefileSuite.scala
================================================
/**
* Copyright 2015 Ram Sriharsha
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package magellan
import magellan.TestingUtils._
import org.apache.spark.sql.magellan.dsl.expressions._
import org.scalatest.{BeforeAndAfterAll, FunSuite}
class ShapefileSuite extends FunSuite with TestSparkContext with BeforeAndAfterAll {
override def beforeAll() {
super.beforeAll()
sc.hadoopConfiguration.set("mapreduce.input.fileinputformat.split.maxsize", "10000")
}
test("shapefile-relation: points") {
val sqlCtx = this.sqlContext
val path = this.getClass.getClassLoader.getResource("testpoint/").getPath
val df = sqlCtx.read.format("magellan").load(path)
import sqlCtx.implicits._
assert(df.count() === 1)
val point = df.select($"point").first().get(0).asInstanceOf[Point]
assert(point.getX() ~== -99.796 absTol 0.2)
// query
assert(df.filter($"point" within $"point").count() === 1)
}
test("shapefile-relation: polygons") {
val sqlCtx = this.sqlContext
val path = this.getClass.getClassLoader.getResource("testpolygon/").getPath
val df = sqlCtx.read.format("magellan").load(path)
import sqlCtx.implicits._
assert(df.count() === 1)
val polygon = df.select($"polygon").first().get(0).asInstanceOf[Polygon]
assert(polygon.getNumRings() === 1)
}
test("shapefile-relation: Zillow Neighborhoods") {
val sqlCtx = this.sqlContext
val path = this.getClass.getClassLoader.getResource("testzillow/").getPath
val df = sqlCtx.read.format("magellan").load(path)
import sqlCtx.implicits._
assert(df.count() === 1932) // 34 + 948 + 689 + 261
// CA should have some metadata attached to it
assert(df.filter($"metadata"("STATE") === "CA").count() === 948)
assert(df.select($"metadata"("STATE").as("state")).filter($"state" === "CA").count() === 948)
assert(df.select($"metadata"("STATE").as("state")).filter($"state" isNull).count() === 723)
}
test("shapefile-relation: polylines") {
val sqlCtx = this.sqlContext
val path = this.getClass.getClassLoader.getResource("testpolyline/").getPath
val df = sqlCtx.read.format("magellan").load(path)
assert(df.count() === 14959)
// 5979762.107174277,2085850.5510566086,6024890.0635061115,2130875.5735391825
}
test("shapefile-relation: points and polygons") {
val sqlCtx = this.sqlContext
val path = this.getClass.getClassLoader.getResource("testcomposite/").getPath
val df = sqlCtx.read.format("magellan").load(path)
assert(df.count() === 2)
// each row should either contain a point or a polygon but not both
import sqlCtx.implicits._
assert(df.filter($"point" isNull).count() === 1)
assert(df.filter($"polygon" isNull).count() === 1)
}
test("shapefile-relation: valid") {
val sqlCtx = this.sqlContext
val path = this.getClass.getClassLoader.getResource("testpolyline/").getPath
val df = sqlCtx.read.format("magellan").load(path)
import sqlCtx.implicits._
assert(df.filter($"valid").count() == 14959)
}
test("shapefile-relation: parsing points") {
val sqlCtx = this.sqlContext
val path = this.getClass.getClassLoader.getResource("testshapefile/").getPath
val df = sqlCtx.read.format("magellan").load(path)
val polygon = df.select("polygon").first().get(0).asInstanceOf[Polygon]
assert(polygon.boundingBox == BoundingBox(-121.457213, 41.183484, -119.998287, 41.997613))
}
test("shapefile-relation: index") {
val sqlCtx = this.sqlContext
val path = this.getClass.getClassLoader.getResource("testshapefile/").getPath
val df = sqlCtx.read.
format("magellan").
option("magellan.index", "true").
option("magellan.index.precision", "15").
load(path)
import org.apache.spark.sql.functions.explode
import sqlCtx.implicits._
assert(df.select(explode($"index")).count() === 2)
assert(df.select(explode($"index").as("index")).groupBy($"index.relation").count().count() === 1)
}
test("shapefile-relation: use shx file to split") {
val sqlCtx = this.sqlContext
val path = this.getClass.getClassLoader.getResource("shapefiles/us_states/").getPath
val df = sqlCtx.read.format("magellan").load(path)
assert(df.count() === 56)
}
}
================================================
FILE: src/test/scala/magellan/TestSparkContext.scala
================================================
/**
* Copyright 2015 Ram Sriharsha
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package magellan
import org.apache.spark.sql.{SQLContext, SparkSession}
import org.apache.spark.{SparkConf, SparkContext}
import org.scalatest.{BeforeAndAfterAll, Suite}
trait TestSparkContext extends BeforeAndAfterAll { self: Suite =>
@transient var sc: SparkContext = _
@transient var spark: SparkSession = _
@transient var sqlContext: SQLContext = _
override def beforeAll() {
super.beforeAll()
val conf = new SparkConf()
.setMaster("local[2]")
.setAppName("MagellanUnitTest")
.set("spark.sql.crossJoin.enabled", "true")
spark = SparkSession.builder()
.config(conf)
.config("spark.sql.crossJoin.enabled", "true")
.getOrCreate()
sqlContext = spark.sqlContext
sc = spark.sparkContext
}
override def afterAll() {
if (spark != null) {
spark.stop()
}
spark = null
sqlContext = null
sc = null
super.afterAll()
}
}
================================================
FILE: src/test/scala/magellan/TestingUtils.scala
================================================
/**
* Copyright 2015 Ram Sriharsha
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package magellan
import com.google.common.base.Splitter
import magellan.geometry.R2Loop
import org.apache.spark.sql.catalyst.InternalRow
import org.apache.spark.sql.catalyst.expressions.LeafExpression
import org.apache.spark.sql.catalyst.expressions.codegen.CodegenFallback
import org.apache.spark.sql.types.{PointUDT, PolygonUDT}
import org.scalatest.exceptions.TestFailedException
import scala.collection.JavaConversions._
object TestingUtils {
val ABS_TOL_MSG = " using absolute tolerance"
val REL_TOL_MSG = " using relative tolerance"
/**
* Private helper function for comparing two values using relative tolerance.
* Note that if x or y is extremely close to zero, i.e., smaller than Double.MinPositiveValue,
* the relative tolerance is meaningless, so the exception will be raised to warn users.
*/
private def RelativeErrorComparison(x: Double, y: Double, eps: Double): Boolean = {
val absX = math.abs(x)
val absY = math.abs(y)
val diff = math.abs(x - y)
if (x == y) {
true
} else if (absX < Double.MinPositiveValue || absY < Double.MinPositiveValue) {
throw new TestFailedException(
s"$x or $y is extremely close to zero, so the relative tolerance is meaningless.", 0)
} else {
diff < eps * math.min(absX, absY)
}
}
/**
* Private helper function for comparing two values using absolute tolerance.
*/
private def AbsoluteErrorComparison(x: Double, y: Double, eps: Double): Boolean = {
math.abs(x - y) < eps
}
case class CompareDoubleRightSide(fun: (Double, Double, Double) => Boolean,
y: Double, eps: Double, method: String)
/**
* Implicit class for comparing two double values using relative tolerance or absolute tolerance.
*/
implicit class DoubleWithAlmostEquals(val x: Double) {
/**
* When the difference of two values are within eps, returns true; otherwise, returns false.
*/
def ~=(r: CompareDoubleRightSide): Boolean = r.fun(x, r.y, r.eps)
/**
* When the difference of two values are within eps, returns false; otherwise, returns true.
*/
def !~=(r: CompareDoubleRightSide): Boolean = !r.fun(x, r.y, r.eps)
/**
* Throws exception when the difference of two values are NOT within eps;
* otherwise, returns true.
*/
def ~==(r: CompareDoubleRightSide): Boolean = {
if (!r.fun(x, r.y, r.eps)) {
throw new TestFailedException(
s"Expected $x and ${r.y} to be within ${r.eps}${r.method}.", 0)
}
true
}
/**
* Throws exception when the difference of two values are within eps; otherwise, returns true.
*/
def !~==(r: CompareDoubleRightSide): Boolean = {
if (r.fun(x, r.y, r.eps)) {
throw new TestFailedException(
s"Did not expect $x and ${r.y} to be within ${r.eps}${r.method}.", 0)
}
true
}
/**
* Comparison using absolute tolerance.
*/
def absTol(eps: Double): CompareDoubleRightSide =
CompareDoubleRightSide(AbsoluteErrorComparison, x, eps, ABS_TOL_MSG)
/**
* Comparison using relative tolerance.
*/
def relTol(eps: Double): CompareDoubleRightSide =
CompareDoubleRightSide(RelativeErrorComparison, x, eps, REL_TOL_MSG)
override def toString: String = x.toString
}
def makeLoop(str: String): R2Loop = {
val tokens = Splitter.on(',').split(str)
val size = tokens.size
val xcoordinates = Array.fill(size)(0.0)
val ycoordinates = Array.fill(size)(0.0)
var index = 0
makePoints(str) foreach { case (x: Double, y: Double) =>
xcoordinates(index) = x
ycoordinates(index) = y
index += 1
}
val r2Loop = new R2Loop()
r2Loop.init(xcoordinates, ycoordinates, 0, size - 1)
r2Loop
}
def makeLine(str: String): Line = {
val iter = makePoints(str) map {
case (x: Double, y: Double) => Point(x, y)
}
Line(iter.next(), iter.next())
}
private def makePoints(str: String): Iterator[(Double, Double)] = {
val tokens = Splitter.on(',').split(str)
tokens.iterator().map { s =>
val colon = s.indexOf(':')
if (colon == -1) throw new IllegalArgumentException(
"Illegal string:" + s + ". Should look like '35:20'")
val x = s.substring(0, colon).toDouble
val y = s.substring(colon + 1).toDouble
(x, y)
}
}
}
case class MockPointExpr(point: Point) extends LeafExpression with CodegenFallback {
override def nullable: Boolean = false
override val dataType = new PointUDT
override def eval(input: InternalRow): Any = {
dataType.serialize(point)
}
}
case class MockPolygonExpr(polygon: Polygon) extends LeafExpression with CodegenFallback {
override def nullable: Boolean = false
override val dataType = new PolygonUDT
override def eval(input: InternalRow): Any = {
dataType.serialize(polygon)
}
}
================================================
FILE: src/test/scala/magellan/WKTParserSuite.scala
================================================
/**
* Copyright 2015 Ram Sriharsha
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package magellan
import com.vividsolutions.jts.io.WKTReader
import org.scalatest.FunSuite
class WKTParserSuite extends FunSuite {
test("parse int") {
val parsed = WKTParser.int.parse("-30")
assert(parsed.index === 3)
assert(parsed.get.value === "-30")
}
test("parse float") {
val parsed = WKTParser.float.parse("-79.470579")
assert(parsed.get.value === "-79.470579")
}
test("parse number") {
val parsed = WKTParser.number.parse("-79.470579")
assert(parsed.get.value === -79.470579)
}
test("parse point") {
val parsed = WKTParser.point.parse("POINT (30 10)")
assert(parsed.index == 13)
val p = parsed.get.value
assert(p.getX() === 30.0)
assert(p.getY() === 10.0)
}
test("parse linestring") {
var parsed = WKTParser.linestring.parse("LINESTRING (30 10, 10 30, 40 40)")
var p: PolyLine = parsed.get.value
assert(p.getNumRings() === 1)
assert(p.length === 3)
parsed = WKTParser.linestring.parse(
"LINESTRING (-79.470579 35.442827,-79.469465 35.444889,-79.468907 35.445829,-79.468294 35.446608,-79.46687 35.447893)")
p = parsed.get.value
assert(p.length === 5)
}
test("parse polygon without holes") {
var parsed = WKTParser.polygonWithoutHoles.parse("POLYGON ((30 10, 40 40, 20 40, 10 20, 30 10))")
val p: Polygon = parsed.get.value
assert(p.length === 5)
}
test("parse polygon with holes") {
val parsed = WKTParser.polygonWithHoles.parse("POLYGON ((35 10, 45 45, 15 40, 10 20, 35 10), (20 30, 35 35, 30 20, 20 30))")
val p: Polygon = parsed.get.value
assert(p.getNumRings() == 2)
assert(p.getRing(1) == 5)
assert(p.getVertex(4) === Point(35.0, 10.0))
assert(p.getVertex(5) === Point(20.0, 30.0))
}
test("parse Polygon without space") {
val parsed = WKTParser.polygonWithHoles.parse("POLYGON((35 10, 45 45, 15 40, 10 20, 35 10), (20 30, 35 35, 30 20, 20 30))")
val p: Polygon = parsed.get.value
assert(p.getNumRings() == 2)
assert(p.getRing(1) == 5)
assert(p.getVertex(4) === Point(35.0, 10.0))
assert(p.getVertex(5) === Point(20.0, 30.0))
}
test("parse") {
val shape = WKTParser.parseAll("LINESTRING (30 10, 10 30, 40 40)")
assert(shape.isInstanceOf[PolyLine])
}
test("perf") {
def time[R](block: => R): R = {
val t0 = System.nanoTime()
val result = block // call-by-name
val t1 = System.nanoTime()
println("Elapsed time: " + (t1 - t0)/1E6 + "ms")
result
}
def exec(text: String, n: Int, fn: (String) => Any) = {
var i = 0
while (i < n) {
fn(text)
i += 1
}
}
val text = "LINESTRING (30 10, 10 30, 40 40)"
val n = 100000
time(exec(text, n, parseUsingJTS))
time(exec(text, n, (s: String) => WKTParser.linestring.parse(s)))
}
private def parseUsingJTS(text: String): Shape = {
val wkt = new WKTReader()
val polyline = wkt.read(text)
val coords = polyline.getCoordinates()
val points = new Array[Point](coords.length)
var i = 0
while (i < coords.length) {
val coord = coords(i)
points.update(i, Point(coord.x, coord.y))
i += 1
}
PolyLine(Array(0), points)
}
}
================================================
FILE: src/test/scala/magellan/catalyst/AsGeoJSONSuite.scala
================================================
package magellan.catalyst
import magellan.{Geometry, Point, TestSparkContext}
import org.apache.spark.sql.Row
import org.apache.spark.sql.magellan.dsl.expressions._
import org.json4s.jackson.JsonMethods.parse
import org.scalatest.FunSuite
class AsGeoJSONSuite extends FunSuite with TestSparkContext {
test("as geojson") {
val sqlCtx = this.sqlContext
import sqlCtx.implicits._
val point = Point(35.7, -122.3)
val points = Seq((1, point))
val df = sc.parallelize(points).toDF("id", "point")
val withJson = df.withColumn("json", $"point" asGeoJSON)
val json = withJson.select("json").map { case Row(s: String) => s}.take(1)(0)
implicit val formats = org.json4s.DefaultFormats
val result = parse(json).extract[Geometry]
val shapes = result.shapes
// expect a single point
assert(shapes.size == 1)
assert(shapes.head.asInstanceOf[Point] === point)
}
}
================================================
FILE: src/test/scala/magellan/catalyst/BufferSuite.scala
================================================
package magellan.catalyst
import magellan.{Point, Polygon, TestSparkContext}
import org.apache.spark.sql.magellan.dsl.expressions._
import org.scalatest.FunSuite
class BufferSuite extends FunSuite with TestSparkContext {
test("buffer point") {
val sqlCtx = this.sqlContext
import sqlCtx.implicits._
val point = Point(0.0, 1.0)
val points = Seq((1, point))
val df = sc.parallelize(points).toDF("id", "point")
val buffered = df.withColumn("buffered", $"point" buffer 0.5)
val polygon = buffered.select($"buffered").take(1)(0).get(0).asInstanceOf[Polygon]
assert(polygon.getNumRings() === 1)
// check that [0.0, 0.75] is within this polygon
assert(polygon.contains(Point(0.0, 0.75)))
// check that [0.4, 1.0] is within this polygon
assert(polygon.contains(Point(0.4, 1.0)))
// check that [0.6, 1.0] is outside this polygon
assert(!polygon.contains(Point(0.6, 1.0)))
}
}
================================================
FILE: src/test/scala/magellan/catalyst/ExpressionSuite.scala
================================================
/**
* Copyright 2015 Ram Sriharsha
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package magellan.catalyst
import magellan._
import org.apache.spark.sql.Row
import org.apache.spark.sql.catalyst.expressions._
import org.apache.spark.sql.magellan.dsl.expressions._
import org.scalatest.FunSuite
case class PointExample(point: Point)
case class PolygonExample(polygon: Polygon)
class ExpressionSuite extends FunSuite with TestSparkContext {
test("Point Converter") {
val sqlCtx = this.sqlContext
import sqlCtx.implicits._
val df = sc.parallelize(Seq((35.7, -122.3))).toDF("lat", "lon")
val p = df.withColumn("point", point($"lon", $"lat"))
.select('point)
.first()(0).asInstanceOf[Point]
assert(p.getX() === -122.3)
assert(p.getY() === 35.7)
}
test("Within") {
val sqlCtx = this.sqlContext
import sqlCtx.implicits._
val ring = Array(Point(1.0, 1.0), Point(1.0, -1.0),
Point(-1.0, -1.0), Point(-1.0, 1.0),
Point(1.0, 1.0))
val polygons = sc.parallelize(Seq(
PolygonExample(Polygon(Array(0), ring))
)).toDF()
val points = sc.parallelize(Seq(
PointExample(Point(0.0, 0.0)),
PointExample(Point(2.0, 2.0))
)).toDF()
val joined = points.join(polygons).where($"point" within $"polygon")
assert(joined.count() === 1)
}
test("Intersects") {
val sqlCtx = this.sqlContext
import sqlCtx.implicits._
val ring = Array(Point(1.0, 1.0), Point(1.0, -1.0),
Point(-1.0, -1.0), Point(-1.0, 1.0),
Point(1.0, 1.0))
val polygons = sc.parallelize(Seq(
PolygonExample(Polygon(Array(0), ring))
)).toDF()
val points = sc.parallelize(Seq(
PointExample(Point(0.0, -1.0)),
PointExample(Point(2.0, 2.0))
)).toDF()
val joined = points.join(polygons).where($"point" intersects $"polygon")
assert(joined.count() === 1)
}
test("Contains") {
val sqlCtx = this.sqlContext
import sqlCtx.implicits._
val ring = Array(Point(1.0, 1.0), Point(1.0, -1.0),
Point(-1.0, -1.0), Point(-1.0, 1.0),
Point(1.0, 1.0))
val polygons = sc.parallelize(Seq(
PolygonExample(Polygon(Array(0), ring))
)).toDF()
val points = sc.parallelize(Seq(
PointExample(Point(0.0, 0.0)),
PointExample(Point(2.0, 2.0))
)).toDF()
val joined = points.join(polygons).where($"polygon" >? $"point")
assert(joined.count() === 1)
}
test("Polygon intersects Line") {
val sqlCtx = this.sqlContext
import sqlCtx.implicits._
val ring = Array(Point(1.0, 1.0), Point(1.0, -1.0),
Point(-1.0, -1.0), Point(-1.0, 1.0),
Point(1.0, 1.0))
val polygons = sc.parallelize(Seq(
PolygonExample(Polygon(Array(0), ring))
)).toDF()
val lines = sc.parallelize(Seq(
(1, Line(Point(0.0, 0.0), Point(0.0, 5.0))), // proper intersection, yes
(2, Line(Point(0.0, 0.0), Point(1.0, 0.0))), // contained within and touches boundary, yes
(3, Line(Point(1.0, 1.0), Point(1.0, 0.0))), // lies on boundary, yes
(4, Line(Point(1.0, 1.0), Point(2.0, 2.0))), // touches, yes
(5, Line(Point(0.0, 0.0), Point(0.5, 0.5))), // contained entirely within, yes
(6, Line(Point(2.0, 2.0), Point(3.0, 3.0))) // outside, no
)).toDF("id", "line")
val joined = lines.join(polygons).where($"polygon" intersects $"line")
assert(joined.select($"id").map { case Row(s: Int) => s }.collect().sorted === Array(1, 2, 3, 4, 5))
}
test("PolyLine intersects Line") {
val line = Line(Point(0,0), Point(2,2))
val polyline1 = PolyLine(new Array[Int](3), Array(
Point(0.0, 0.0), Point(2.0, 2.0), Point(-2.0, -2.0)
))
val polyline2 = PolyLine(new Array[Int](3), Array(
Point(0.0, 3.0), Point(3.0, 1.0), Point(-2.0, -2.0)
))
val polyline3 = PolyLine(new Array[Int](3), Array(
Point(3.0, 3.0), Point(3.0, 11.0), Point(5.0, 0.0)
))
assert(polyline1.intersects(line) === true)
assert(polyline2.intersects(line) === true)
assert(polyline3.intersects(line) === false)
val sqlCtx = this.sqlContext
import sqlCtx.implicits._
val lines = sc.parallelize(Seq(("1", line))).toDF("id", "line")
val polylines = sc.parallelize(Seq(
(true, polyline1),
(true, polyline2),
(false, polyline3))).toDF("cond", "polyline")
val joined = polylines.join(lines, $"polyline" intersects $"line", "leftOuter").
select("cond", "line").
collect().
map {
case Row(cond: Boolean, line: Line) =>
(cond, Some(line))
case Row(cond: Boolean, null) =>
(cond, None)
}
joined foreach { case (cond, line) => assert(cond || line.isEmpty)}
}
test("PolyLine intersects Polygon") {
val polyline = PolyLine(Array(0), Array(Point(0.0, 0.0), Point(1.0, 1.0)))
val polygon1 = Polygon(Array(0), Array(Point(1.0, 1.0), Point(1.0, -1.0),
Point(-1.0, -1.0), Point(-1.0, 1.0), Point(1.0, 1.0)))
val polygon2 = Polygon(Array(0), Array(Point(3.0, 3.0), Point(3.0, 2.0),
Point(2.0, 2.0), Point(2.0, 3.0), Point(3.0, 3.0)))
val polygon3 = Polygon(Array(0), Array(Point(3.0, 3.0), Point(3.0, -3.0),
Point(-3.0, -3.0), Point(-3.0, 3.0), Point(3.0, 3.0)))
assert(polygon1.intersects(polyline) === true)
assert(polygon2.intersects(polyline) === false)
assert(polygon3.intersects(polyline) === true)
val sqlCtx = this.sqlContext
import sqlCtx.implicits._
val polylines = sc.parallelize(Seq(("1", polyline))).toDF("id", "polyline")
val polygons = sc.parallelize(Seq(
(true, polygon1),
(false, polygon2),
(true, polygon3))).toDF("cond", "polygon")
val joined = polygons.join(polylines, $"polygon" intersects $"polyline", "leftOuter").
select("cond", "polyline").
collect().
map {
case Row(cond: Boolean, polyline: PolyLine) =>
(cond, Some(polyline))
case Row(cond: Boolean, null) =>
(cond, None)
}
joined foreach { case (cond, polyline) => assert(cond || polyline.isEmpty)}
}
test("PolyLine contains Point") {
val polyline = PolyLine(new Array[Int](3), Array(
Point(0.0, 0.0), Point(3.0, 3.0), Point(-2.0, -2.0)
))
val sqlCtx = this.sqlContext
import sqlCtx.implicits._
val polylines = sc.parallelize(Seq(("1", polyline))).toDF("id", "polyline")
val points = sc.parallelize(Seq(
(true, Point(1.0, 1.0)),
(false, Point(2.0, 1.0)))).toDF("cond", "point")
val joined = points.join(polylines, $"point" within $"polyline", "leftOuter").
select("cond", "polyline").
collect().
map {
case Row(cond: Boolean, polyline: PolyLine) =>
(cond, Some(polyline))
case Row(cond: Boolean, null) =>
(cond, None)
}
joined foreach { case (cond, polyline) => assert(cond || polyline.isEmpty)}
}
test("Point within Range") {
val sqlCtx = this.sqlContext
import sqlCtx.implicits._
val points = sc.parallelize(Seq(
PointExample(Point(0.0, 0.0)),
PointExample(Point(2.0, 2.0))
)).toDF()
val boundingBox = BoundingBox(0.0, 0.0, 1.0, 1.0)
assert(points.where($"point" withinRange boundingBox).count() === 1)
}
test("Point within Circle Range") {
val sqlCtx = this.sqlContext
import sqlCtx.implicits._
val points = sc.parallelize(Seq(
PointExample(Point(0.0, 0.0)),
PointExample(Point(2.0, 2.0))
)).toDF()
assert(points.where($"point" withinRange (Point(0.0, 0.0), 1.0)).count() === 1)
}
test("Polygon within Range") {
val sqlCtx = this.sqlContext
import sqlCtx.implicits._
val ring = Array(Point(1.0, 1.0), Point(1.0, -1.0),
Point(-1.0, -1.0), Point(-1.0, 1.0),
Point(1.0, 1.0))
val polygons = sc.parallelize(Seq(
PolygonExample(Polygon(Array(0), ring))
)).toDF()
val boundingBox = BoundingBox(-1.0, -1.0, 1.0, 1.0)
assert(polygons.where($"polygon" withinRange boundingBox).count() === 1)
}
test("Polygon within Circle Range") {
val sqlCtx = this.sqlContext
import sqlCtx.implicits._
val ring = Array(Point(1.0, 1.0), Point(1.0, -1.0),
Point(-1.0, -1.0), Point(-1.0, 1.0),
Point(1.0, 1.0))
val polygons = sc.parallelize(Seq(
PolygonExample(Polygon(Array(0), ring))
)).toDF()
assert(polygons.where($"polygon" withinRange (Point(0.0, 0.0), 1.42)).count() === 1)
}
test("eval: point in range") {
val expr = WithinRange(MockPointExpr(Point(0.0, 0.0)), BoundingBox(0.0, 0.0, 1.0, 1.0))
assert(expr.eval(null) === true)
}
test("eval: point in circle range") {
val expr = WithinCircleRange(MockPointExpr(Point(0.0, 0.0)), Point(0.5, 0.5), 0.5)
assert(expr.eval(null) === false)
}
test("eval: point within polygon") {
val ring = Array(Point(1.0, 1.0), Point(1.0, -1.0),
Point(-1.0, -1.0), Point(-1.0, 1.0),
Point(1.0, 1.0))
val polygon = Polygon(Array(0), ring)
var point = Point(0.0, 0.0)
var expr = Within(MockPointExpr(point), MockPolygonExpr(polygon))
assert(expr.eval(null) === true)
point = Point(1.5, 1.5)
expr = Within(MockPointExpr(point), MockPolygonExpr(polygon))
assert(expr.eval(null) === false)
}
test("eval: point intersects polygon") {
val ring = Array(Point(1.0, 1.0), Point(1.0, -1.0),
Point(-1.0, -1.0), Point(-1.0, 1.0),
Point(1.0, 1.0))
val polygon = Polygon(Array(0), ring)
var point = Point(0.0, 0.0)
var expr = Intersects(MockPointExpr(point), MockPolygonExpr(polygon))
assert(expr.eval(null) === false)
point = Point(1.0, 1.0)
expr = Intersects(MockPointExpr(point), MockPolygonExpr(polygon))
assert(expr.eval(null) === true)
}
test("Polygon intersects Polygon") {
/**
* +---------+ 1,1
* + 0,0 + 2,0
* + +---+----+
* + + + +
* +-----+---+ +
* +--------+
*/
val ring1 = Array(Point(1.0, 1.0), Point(1.0, -1.0),
Point(-1.0, -1.0), Point(-1.0, 1.0), Point(1.0, 1.0))
val polygon1 = Polygon(Array(0), ring1)
val ring2 = Array(Point(0.0, 0.0), Point(2.0, 0.0),
Point(2.0, -2.0), Point(0.0, -2.0), Point(0.0, 0.0))
val polygon2 = Polygon(Array(0), ring2)
val ring3 = Array(Point(1.0, 0.0), Point(2.0, 0.0),
Point(2.0, -2.0), Point(1.0, -2.0), Point(1.0, 0.0))
val polygon3 = Polygon(Array(0), ring3)
val ring4 = Array(Point(1.0, -1.0), Point(2.0, -1.0),
Point(2.0, -2.0), Point(1.0, -2.0), Point(1.0, -1.0))
val polygon4 = Polygon(Array(0), ring4)
val ring5 = Array(Point(1.1, -1.0), Point(2.0, -1.0),
Point(2.0, -2.0), Point(1.1, -2.0), Point(1.1, -1.0))
val polygon5 = Polygon(Array(0), ring5)
val sqlCtx = this.sqlContext
import sqlCtx.implicits._
val x = sc.parallelize(Seq(
PolygonExample(polygon1)
)).toDF()
val y = sc.parallelize(Seq(polygon2, polygon3, polygon4, polygon5)).zipWithIndex().toDF("polygon", "index")
val results = x.join(y).where(x("polygon") intersects y("polygon")).
select($"index").
map {case Row (s: Long) => s}.
collect().
sorted
assert(results === Array(0, 1, 2))
}
}
================================================
FILE: src/test/scala/magellan/catalyst/IndexerSuite.scala
================================================
/**
* Copyright 2015 Ram Sriharsha
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package magellan.catalyst
import magellan.{MockPointExpr, Point, TestSparkContext}
import magellan.index.ZOrderCurve
import org.apache.spark.sql.catalyst.expressions.{GenericInternalRow, Indexer}
import org.apache.spark.sql.catalyst.util.GenericArrayData
import org.apache.spark.sql.magellan.dsl.expressions._
import org.scalatest.FunSuite
class IndexerSuite extends FunSuite with TestSparkContext {
test("index points") {
val sqlCtx = this.sqlContext
val path = this.getClass.getClassLoader.getResource("testpoint/").getPath
val df = sqlCtx.read.format("magellan").load(path)
import sqlCtx.implicits._
val index = df.withColumn("index", $"point" index 25)
.select($"index.curve")
.take(1)(0)(0)
.asInstanceOf[Seq[ZOrderCurve]]
assert(index.map(_.toBase32()) === Seq("9z109"))
try {
df.withColumn("index", $"point" index 23)
assert(false)
} catch {
case e: Error => assert(true)
}
}
test("eval: Index") {
val indexer = Indexer(MockPointExpr(Point(-122.3959313, 37.7912976)), 25)
val result = indexer.eval(null).asInstanceOf[GenericArrayData]
assert(result.numElements() === 1)
val resultRow = result.get(0, Indexer.dataType).asInstanceOf[GenericInternalRow]
val indexUDT = Indexer.indexUDT
val curve = indexUDT.deserialize(resultRow.get(0, indexUDT))
assert(curve.toBase32() === "9q8yy")
val relation = resultRow.getString(1)
assert(relation === "Contains")
}
}
================================================
FILE: src/test/scala/magellan/catalyst/RangeQueryRewriteSuite.scala
================================================
/**
* Copyright 2015 Ram Sriharsha
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package magellan.catalyst
import magellan.{BoundingBox, Point, TestSparkContext}
import org.apache.spark.sql.catalyst.expressions.{And, GreaterThanOrEqual, LessThanOrEqual, Literal}
import org.apache.spark.sql.catalyst.plans.logical.{Filter, LogicalPlan}
import org.apache.spark.sql.catalyst.rules.RuleExecutor
import org.apache.spark.sql.magellan.dsl.expressions._
import org.apache.spark.sql.types.DoubleType
import org.scalatest.FunSuite
class RangeQueryRewriteSuite extends FunSuite with TestSparkContext {
test("Rewrite point($x, $y) within Range Query") {
object Optimize extends RuleExecutor[LogicalPlan] {
val batches =
Batch("rewrite range query", FixedPoint(100), RangeQueryRewrite(spark)) :: Nil
}
val sqlCtx = this.sqlContext
import sqlCtx.implicits._
val points = sc.parallelize(Seq(
(0.0, 0.0),
(2.0, 2.0)
)).toDF("x", "y")
val boundingBox = BoundingBox(-1.0, -1.0, 1.0, 1.0)
val query = points.where(point($"x", $"y") withinRange boundingBox)
val optimizedPlan = Optimize.execute(query.queryExecution.analyzed)
val filter = optimizedPlan(0).asInstanceOf[Filter]
val condition = filter.condition
val And(xpredicate, ypredicate) = condition
val And(xupperbound, xlowerbound) = xpredicate
val And(yupperbound, ylowerbound) = ypredicate
xupperbound match {
case LessThanOrEqual(_, Literal(1.0, DoubleType)) => assert(true)
case _ => assert(false)
}
xlowerbound match {
case GreaterThanOrEqual(_, Literal(-1.0, DoubleType)) => assert(true)
case _ => assert(false)
}
yupperbound match {
case LessThanOrEqual(_, Literal(1.0, DoubleType)) => assert(true)
case _ => assert(false)
}
ylowerbound match {
case GreaterThanOrEqual(_, Literal(-1.0, DoubleType)) => assert(true)
case _ => assert(false)
}
// execute the query and verify the results
assert(query.count() === 1)
}
test("Rewrite point($x, $y) within Circle Range Query") {
object Optimize extends RuleExecutor[LogicalPlan] {
val batches =
Batch("rewrite range query", FixedPoint(100), new RangeQueryRewrite(spark)) :: Nil
}
val sqlCtx = this.sqlContext
import sqlCtx.implicits._
val points = sc.parallelize(Seq(
(0.0, 0.0),
(1.4, 1.4),
(2.0, 2.0)
)).toDF("x", "y")
val query = points.where(point($"x", $"y") withinRange (Point(0.5, 0.5), 1.0))
val optimizedPlan = Optimize.execute(query.queryExecution.analyzed)
val filter = optimizedPlan(0).asInstanceOf[Filter]
val condition = filter.condition
val And(And(xpredicate, ypredicate), other) = condition
val And(xupperbound, xlowerbound) = xpredicate
val And(yupperbound, ylowerbound) = ypredicate
xupperbound match {
case LessThanOrEqual(_, Literal(1.5, DoubleType)) => assert(true)
case _ => assert(false)
}
xlowerbound match {
case GreaterThanOrEqual(_, Literal(-0.5, DoubleType)) => assert(true)
case _ => assert(false)
}
yupperbound match {
case LessThanOrEqual(_, Literal(1.5, DoubleType)) => assert(true)
case _ => assert(false)
}
ylowerbound match {
case GreaterThanOrEqual(_, Literal(-0.5, DoubleType)) => assert(true)
case _ => assert(false)
}
// execute the query and verify the results
assert(query.count() === 1)
}
}
================================================
FILE: src/test/scala/magellan/catalyst/SpatialJoinSuite.scala
================================================
/**
* Copyright 2015 Ram Sriharsha
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package magellan.catalyst
import java.nio.file.Files
import magellan.{Point, Polygon, TestSparkContext, Utils}
import org.apache.spark.sql.Row
import org.apache.spark.sql.catalyst.optimizer.PushPredicateThroughJoin
import org.apache.spark.sql.catalyst.plans.logical.LogicalPlan
import org.apache.spark.sql.catalyst.rules.RuleExecutor
import org.apache.spark.sql.functions.broadcast
import org.apache.spark.sql.magellan.dsl.expressions._
import org.scalatest.FunSuite
class SpatialJoinSuite extends FunSuite with TestSparkContext {
object Optimize extends RuleExecutor[LogicalPlan] {
val batches =
Batch("pushdown filter through join", Once, PushPredicateThroughJoin) ::
Batch("spatial join", FixedPoint(100), new SpatialJoin(spark)) :: Nil
}
override def beforeAll() {
super.beforeAll()
Utils.injectRules(spark)
}
test("spatial join in plan: within") {
val sqlCtx = this.sqlContext
import sqlCtx.implicits._
val ring = Array(Point(1.0, 1.0), Point(1.0, -1.0),
Point(-1.0, -1.0), Point(-1.0, 1.0),
Point(1.0, 1.0))
val polygons = sc.parallelize(Seq(
("1", Polygon(Array(0), ring))
)).toDF("id", "polygon")
val points = sc.parallelize(Seq(
("a", 1, Point(0.0, 0.0)),
("b" , 2, Point(2.0, 2.0))
)).toDF("name", "value", "point")
val joined = points.join(polygons index 5).where($"point" within $"polygon")
val optimizedPlan = Optimize.execute(joined.queryExecution.analyzed)
assert(optimizedPlan.toString().contains("Generate inline(indexer"))
assert(joined.count() === 1)
}
test("spatial join in plan: more complex within condition") {
val sqlCtx = this.sqlContext
import sqlCtx.implicits._
val ring = Array(Point(1.0, 1.0), Point(1.0, -1.0),
Point(-1.0, -1.0), Point(-1.0, 1.0),
Point(1.0, 1.0))
val polygons = sc.parallelize(Seq(
("1", Polygon(Array(0), ring))
)).toDF("id", "polygon")
val points = sc.parallelize(Seq(
("a", 1, Point(0.0, 0.0)),
("b" , 2, Point(2.0, 2.0))
)).toDF("name", "value", "point")
val joined = points.join(polygons index 5).
where($"point" within $"polygon").
where($"name" === "a")
val optimizedPlan = Optimize.execute(joined.queryExecution.analyzed)
assert(optimizedPlan.toString().contains("Generate inline(indexer"))
assert(joined.count() === 1)
}
test("use existing indices in spatial join") {
val sqlCtx = this.sqlContext
import sqlCtx.implicits._
val ring = Array(Point(1.0, 1.0), Point(1.0, -1.0),
Point(-1.0, -1.0), Point(-1.0, 1.0),
Point(1.0, 1.0))
var polygons = sc.parallelize(Seq(
("1", Polygon(Array(0), ring))
)).toDF("id", "polygon")
.withColumn("index", $"polygon" index 5)
var points = sc.parallelize(Seq(
("a", 1, Point(0.0, 0.0)),
("b" , 2, Point(2.0, 2.0))
)).toDF("name", "value", "point")
.withColumn("index", $"point" index 5)
val outputDir = Files.createTempDirectory("output").toUri.getPath
val polygonsDir = s"$outputDir/polygons"
polygons.write.parquet(polygonsDir)
val pointsDir = s"$outputDir/points"
points.write.parquet(pointsDir)
points = spark.read.parquet(pointsDir)
polygons = spark.read.parquet(polygonsDir)
val joined = polygons.join(points).where($"point" within $"polygon")
val optimizedPlan = Optimize.execute(joined.queryExecution.analyzed)
assert(optimizedPlan.toString().contains("Generate inline(index#"))
assert(optimizedPlan.toString().contains("Generate inline(index#"))
assert(joined.count() === 1)
}
test("order of expressions in filter does not matter") {
val sqlCtx = this.sqlContext
import sqlCtx.implicits._
val ring = Array(Point(1.0, 1.0), Point(1.0, -1.0),
Point(-1.0, -1.0), Point(-1.0, 1.0),
Point(1.0, 1.0))
val polygons = sc.parallelize(Seq(
("1", Polygon(Array(0), ring))
)).toDF("id", "polygon")
val points = sc.parallelize(Seq(
("a", 1, Point(0.0, 0.0)),
("b" , 2, Point(2.0, 2.0))
)).toDF("name", "value", "point")
val joined = polygons.join(points index 5).where($"point" within $"polygon")
val optimizedPlan = Optimize.execute(joined.queryExecution.analyzed)
assert(optimizedPlan.toString().contains("Generate inline(indexer"))
assert(joined.count() === 1)
}
test("Broadcast Join preserved under spatial join") {
val sqlCtx = this.sqlContext
import sqlCtx.implicits._
val ring = Array(Point(1.0, 1.0), Point(1.0, -1.0),
Point(-1.0, -1.0), Point(-1.0, 1.0),
Point(1.0, 1.0))
val polygons = Seq(
("1", Polygon(Array(0), ring))
).toDF("id", "polygon")
val points =Seq(
("a", 1, Point(0.0, 0.0)),
("b" , 2, Point(2.0, 2.0))
).toDF("name", "value", "point")
val joined = points.join(broadcast(polygons index 5)).where($"point" within $"polygon")
assert(joined.queryExecution.executedPlan.toString() contains "BroadcastExchange")
}
test("Spatial Join rewrite does not introduce additional output columns") {
val sqlCtx = this.sqlContext
import sqlCtx.implicits._
val path = this.getClass.getClassLoader.getResource("geojson/multipolygon/countries.geojson").getPath
val countries = sqlContext.read
.format("magellan")
.option("type", "geojson")
.load(path)
.select($"polygon",
$"metadata"("name").as("country"))
.cache()
val cities = sc.parallelize(Seq(("San Francisco", Point(-122.5076401, 37.7576793)))).toDF("city", "point")
val results = cities.join(countries index 5).where($"point" within $"polygon")
//polygon, name, point, city
assert(results.columns.size === 4)
}
test("Optimize Left Outer Join") {
val sqlCtx = this.sqlContext
import sqlCtx.implicits._
val ring1 = Array(Point(1.0, 1.0), Point(1.0, -1.0),
Point(-1.0, -1.0), Point(-1.0, 1.0),
Point(1.0, 1.0))
val ring2 = Array(Point(1.1, -1.0), Point(2.0, -1.0),
Point(2.0, -2.0), Point(1.1, -2.0), Point(1.1, -1.0))
val polygons = sc.parallelize(Seq(
("1", Polygon(Array(0), ring1)),
("2", Polygon(Array(0), ring2))
)).toDF("id", "polygon")
val points = sc.parallelize(Seq(
("a", 1, Point(0.0, 0.0)),
("b", 2, Point(1.5, -1.5)),
("c" , 3, Point(2.0, 2.0))
)).toDF("name", "value", "point")
val joined = points.join(polygons index 5,
points("point") within polygons("polygon"), "left_outer")
val optimizedPlan = Optimize.execute(joined.queryExecution.analyzed)
assert(optimizedPlan.toString().contains("Generate inline(indexer"))
assert(joined.count() === 3)
val unmatched = joined.filter($"polygon" isNull).
select("name").
map { case Row(s: String) => s}.collect()
assert(unmatched === Array("c"))
}
test("Complex Join Condition") {
val sqlCtx = this.sqlContext
import sqlCtx.implicits._
val ring = Array(Point(1.0, 1.0), Point(1.0, -1.0),
Point(-1.0, -1.0), Point(-1.0, 1.0),
Point(1.0, 1.0))
val polygons = sc.parallelize(Seq(
("1", Polygon(Array(0), ring))
)).toDF("id", "polygon")
val points = sc.parallelize(Seq(
("a", 1, Point(0.0, 0.0)),
("b" , 2, Point(2.0, 2.0))
)).toDF("name", "value", "point")
var joined = points.join(polygons index 5,
points("point") within polygons("polygon")).filter(points("name") === "a")
var optimizedPlan = Optimize.execute(joined.queryExecution.analyzed)
assert(optimizedPlan.toString().contains("Generate inline(indexer"))
assert(joined.count() === 1)
joined = points.join(polygons index 5).
where(points("name") === "a" && (points("point") within polygons("polygon")))
optimizedPlan = Optimize.execute(joined.queryExecution.analyzed)
assert(optimizedPlan.toString().contains("Generate inline(indexer"))
assert(joined.count() === 1)
}
}
================================================
FILE: src/test/scala/magellan/catalyst/TransformerSuite.scala
================================================
/**
* Copyright 2015 Ram Sriharsha
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package magellan.catalyst
import magellan.TestingUtils._
import magellan.{MockPointExpr, Point, TestSparkContext}
import org.apache.spark.sql.catalyst.InternalRow
import org.apache.spark.sql.catalyst.expressions.{GenericInternalRow, Transformer}
import org.apache.spark.sql.magellan.dsl.expressions._
import org.scalatest.FunSuite
class TransformerSuite extends FunSuite with TestSparkContext {
test("transform") {
val sqlCtx = this.sqlContext
val path = this.getClass.getClassLoader.getResource("testpoint/").getPath
val df = sqlCtx.read.format("magellan").load(path)
import sqlCtx.implicits._
val dbl = (x: Point) => Point(2 * x.getX(), 2 * x.getY())
val point = df.withColumn("transformed", $"point".transform(dbl))
.select($"transformed")
.first()(0).asInstanceOf[Point]
assert(point.getX() ~== -199.0 absTol 1.0)
}
test("eval: transform") {
val fn = (p: Point) => Point(2 * p.getX(), 2 * p.getY())
val expr = Transformer(MockPointExpr(Point(1.0, 2.0)), fn)
val result = expr.eval(null).asInstanceOf[InternalRow]
// skip the type
assert(result.getDouble(1) === 2.0)
assert(result.getDouble(2) === 4.0)
}
}
================================================
FILE: src/test/scala/magellan/catalyst/WKTSuite.scala
================================================
/**
* Copyright 2015 Ram Sriharsha
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package magellan.catalyst
import com.esri.core.geometry.GeometryEngine
import magellan.esri.ESRIUtil
import magellan.{Point, Polygon, TestSparkContext}
import org.apache.spark.sql.Row
import org.apache.spark.sql.magellan.dsl.expressions._
import org.scalatest.FunSuite
class WKTSuite extends FunSuite with TestSparkContext {
test("convert points to WKT") {
val sqlCtx = this.sqlContext
import sqlCtx.implicits._
val df = sc.parallelize(Seq(
(1, "POINT (3 15)"),
(2, "POINT (25 5)"),
(3, "POINT (30 10)")
)).toDF("id", "text")
val points = df.withColumn("shape", wkt($"text")).select($"shape"("point"))
assert(points.count() === 3)
val point = points.first()(0).asInstanceOf[Point]
assert(point.getX() === 3.0)
assert(point.getY() === 15.0)
}
test("ISSUE-108") {
val sqlCtx = this.sqlContext
import sqlCtx.implicits._
val points = sc.parallelize(Seq(
"600000001,5.4588922996667,5.4588922996667",
"600000001,5.4588922996667,5.4588922996667",
"6000000SS,5.4588922996667,5.4588922996667",
"600000033,5.4588922996669,5.4588922996669",
"600000000,5.4588922996667,5.4588922996667",
"600000002,5.4588922996668,5.45889229966681",
"6000000SS,5.4588922996667,5.4588922996667",
"100000000,15.4588922996667,47.0500470991844",
"100000001,15.4427295917601,47.0628953964286"
)).map { line =>
val Array(pointId, x, y) = line.split(",")
(pointId, Point(x.toDouble, y.toDouble))
}.toDF("pointId", "point")
val polygons = sc.parallelize(Seq(
"location2;456;POLYGON ((0.4588922996667 0.4588922996667, 10.4588922996667 0.4588922996667, 10.4588922996667 10.4588922996667, 0.4588922996667 10.4588922996667, 0.4588922996667 0.4588922996667))",
"handDrawn;-55;POLYGON((16.5132943323988 47.85121641510742,16.523422353639035 47.83923477616023,16.558183782472042 47.84741484867311,16.558183782472042 47.86106463188969,16.53106128491345 47.865210689885984,16.52951633252087 47.85565122375945,16.516985052003292 47.857378968615265,16.5132943323988 47.85121641510742))"
)).map { line =>
val Array(polygonId, value, text) = line.split(";")
(polygonId, value, text)
}.toDF("polygonId", "value", "text")
.withColumn("polygon", wkt($"text")("polygon"))
val actual = points.join(polygons)
.where($"point" within $"polygon")
.select($"pointId", $"polygonId")
.map { case Row(pointId: String, polygonId: String) =>
(pointId, polygonId)
}
.collect()
.sortBy(_._1)
// compare with ESRI
val esriPoints = points.collect().map { case Row(id: String, point: Point) =>
val esriPoint = ESRIUtil.toESRIGeometry(point)
(id, esriPoint)
}
val esriResults = polygons.flatMap {
case Row(polygonId: String, value: String, text: String, polygon: Polygon) =>
val esriPolygon = ESRIUtil.toESRIGeometry(polygon)
esriPoints.map {case (pointId, esriPoint) =>
val within = GeometryEngine.contains(esriPolygon, esriPoint, null)
(within, pointId, polygonId)
}.filter(_._1)
}
val expected = esriResults.collect().sortBy(_._2)
assert(expected.length === actual.length)
assert(expected.map(x => (x._2, x._3)).deep === actual.deep)
}
}
================================================
FILE: src/test/scala/magellan/encoders/EncodersSuite.scala
================================================
package magellan.encoders
import magellan.{Point, PolyLine, Polygon, TestSparkContext}
import magellan.encoders.Encoders._
import org.apache.spark.sql.magellan.dsl.expressions._
import org.scalatest.FunSuite
class EncodersSuite extends FunSuite with TestSparkContext {
test("point encoder") {
val sqlContext = this.sqlContext
import sqlContext.implicits._
val points = sc.parallelize(Seq(
Point(-1.0, -0.9),
Point(1.1, -0.8),
Point(1.2, 0.9),
Point(-0.8, 0.9)
)).toDS()
assert(points.filter(_.getX() == -1.0).count() === 1)
}
test("polygon encoder") {
val sqlContext = this.sqlContext
import sqlContext.implicits._
val ring1 = Array(Point(1.0, 1.0), Point(1.0, -1.0),
Point(-1.0, -1.0), Point(-1.0, 1.0), Point(1.0, 1.0))
val ring2 = Array(Point(5.0, 5.0), Point(5.0, 4.0),
Point(4.0, 4.0), Point(4.0, 5.0), Point(5.0, 5.0))
val polygon1 = Polygon(Array(0),ring1)
val polygon2 = Polygon(Array(0), ring2)
val polygons = sc.parallelize(Seq(
polygon1,
polygon2)).toDS()
assert(polygons.filter(_.contains(Point(0.0, 0.0))).count() === 1)
}
test("join") {
val sqlContext = this.sqlContext
import sqlContext.implicits._
val ring1 = Array(Point(1.0, 1.0), Point(1.0, -1.0),
Point(-1.0, -1.0), Point(-1.0, 1.0), Point(1.0, 1.0))
val ring2 = Array(Point(5.0, 5.0), Point(5.0, 4.0),
Point(4.0, 4.0), Point(4.0, 5.0), Point(5.0, 5.0))
val polygon1 = Polygon(Array(0),ring1)
val polygon2 = Polygon(Array(0), ring2)
val polygons = sc.parallelize(Seq(
polygon1,
polygon2)).toDS()
val points = sc.parallelize(Seq(
Point(0.0, 0.0),
Point(1.1, 1.1),
Point(4.4, 4.4)
)).toDS()
val joined = points.join(polygons,
points.col("type") within polygons.col("type"))
assert(joined.count() === 2)
}
test("polyline encoder") {
val sqlContext = this.sqlContext
import sqlContext.implicits._
val ring = Array(Point(-1.0, 1.0), Point(1.0, 1.0),
Point(1.0, -1.0), Point(-1.0, -1.0))
val polyline = PolyLine(Array(0), ring)
val polylines = sc.parallelize(Seq(polyline)).toDS()
assert(polylines.filter(_.getVertex(0) == Point(-1.0, 1.0)).count() === 1)
}
}
================================================
FILE: src/test/scala/magellan/esri/ESRIUtilSuite.scala
================================================
package magellan.esri
import com.esri.core.geometry.{Point => ESRIPoint, Polygon => ESRIPolygon, Polyline => ESRIPolyline}
import org.scalatest.FunSuite
import magellan._
import magellan.TestingUtils._
class ESRIUtilSuite extends FunSuite {
test("to esri-point") {
val esriPoint = ESRIUtil.toESRI(Point(0.0, 1.0))
assert(esriPoint.getX === 0.0)
assert(esriPoint.getY === 1.0)
}
test("from esri-point") {
val esriPoint = new ESRIPoint(0.0, 1.0)
val point = ESRIUtil.fromESRI(esriPoint)
assert(point.getX() == 0.0)
assert(point.getY() == 1.0)
}
test("to esri-polygon") {
// no hole
var ring = Array(Point(1.0, 1.0), Point(1.0, -1.0),
Point(-1.0, -1.0), Point(-1.0, 1.0), Point(1.0, 1.0))
var polygon = Polygon(Array(0), ring)
var esriPolygon = ESRIUtil.toESRI(polygon)
assert(esriPolygon.calculateRingArea2D(0) ~== 4.0 absTol 0.001)
assert(esriPolygon.getPathCount === 1)
assert(esriPolygon.getPoint(0).getX === 1.0)
assert(esriPolygon.getPoint(0).getY === 1.0)
assert(esriPolygon.getPoint(1).getX === 1.0)
assert(esriPolygon.getPoint(1).getY === -1.0)
assert(esriPolygon.getPoint(3).getX === -1.0)
assert(esriPolygon.getPoint(3).getY === 1.0)
}
test("from esri-polygon") {
val esriPolygon = new ESRIPolygon()
// outer ring1
esriPolygon.startPath(-200, -100)
esriPolygon.lineTo(200, -100)
esriPolygon.lineTo(200, 100)
esriPolygon.lineTo(-190, 100)
esriPolygon.lineTo(-190, 90)
esriPolygon.lineTo(-200, 90)
// hole
esriPolygon.startPath(-100, 50)
esriPolygon.lineTo(100, 50)
esriPolygon.lineTo(100, -40)
esriPolygon.lineTo(90, -40)
esriPolygon.lineTo(90, -50)
esriPolygon.lineTo(-100, -50)
// island
esriPolygon.startPath(-10, -10)
esriPolygon.lineTo(10, -10)
esriPolygon.lineTo(10, 10)
esriPolygon.lineTo(-10, 10)
esriPolygon.reverseAllPaths()
val polygon = ESRIUtil.fromESRI(esriPolygon)
assert(polygon.getRings() === Array(0, 6, 12))
assert(polygon.getVertex(6) === Point(-200.0, -100.0))
assert(polygon.getVertex(13) === Point(-100.0, 50.0))
}
test("to esri-polyline") {
var ring = Array(Point(1.0, 1.0), Point(1.0, -1.0),
Point(-1.0, -1.0), Point(-1.0, 1.0))
var polyline = PolyLine(Array(0), ring)
var esriPolyline = ESRIUtil.toESRI(polyline)
assert(esriPolyline.getPoint(0).getX === 1.0)
assert(esriPolyline.getPoint(0).getY === 1.0)
assert(esriPolyline.getPoint(1).getX === 1.0)
assert(esriPolyline.getPoint(1).getY === -1.0)
assert(esriPolyline.getPoint(3).getX === -1.0)
assert(esriPolyline.getPoint(3).getY === 1.0)
}
test("from esri-polyline") {
val esriPolyline = new ESRIPolyline()
// outer ring1
esriPolyline.startPath(-200, -100)
esriPolyline.lineTo(200, -100)
esriPolyline.lineTo(200, 100)
esriPolyline.lineTo(-190, 100)
esriPolyline.lineTo(-190, 90)
esriPolyline.lineTo(-200, 90)
esriPolyline.startPath(-100, 50)
esriPolyline.lineTo(100, 50)
esriPolyline.lineTo(100, -40)
esriPolyline.lineTo(90, -40)
esriPolyline.lineTo(90, -50)
esriPolyline.lineTo(-100, -50)
esriPolyline.reverseAllPaths()
val polyline = ESRIUtil.fromESRI(esriPolyline)
assert(polyline.getRings() === Array(0, 6))
assert(polyline.getVertex(2) === Point(-190.0, 100.0))
assert(polyline.getVertex(7) === Point(-100.0, -50.0))
}
}
================================================
FILE: src/test/scala/magellan/geometry/R2LoopSuite.scala
================================================
/**
* Copyright 2015 Ram Sriharsha
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package magellan.geometry
import magellan.Relate.{Contains, Disjoint, Touches}
import magellan.TestingUtils._
import magellan.{Line, Point}
import org.scalatest.FunSuite
class R2LoopSuite extends FunSuite {
test("Loop contains Point") {
val r2Loop = makeLoop("1.0:1.0,1.0:-1.0,-1.0:-1.0,-1.0:1.0,1.0:1.0")
assert(r2Loop.contains(Point(0.0, 0.0)))
assert(r2Loop.contains(Point(0.5, 0.5)))
assert(!r2Loop.contains(Point(1.0, 0.0)))
}
test("Loop containsOrCrosses Point") {
val r2Loop = makeLoop("1.0:1.0,1.0:-1.0,-1.0:-1.0,-1.0:1.0,1.0:1.0")
assert(r2Loop.containsOrCrosses(Point(1.0, 0.0)) === Touches)
assert(r2Loop.containsOrCrosses(Point(0.0, 0.0)) === Contains)
assert(r2Loop.containsOrCrosses(Point(1.0, 1.0)) === Touches)
assert(r2Loop.containsOrCrosses(Point(2.0, 0.0)) === Disjoint)
}
test("Loop intersects line") {
val r2Loop = makeLoop("1.0:1.0,1.0:-1.0,-1.0:-1.0,-1.0:1.0,1.0:1.0")
assert(!r2Loop.intersects(Line(Point(0.0, 0.0), Point(0.5, 0.5))))
assert(r2Loop.intersects(Line(Point(-2.0, 0.0), Point(2.0, 0.0))))
}
test("Loop intersects Loop") {
val loop1 = makeLoop("1.0:1.0,1.0:-1.0,-1.0:-1.0,-1.0:1.0,1.0:1.0")
val loop2 = makeLoop("0.0:0.0,2.0:0.0,2.0:-2.0,0.0:-2.0,0.0:0.0")
assert(loop1 intersects loop2)
}
test("Ray intersects line") {
/**
* Given
* + + + + + + + +
* .
* .
* P
*
* ray from P should intersect line
*/
assert(R2Loop.intersects(Point(0.0, -2.0), makeLine("-1.0:-1.0,1.0:-1.0")))
/**
* Given
* +
* +
* + .
* + .
* + P
*
* ray from P should not intersect line (parallel)
*/
assert(!R2Loop.intersects(Point(0.0, 0.0), makeLine("-1.0:-1.0,-1.0:1.0")))
/**
* Given
* +
* +
* +
* +
* P
*
* ray from P should not intersect line (collinear)
*/
assert(!R2Loop.intersects(Point(-1.0, 0.0), makeLine("-1.0:-1.0,-1.0:1.0")))
/**
* Given
* + + + +
* + .
* + .
* .
* P
*
* Ray from P should intersect polyline exactly once
*/
assert(!R2Loop.intersects(Point(2.0, 0.0), makeLine("0.0:0.0,2.0:2.0")))
assert(R2Loop.intersects(Point(2.0, 0.0), makeLine("2.0:2.0,4.0:2.0")))
/**
* Given
* + + + +
* + .
* + + + + + +
* .
* P
*
* Ray from P should intersect the polyline exactly twice
*/
assert(R2Loop.intersects(Point(2.0, 0.0), makeLine("1.0:1.0,4.0:1.0")))
}
}
================================================
FILE: src/test/scala/magellan/index/ZOrderCurveSuite.scala
================================================
/**
* Copyright 2015 Ram Sriharsha
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package magellan.index
import java.io.File
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.databind.module.SimpleModule
import magellan.{BoundingBox, Point, Polygon, PolygonDeserializer}
import magellan.TestingUtils._
import org.scalatest.FunSuite
class ZOrderCurveSuite extends FunSuite {
test("equals") {
val indexer = new ZOrderCurveIndexer(BoundingBox(-180, -90, 180, 90))
val index = indexer.index(Point(-122.4517249, 37.765315), 5)
val anotherIndex = indexer.index(Point(-122.4517249, 37.765315), 5)
assert(index === anotherIndex)
assert(index !== indexer.index(Point(-122.4517249, 37.765315), 7))
println(indexer.index(Point(-122.45, 37.76), 25).boundingBox)
assert(indexer.index(Point(-122.45, 37.76), 25) !== indexer.index(Point(-122.45, 37.8), 25))
}
test("GeoHash globe") {
val indexer = new ZOrderCurveIndexer(BoundingBox(-180, -90, 180, 90))
val index = indexer.index(Point(-122.4517249, 37.765315), 5)
assert(index.bits === (9L << 59))
val child = index.children().filter(_.code() === "0100110")
assert(!child.isEmpty)
val c = child.head
assert(c.bits === 5476377146882523136L)
}
test("GeoHash Point") {
val indexer = new ZOrderCurveIndexer(BoundingBox(-180, -90, 180, 90))
val index = indexer.index(Point(-122.3959313, 37.7912976), 25)
assert(index.toBase32() === "9q8yy")
assert(index.code() === "0100110110010001111011110")
val BoundingBox(xmin, ymin, xmax, ymax) = index.boundingBox
assert(xmin ~== -122.41 absTol 0.5)
assert(xmax ~== -122.41 absTol 0.5)
assert(ymin ~== 37.771 absTol 0.5)
assert(ymax ~== 37.771 absTol 0.5)
val anotherIndex = indexer.index(Point(116.6009234, 40.0798573), 30)
assert(anotherIndex.toBase32() === "wx4uj2")
}
test("GeoHash children") {
val indexer = new ZOrderCurveIndexer(BoundingBox(-180, -90, 180, 90))
val index = indexer.index(Point(-122.3959313, 37.7912976), 23)
val children = index.children()
assert(children.filter(_.toBase32() === "9q8yy").nonEmpty)
}
test("cover") {
val indexer = new ZOrderCurveIndexer(BoundingBox(-4, -4, 4, 4))
var cover = indexer.cover(BoundingBox(1.0, 1.0, 3.0, 3.0), 2)
assert(cover.size === 1)
val Seq(hash) = cover
assert(hash.code() === "11")
cover = indexer.cover(BoundingBox(1.0, 1.0, 3.0, 3.0), 4)
assert(cover.size === 4)
assert(cover.map(_.code()).sorted === Seq("1100", "1101", "1110", "1111"))
cover = indexer.cover(BoundingBox(1.0, 1.0, 3.0, 3.0), 6)
assert(cover.map(_.code).sorted === Seq("110011", "110110", "111001", "111100"))
}
test("index Polygon") {
val indexer = new ZOrderCurveIndexer(BoundingBox(-4, -4, 4, 4))
var ring = Array(Point(2.0, 1.0),
Point(3.5, 1.0),
Point(3.5, 1.5),
Point(2.5, 1.5),
Point(2.5, 2.5),
Point(2, 2.5),
Point(2.0, 1.0)
)
var polygon = Polygon(Array(0), ring)
var hashes = indexer.index(polygon, 2)
assert(hashes.map(_.code()) === Seq("11"))
hashes = indexer.index(polygon, 4)
assert(hashes.map(_.code()).sorted === Seq("1110", "1111"))
hashes = indexer.index(polygon, 6)
assert(hashes.map(_.code()).sorted === Seq("111001", "111011", "111100"))
}
test("geohash polygon") {
val path = this.getClass.getClassLoader.getResource("testindex/testpolygon.json").getPath
val mapper = new ObjectMapper()
val module = new SimpleModule()
module.addDeserializer(classOf[Polygon], new PolygonDeserializer())
mapper.registerModule(module)
val polygon: Polygon = mapper.readerFor(classOf[Polygon]).readValue(new File(path))
val indexer = new ZOrderCurveIndexer(BoundingBox(-180, -90, 180, 90))
var index = indexer.index(polygon, 20)
assert(index.map(_.toBase32()).sorted === Seq("dr5n", "dr5q"))
index = indexer.index(polygon, 25)
assert(index.map(_.toBase32()).contains("dr5nx"))
}
test("index equality") {
val indexer = new ZOrderCurveIndexer(BoundingBox(-4, -4, 4, 4))
val index1 = indexer.index(Point(0.5, 0.5), 4)
val index2 = indexer.index(Point(0.25, 0.25), 4)
val index3 = indexer.index(Point(2.05, 2.05), 4)
assert(index1 === index2)
assert(index1.hashCode() === index2.hashCode())
assert(index1 !== index3)
}
}
================================================
FILE: src/test/scala/magellan/io/ShapeReaderSuite.scala
================================================
/**
* Copyright 2015 Ram Sriharsha
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package magellan.io
import java.io.{DataInputStream, File, FileInputStream}
import org.apache.commons.io.EndianUtils
import org.scalatest.FunSuite
class ShapeReaderSuite extends FunSuite {
test("Read Polygon") {
val path = this.getClass.getClassLoader.getResource("testpolygon/testpolygon.shp").getPath
val dis = new DataInputStream(new FileInputStream(new File(path)))
val header = new Array[Byte](100)
dis.readFully(header, 0, 100) // discard the first 100 bytes
// discard the record header and content length
assert(dis.readInt() === 1)
val contentLength = 2 * dis.readInt() //content length in bytes
// contentlength = shapetype(int) + bounding box (4 doubles) + numParts (int) + numPoints (int) +
// parts (int) + points (16 * length) bytes
val expectedLength = (contentLength - 4 - 4 * 8 - 4 - 4 - 4) / 16
println(expectedLength)
// discard the geometry type
assert(EndianUtils.swapInteger(dis.readInt()) === 5)
// now read the polygon
val polygonReader = new PolygonReader()
val polygon = polygonReader.readFields(dis)
assert(polygon.length() === expectedLength)
}
}
================================================
FILE: src/test/scala/magellan/mapreduce/DBReaderSuite.scala
================================================
/**
* Copyright 2015 Ram Sriharsha
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package magellan.mapreduce
import scala.collection.JavaConversions._
import magellan.{TestingUtils, TestSparkContext}
import magellan.io.ShapeKey
import TestingUtils._
import org.apache.hadoop.io.{Text, MapWritable}
import org.scalatest.FunSuite
class DBReaderSuite extends FunSuite with TestSparkContext {
test("read dBase format") {
val path = this.getClass.getClassLoader.getResource("testzillow/zillow_ca.dbf").getPath
val baseRdd = sc.newAPIHadoopFile(
path,
classOf[DBInputFormat],
classOf[ShapeKey],
classOf[MapWritable]
)
assert(baseRdd.count() == 948)
}
test("bug: Landtracs DBF") {
val path = this.getClass.getClassLoader.getResource("landtracs/landtrac_units.dbf").getPath
val baseRdd = sc.newAPIHadoopFile(
path,
classOf[DBInputFormat],
classOf[ShapeKey],
classOf[MapWritable]
).map { case (s: ShapeKey, v: MapWritable) =>
v.entrySet().map { kv =>
val k = kv.getKey.asInstanceOf[Text].toString
val v = kv.getValue.asInstanceOf[Text].toString
(k, v)
}.toMap
}
assert(baseRdd.count() == 231)
// what does the first row look like?
val area = baseRdd.first()("SHAPE_area")
assert(area.toDouble ~== 426442.116396 absTol 1.0)
}
test("ISSUE-167") {
val path = this.getClass.getClassLoader.getResource("shapefiles/ISSUE-167/iri_shape.dbf").getPath
val baseRdd = sc.newAPIHadoopFile(
path,
classOf[DBInputFormat],
classOf[ShapeKey],
classOf[MapWritable]
).map { case (s: ShapeKey, v: MapWritable) =>
v.entrySet().map { kv =>
val k = kv.getKey.asInstanceOf[Text].toString
val v = kv.getValue.asInstanceOf[Text].toString
(k, v)
}.toMap
}
assert(baseRdd.count() == 22597)
assert(baseRdd.first()("route_ident").trim() === "[u'025A_BR_2498#_1']")
}
}
================================================
FILE: src/test/scala/magellan/mapreduce/ShxReaderSuite.scala
================================================
/**
* Copyright 2015 Ram Sriharsha
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package magellan.mapreduce
import magellan.TestSparkContext
import magellan.io.PolygonReader
import org.apache.commons.io.EndianUtils
import org.apache.hadoop.conf.Configuration
import org.apache.hadoop.fs.{FileSystem, Path}
import org.apache.hadoop.io.{ArrayWritable, LongWritable, Text}
import org.scalatest.FunSuite
class ShxReaderSuite extends FunSuite with TestSparkContext {
test("Read shx file") {
val path = this.getClass.getClassLoader.getResource("shapefiles/us_states/tl_2016_us_state.shx").getPath
val conf = new Configuration()
conf.set("mapreduce.input.fileinputformat.split.maxsize", "10000")
val data = sc.newAPIHadoopFile(
path,
classOf[ShxInputFormat],
classOf[Text],
classOf[ArrayWritable],
conf
).map { case (txt: Text, splits: ArrayWritable) =>
val fileName = txt.toString
val s = splits.get()
val size = s.length
var i = 0
val v = Array.fill(size)(0L)
while (i < size) {
v.update(i, s(i).asInstanceOf[LongWritable].get())
i += 1
}
(fileName, v)
}
assert(data.count() === 1)
val (fileName, splits) = data.first()
assert(fileName === "tl_2016_us_state")
// the offsets should be correct
val firstOffset = splits(0)
val secondOffset = splits(1)
// skipping to the first offset in the Shapefile should allow me to read the first polygon
val shpFilePath = this.getClass.getClassLoader.getResource("shapefiles/us_states/tl_2016_us_state.shp").getPath
val fs = FileSystem.get(sc.hadoopConfiguration)
var dis = fs.open(new Path(shpFilePath))
// skip firstOffset # of bytes
dis.seek(firstOffset)
// skip record number
assert(dis.readInt() === 1)
// read content length
var contentLength = 16 * (dis.readInt() + 4)
// extract the shape type
var shapeType = EndianUtils.swapInteger(dis.readInt())
// expect a Polygon
assert(shapeType === 5)
// the first polygon's content should follow from here
val polygonReader = new PolygonReader()
val polygon = polygonReader.readFields(dis)
assert(polygon != null)
// seek to the second offset
dis.seek(secondOffset)
assert(dis.readInt() === 2)
}
}
================================================
FILE: src/test/scala/magellan/mapreduce/WholeFileReaderSuite.scala
================================================
/**
* Copyright 2015 Ram Sriharsha
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package magellan.mapreduce
import magellan.TestSparkContext
import org.apache.hadoop.io.{NullWritable, Text}
import org.scalatest.FunSuite
class WholeFileReaderSuite extends FunSuite with TestSparkContext {
test("Read Whole File") {
val path = this.getClass.getClassLoader.getResource("geojson/point").getPath
val data = sc.newAPIHadoopFile(
path,
classOf[WholeFileInputFormat],
classOf[NullWritable],
classOf[Text]
)
assert(data.count() === 1)
}
}