In [6]:
from sqlalchemy import create_engine
from __future__ import division
from pyomo.environ import *
from pyomo.opt import SolverFactory
import time as tm
import googlemaps
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import os
import ast

In [7]:
# Conventions for naming model components:
#   SETS_ALL_CAPS
#   VarsCamelCase
#   params_pothole_case
#   Constraints_Words_Capitalized_With_Underscores

# Initialize the model
model = ConcreteModel()

engine = create_engine('postgresql+pg8000://jdlara:Amadeus-2010@switch-db2.erg.berkeley.edu:5432/apl_cec?ssl=true&sslfactory=org.postgresql.ssl.NonValidatingFactory')
df_routes = pd.read_sql_query('select biosum.scenario1_gis.lat as source_lat, biosum.scenario1_gis.lon as source_lon, pge_ram.feeders_data.lat as dest_lat, pge_ram.feeders_data.lon as dest_lon, st_distance_Spheroid(biosum.scenario1_gis.st_makepoint, pge_ram.feeders_data.the_geom, \'SPHEROID[\"WGS 84\",6378137,298.257223563]\')/1000 as distance FROM biosum.scenario1_gis, pge_ram.feeders_data where (st_distance_Spheroid(biosum.scenario1_gis.st_makepoint, pge_ram.feeders_data.the_geom, \'SPHEROID[\"WGS 84\",6378137,298.257223563]\')/1000 <= 30);',engine)
print df_routes.count()

"""
This portion of the code is somewhat difficult to follow. In the Database the
coordinates Y and X of the sites are independent columns, both the substations
and the biomass. However,from the optimization point of view each "point" is a
single location. So, what it does is that it merges the Y and X coordinates into
a single colum as a string. Later on, this will also be used to generate the
dictionaries with some limits.
"""

biomass_coord = df_routes.source_lat.astype(str).str.cat(df_routes.source_lon.astype(str), sep=',')
biomass_coord = biomass_coord.values.tolist()
biomass_coord = list(set(biomass_coord))

substation_coord = df_routes.dest_lat.astype(str).str.cat(df_routes.dest_lon.astype(str), sep=',')
substation_coord = substation_coord.values.tolist()
substation_coord = list(set(biomass_coord))

"""
Load data from files and turn into lists for processing, later this can be updated
directly from the database.

File biomass_v1.dat contains the data from the biomass stocks and their location
All the data is loaded in to a dataframe
File subs_v1.dat contains the data from the electrical nodes and their location
All the data is loaded in to a dataframe
"""

#biomass_df = pd.read_csv('biomass_v1.dat', encoding='UTF-8', delimiter=',')
#substation_df = pd.read_csv('subs_v2.dat', encoding='UTF-8', delimiter=',')

"""
The data for the piecewise cost of installation is given in # of gasifiers per
substation. This is why the sizes are integers. The cost is the total cost in $
of installing the amount N of gasifiers. Given that the gasifiers can only be
installed in integer number, this is a better approximation of the costs than
using a cost per kw. This explicit calculation needs to be replaced with a file.
"""
number_of_containers = [0, 1, 2, 3, 5, 10, 20]
cost = [0, 4000, 6500, 7500, 9300, 13000, 17000]

"""
Distances from googleAPI, matrx_distance is a dictionary, first it extends
the biomass list to include the substations for the distance calculations
Extract distances and travel times from the google maps API results

As of now, the code checks if the matrices already exist, this protection is
quite unrefined and will need better practices in the future, like comparing the
lists loaded in the model with the list in the files. For testing purposes, it
will work and avoid constant queries to the google API.

This portion of the code is run before the definition of the sets, to avoid
issues when some routes are not available.
"""
gmaps = googlemaps.Client(key='AIzaSyAh2PIcLDrPecSSR36z2UNubqphdHwIw7M')
distance_table = {}
time_table = {}
biomass_list = []
substation_list = []
avoid_table = {}
fail_table = {}


source_lat    34520
source_lon    34520
dest_lat      34520
dest_lon      34520
distance      34520
dtype: int64

In [8]:
if os.path.isfile('time_table.dat'):
    print "matrices for time exist at this time"
    f = open('time_table.dat', 'r')
    time_table = f.read()
    f.close()
    time_table = ast.literal_eval(time_table)
else:
    print "There are no matrix files stored"
    f = open('time_table.dat', 'w')
    f.close()    

if os.path.isfile('distance_table.dat'):
    print "matrices for distance exist at this time"
    f = open('distance_table.dat', 'r')
    distance_table = f.read()
    f.close()
    distance_table = ast.literal_eval(distance_table)
else:
    print "There are no matrix files stored"
    f = open('distance_table.dat', 'w')
    f.close()
    
if os.path.isfile('avoid_table.dat'):
    print "avoid table exist at this time"
    f = open('avoid_table.dat', 'r')
    avoid_table = f.read()
    f.close()
    avoid_table = ast.literal_eval(avoid_table)
else:
    print "There are no avoid table files stored"
    f = open('avoid_table.dat', 'w')
    f.close()  
    
if os.path.isfile('fail_table.dat'):
    print "fail table exist at this time"
else:
    print "There are no fail table files stored"
    f = open('fail_table.dat', 'w')
    f.close()


matrices for time exist at this time
matrices for distance exist at this time
avoid table exist at this time
fail table exist at this time

In [10]:
for (bio_idx, biomass_source) in enumerate(biomass_coord):
    for (sub_idx, substation_dest) in enumerate(substation_coord):
        if (biomass_coord[bio_idx], substation_coord[sub_idx]) not in distance_table.keys() or (biomass_coord[bio_idx], substation_coord[sub_idx]) not in avoid_table.keys():
            tm.sleep(0.3)
            matrx_distance = gmaps.distance_matrix(biomass_coord[bio_idx], substation_coord[sub_idx], mode="driving", departure_time="now", traffic_model="pessimistic")
            error = matrx_distance['rows'][0]['elements'][0]['status']
            if error != 'OK':
                f = open('fail_table.dat', 'a')
                f.write(('Route data unavailable for ' + str(biomass_coord[bio_idx]) + "," + str(substation_coord[sub_idx] + "\n")))
                f.close()            
            else:
                #print "Route data available for " + biomass_coord[bio_idx], substation_coord[sub_idx]
                if 0.001 * (matrx_distance['rows'][0]['elements'][0]['distance']['value']) > 160:
                    print "Distance too long for " + biomass_coord[bio_idx], substation_coord[sub_idx]
                    avoid_table[biomass_source, substation_dest] = 1
                    f = open('avoid_table.dat', 'w')
                    f.write(str(avoid_table))
                    f.close()
                else:   
                    if str(biomass_coord[bio_idx]) not in biomass_list:
                        biomass_list.extend([str(biomass_coord[bio_idx])])
                    if str(substation_coord[sub_idx]) not in substation_list:
                        substation_list.extend([str(substation_coord[sub_idx])])
                    distance_table[biomass_source, substation_dest] = 0.001 * (matrx_distance['rows'][0]['elements'][0]['distance']['value'])
                    time_table[biomass_source, substation_dest] = (1 / 3600) * (matrx_distance['rows'][0]['elements'][0]['duration_in_traffic']['value'])
                    f = open('distance_table.dat', 'w')
                    f.write(str(distance_table))
                    f.close()
                    f = open('time_table.dat', 'w')
                    f.write(str(time_table))
                    f.close()
        else:                    
            continue            

    
    
#    f.write(str(time_table))
#    f.write(str(distance_table))

# Define sets of the substations and biomass stocks and initialize them from data above.
model.SOURCES = Set(initialize=biomass_list, doc='Location of Biomass sources')
model.SUBSTATIONS = Set(initialize=substation_list, doc='Location of Substations')
model.ROUTES = Set(dimen=2, doc='Allows routes from sources to sinks',
                   initialize=lambda mdl: (mdl.SOURCES * mdl.SUBSTATIONS))


Distance too long for 40.229738,-121.504695 40.214704,-124.074578
Distance too long for 40.229738,-121.504695 38.50871,-122.593006
Distance too long for 40.229738,-121.504695 38.898799,-123.395228
Distance too long for 40.229738,-121.504695 41.058303,-121.818662
Distance too long for 40.229738,-121.504695 39.140085,-123.357297
Distance too long for 40.229738,-121.504695 40.110637,-124.01984
Distance too long for 40.229738,-121.504695 38.959633,-120.868089
Distance too long for 40.229738,-121.504695 40.785875,-123.893211
Distance too long for 40.229738,-121.504695 37.51428,-119.836374
Distance too long for 40.229738,-121.504695 38.705932,-123.276802
---------------------------------------------------------------------------
KeyboardInterrupt                         Traceback (most recent call last)
<ipython-input-10-604226acba18> in <module>()
      3         if (biomass_coord[bio_idx], substation_coord[sub_idx]) not in distance_table.keys() or (biomass_coord[bio_idx], substation_coord[sub_idx]) not in avoid_table.keys():
      4             tm.sleep(0.3)
----> 5             matrx_distance = gmaps.distance_matrix(biomass_coord[bio_idx], substation_coord[sub_idx], mode="driving", departure_time="now", traffic_model="pessimistic")
      6             error = matrx_distance['rows'][0]['elements'][0]['status']
      7             if error != 'OK':

/Library/Python/2.7/site-packages/googlemaps/distance_matrix.pyc in distance_matrix(client, origins, destinations, mode, language, avoid, units, departure_time, arrival_time, transit_mode, transit_routing_preference, traffic_model)
    128         params["traffic_model"] = traffic_model
    129 
--> 130     return client._get("/maps/api/distancematrix/json", params)

/Library/Python/2.7/site-packages/googlemaps/client.pyc in _get(self, url, params, first_request_time, retry_counter, base_url, accepts_clientid, extract_body, requests_kwargs)
    199         requests_kwargs = dict(self.requests_kwargs, **(requests_kwargs or {}))
    200         try:
--> 201             resp = requests.get(base_url + authed_url, **requests_kwargs)
    202         except requests.exceptions.Timeout:
    203             raise googlemaps.exceptions.Timeout()

/Library/Python/2.7/site-packages/requests/api.pyc in get(url, **kwargs)
     66 
     67     kwargs.setdefault('allow_redirects', True)
---> 68     return request('get', url, **kwargs)
     69 
     70 

/Library/Python/2.7/site-packages/requests/api.pyc in request(method, url, **kwargs)
     48 
     49     session = sessions.Session()
---> 50     response = session.request(method=method, url=url, **kwargs)
     51     # By explicitly closing the session, we avoid leaving sockets open which
     52     # can trigger a ResourceWarning in some cases, and look like a memory leak

/Library/Python/2.7/site-packages/requests/sessions.pyc in request(self, method, url, params, data, headers, cookies, files, auth, timeout, allow_redirects, proxies, hooks, stream, verify, cert, json)
    462         }
    463         send_kwargs.update(settings)
--> 464         resp = self.send(prep, **send_kwargs)
    465 
    466         return resp

/Library/Python/2.7/site-packages/requests/sessions.pyc in send(self, request, **kwargs)
    574 
    575         # Send the request
--> 576         r = adapter.send(request, **kwargs)
    577 
    578         # Total elapsed time of the request (approximately)

/Library/Python/2.7/site-packages/requests/adapters.pyc in send(self, request, stream, timeout, verify, cert, proxies)
    368                     decode_content=False,
    369                     retries=self.max_retries,
--> 370                     timeout=timeout
    371                 )
    372 

/Library/Python/2.7/site-packages/requests/packages/urllib3/connectionpool.pyc in urlopen(self, method, url, body, headers, retries, redirect, assert_same_host, timeout, pool_timeout, release_conn, **response_kw)
    542             httplib_response = self._make_request(conn, method, url,
    543                                                   timeout=timeout_obj,
--> 544                                                   body=body, headers=headers)
    545 
    546             # If we're going to release the connection in ``finally:``, then

/Library/Python/2.7/site-packages/requests/packages/urllib3/connectionpool.pyc in _make_request(self, conn, method, url, timeout, **httplib_request_kw)
    339         # Trigger any extra validation we need to do.
    340         try:
--> 341             self._validate_conn(conn)
    342         except (SocketTimeout, BaseSSLError) as e:
    343             # Py2 raises this as a BaseSSLError, Py3 raises it as socket timeout.

/Library/Python/2.7/site-packages/requests/packages/urllib3/connectionpool.pyc in _validate_conn(self, conn)
    760         # Force connect early to allow us to validate the connection.
    761         if not getattr(conn, 'sock', None):  # AppEngine might not have  `.sock`
--> 762             conn.connect()
    763 
    764         if not conn.is_verified:

/Library/Python/2.7/site-packages/requests/packages/urllib3/connection.pyc in connect(self)
    202     def connect(self):
    203         # Add certificate verification
--> 204         conn = self._new_conn()
    205 
    206         resolved_cert_reqs = resolve_cert_reqs(self.cert_reqs)

/Library/Python/2.7/site-packages/requests/packages/urllib3/connection.pyc in _new_conn(self)
    132         try:
    133             conn = connection.create_connection(
--> 134                 (self.host, self.port), self.timeout, **extra_kw)
    135 
    136         except SocketTimeout:

/Library/Python/2.7/site-packages/requests/packages/urllib3/util/connection.pyc in create_connection(address, timeout, source_address, socket_options)
     76             if source_address:
     77                 sock.bind(source_address)
---> 78             sock.connect(sa)
     79             return sock
     80 

/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/socket.pyc in meth(name, self, *args)
    226 
    227 def meth(name,self,*args):
--> 228     return getattr(self._sock,name)(*args)
    229 
    230 for _m in _socketmethods:

KeyboardInterrupt: 

In [ ]:
"""
Each piecewise approximation requires and independent set for each one of the lines in the approximation. In this case, this is the piecewise approximation for the installations costs, and more maybe required soon.
"""
model.Pw_Install_Cost = Set(initialize=range(1, len(number_of_containers)),
                            doc='Set for the Piecewise approx of the installation cost')

"""
All the parameters are subject to be modified later when doing MonteCarlo simulations
for now, they are fixed during the development stage. This first set of parameters
are not read from the files or database.
"""

# Cost related parameters, most of them to be replaced with cost curves
model.om_cost_fix = Param(initialize=0,
                          doc='Fixed cost of operation per installed kW')
model.om_cost_var = Param(initialize=0,
                          doc='Variable cost of operation per installed kW')
model.transport_cost = Param(initialize=0.1343,
                             doc='Freight in dollars per BDT per km')

# Limits related parameters, read from the database/files

biomass_prod = pd.DataFrame(biomass_list)
biomass_prod['production'] = biomass_df.production
biomass_prod = biomass_prod.set_index(0).to_dict()['production']
model.source_biomass_max = Param(model.SOURCES,
                                 initialize=biomass_prod,
                                 doc='Capacity of supply in tons')

# TO BE READ FROM DATABASE IN THE NEAR FUTURE
substation_capacity = pd.DataFrame(substation_list)
substation_capacity['sbs_cap'] = substation_df.limit
substation_capacity = substation_capacity.set_index(0).to_dict()['sbs_cap']
model.max_capacity = Param(model.SUBSTATIONS,
                           initialize=substation_capacity,
                           doc='Max installation per site kW')
model.min_capacity = Param(model.SUBSTATIONS,
                           initialize=150,
                           doc='Min installation per site kW')

biomass_price = pd.DataFrame(biomass_list)
biomass_price['price_trgt'] = biomass_df.price_trgt
biomass_price = biomass_price.set_index(0).to_dict()['price_trgt']
model.biomass_cost = Param(model.SOURCES,
                           initialize=biomass_price,
                           doc='Cost of biomass per ton')

substation_price = pd.DataFrame(substation_list)
substation_price['sbs_price'] = 0.09  # substation_df.sbs_price'
substation_price = substation_price.set_index(0).to_dict()['sbs_price']
model.fit_tariff = Param(model.SUBSTATIONS,
                         initialize=substation_price,
                         doc='Payment depending on the location $/kWh')

# Operational parameters
model.heat_rate = Param(initialize=833.3, doc='Heat rate kWh/TON')
model.capacity_factor = Param(initialize=0.85, doc='Gasifier capacity factor')
model.total_hours = Param(initialize=8760, doc='Total amount of hours in the analysis period')
model.distances = Param(model.ROUTES, initialize=distance_table, doc='Distance in km')
model.times = Param(model.ROUTES, initialize=time_table, doc='Time in Hours')


def calculate_lines(x, y):
    """
    Calculate lines to connect a series of points. This is used for the PW approximations. Given matching vectors of x,y coordinates. This only makes sense for monotolically increasing values.

    This function does not perform a data integrity check.
    """
    slope_list = {}
    intercept_list = {}
    for i in range(0, len(x) - 1):
        slope_list[i + 1] = (y[i] - y[i + 1]) / (x[i] - x[i + 1])
        intercept_list[i + 1] = y[i + 1] - slope_list[i + 1] * x[i + 1]
    return slope_list, intercept_list

install_cost_slope, install_cost_intercept = calculate_lines(number_of_containers, cost)

model.install_cost_slope = Param(model.Pw_Install_Cost, initialize=install_cost_slope, doc='PW c_i')
model.install_cost_intercept = Param(model.Pw_Install_Cost, initialize=install_cost_intercept, doc='PW d_i')

"""
This portion of the code defines the decision making variables, in general the
model will solve for the capacity installed per substation, the decision to
install or not, the amount of biomass transported per route and variable for
the total install cost resulting from the piecewise approximation
"""

model.CapInstalled = Var(model.SUBSTATIONS, within=NonNegativeReals,
                         doc='Installed Capacity kW')
model.InstallorNot = Var(model.SUBSTATIONS, within=Binary,
                         doc='Decision to install or not')
model.BiomassTransported = Var(model.ROUTES, within=NonNegativeReals,
                               doc='Biomass shipment quantities in tons')
model.Fixed_Install_Cost = Var(model.SUBSTATIONS, within=NonNegativeReals,
                               doc='Variable for PW of installation cost')

"""
Define contraints
Here b is the index for sources and s the index for substations
"""


def Subs_Nodal_Balance_rule(mdl, s):
    return mdl.CapInstalled[s] * mdl.capacity_factor * mdl.total_hours == (
        sum(mdl.heat_rate * mdl.BiomassTransported[b, s]
            for b in mdl.SOURCES))

model.Subs_Nodal_Balance = Constraint(model.SUBSTATIONS,
                                      rule=Subs_Nodal_Balance_rule,
                                      doc='Energy Balance at the substation')


def Sources_Nodal_Limit_rule(mdl, b):
    return sum(mdl.BiomassTransported[b, s] for s in model.SUBSTATIONS) <= (
        model.source_biomass_max[b])

model.Sources_Nodal_Limit = Constraint(model.SOURCES,
                                       rule=Sources_Nodal_Limit_rule,
                                       doc='Limit of biomass supply at source')


def Install_Decision_Max_rule(mdl, s):
    return mdl.CapInstalled[s] <= mdl.InstallorNot[s] * mdl.max_capacity[s]

model.Install_Decision_Max = Constraint(
    model.SUBSTATIONS, rule=Install_Decision_Max_rule,
    doc='Limit the maximum installed capacity and bind the continuous decision to the binary InstallorNot variable.')


def Install_Decision_Min_rule(mdl, s):
    return mdl.CapInstalled[s] >= mdl.InstallorNot[s] * mdl.min_capacity[s]

model.Install_Decision_Min = Constraint(
    model.SUBSTATIONS, rule=Install_Decision_Min_rule,
    doc='Limit the mininum installed capacity and bind the continuous decision to the binary InstallorNot variable.')


# This set of constraints define the piece-wise linear approximation of
# installation cost


def Pwapprox_InstallCost_rule(mdl, s, p):
    r"""
    This rule approximates picewise non-linear concave cost functions.

    It has a input from the output from the function calculate_lines and the set PW. The installation cost is calculated by substation.

    The model is as follows (as per Bersimas Introduction to linear optimization, page 17)

    min z &\\
    s.t. & z \le c_i x + d_i forall i

    where z is a slack variable, i is the set of lines that approximate the non-linear convex function,
    c_i is the slope of the line, and d_i is the intercept.

    """
    return (mdl.Fixed_Install_Cost[s] <= mdl.install_cost_slope[p] * (mdl.CapInstalled[s] / 150) +
            mdl.install_cost_intercept[p])

model.Installation_Cost = Constraint(model.SUBSTATIONS, model.Pw_Install_Cost,
                                     rule=Pwapprox_InstallCost_rule,
                                     doc='PW constraint')

In [ ]:


In [ ]:


In [10]:
biomass_coord


Out[10]:
['40.229738,-121.504695',
 '40.214704,-124.074578',
 '38.50871,-122.593006',
 '38.898799,-123.395228',
 '40.339566,-120.820642',
 '41.058303,-121.818662',
 '39.846544,-121.864212',
 '39.140085,-123.357297',
 '40.110637,-124.01984',
 '40.016489,-121.701714',
 '40.785875,-123.893211',
 '37.51428,-119.836374',
 '38.705932,-123.276802',
 '38.648632,-122.664556',
 '40.505443,-120.977077',
 '40.47176,-122.784689',
 '37.80004,-122.057086',
 '39.385054,-123.184693',
 '40.509766,-123.837314',
 '39.976348,-123.210211',
 '38.750596,-123.499846',
 '40.315573,-120.91077',
 '39.196439,-120.826835',
 '41.369564,-123.840493',
 '38.816085,-123.097615',
 '41.058729,-123.630853',
 '41.467154,-123.981357',
 '37.263388,-121.207555',
 '39.770736,-123.268817',
 '40.830313,-121.7143',
 '38.674063,-122.896611',
 '40.300583,-121.407344',
 '38.939151,-123.143174',
 '39.773396,-122.415035',
 '40.680286,-124.069046',
 '39.053439,-123.193792',
 '38.69688,-120.10987',
 '37.971128,-119.958176',
 '40.220775,-123.925603',
 '37.101185,-122.054305',
 '39.962426,-121.465436',
 '38.307499,-120.427291',
 '40.863223,-123.802304',
 '40.404872,-121.753769',
 '40.773608,-123.965495',
 '40.825578,-122.890885',
 '35.245977,-118.460543',
 '39.916245,-120.738451',
 '39.699918,-123.738812',
 '40.839139,-122.717469',
 '37.161357,-121.585615',
 '40.05395,-121.580423',
 '39.003943,-120.887301',
 '39.899175,-120.803214',
 '38.360983,-122.532864',
 '38.880098,-123.189622',
 '39.980663,-123.290075',
 '40.56054,-122.656655',
 '40.814596,-122.619099',
 '40.986005,-121.501048',
 '38.663806,-122.578243',
 '38.567296,-120.65399',
 '40.104174,-120.859289',
 '40.967653,-122.603874',
 '40.294274,-120.878921',
 '40.35872,-120.87888',
 '40.512257,-122.989567',
 '39.564823,-123.356438',
 '37.32775,-121.603798',
 '39.176623,-120.961785',
 '36.946121,-121.659899',
 '40.891167,-121.687314',
 '39.702748,-123.793256',
 '38.398921,-120.620163',
 '37.834224,-120.221077',
 '38.645505,-123.24513',
 '37.166489,-121.704703',
 '37.087207,-122.14232',
 '38.035806,-120.332655',
 '39.162151,-123.412828',
 '39.572363,-121.13262',
 '38.742418,-123.277828',
 '38.503643,-122.971658',
 '39.810521,-123.110575',
 '39.403467,-120.656644',
 '36.636488,-121.408588',
 '38.496335,-123.03033',
 '39.925738,-123.935056',
 '40.407204,-121.698113',
 '40.68887,-123.983217',
 '37.079169,-121.753746',
 '41.11051,-123.81922',
 '39.276271,-122.702548',
 '40.473434,-122.839044',
 '38.519803,-122.353299',
 '40.67455,-121.738183',
 '41.275699,-123.926928',
 '40.766144,-124.008266',
 '40.11759,-121.510112',
 '37.19643,-122.090558',
 '40.738107,-122.853129',
 '40.531309,-123.976809',
 '39.510189,-123.516357',
 '40.361938,-123.798853',
 '36.400839,-121.698904',
 '38.291979,-120.560702',
 '41.091081,-122.287851',
 '35.99961,-118.719611',
 '40.505869,-121.635638',
 '37.072348,-121.841028',
 '40.002944,-123.386038',
 '40.770774,-121.994355',
 '39.945768,-123.825672',
 '39.451351,-120.716374',
 '40.898655,-122.624755',
 '38.370433,-122.604946',
 '40.751923,-123.72785',
 '40.479466,-123.841385',
 '37.558533,-119.860841',
 '38.987279,-123.47571',
 '38.765536,-121.1786',
 '39.529158,-120.210155',
 '39.3228,-123.623726',
 '40.667928,-123.924003',
 '39.924944,-123.768456',
 '40.440677,-123.926881',
 '38.783139,-123.4754',
 '39.973115,-121.593491',
 '36.09806,-118.637872',
 '39.626492,-123.275692',
 '40.829073,-123.860822',
 '39.977572,-121.781722',
 '39.844046,-121.16887',
 '40.577307,-121.657923',
 '38.741963,-123.373721',
 '40.732511,-122.104497',
 '38.325957,-122.355485',
 '40.274002,-124.065838',
 '39.370215,-121.156615',
 '39.152133,-122.742248',
 '41.179877,-123.609063',
 '40.935823,-124.053549',
 '39.002391,-123.572579',
 '38.925535,-122.644897',
 '40.257312,-121.054791',
 '41.300818,-123.960382',
 '39.207485,-123.071959',
 '39.525913,-120.489283',
 '40.330908,-121.771399',
 '38.876095,-123.4875',
 '39.305417,-123.24004',
 '41.205704,-123.852897',
 '38.884523,-122.684995',
 '40.268784,-121.324576',
 '38.750186,-123.162121',
 '40.315132,-124.166203',
 '40.120391,-120.797856',
 '39.070044,-123.444139',
 '40.654087,-124.046768',
 '40.381347,-123.893328',
 '41.089408,-121.773897',
 '36.087954,-121.063364',
 '40.262253,-123.579212',
 '38.684288,-122.219382',
 '38.367796,-120.37853',
 '40.208096,-123.741967',
 '41.038104,-122.074703',
 '39.092897,-123.620683',
 '34.905809,-120.13897',
 '39.456142,-123.246775',
 '37.107373,-121.294076',
 '35.459343,-120.152331',
 '40.408159,-123.919646',
 '40.10449,-121.267808',
 '39.126281,-121.13259',
 '40.554681,-122.02045',
 '40.905177,-122.32711',
 '39.248943,-123.333985',
 '41.135224,-123.70249',
 '38.326859,-120.27258',
 '34.804684,-120.144747',
 '35.980936,-118.685744',
 '35.81378,-121.269174',
 '35.509452,-120.781981',
 '39.111325,-122.764617',
 '39.723911,-123.684357',
 '39.223873,-123.541966',
 '39.734722,-123.167905',
 '40.848908,-121.74635',
 '39.058964,-122.748425',
 '37.522406,-120.026473',
 '40.954744,-122.752587',
 '39.739733,-121.508703',
 '41.252484,-123.717662',
 '39.059849,-120.982344',
 '38.797339,-122.942587',
 '39.981189,-121.659718',
 '39.643707,-123.488505',
 '38.908405,-122.562989',
 '40.707126,-121.801717',
 '39.915099,-121.392936',
 '38.836974,-122.877731',
 '41.141928,-123.627384',
 '37.196458,-119.622902',
 '38.889602,-123.202216',
 '39.83612,-120.48628',
 '40.573964,-121.766894',
 '38.387314,-120.339486',
 '38.504539,-120.312918',
 '38.574829,-122.928004',
 '40.527292,-121.841054',
 '41.04642,-124.054039',
 '39.101551,-121.053487',
 '40.778606,-122.641454',
 '39.319391,-123.326803',
 '37.057107,-122.024318',
 '38.839982,-123.343859',
 '40.733656,-121.218192',
 '36.708782,-121.475447',
 '38.423059,-122.20022',
 '40.432818,-120.722405',
 '34.552455,-120.293045',
 '40.033849,-123.841467',
 '39.882999,-123.808873',
 '38.935253,-120.832929',
 '38.035328,-122.691174',
 '39.673039,-121.196597',
 '39.549934,-120.462048',
 '39.306257,-121.364176',
 '38.761593,-120.691124',
 '39.248822,-120.735995',
 '39.477326,-123.617336',
 '38.311211,-122.129539',
 '40.034235,-123.9074',
 '39.297431,-123.626203',
 '39.172607,-120.852086',
 '37.761266,-120.154352',
 '37.451077,-119.694048',
 '38.331998,-120.704023',
 '37.152028,-122.044831',
 '40.754892,-123.918894',
 '36.474374,-121.511741',
 '39.081982,-120.947437',
 '39.452832,-123.649524',
 '39.192574,-123.565823',
 '38.859917,-120.505236',
 '38.267922,-120.178833',
 '38.329281,-122.468231',
 '39.099013,-123.160575',
 '41.237253,-123.85234',
 '37.543532,-121.889528',
 '38.576991,-120.553309',
 '40.556734,-121.706323',
 '41.035663,-121.507059',
 '41.24569,-121.670408',
 '36.398363,-118.827789',
 '40.476819,-123.679657',
 '39.604792,-121.240195',
 '38.156239,-121.2135',
 '37.968828,-120.205761',
 '38.73167,-120.57547',
 '36.862962,-121.587785',
 '39.421473,-121.272303',
 '39.15833,-123.296544',
 '39.419672,-123.221611',
 '38.867264,-123.006632',
 '40.785251,-123.703787',
 '40.196534,-123.625117',
 '41.159342,-123.746311',
 '39.224018,-123.119185',
 '39.439455,-123.506783',
 '39.253473,-123.704667',
 '41.057527,-123.671375',
 '39.63078,-123.615505',
 '37.093768,-122.006147',
 '38.611274,-121.001124',
 '38.442212,-120.073741',
 '41.178859,-124.096911',
 '40.442744,-121.777242',
 '35.065467,-120.380475',
 '39.271792,-123.661298',
 '40.80582,-122.871545',
 '40.354505,-123.490503',
 '41.446132,-123.860682',
 '40.615355,-123.678543',
 '40.722255,-121.665777',
 '40.484033,-121.869395',
 '38.456693,-120.317458',
 '38.898013,-123.315367',
 '39.167063,-120.922962',
 '40.552077,-122.897189',
 '39.488988,-123.27751',
 '39.978359,-123.892079',
 '41.140904,-123.573193',
 '40.954916,-122.127138',
 '38.537971,-120.605706',
 '37.718597,-122.049985',
 '40.65652,-121.871822',
 '38.676151,-123.286574',
 '35.761262,-121.083465',
 '40.937563,-123.776654',
 '39.306731,-123.569384',
 '39.819518,-123.710986',
 '40.253098,-121.540619',
 '39.622835,-121.388304',
 '39.915286,-123.64732',
 '39.168888,-123.635459',
 '40.872709,-122.54883',
 '41.444144,-123.930973',
 '39.458376,-123.349571',
 '41.034483,-121.65028',
 '38.939386,-120.435112',
 '41.103562,-123.792589',
 '37.491982,-121.34105',
 '38.909638,-122.90253',
 '41.009133,-124.006995',
 '39.388735,-120.823042',
 '38.38773,-120.464298',
 '37.209087,-121.966744',
 '40.31035,-121.441795',
 '41.404344,-123.824036',
 '38.516063,-122.465583',
 '35.399339,-118.510304',
 '36.56446,-121.838028',
 '41.152799,-121.69692',
 '40.429604,-122.304384',
 '38.232475,-120.206614',
 '40.861473,-121.638115',
 '39.571747,-123.632004',
 '38.669535,-123.128432',
 '38.981104,-123.516758',
 '35.287961,-118.401739',
 '38.359987,-120.756216',
 '38.147006,-122.638352',
 '35.789404,-121.019899',
 '38.79381,-123.355141',
 '40.350788,-124.098286',
 '40.940324,-122.192941',
 '40.636191,-122.916844',
 '41.105826,-124.078473',
 '35.581663,-118.833696',
 '34.924766,-118.742083',
 '34.766762,-119.097953',
 '37.145054,-122.102739',
 '40.853476,-124.059787',
 '40.238843,-121.338046',
 '41.370033,-123.909206',
 '34.693807,-120.277533',
 '40.997812,-121.858765',
 '39.521423,-121.370445',
 '40.937193,-121.893665',
 '37.715017,-120.062717',
 '39.905214,-121.569531',
 '40.247094,-121.023835',
 '41.161251,-123.682481',
 '39.906585,-123.468701',
 '40.76742,-121.2212',
 '39.362658,-123.452055',
 '40.273222,-121.275927',
 '39.823509,-120.432039',
 '39.284043,-123.288665',
 '41.018467,-120.893379',
 '41.145979,-123.833675',
 '39.695891,-120.987327',
 '38.676348,-122.965161',
 '39.648619,-121.184808',
 '39.502278,-121.152444',
 '39.43246,-120.777846',
 '40.301394,-121.085224',
 '39.775387,-123.104224',
 '41.436166,-123.983751',
 '37.108771,-122.089517',
 '37.16521,-119.908772',
 '39.857286,-123.763551',
 '40.597058,-124.046255',
 '36.013973,-118.638405',
 '37.266289,-122.300114',
 '37.912671,-120.149306',
 '35.049314,-120.364254',
 '39.498291,-123.229932',
 '39.416444,-123.510589',
 '41.016865,-123.938263',
 '38.435419,-122.902467',
 '38.604559,-122.902971',
 '41.198925,-123.924866',
 '39.468046,-123.181645',
 '39.426991,-123.426177',
 '39.2691,-120.766174',
 '40.069224,-122.764613',
 '40.541999,-124.333658',
 '37.103241,-121.953681',
 '38.305494,-120.308302',
 '40.513534,-123.955446',
 '39.987105,-123.580392',
 '38.880169,-123.080707',
 '41.036536,-121.876845',
 '40.281752,-121.163976',
 '38.16114,-120.696808',
 '39.389028,-121.178936',
 '40.926501,-121.805313',
 '37.045049,-122.122644',
 '38.708194,-122.73101',
 '38.338193,-120.519053',
 '37.922558,-120.274364',
 '40.753475,-121.966564',
 '40.212177,-122.053215',
 '38.560472,-123.229152',
 '39.683675,-121.069654',
 '40.285488,-120.734313',
 '38.905334,-123.125438',
 '40.33839,-123.730514',
 '40.472095,-121.740365',
 '38.60899,-120.601795',
 '39.69577,-123.554454',
 '39.854174,-123.385507',
 '39.348972,-123.437599',
 '38.836746,-123.229421',
 '40.459084,-123.263206',
 '38.730407,-122.594591',
 '37.212267,-121.918116',
 '37.262526,-122.311776',
 '38.541,-123.085186',
 '40.313673,-124.207463',
 '39.129562,-120.881875',
 '39.484381,-123.44719',
 '39.83197,-123.131633',
 '40.70562,-123.46865',
 '40.933382,-123.868887',
 '39.685863,-121.538399',
 '39.05405,-120.790161',
 '40.761704,-124.141401',
 '39.467554,-123.785929',
 '38.526135,-120.471796',
 '38.302374,-120.129819',
 '37.022411,-121.960593',
 '40.755631,-123.870097',
 '38.460416,-120.554552',
 '40.642289,-121.253242',
 '40.799984,-122.436265',
 '39.209057,-123.409141',
 '40.780637,-120.986176',
 '38.637667,-123.298635',
 '41.074867,-121.859623',
 '41.084276,-120.853422',
 '39.478776,-123.527264',
 '38.521675,-122.915243',
 '41.083964,-121.53661',
 '39.132197,-123.278779',
 '40.326175,-121.093258',
 '41.396732,-123.905702',
 '40.98319,-123.894445',
 '39.257962,-123.761783',
 '39.941426,-121.553104',
 '39.007548,-120.833794',
 '38.73547,-123.197584',
 '40.483673,-120.942031',
 '40.741512,-121.524105',
 '39.027707,-123.665795',
 '38.455858,-120.438708',
 '38.60674,-120.78552',
 '39.005485,-123.611375',
 '40.504123,-124.15865',
 '38.557532,-120.547451',
 '40.151298,-120.945799',
 '40.91256,-123.865836',
 '40.783571,-122.685255',
 '40.189495,-121.023947',
 '38.688816,-120.933102',
 '39.341682,-120.804568',
 '41.518447,-123.963615',
 '38.3606,-120.289988',
 '40.865324,-121.872235',
 '40.873054,-123.904079',
 '40.745705,-123.982041',
 '39.769763,-120.537973',
 '40.511813,-123.691342',
 '38.556378,-122.576371',
 '39.503148,-121.333387',
 '40.72158,-124.100694',
 '38.900108,-120.470403',
 '35.692768,-120.954849',
 '40.794835,-123.800555',
 '40.283274,-124.200734',
 '37.175833,-121.953084',
 '38.369226,-122.391194',
 '41.098033,-124.024308',
 '40.162161,-124.018898',
 '40.523504,-121.716253',
 '40.498405,-121.833408',
 '38.698212,-119.791428',
 '35.011507,-118.506794',
 '37.485088,-121.554942',
 '39.477914,-121.113061',
 '40.087799,-123.895397',
 '40.376667,-121.05102',
 '40.895538,-121.764986',
 '37.349547,-122.223511',
 '39.383613,-123.09297',
 '40.454222,-124.323982',
 '39.130358,-123.452778',
 '40.987702,-122.117088',
 '40.327248,-121.14989',
 '37.023407,-121.743203',
 '40.645643,-121.818394',
 '39.0963,-123.573532',
 '36.980721,-121.850107',
 '36.54656,-121.745855',
 '40.80461,-122.534224',
 '40.333062,-120.71922',
 '38.741743,-123.415074',
 '39.82125,-121.621317',
 '41.345726,-123.523266',
 '40.889306,-121.190995',
 '40.57068,-123.701305',
 '38.798608,-120.53128',
 '37.419205,-119.601846',
 '38.79222,-120.433056',
 '39.535113,-120.602006',
 '41.326191,-123.885211',
 '39.931059,-123.309422',
 '38.49498,-120.671234',
 '41.078981,-123.854161',
 '38.858973,-123.504648',
 '40.337789,-121.32373',
 '38.675877,-123.002525',
 '38.408014,-120.368797',
 '40.453543,-121.663172',
 '38.822382,-123.438799',
 '40.684586,-123.950433',
 '41.021914,-124.057418',
 '39.455859,-123.692046',
 '39.174355,-123.687059',
 '41.23139,-121.305813',
 '39.367631,-121.028685',
 '38.499444,-120.750194',
 '38.09529,-120.013205',
 '37.074262,-121.73891',
 '38.696807,-120.672354',
 '38.657003,-120.791901',
 '39.183038,-123.430676',
 '41.291828,-123.849133',
 '39.046414,-120.739605',
 '39.879023,-123.296616',
 '40.653961,-123.670324',
 '38.572645,-120.680066',
 '39.167612,-123.327073',
 '35.935041,-120.98081',
 '39.941938,-121.606584',
 '39.538925,-120.733566',
 '41.235107,-121.758386',
 '38.922398,-123.457581',
 '38.309841,-120.204961',
 '41.011982,-123.657462',
 '39.342432,-121.327965',
 '40.883775,-122.809067',
 '40.797617,-124.050824',
 '40.140725,-123.447251',
 '39.720223,-123.773832',
 '35.21511,-118.649075',
 '40.408523,-124.059072',
 '40.820474,-121.684525',
 '37.690118,-121.973938',
 '40.154692,-121.147551',
 '40.509097,-122.85697',
 '39.78231,-120.564813',
 '40.941598,-122.671746',
 '38.938067,-122.219267',
 '39.85086,-123.208658',
 '37.087393,-121.85502',
 '35.372965,-118.508139',
 '41.539018,-123.998615',
 '38.378794,-121.041084',
 '41.247596,-121.824841',
 '40.647715,-124.152878',
 '38.959633,-120.868089',
 '39.353111,-120.591242',
 '37.101962,-121.925631',
 '40.477492,-124.036655',
 '37.230859,-122.168423',
 '38.835124,-123.524286',
 '38.41588,-120.26495',
 '39.022096,-123.487229',
 '37.148003,-121.286498',
 '38.756113,-120.460506',
 '36.247856,-120.578615',
 '39.657797,-123.42716',
 '40.038563,-120.763456',
 '40.311178,-124.107458',
 '37.968151,-122.574518',
 '40.911521,-123.969211',
 '40.204176,-122.375738',
 '38.463686,-120.808335',
 '40.540402,-120.997632',
 '40.076336,-120.894076',
 '40.846046,-121.888019',
 '40.344562,-123.867292',
 '41.099937,-122.355383',
 '38.536772,-122.633328',
 '38.99629,-121.152409',
 '36.38188,-121.870488',
 '39.81201,-120.921339',
 '39.915534,-123.227798',
 '41.515417,-124.036553',
 '38.785285,-123.533627',
 '40.188663,-122.836263',
 '39.473861,-121.244908',
 '39.230301,-120.989623',
 '36.255263,-120.680595',
 '40.710117,-122.225668',
 '38.149844,-120.436699',
 '41.029675,-120.921807',
 '39.221121,-123.456058',
 '37.990533,-122.196569',
 '38.647604,-122.979598',
 '40.795659,-121.84204',
 '40.134767,-123.777942',
 '37.845388,-120.500156',
 '38.761161,-120.850237',
 '38.757812,-123.185434',
 '40.455398,-121.701818',
 '38.806955,-123.263819',
 '38.438113,-120.798661',
 '40.134228,-123.72359',
 '41.208391,-121.86401',
 '40.530941,-123.757091',
 '38.378902,-120.574151',
 '39.951932,-121.514697',
 '39.486903,-122.465828',
 '41.109326,-123.673868',
 '40.324099,-121.245019',
 '40.045346,-123.550513',
 '38.456904,-120.509797',
 '39.381947,-122.681479',
 '36.522748,-121.803302',
 '39.392826,-120.262698',
 '38.421901,-120.671889',
 '40.502045,-122.813696',
 '40.930636,-121.669572',
 '40.28918,-123.666642',
 '39.243933,-120.378042',
 '39.493526,-123.677487',
 '40.523958,-121.660287',
 '38.196915,-120.460351',
 '37.309357,-122.271863',
 '39.059423,-120.420914',
 '40.197247,-121.274459',
 '40.273378,-121.679323',
 '41.388452,-123.96472',
 '40.426638,-123.749635',
 '39.835198,-120.427385',
 '39.774863,-121.290582',
 '38.546138,-120.845003',
 '40.358126,-121.281668',
 '40.536197,-124.265613',
 '39.703555,-123.683141',
 '35.084916,-118.497711',
 '40.547495,-123.866624',
 '37.021976,-121.282993',
 '39.55629,-120.55342',
 '40.386608,-124.107704',
 '37.241487,-121.653667',
 '38.52613,-122.221761',
 '39.758542,-121.488231',
 '39.379046,-121.287537',
 '38.900756,-120.617217',
 '40.04965,-121.681578',
 '39.593915,-120.657177',
 '40.324456,-121.730425',
 '41.192901,-121.747236',
 '38.456384,-123.055999',
 '39.394458,-123.472071',
 '40.85389,-121.829576',
 '37.489995,-119.860874',
 '39.209323,-120.876666',
 '38.712697,-120.623411',
 '39.175197,-123.473174',
 '39.915085,-123.518813',
 '40.771647,-121.688404',
 '37.075657,-119.382396',
 '40.695653,-122.786348',
 '39.331998,-123.677411',
 '40.726525,-123.801736',
 '39.422114,-123.602815',
 '40.957685,-123.801963',
 '40.041526,-121.527113',
 '41.47406,-124.020002',
 '39.174456,-121.088011',
 '40.509281,-123.893549',
 '40.887174,-122.749243',
 '40.816797,-123.993845',
 '40.856702,-121.688933',
 '39.438129,-123.668456',
 '38.538429,-122.944334',
 '40.457763,-123.898928',
 '40.688427,-121.93325',
 '41.116551,-123.742682',
 '40.852165,-123.848249',
 '39.195427,-123.676969',
 '41.189273,-121.273227',
 '41.291113,-123.52117',
 '38.459614,-122.486139',
 '39.138822,-120.350607',
 '39.436384,-123.726805',
 '39.2099,-121.791069',
 '39.057132,-123.629317',
 '38.80296,-120.403332',
 '38.531443,-120.661649',
 '40.249785,-121.670011',
 '39.211677,-123.345485',
 '40.551183,-123.939884',
 '41.041924,-123.867221',
 '40.42552,-123.890718',
 '39.294329,-120.064228',
 '40.33564,-120.66828',
 '38.858175,-122.611117',
 '38.754128,-122.440803',
 '37.039513,-121.682522',
 '41.158579,-122.144701',
 '39.217888,-123.59268',
 '37.556436,-119.98313',
 '40.262227,-124.248576',
 '37.013492,-121.915831',
 '39.312565,-123.45969',
 '39.452442,-120.490845',
 '38.540788,-123.138153',
 '39.869352,-123.875558',
 '41.197059,-121.684714',
 '39.151446,-120.596167',
 '38.878321,-120.557936',
 '38.926448,-123.303298',
 '39.604512,-123.745635',
 '35.620221,-118.81062',
 '39.306211,-121.037762',
 '35.215778,-118.5297',
 '38.167823,-120.936304',
 '40.492742,-120.870333',
 '41.002258,-123.738329',
 '39.855497,-121.666095',
 '38.923534,-123.623869',
 '40.997434,-123.763934',
 '39.375682,-122.954079',
 '38.90262,-123.513825',
 '38.594176,-122.421517',
 '38.650085,-123.066076',
 '39.048445,-123.612322',
 '39.647507,-123.684186',
 '41.103679,-123.849598',
 '38.463803,-120.330934',
 '40.215632,-123.582398',
 '40.368371,-121.16562',
 '38.882872,-122.758954',
 '36.71395,-121.359161',
 '40.82199,-122.697549',
 '41.090467,-122.398281',
 '39.736536,-120.512926',
 '40.000815,-121.656932',
 '40.714431,-123.707302',
 '37.421762,-119.542545',
 '38.696735,-122.194385',
 '38.762116,-120.747923',
 '38.623818,-122.765272',
 '41.045149,-123.737773',
 '37.836296,-122.17295',
 '39.469931,-121.341132',
 '38.312472,-122.411413',
 '39.552791,-123.540254',
 '37.12829,-121.81489',
 '40.636961,-121.919737',
 '40.73293,-121.709333',
 '40.902905,-122.55322',
 '40.848344,-122.554097',
 '40.447429,-124.102759',
 '40.81124,-123.948826',
 '37.955486,-120.162273',
 '38.735877,-122.863742',
 '37.080024,-121.336256',
 '40.484425,-122.720793',
 '40.433169,-120.846917',
 '38.200939,-120.348596',
 '39.553773,-123.590463',
 '39.549826,-123.653057',
 '40.131236,-122.602647',
 '40.821964,-121.599875',
 '40.483326,-120.803787',
 '40.422453,-123.832068',
 '41.057541,-123.96075',
 '38.869761,-123.585866',
 '37.535245,-121.681824',
 '40.553547,-122.955616',
 '40.278836,-121.772319',
 '39.603041,-121.039076',
 '39.24643,-120.345113',
 '41.090714,-123.599261',
 '38.895303,-122.88486',
 '40.231402,-121.228738',
 '40.650335,-121.192452',
 '40.224722,-121.562431',
 '38.637218,-122.493821',
 '40.613255,-123.977566',
 '40.916714,-123.915778',
 '38.971363,-120.700547',
 '38.2598,-120.347279',
 '35.75324,-118.765273',
 '39.428626,-123.57472',
 '40.529303,-120.784448',
 '38.459459,-122.952511',
 '38.006358,-120.127105',
 '39.953178,-123.208407',
 '39.439191,-120.147912',
 '38.392586,-122.94722',
 '37.459821,-119.657109',
 '41.062619,-123.727436',
 '40.749704,-122.896778',
 '40.794673,-121.909064',
 '39.545257,-123.10913',
 '40.18683,-123.759261',
 '39.845715,-123.819457',
 '40.580775,-123.894703',
 '38.988399,-123.378139',
 '40.976029,-122.36212',
 '36.577611,-121.950439',
 '40.53723,-123.5065',
 '40.99549,-123.978229',
 '39.320414,-123.040311',
 '39.923577,-123.569569',
 '39.587168,-123.025372',
 '39.858813,-123.704424',
 '38.02741,-120.190549',
 '37.066885,-122.169513',
 '34.776623,-119.033233',
 '39.963801,-120.900695',
 '40.383336,-123.774837',
 '39.012807,-123.110887',
 '40.842013,-123.809296',
 '39.475816,-123.379876',
 '41.014131,-122.175425',
 '38.119969,-120.092854',
 '35.203414,-118.688202',
 '41.235015,-123.921902',
 '39.003038,-120.666324',
 '39.05141,-120.854341',
 '40.00819,-121.418322',
 '37.062934,-121.921841',
 '36.379125,-121.608909',
 '40.468323,-124.137839',
 '39.848072,-123.511973',
 '38.934117,-123.651364',
 '41.076189,-121.62281',
 '39.885543,-121.54179',
 '39.57048,-120.350949',
 '41.159091,-121.579969',
 '40.496635,-123.479075',
 '34.943204,-118.61563',
 '38.681686,-122.494668',
 '37.077666,-119.440041',
 '34.969537,-120.089766',
 '40.189467,-121.07414',
 '37.449968,-119.826643',
 '39.653127,-123.334289',
 '38.572941,-120.81134',
 '39.516684,-123.601468',
 '37.190293,-122.126664',
 '41.132067,-121.215375',
 '38.446733,-120.111754',
 '39.040215,-120.462764',
 '38.855094,-123.188473',
 '39.95299,-121.411037',
 '38.239649,-120.264751',
 '35.505558,-120.590895',
 '35.191325,-118.573839',
 '40.616389,-121.74883',
 '39.359745,-121.413928',
 '38.370318,-120.544875',
 '37.495014,-119.800819',
 '40.317638,-121.501157',
 '35.865918,-120.526259',
 '41.192468,-123.760831',
 '38.619044,-122.645476',
 '40.613812,-121.827691',
 '37.991883,-120.289126',
 '39.138199,-123.657967',
 '38.694584,-123.320063',
 '40.219276,-123.655566',
 '41.258742,-121.29459',
 '40.511809,-121.788689',
 '40.898426,-121.083595',
 '40.14494,-123.931649',
 '41.048493,-120.817631',
 '39.93303,-121.500746',
 '38.573281,-123.175375',
 '39.90341,-120.83148',
 '39.652744,-123.688387',
 '37.105827,-122.217391',
 '38.656287,-123.341397',
 '39.255737,-121.079848',
 '40.600353,-123.464013',
 '38.246575,-120.076217',
 '38.78118,-123.388052',
 '41.237207,-121.888033',
 '39.649997,-123.624149',
 '39.314401,-123.791939',
 '40.568221,-121.824411',
 '38.534559,-120.187526',
 '40.078326,-123.491293',
 '38.515905,-120.376257',
 '41.055617,-123.589219',
 '39.283262,-120.029625',
 '40.851965,-122.865963',
 '40.55063,-122.608412',
 '38.674842,-123.16593',
 '40.001234,-121.565701',
 '41.052561,-124.092025',
 '40.615451,-123.085651',
 '40.125439,-123.953212',
 '37.230792,-122.270332',
 '40.97857,-122.221299',
 '40.409685,-120.759718',
 '37.083178,-119.305885',
 '39.036552,-123.327995',
 '36.991168,-121.984528',
 '39.904942,-121.709028',
 '39.687046,-121.462598',
 '40.984538,-121.981375',
 '40.72894,-122.842171',
 '37.182409,-121.262684',
 '39.253969,-123.461892',
 '39.278552,-123.598941',
 '39.140642,-123.633297',
 '39.280591,-123.533196',
 '41.261444,-121.361607',
 '40.341027,-121.009135',
 '40.942503,-121.946014',
 '35.645426,-120.856583',
 '40.729663,-122.030654',
 '38.521762,-122.513882',
 '38.721958,-123.398108',
 '39.712999,-121.161715',
 '41.570811,-124.09206',
 '39.262582,-120.555659',
 '41.115066,-124.050467',
 '40.48798,-121.694347',
 '40.776911,-121.828489',
 '39.374353,-123.238151',
 '37.010883,-121.828149',
 '39.024606,-120.909939',
 '38.838648,-122.846087',
 '41.146833,-123.786567',
 '40.151476,-121.209439',
 '40.456766,-122.685242',
 '40.648286,-124.109315',
 '41.224594,-123.835568',
 '40.346093,-124.200788',
 '40.313547,-121.695723',
 '38.785247,-120.938273',
 '36.052038,-118.644533',
 '39.229845,-123.484824',
 '40.125876,-121.60977',
 '39.956283,-121.694144',
 '40.6332,-123.053936',
 '35.933258,-120.647229',
 '39.347006,-123.08857',
 '39.179068,-123.520748',
 '40.792055,-121.091956',
 '41.140812,-121.661805',
 '40.220892,-121.011976',
 '40.766956,-120.875258',
 '38.487874,-120.454976',
 '39.19534,-122.991544',
 '41.106112,-121.622685',
 '37.906642,-120.594664',
 '39.708197,-123.405224',
 '40.157527,-123.66649',
 '41.116343,-121.672355',
 '40.547584,-122.410801',
 '40.532153,-122.662821',
 '39.633342,-123.561355',
 '40.155269,-123.82654',
 '38.457541,-123.00056',
 '37.67654,-120.455646',
 '40.756138,-121.882211',
 '41.102163,-124.108483',
 '38.872845,-120.631923',
 '40.334116,-120.753298',
 '37.560161,-120.038363',
 '39.843513,-120.75913',
 '36.739594,-121.505436',
 '39.038894,-123.431512',
 '39.563574,-123.68932',
 '36.802727,-121.471455',
 '38.819349,-122.754124',
 '39.889356,-120.656443',
 '39.265263,-121.374623',
 '41.206491,-121.249671',
 '40.729025,-121.500212',
 '40.415352,-124.311916',
 '40.077973,-123.591942',
 '39.844373,-120.771046',
 '41.12696,-121.77788',
 '37.238963,-122.305384',
 '39.678689,-121.123275',
 ...]

In [ ]: