diff --git a/gis/solar_adoption/README.md b/gis/solar_adoption/README.md new file mode 100644 index 000000000..e0e8aea0c --- /dev/null +++ b/gis/solar_adoption/README.md @@ -0,0 +1,31 @@ +# Solar Adoption Model + +This model demonstrates a simulation of households adopting solar panels, driven by two key geographic factors: +1. **Environmental (Raster Data):** The economic viability of solar is based on local solar radiation (simulated via a `RasterLayer`). +2. **Social (Vector Data):** The "peer effect" where households are more likely to adopt solar panels if their neighbors—within a certain distance—have already adopted them. Households are represented as `GeoAgents`. + +This example is specifically designed to showcase how `mesa-geo` integrates both **Continuous Space (Raster)** environments and **Discrete Space (Vector)** agents interacting with one another. + +## How to Run + +To run the model, first install the dependencies: + +```bash +pip install -r requirements.txt +``` + +Then run the application: + +```bash +solara run app.py +``` + +Then visit the provided localhost address in your web browser. + +## Using the Interface + +- **Number of Households:** Controls how many `Household` agents populate the environment. +- **Social Influence Weight:** Adjusts how strongly a household is influenced by neighbors who already have solar panels. +- **Economic Weight (Radiation):** Adjusts how strongly the underlying solar radiation `RasterLayer` influences adoption. + +Watch how clusters of adoption naturally form in areas with high solar radiation and slowly spread outward through social influence! diff --git a/gis/solar_adoption/agents.py b/gis/solar_adoption/agents.py new file mode 100644 index 000000000..8d2b3d3b4 --- /dev/null +++ b/gis/solar_adoption/agents.py @@ -0,0 +1,43 @@ +import mesa_geo as mg + + +class Household(mg.GeoAgent): + """Solar panel adoption agent.""" + + def __init__(self, model, geometry, crs, unique_id=None): + """Create a new Household agent.""" + super().__init__(model, geometry, crs) + self.unique_id = ( + unique_id + if unique_id is not None + else self.model.random.randint(1, 100000000) + ) + self.has_solar = False + self.solar_radiation = 0.0 + + def step(self): + if self.has_solar: + return + + neighbors = list( + self.model.space.get_neighbors_within_distance(self, distance=500) + ) + + solar_neighbors = sum(1 for n in neighbors if getattr(n, "has_solar", False)) + total_neighbors = len(neighbors) + social_influence = ( + solar_neighbors / total_neighbors if total_neighbors > 0 else 0.0 + ) + economic_viability = self.solar_radiation + + prob_adopt = (self.model.social_weight * social_influence) + ( + self.model.economic_weight * economic_viability + ) + prob_adopt += 0.01 + + if self.model.random.random() < prob_adopt: + self.has_solar = True + self.model.total_adopted += 1 + + def __repr__(self): + return f"Household {self.unique_id} (Solar: {self.has_solar})" diff --git a/gis/solar_adoption/app.py b/gis/solar_adoption/app.py new file mode 100644 index 000000000..fec675f4e --- /dev/null +++ b/gis/solar_adoption/app.py @@ -0,0 +1,45 @@ +from agents import Household +from mesa.visualization import Slider, SolaraViz, make_plot_component +from mesa_geo.visualization import make_geospace_component +from model import SolarAdoption + + +def solar_portrayal(agent): + """Portrayal function for households and solar radiation cells.""" + if isinstance(agent, Household): + portrayal = {} + if agent.has_solar: + portrayal["color"] = "gold" + portrayal["radius"] = 4 + else: + portrayal["color"] = "grey" + portrayal["radius"] = 3 + return portrayal + else: + # It's a Raster Cell + val = getattr(agent, "radiation", 0) + r = int(255 * val) + g = int(255 * val) + b = 0 + return (r, g, b, 128) + + +model_params = { + "num_houses": Slider("Number of Households", 100, 10, 500, 10), + "social_weight": Slider("Social Influence Weight", 0.3, 0.0, 1.0, 0.1), + "economic_weight": Slider("Economic Weight (Radiation)", 0.3, 0.0, 1.0, 0.1), +} + + +model = SolarAdoption() +page = SolaraViz( + model, + name="Solar Adoption", + model_params=model_params, + components=[ + make_geospace_component(solar_portrayal, zoom=9), + make_plot_component(["Adopted"]), + ], +) + +page # noqa diff --git a/gis/solar_adoption/data/generate_data.py b/gis/solar_adoption/data/generate_data.py new file mode 100644 index 000000000..b2878ad49 --- /dev/null +++ b/gis/solar_adoption/data/generate_data.py @@ -0,0 +1,70 @@ +import os +import random + +import geopandas as gpd +import numpy as np +import rasterio +from rasterio.transform import from_origin +from shapely.geometry import Point + +# Paths +script_dir = os.path.dirname(__file__) +raster_path = os.path.join(script_dir, "solar_radiation.tif") +vector_path = os.path.join(script_dir, "households.geojson") + + +def generate_raster(): + """Generate a procedural raster layer representing solar radiation.""" + width = 100 + height = 100 + + # Create a procedural 2D numpy array (e.g. gradient + noise) for solar radiation + # Values from 0 (low radiation) to 1 (high radiation) + y, x = np.mgrid[0:height, 0:width] + gradient = (x + y) / (width + height) # Diagonal gradient + noise = np.random.normal(0, 0.1, (height, width)) + radiation_data = np.clip(gradient + noise, 0, 1) + + # Reshape to (1, height, width) for Rasterio format + radiation_data = radiation_data.reshape(1, height, width).astype(np.float32) + + # Create a Georeferenced Transform for the Raster (e.g., origin at 0,0, pixel size 1000m) + transform = from_origin(0, height * 1000, 1000, 1000) + + with rasterio.open( + raster_path, + "w", + driver="GTiff", + height=height, + width=width, + count=1, + dtype=radiation_data.dtype, + crs="epsg:3857", + transform=transform, + ) as dataset: + dataset.write(radiation_data) + print(f"Generated {raster_path}") + return transform, width, height + + +def generate_vector(width, height): + bounds = [0, 0, width * 1000, height * 1000] + minx, miny, maxx, maxy = bounds + + num_houses = 500 + points = [] + for _ in range(num_houses): + # Generate random points within the bounds + x = random.uniform(minx, maxx) + y = random.uniform(miny, maxy) + points.append(Point(x, y)) + + # Create a GeoDataFrame from points + gdf = gpd.GeoDataFrame(geometry=points, crs="epsg:3857") + gdf.to_file(vector_path, driver="GeoJSON") + print(f"Generated {vector_path}") + + +if __name__ == "__main__": + t, w, h = generate_raster() + generate_vector(w, h) diff --git a/gis/solar_adoption/data/households.geojson b/gis/solar_adoption/data/households.geojson new file mode 100644 index 000000000..28484e7ff --- /dev/null +++ b/gis/solar_adoption/data/households.geojson @@ -0,0 +1,507 @@ +{ +"type": "FeatureCollection", +"name": "households", +"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:EPSG::3857" } }, +"features": [ +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 93100.104957094867132, 12360.375294707004286 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 10298.019436071448581, 13328.572398176997012 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 26662.021793777712446, 54698.675660731067182 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 43898.204123875715595, 93688.870917804102646 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 42813.697101513884263, 83497.689121625357075 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 3317.039012069766613, 29481.841211307622871 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 51314.856467230965791, 96280.651586984153255 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 60572.903964775796339, 41171.641377147105231 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 59795.848174111320986, 87020.492544274908141 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 28309.066778780190361, 81634.994606574720819 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 50199.283272374806984, 49090.963381403438689 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 53749.612721565667016, 79139.784316092845984 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 79497.89139332981722, 52002.291099507157924 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 19548.928204745796393, 36066.431618563830853 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 31585.90249662370843, 13593.794907711231644 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 79902.944292426735046, 74981.743206411978463 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 567.740828053242581, 59591.317174838390201 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 65626.738891718021478, 82659.566085440572351 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 5857.224434400065547, 66035.810028931926354 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 10285.427563956362064, 21898.137115114233893 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 92089.91556904380559, 7811.066728485759995 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 41985.491007852746407, 66433.814172620986938 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 73782.363180031461525, 31584.885560950104264 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 81468.680602966167498, 57628.647031545209757 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 86988.24473542792839, 2783.4240809594844 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 12659.823658857294504, 95522.419507061160402 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 92364.800868985519628, 74062.386334693990648 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 99687.41327261927654, 85701.658245663857087 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 16020.377429796850265, 75507.696372565478669 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 50904.678393700298329, 45838.369961229727778 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 80096.679041890907683, 27499.410163526183169 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 37681.99597339121101, 39544.378744486806681 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 59830.808430812685401, 76849.447711561224423 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 82038.519370345646166, 93993.897830941379652 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 57418.305904096334416, 15436.580528286393019 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 42938.619294810407155, 83886.140792904188856 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 46703.750773430561821, 80731.609055450928281 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 80761.058596051676432, 92124.392885172535898 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 62010.998877198406262, 91167.882477735023713 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 75067.891049193407525, 44620.81318330947397 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 83043.659074029550538, 16242.049265485158685 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 30513.414341820189293, 16801.633483249079291 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 26056.333230958905915, 94378.700391251870315 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 62618.347866316245927, 7536.31866487139996 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 95371.469885638769483, 94506.553150146457483 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 34812.768886359343014, 87802.631423907892895 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 83804.827943238153239, 75601.900162931138766 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 37736.445641875870933, 37130.354393638255715 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 499.124564563124807, 63582.890167003657552 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 26783.290540788064391, 50479.265778921711899 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 38021.146588638599496, 33845.963852268090704 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 4400.492526133425599, 93627.700394454834168 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 58439.114328852658218, 23236.550093048947019 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 89241.853267895494355, 35705.97456570918439 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 82679.786351373841171, 2934.621401604509174 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 63800.112486451143923, 35666.165492628351785 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 59142.086611923739838, 98293.959816884816973 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 42984.064193309823168, 18469.070672834252036 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 58892.353956503044174, 97686.968685834188364 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 18439.157352716505557, 21131.902531252799236 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 91463.739928236987907, 23954.719142420199205 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 64692.33532644627121, 38724.622728783651837 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 36736.264441569146584, 45226.369610314912279 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 54771.622294350265292, 8615.881043285467968 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 37465.28487923686771, 17489.503079995403823 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 48446.635879574205319, 1807.06054834716133 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 71533.485266086616321, 8642.120926673102076 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 46492.473436264277552, 36556.255183221262996 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 66954.894336474171723, 95168.784352661954472 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 60608.220097473909846, 79365.94087493691768 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 52761.520096861058846, 33446.207379566447344 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 12841.009243862967196, 76321.535872360429494 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 70014.493304006784456, 6562.116851955956918 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 79605.795702334304224, 69202.526770691052661 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 34364.24962661301106, 56476.723939191753743 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 6026.309429410192934, 93527.24948604623205 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 75739.617289457368315, 35875.479123951881775 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 33484.488413664759719, 62341.361587361287093 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 69519.905789518190431, 38768.939430688486027 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 98504.059666228218703, 26604.899255656444439 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 47467.721171538702038, 32590.962072338614234 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 55118.257382544099528, 58254.853416291727626 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 72191.489401593978982, 6857.617183445663613 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 17246.85106648724468, 16710.27474194109891 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 97510.055099378427258, 41727.30324988290522 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 36423.659674194372201, 59005.143506133572373 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 86459.978057897853432, 62453.764184597384883 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 61628.024408932469669, 36473.166923990262148 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 25416.283626688586082, 39990.206992904495564 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 48469.029866495082388, 19355.324553813679813 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 14073.756452032826928, 43081.949507989716949 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 81108.793581371734035, 21694.506583273265278 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 29449.914966143041966, 70369.016499989695149 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 45769.848769270814955, 87643.977451453742106 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 5671.730636038885677, 40768.645014574402012 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 97975.130804589425679, 40869.663251063269854 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 9564.374188279201917, 27730.533231155619433 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 22455.629851800738834, 4856.744208053609327 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 5503.810256879315602, 49539.946730435156496 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 27174.832696863770252, 71406.308801255014259 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 33848.410259273565316, 4809.41478113156063 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 94852.059002822788898, 17298.470175838454452 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 51919.555651382652286, 39311.144140661992424 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 3781.902989127528144, 14368.418081099966003 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 61506.46023529717786, 73019.711239252937958 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 96796.907276361103868, 6847.197702665175711 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 62486.008209661747969, 45064.4735019655418 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 85213.469782769418089, 2167.856179155447535 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 30901.513366975952522, 76631.729504345406895 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 8439.696650414574833, 79871.365898113333969 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 74807.315249355204287, 36114.646069153255667 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 15121.267013791039062, 65757.974288356650504 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 36750.510902266345511, 9711.828678294210476 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 87647.65127387958637, 72351.384339466603706 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 50762.38698699005181, 67816.380404140159953 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 38445.492386830206669, 5137.740307073235272 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 51669.74668277578894, 14893.8845075457848 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 76273.409907863329863, 58416.368051334189659 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 74850.20994240512664, 41952.070540413100389 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 83920.657114485729835, 17949.650709971188917 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 86498.523793818472768, 88316.092645867262036 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 60366.597217191039817, 6553.651490377998925 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 56591.816968095830816, 7308.568251125524512 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 97784.374018531496404, 70163.084029680205276 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 50495.043237190817308, 7053.372036779037444 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 35303.061184730955574, 66222.047095903122681 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 3867.656292466037485, 89480.397153060694109 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 12966.295117878313249, 66475.821219714111066 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 328.859564514127896, 38678.345022099449125 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 78884.027674726152327, 40273.420117742207367 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 94485.17748648916313, 48730.099455980998755 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 2934.394794634032223, 82999.032640954610542 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 97343.118115469929762, 6060.978128620786265 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 91034.654874597545131, 55870.861991004770971 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 13100.050344071800282, 17856.383807416797936 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 59650.115427515578631, 89553.650875780775095 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 65257.350382379816438, 57090.724736092393869 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 44775.950601067226671, 41567.476848939491902 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 50966.746859397593653, 91803.795332797511946 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 70566.330892652767943, 14750.061006752168396 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 73880.785258706309833, 21976.951019520452974 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 5006.864405345035266, 57017.390766575779708 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 47330.259624551705201, 52383.839307299087523 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 31867.894077202086919, 71223.221895455440972 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 94809.950594786700094, 43261.876355930573482 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 4831.959736352208893, 57971.436822390009183 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 79348.191655638132943, 58413.659371725734673 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 26047.868080653370271, 46595.044138800847577 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 18476.143950395649881, 72804.286573259945726 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 37279.679229044922977, 45519.18890245653165 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 13863.491636376700626, 76221.605471130285878 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 39840.409235446881212, 19982.98239838909285 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 30886.355641836136783, 4264.131174155505505 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 28855.224541238512757, 63199.925796781855752 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 77721.314285941494745, 88356.649920909665525 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 52906.377141083707102, 36470.277106759996968 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 95821.98897352948552, 91583.649333853507414 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 15258.361494330485584, 62962.091483005897317 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 38343.702847434731666, 97714.171582512237364 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 95904.205789948769961, 13854.623941485910109 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 87326.268502634382457, 61348.902061217013397 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 24163.654526553189498, 73083.654633828293299 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 30486.304867939528776, 7142.007451724330167 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 75791.324650290669524, 71612.996930848545162 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 23515.593662963761744, 60036.029199087468442 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 20991.07489426853499, 94319.40027322343667 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 19712.518579866977234, 27371.601951483604353 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 67944.580273427884094, 14296.317477443199095 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 35509.536664726729214, 49739.155295213466161 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 93530.42544442426879, 77448.809730609675171 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 38685.157682769546227, 59034.40939758852619 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 28958.441345069342788, 87204.54583543917397 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 77013.441623323436943, 76619.029870828977437 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 35085.759266352448321, 49067.812787381415546 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 88120.765235449478496, 29597.35594328775187 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 17937.13793893410184, 40639.838675350969424 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 54026.746266194233613, 42653.56246667628875 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 9326.676264139621708, 12025.741524772503908 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 28019.195805908591865, 30415.282358667871449 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 85677.69332759793906, 60926.554281450531562 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 27284.393937385142635, 6818.878234894931666 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 35888.971270025824197, 93409.982994804115151 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 68192.074074820367969, 28909.75429076753062 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 52340.818102849640127, 43346.452663486379606 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 35150.340376648280653, 49591.227375227950688 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 22370.894698643984157, 89443.291647466932773 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 56808.668716534237319, 33209.10408838474541 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 89963.150253449188313, 26048.355549822834291 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 33041.36181648283673, 80112.637071660836227 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 80126.805066271408577, 91653.878415618586587 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 31883.225843471151165, 25398.502390619527432 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 10836.996623225391886, 8122.2192841862161 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 19907.654530531970522, 39389.68844625204656 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 53015.068461576833215, 7751.793706706255762 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 1160.259580700206925, 57626.493995263757824 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 65405.870381223474396, 40949.903119831411459 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 97912.934179851785302, 27420.964154192715796 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 81033.554870017615031, 61473.363827044217032 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 70175.750656653617625, 44381.518405068629363 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 41989.042839939727855, 11283.469959272173583 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 69399.412254097653204, 19163.757080415110977 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 85679.633700696722372, 98664.979577400503331 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 83530.395171645752271, 13244.55106841925226 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 25148.203944173295895, 88278.851086288850638 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 85008.925763595761964, 33689.298998953330738 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 81436.802698424493428, 86627.214247210955364 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 36552.477220489912725, 45430.191275973185839 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 58023.525870683879475, 14804.520420935019501 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 59869.253780778621149, 29577.330901773057121 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 29290.103688920586137, 21186.918959232658381 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 93995.699035042751348, 64047.729575571829628 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 56331.42200771150965, 18240.324810359186813 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 29835.49876077747831, 29269.324523638540995 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 82971.835741583170602, 4718.771478525807652 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 97109.817169137764722, 98045.580500275144004 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 36178.282048703993496, 51744.841366876134998 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 22518.907502103167644, 86215.174470372803626 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 41492.924481811809528, 32265.764698920083902 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 89803.132767094386509, 44405.977426080979058 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 468.75175812272073, 65176.895222942432156 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 72466.08024142528302, 29481.772955141095736 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 45787.669257578010729, 7033.555773642652639 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 45386.150976127733884, 6043.060827278612123 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 54157.557170701220457, 78775.980209577508504 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 89089.121825657115551, 42914.866879268483899 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 99531.414579360382049, 50164.106720271061931 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 3395.157963802075756, 94533.094600175740197 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 18961.899855661045876, 83845.23460492263257 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 81553.638286525208969, 95890.249452835312695 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 91067.356199517627829, 56529.840226519489079 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 19406.265390965982078, 63400.100574382078776 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 87732.762064109003404, 44656.329272125425632 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 74040.569593410720699, 47643.400206695208908 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 26415.43172843564389, 7461.626815629651901 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 83578.853591324528679, 19312.272939418540773 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 97971.426180320442654, 57067.961651254438038 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 68781.531664141322835, 86202.952580389261129 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 66858.731237818705267, 49552.531343948146969 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 99650.784383055972285, 4219.552813845229139 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 47562.104435101296986, 9699.405087531076788 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 42190.283342652226565, 87091.617755002720514 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 25249.103302945841278, 42330.556431191624142 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 2468.839214268581145, 16170.187335966656974 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 91967.283205366838956, 59148.666462932087597 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 75229.054208628149354, 41227.870999425686023 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 40186.807882959707058, 98890.509793979072128 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 70097.681320086645428, 29867.033244071615627 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 59687.205912857141811, 3130.64411117952568 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 84435.067037615241134, 26085.044533895030327 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 83145.175353125450783, 55321.216968421125785 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 87368.285878124632291, 18492.8474870009195 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 46054.546727014363569, 68130.592300895470544 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 85906.878371511891601, 85963.480139103645342 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 82825.207069830226828, 15993.470802619069218 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 46787.531003041840449, 26946.740489521158452 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 59315.272987462383753, 98507.320541433131439 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 20090.550222920057422, 81278.019162281707395 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 62397.746797042229446, 83464.187193636360462 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 49870.936195755079098, 10551.035513116525181 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 48100.120539690979058, 40912.085870646398689 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 44382.590378691769729, 84858.519908863730961 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 4023.30302872909715, 90979.659000444560661 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 85950.198995470389491, 99922.98302099556895 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 9975.001520403648101, 62680.363459921143658 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 83981.42262771683454, 58232.931625695891853 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 22126.752868482235499, 30662.626993830264837 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 24080.234903570708411, 68181.091700567645603 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 18853.475869007306756, 7823.153179205089145 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 14652.847718382123276, 48591.638194283936173 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 61378.945711944834329, 20861.645115462677495 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 24247.24521374834876, 35098.375056037599279 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 7432.065848225699483, 27743.608824437214935 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 38570.335185637748509, 70301.575612115600961 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 83155.563564009935362, 92696.553835379265365 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 70584.272549364948645, 36883.596570320951287 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 10602.782829590496476, 95099.854233199890587 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 20181.314884957035247, 53761.510517660019104 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 8937.662388785005533, 62219.558631816507841 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 96328.202102591327275, 92412.787442786706379 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 28256.617135189477267, 46884.450283317302819 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 95806.837357078984496, 79899.046091275900835 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 92641.90872983574809, 31668.361608946015622 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 52624.716093051480129, 41560.806722889697994 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 90770.794081163563533, 60519.887657205741561 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 59524.981228029682825, 50197.851985409004556 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 54377.808542644554109, 64684.753940492148104 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 55090.691072928821086, 59152.087042963066779 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 52689.940577268069319, 45953.567267107311636 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 6952.997764675527833, 63526.660039418617089 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 71852.666092132683843, 33634.342163616958715 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 21011.922513884419459, 21718.055883023924252 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 94356.844018130985205, 68614.147935381479328 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 69952.539070894665201, 15492.297107505004533 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 94451.878362538060173, 49161.243084486362932 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 20698.573081818594801, 59917.136770628472732 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 48468.687073864377453, 45082.776362864577095 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 60053.955447606756934, 68954.383958761143731 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 13166.272990462413873, 52552.314930815533444 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 14102.727534985693637, 97025.511917821466341 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 63261.495857740221254, 14910.007629499421455 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 14134.313754752669411, 81797.036760290240636 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 69962.724508456172771, 6322.244608959804282 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 33882.503187887079548, 52625.827174744554213 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 77598.208564737011329, 9612.134874798382953 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 55174.580458971810003, 89687.524244345637271 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 62839.674707857164321, 97192.326340277009876 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 78413.845107007597107, 32275.89748732584485 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 8360.133811712388706, 61009.963071752747055 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 87659.53008134214906, 86317.652690011062077 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 13223.723197306037036, 94722.494758737768279 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 6705.995913498674781, 36342.87287121675763 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 45663.681084495809046, 84970.086049162928248 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 16030.509599079057807, 32587.462592787509493 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 56306.134117516070546, 92080.806866149723646 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 18866.161712850815093, 97176.792059864121256 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 78907.992190697070328, 21340.286714719226438 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 76632.338773586016032, 33457.624074525607284 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 93380.266239433069131, 79237.795639477510122 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 79584.341758378068334, 91846.69357590538857 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 24292.661478242651356, 25608.330281667535019 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 91980.340021613126737, 7095.076583919657423 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 14214.72857790094713, 88649.064522121159825 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 97321.253584693127777, 21795.784333976818743 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 55435.515686986735091, 27996.111042835913395 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 24904.933728126867209, 98613.931034697845462 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 28540.740979529633478, 91215.253095116844634 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 76090.847025465540355, 87520.111140219014487 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 6669.094079971060637, 88966.334819856725517 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 35720.786410140011867, 18132.082346879706165 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 97472.445650193156325, 98641.447037674952298 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 19726.356443359760306, 61797.488467075680092 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 696.075571997123461, 69285.853925061426708 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 24835.91419405178749, 11761.870170000322105 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 29345.153086196940421, 36991.057092860923149 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 609.957296292085175, 65036.509264143242035 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 46839.391610460355878, 64452.373150902261841 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 77600.635019096269389, 38868.185430465506215 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 78359.293617898088996, 52262.786504990486719 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 73744.822265401206096, 29867.253603497658332 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 55119.759771235301741, 69859.686118746583816 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 53991.372185325191822, 10639.422708953072288 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 73202.753966367949033, 51767.173025601397967 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 1596.083576409601619, 10139.233799766478114 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 91046.687022541678743, 62475.592078927576949 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 78898.567543624478276, 54406.18010321148904 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 38644.905591381721024, 91897.329145269599394 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 16115.145216137150783, 22154.711287842819729 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 53184.661739326453244, 11996.349247464033397 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 8141.545150363304856, 85013.777348620060366 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 44200.177159624363412, 52481.990480299078627 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 78265.925093373778509, 14628.492182853846316 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 53025.652713465700799, 40663.228483419799886 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 32962.1446694487895, 10422.259567285285812 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 62536.98236147845455, 29698.720126339518174 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 91896.106841032626107, 49627.542822386953048 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 69682.139568529179087, 49212.731361472913704 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 80956.444246168830432, 39443.948544774008042 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 27917.127545098519477, 5149.027828276220134 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 46330.649882434881874, 43418.718951210132218 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 2182.961668399330392, 45784.881219061746378 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 78148.179462250715005, 92781.035164355227607 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 25769.770806197524507, 86207.852250042982632 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 26911.696290009367658, 97468.536750805942575 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 3433.016388838172588, 91327.829239753249567 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 52668.003629119739344, 98898.835837407998042 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 90309.912461228508619, 57739.882906361919595 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 57045.440775575749285, 44718.039432330777345 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 52898.82342450737633, 261.272114279054165 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 55508.176874337186746, 52318.583158723355155 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 66892.188145469117444, 83607.576232116523897 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 2655.619414903498182, 61825.501910170598421 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 30570.856553910551156, 82575.130841012942255 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 19877.333885565083619, 7129.3452537489311 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 80667.85169625589333, 2243.208532321472376 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 60070.547054154834768, 58236.103584743483225 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 94963.252756041110842, 44769.198576395378041 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 68957.789661316302954, 58167.085332240596472 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 87078.349915830331156, 32037.608506988744921 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 18023.365160265337181, 94502.035435128214885 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 5321.829274138111941, 96437.273372132782242 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 21634.194604450662155, 10965.45793239402883 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 75246.999820986020495, 69064.575744383197161 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 41847.318363410944585, 21408.053061455368152 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 32578.508297626794956, 12175.832867874258227 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 25804.854996661542827, 8469.377030367097177 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 4257.501203063562571, 87311.076028162249713 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 66332.460934369504685, 58275.280940138109145 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 19451.776044999580336, 15557.583986835232281 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 71171.764591465980629, 24486.754267291944416 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 67833.196616014261963, 13471.431639494401679 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 98775.957376050107996, 73059.351952776298276 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 52867.949508116238576, 47296.169467211482697 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 83664.840414707359741, 67951.939624894992448 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 6618.126248191447303, 11087.58982707195355 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 69715.100331145033124, 3310.940096814862954 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 75943.936908052957733, 10494.343321830079731 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 38140.87900090545736, 2856.21019891454398 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 34063.799797319457866, 60500.018634983156517 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 85280.621656261428143, 90531.472098830359755 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 16722.322857631854276, 89890.795832314353902 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 76447.745767174215871, 15173.336863490138057 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 18616.223694646218064, 26801.254143986152485 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 66901.911519941233564, 76453.824101280391915 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 99202.409261445907759, 23188.517016674446495 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 54969.159926163687487, 3765.103432004879323 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 84040.05499234481249, 27372.599128028985433 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 6868.932401205241149, 38768.982518400342087 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 54022.803747654121253, 39790.471530386254017 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 12792.08583360951161, 68676.23922983155353 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 27847.02640086071915, 31847.731125668644381 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 56671.09745401411783, 94614.204012753456482 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 5278.242752991424823, 85802.573728255694732 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 43980.309308538591722, 22344.057590268006606 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 9398.393852553799661, 99356.644014889956452 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 64549.624293373388355, 31669.641714864839741 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 52964.667637256381568, 63812.870022724622686 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 58513.42966508911195, 28921.510075447997224 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 48613.60684830397804, 68692.859260168275796 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 99361.57831678391085, 2664.000334392979767 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 95602.188986576613388, 4818.896294860697708 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 48229.251004724479571, 17758.034285357040062 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 21770.584136504701746, 86785.8659568461444 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 43587.257098877766111, 78932.975980155708385 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 85976.125604328830377, 63037.20764676057297 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 4507.621896075075711, 16037.826807745370388 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 81228.926270469775773, 78143.060309466076433 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 78767.722203167766565, 96417.160654451858136 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 12435.508261043903985, 34555.408164207125083 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 42217.039680127163592, 72172.178232916776324 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 38638.153152183818747, 52241.777260353715974 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 4309.728632590937195, 75289.87600378364732 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 83815.485527183307568, 79332.42625613254495 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 31804.53188143180887, 18255.419203956767888 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 88834.822171608408098, 23957.525020796867466 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 97636.425588569734828, 54269.492796829108556 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 18004.824541964968375, 6871.828550593694672 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 68694.245638260195847, 17547.315977696376649 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 12543.162785825134051, 63172.729117930080974 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 2034.249808949828321, 84527.551949438740849 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 37615.331514428842638, 59802.678391582121549 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 47670.443468446166662, 50145.724887636686617 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 90559.098811228788691, 57011.235953525349032 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 47556.141022164025344, 82415.830354753430584 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 39841.606893976124411, 44262.541095143402345 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 50021.897000041557476, 33627.941625368104724 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 17143.064070835866005, 10501.768951180489239 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 53769.296345970018592, 96605.394977901465609 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 99513.492725060132216, 72517.781418963815668 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 99382.705172797621344, 18519.112786462443182 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 73374.844345356221311, 13044.438735999985511 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 4396.605874472392316, 77711.124168114896747 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 3476.666679735263187, 12608.974288540319321 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 17537.256203284068761, 25446.200218797275738 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 43775.019147498387611, 65636.163443209050456 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 47535.546288754259876, 829.605109462105929 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 28521.683696979525848, 42429.658078069965995 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 52829.342837389071065, 12902.982675574692621 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 94944.023587238261825, 49362.79008160574449 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 86439.268113937418093, 78953.232427026436199 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 90092.33285344702017, 44260.045696960791247 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 32369.416117840344668, 87684.190824241974042 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 93506.357926885335473, 41060.324895725672832 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 64692.823916919747717, 70838.237522231342155 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 27558.379478851737076, 63936.825440443615662 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 9388.111072510862869, 92139.578563993360149 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 66077.571933063998586, 93309.300404178968165 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 58701.271310562864528, 17827.537382678416179 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 41995.337881914405443, 49487.705073007004103 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 19251.923903061950114, 44574.961564060409728 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 22774.4038208011807, 45005.55428895301884 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 10627.862267082444305, 66049.280113116372377 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 91143.27915002629743, 87837.812112333034747 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 80831.039537647840916, 77947.461058599350508 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 9710.46609152576093, 9872.701990267463771 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 38569.946791105314333, 69872.873645863553975 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 67787.390384325670311, 73158.999156864447286 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 7609.610844824976994, 93058.443808153024293 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 23624.64484379852729, 63248.798578678011836 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 74973.347653746939613, 92074.595446764797089 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 72498.636071645640186, 63623.719322108641791 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 61656.576814737418317, 46725.336072239886562 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 45480.001203189356602, 5919.307844194354402 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 91056.653503741617897, 67120.663849612392369 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 69288.25835263285262, 97016.142273614634178 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 37452.424525294612977, 69129.887579974747496 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 48450.55021157014562, 51351.636095506328274 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 49745.774129331097356, 7143.514892658598001 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 91391.160463560256176, 78187.001707918519969 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 72656.010885645955568, 37071.948069320380455 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 75810.810276699019596, 19003.988701927453803 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 35327.751079582936654, 51311.14229657989199 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 54191.161790653211938, 19605.408519121014251 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 78696.711816162511241, 32836.759456414554734 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 47217.592340940173017, 20345.151913287805655 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 75394.804655946951243, 43748.051365247585636 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 13068.316470157915319, 56212.059738265583292 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 87546.540885912327212, 4418.70712895195993 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 27988.007969826590852, 62853.746326024105656 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 8119.215484352748717, 11512.589601261524876 ] } }, +{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 99437.163510433616466, 97472.41599802194105 ] } } +] +} diff --git a/gis/solar_adoption/data/solar_radiation.tif b/gis/solar_adoption/data/solar_radiation.tif new file mode 100644 index 000000000..9ec05e1f2 Binary files /dev/null and b/gis/solar_adoption/data/solar_radiation.tif differ diff --git a/gis/solar_adoption/model.py b/gis/solar_adoption/model.py new file mode 100644 index 000000000..fd465d4a8 --- /dev/null +++ b/gis/solar_adoption/model.py @@ -0,0 +1,86 @@ +import os + +import geopandas as gpd +import mesa +import mesa_geo as mg +from agents import Household + + +class SolarAdoption(mesa.Model): + """Model class for the Solar Adoption model.""" + + def __init__( + self, + num_houses=100, + social_weight=0.3, + economic_weight=0.3, + seed=None, + ): + super().__init__(seed=seed) + self.num_houses = num_houses + self.social_weight = social_weight + self.economic_weight = economic_weight + + self.space = mg.GeoSpace(crs="epsg:3857") + self.space.warn_crs_conversion = False + self.total_adopted = 0 + self.running = True + + self._generate_raster_layer() + self._generate_households() + + self.datacollector = mesa.DataCollector( + model_reporters={"Adopted": "total_adopted"} + ) + + def _generate_raster_layer(self): + """Load the raster layer representing solar radiation.""" + script_dir = os.path.dirname(__file__) + raster_path = os.path.join(script_dir, "data/solar_radiation.tif") + + self.raster_layer = mg.RasterLayer.from_file( + raster_path, model=self, attr_name="radiation" + ) + self.raster_layer.crs = self.space.crs + self.space.add_layer(self.raster_layer) + + def _generate_households(self): + """Load Household agents from vector data.""" + script_dir = os.path.dirname(__file__) + vector_path = os.path.join(script_dir, "data/households.geojson") + + gdf = gpd.read_file(vector_path) + + # Sample so we respect the `num_houses` slider + if len(gdf) > self.num_houses: + gdf = gdf.sample( + self.num_houses, random_state=self.random.randint(0, 100000) + ) + + ac = mg.AgentCreator(Household, model=self) + self.agents_added = ac.from_GeoDataFrame(gdf) + + for ind, agent in enumerate(self.agents_added): + agent.unique_id = ind + x, y = agent.geometry.x, agent.geometry.y + + try: + row, col = self.raster_layer.transform.inverse * (x, y) + row, col = int(row), int(col) + row = min(max(row, 0), self.raster_layer.height - 1) + col = min(max(col, 0), self.raster_layer.width - 1) + + val = self.raster_layer.cells[row][col].radiation + agent.solar_radiation = val + except Exception: + agent.solar_radiation = 0.5 + + self.space.add_agents(self.agents_added) + + def step(self): + """Run one step of the model.""" + self.agents.shuffle_do("step") + self.datacollector.collect(self) + + if self.total_adopted == self.num_houses: + self.running = False diff --git a/gis/solar_adoption/requirements.txt b/gis/solar_adoption/requirements.txt new file mode 100644 index 000000000..7d8d3014d --- /dev/null +++ b/gis/solar_adoption/requirements.txt @@ -0,0 +1,7 @@ +mesa>=3.0.0 +mesa-geo>=0.9.0 +geopandas +rasterio +numpy +solara +shapely diff --git a/test_gis_examples.py b/test_gis_examples.py index 98e58499b..1ff5e1ba9 100644 --- a/test_gis_examples.py +++ b/test_gis_examples.py @@ -1,5 +1,6 @@ import importlib import os +import sys import pytest from mesa import Model @@ -14,7 +15,13 @@ def get_models(directory): os.sep, "." ) + # Append the example's directory to sys.path so its absolute imports work + sys.path.insert(0, os.path.abspath(root)) + module = importlib.import_module(module_name) + + # Clean up sys.path + sys.path.pop(0) for item in dir(module): obj = getattr(module, item) if (