geo-l2-bangkok-landuse-intersect

Status: done
Score: 1.000
Duration: 1:14
Cost: 0.48¢
Model: google/gemma-4-26b-a4b-it

Map (reference ← swipe → agent)

0:00
Working on a flood-mitigation green-cover briefing. `landcover` has land-cover polygons for the Bangkok metro; `study_area` defines the BMA boundary. I need the land-cover within the study area, simplified enough that the file is small for the policy lead to preview in a browser, with the original `class` string and a per-feature `area_m2` in square metres. Write the result to `bma_landcover_intersect.geojson` as a GeoJSON FeatureCollection with every feature stored as a MultiPolygon.
0:00
System info
{
  "adapter": "openrouter",
  "model": "google/gemma-4-26b-a4b-it",
  "base_url": "https://openrouter.ai/api/v1"
}
0:00
Bash ls -F
ls -F
bangkok_landcover.parquet
bma_study_area.geojson
0:03
Write /work/check_data.py
content · 15 lines · py
import geopandas as gpd

# Load the data
landcover = gpd.read_parquet('bangkok_landcover.parquet')
study_area = gpd.read_file('bma_study_area.geojson')

print("Landcover columns:", landcover.columns)
print("Study area columns:", study_area.columns)
print("Landcover CRS:", landcover.crs)
print("Study area CRS:", study_area.crs)

# Inspect first few rows
print(landcover.head())
print(study_area.head())
Wrote /work/check_data.py (404 chars).
0:04
Bash python /work/check_data.py
python /work/check_data.py
Landcover columns: Index(['id', 'class', 'geometry'], dtype='str')
Study area columns: Index(['name', 'geometry'], dtype='str')
Landcover CRS: {"$schema": "https://proj.org/schemas/v0.7/projjson.schema.json", "type": "ProjectedCRS", "name": "WGS 84 / UTM zone 47N", "base_crs": {"name": "WGS 84", "datum_ensemble": {"name": "World Geodetic System 1984 ensemble", "members": [{"name": "World Geodetic System 1984 (Transit)"}, {"name": "World Geodetic System 1984 (G730)"}, {"name": "World Geodetic System 1984 (G873)"}, {"name": "World Geodetic System 1984 (G1150)"}, {"name": "World Geodetic System 1984 (G1674)"}, {"name": "World Geodetic System 1984 (G1762)"}, {"name": "World Geodetic System 1984 (G2139)"}, {"name": "World Geodetic System 1984 (G2296)"}], "ellipsoid": {"name": "WGS 84", "semi_major_axis": 6378137, "inverse_flattening": 298.257223563}, "accuracy": "2.0", "id": {"authority": "EPSG", "code": 6326}}, "coordinate_system": {"subtype": "ellipsoidal", "axis": [{"name": "Geodetic latitude", "abbreviation": "Lat", "direction": "north", "unit": "degree"}, {"name": "Geodetic longitude", "abbreviation": "Lon", "direction": "east", "unit": "degree"}]}, "id": {"authority": "EPSG", "code": 4326}}, "conversion": {"name": "UTM zone 47N", "method": {"name": "Transverse Mercator", "id": {"authority": "EPSG", "code": 9807}}, "parameters": [{"name": "Latitude of natural origin", "value": 0, "unit": "degree", "id": {"authority": "EPSG", "code": 8801}}, {"name": "Longitude of natural origin", "value": 99, "unit": "degree", "id": {"authority": "EPSG", "code": 8802}}, {"name": "Scale factor at natural origin", "value": 0.9996, "unit": "unity", "id": {"authority": "EPSG", "code": 8805}}, {"name": "False easting", "value": 500000, "unit": "metre", "id": {"authority": "EPSG", "code": 8806}}, {"name": "False northing", "value": 0, "unit": "metre", "id": {"authority": "EPSG", "code": 8807}}]}, "coordinate_system": {"subtype": "Cartesian", "axis": [{"name": "Easting", "abbreviation": "E", "direction": "east", "unit": "metre"}, {"name": "Northing", "abbreviation": "N", "direction": "north", "unit": "metre"}]}, "scope": "Navigation and medium accuracy spatial referencing.", "area": "Between 96\u00b0E and 102\u00b0E, northern hemisphere between equator and 84\u00b0N, onshore and offshore. China. Indonesia. Laos. Malaysia - West Malaysia. Mongolia. Myanmar (Burma). Russian Federation. Thailand.", "bbox": {"south_latitude": 0, "west_longitude": 96, "north_latitude": 84, "east_longitude": 102}, "id": {"authority": "EPSG", "code": 32647}}
Study area CRS: EPSG:32647
                                     id  ...                                           geometry
0  00023927-8760-5550-a47d-48ae7f087574  ...  POLYGON ((647454.402 1506832.283, 647738.841 1...
1  0002ad8a-093a-539c-8f6c-0fb0b4f2c3c1  ...  POLYGON ((643806.222 1536031.975, 643880.924 1...
2  001206dc-28bb-593e-87bd-72efd2f32c65  ...  POLYGON ((695139.782 1532663.1, 695231.345 153...
3  001748f2-f294-53b7-be74-29acd35b3af6  ...  POLYGON ((650585.19 1544580.727, 650660.692 15...
4  001ca192-b61e-56b8-a9b1-8f6d429f6fc0  ...  POLYGON ((652703.522 1505402.689, 652740.294 1...

[5 rows x 3 columns]
             name                                           geometry
0  BMA study area  POLYGON ((653609.601 1506149.152, 662313.016 1...
0:15
Write /work/solve.py
content · 44 lines · py
import geopandas as gpd

# Load the data
landcover = gpd.read_parquet('bangkok_landcover.parquet')
study_area = gpd.read_file('bma_study_area.geojson')

# Ensure they are in the same CRS
if landcover.crs != study_area.crs:
    landcover = landcover.to_crs(study_area.crs)

# 1. Intersect landcover with study area
# This will clip the polygons to the study area boundary
landcover_intersected = gpd.clip(landcover, study_area)

# 2. Calculate area in square meters
# Since CRS is EPSG:32647 (UTM 47N), units are already in meters.
landcover_intersected['area_m2'] = landcover_intersected.geometry.area

# 3. Simplify geometries to make the file smaller
# We can use the tolerance parameter. 
# Since it is in meters, a tolerance of 1-5 meters should be enough for a preview.
landcover_intersected['geometry'] = landcover_intersected.geometry.simplify(tolerance=2.0, preserve_topology=True)

# 4. Ensure everything is stored as MultiPolygon
# Even if a single polygon remains after simplification/clipping, we want MultiPolygon
landcover_intersected['geometry'] = landcover_intersected.geometry.apply(lambda geom: 
    gpd.GeoSeries([geom]).to_multipolygon().iloc[0] if geom.geom_type == 'Polygon' else geom
)

# 5. Prepare final columns
# We only need 'class', 'area_m2', and 'geometry'
# Let's double check the 'class' column name from the check_data output
final_gdf = landcover_intersected[['class', 'area_m2', 'geometry']]

# 6. Convert to WGS84 (EPSG:4326) for GeoJSON standard/web previewing
final_gdf = final_gdf.to_crs(epsg=4326)

# 7. Write to GeoJSON
final_gdf.to_file('bma_landcover_intersect.geojson', driver='GeoJSON')

print(f"Successfully created bma_landcover_intersect.geojson")
print(f"Total features: {len(final_gdf)}")
print(f"Column names: {final_gdf.columns.tolist()}")
Wrote /work/solve.py (1792 chars).
0:16
Bash python /work/solve.py
python /work/solve.py
Traceback (most recent call last):
  File "/work/solve.py", line 13, in <module>
    landcover_intersected = gpd.clip(landcover, study_area)
  File "/usr/local/lib/python3.14/site-packages/geopandas/tools/clip.py", line 218, in clip
    clipped = _clip_gdf_with_mask(gdf, combined_mask, sort=sort)
  File "/usr/local/lib/python3.14/site-packages/geopandas/tools/clip.py", line 93, in _clip_gdf_with_mask
    gdf_sub.geometry.values[non_point_mask].intersection(mask)
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^
  File "/usr/local/lib/python3.14/site-packages/geopandas/array.py", line 858, in intersection
    self._binary_method("intersection", self, other), crs=self.crs
    ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.14/site-packages/geopandas/array.py", line 795, in _binary_method
    return getattr(shapely, op)(left._data, right, **kwargs)
           ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.14/site-packages/shapely/decorators.py", line 173, in wrapper
    result = func(*args, **kwargs)
  File "/usr/local/lib/python3.14/site-packages/shapely/decorators.py", line 88, in wrapped
    return func(*args, **kwargs)
  File "/usr/local/lib/python3.14/site-packages/shapely/set_operations.py", line 168, in intersection
    return lib.intersection(a, b, **kwargs)
           ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^
shapely.errors.GEOSException: TopologyException: side location conflict at 671567.85823834711 1501411.7438156258. This can occur if the input geometry is invalid.
0:32
Write /work/solve.py
content · 80 lines · py
import geopandas as gpd
from shapely.validation import make_valid

# Load the data
landcover = gpd.read_parquet('bangkok_landcover.parquet')
study_area = gpd.read_file('bma_study_area.geojson')

# Ensure they are in the same CRS
if landcover.crs != study_area.crs:
    landcover = landcover.to_crs(study_area.crs)

# Fix invalid geometries in landcover
print("Fixing landcover geometries...")
landcover['geometry'] = landcover['geometry'].apply(lambda geom: make_valid(geom) if not geom.is_valid else geom)

# Fix invalid geometries in study_area
print("Fixing study_area geometries...")
study_area['geometry'] = study_area['geometry'].apply(lambda geom: make_valid(geom) if not geom.is_valid else geom)

# 1. Intersect landcover with study area
print("Clipping landcover...")
landcover_intersected = gpd.clip(landcover, study_area)

# 2. Calculate area in square meters
# Since CRS is EPSG:32647 (UTM 47N), units are already in meters.
landcover_intersected['area_m2'] = landcover_intersected.geometry.area

# 3. Simplify geometries to make the file smaller
# We can use the tolerance parameter. 
# Since it is in meters, a tolerance of 2 meters should be enough for a preview.
print("Simplifying geometries...")
landcover_intersected['geometry'] = landcover_intersected.geometry.simplify(tolerance=2.0, preserve_topology=True)

# 4. Ensure everything is stored as MultiPolygon
# After simplification and clipping, some might be Polygons. 
# We convert them to MultiPolygons to satisfy the requirement.
print("Converting to MultiPolygons...")
def ensure_multipolygon(geom):
    if geom.is_empty:
        return geom
    if geom.geom_type == 'Polygon':
        return MultiPolygon([geom])
    elif geom.geom_type == 'MultiPolygon':
        return geom
    # If it's a GeometryCollection (can happen after make_valid or clip)
    elif geom.geom_type == 'GeometryCollection':
        # Extract only Polygons/MultiPolygons
        polys = [p for p in geom.geoms if p.geom_type in ['Polygon', 'MultiPolygon']]
        if not polys:
            return None # or some empty geometry
        # If we have multiple polygons, we should combine them if possible or return a MultiPolygon
        # A simple way is to wrap them into a MultiPolygon structure
        from shapely.geometry import MultiPolygon
        if len(polys) == 1:
            if polys[0].geom_type == 'Polygon':
                return MultiPolygon([polys[0]])
            return polys[0]
        return MultiPolygon(polys)
    return geom

from shapely.geometry import MultiPolygon
landcover_intersected['geometry'] = landcover_intersected['geometry'].apply(ensure_multipolygon)

# Remove any None values resulting from the conversion
landcover_intersected = landcover_intersected[landcover_intersected.geometry.notnull()]

# 5. Prepare final columns
# We only need 'class', 'area_m2', and 'geometry'
final_gdf = landcover_intersected[['class', 'area_m2', 'geometry']]

# 6. Convert to WGS84 (EPSG:4326) for GeoJSON standard/web previewing
final_gdf = final_gdf.to_crs(epsg=4326)

# 7. Write to GeoJSON
final_gdf.to_file('bma_landcover_intersect.geojson', driver='GeoJSON')

print(f"Successfully created bma_landcover_intersect.geojson")
print(f"Total features: {len(final_gdf)}")
print(f"Column names: {final_gdf.columns.tolist()}")
Wrote /work/solve.py (3294 chars).
0:34
Bash python /work/solve.py
python /work/solve.py
Fixing landcover geometries...
Fixing study_area geometries...
Clipping landcover...
Simplifying geometries...
Converting to MultiPolygons...
Traceback (most recent call last):
  File "/work/solve.py", line 62, in <module>
    landcover_intersected['geometry'] = landcover_intersected['geometry'].apply(ensure_multipolygon)
                                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.14/site-packages/geopandas/geoseries.py", line 800, in apply
    result = super().apply(func, args=args, **kwargs)
  File "/usr/local/lib/python3.14/site-packages/pandas/core/series.py", line 5084, in apply
    ).apply()
      ~~~~~^^
  File "/usr/local/lib/python3.14/site-packages/pandas/core/apply.py", line 1520, in apply
    return self.apply_standard()
           ~~~~~~~~~~~~~~~~~~~^^
  File "/usr/local/lib/python3.14/site-packages/pandas/core/apply.py", line 1578, in apply_standard
    mapped = obj._map_values(mapper=curried)
  File "/usr/local/lib/python3.14/site-packages/pandas/core/base.py", line 1020, in _map_values
    return arr.map(mapper, na_action=na_action)
           ~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.14/site-packages/pandas/core/arrays/base.py", line 2745, in map
    return map_array(self, mapper, na_action=na_action)
  File "/usr/local/lib/python3.14/site-packages/pandas/core/algorithms.py", line 1715, in map_array
    return lib.map_infer(values, mapper)
           ~~~~~~~~~~~~~^^^^^^^^^^^^^^^^
  File "pandas/_libs/lib.pyx", line 3071, in pandas._libs.lib.map_infer
  File "/work/solve.py", line 42, in ensure_multipolygon
    return MultiPolygon([geom])
           ^^^^^^^^^^^^
UnboundLocalError: cannot access local variable 'MultiPolygon' where it is not associated with a value
0:52
Write /work/solve.py
content · 86 lines · py
import geopandas as gpd
from shapely.validation import make_valid
from shapely.geometry import MultiPolygon, Polygon

# Load the data
landcover = gpd.read_parquet('bangkok_landcover.parquet')
study_area = gpd.read_file('bma_study_area.geojson')

# Ensure they are in the same CRS
if landcover.crs != study_area.crs:
    landcover = landcover.to_crs(study_area.crs)

# Fix invalid geometries in landcover
print("Fixing landcover geometries...")
landcover['geometry'] = landcover['geometry'].apply(lambda geom: make_valid(geom) if not geom.is_valid else geom)

# Fix invalid geometries in study_area
print("Fixing study_area geometries...")
study_area['geometry'] = study_area['geometry'].apply(lambda geom: make_valid(geom) if not geom.is_valid else geom)

# 1. Intersect landcover with study area
print("Clipping landcover...")
landcover_intersected = gpd.clip(landcover, study_area)

# 2. Calculate area in square meters
print("Calculating areas...")
landcover_intersected['area_m2'] = landcover_intersected.geometry.area

# 3. Simplify geometries to make the file smaller
print("Simplifying geometries...")
landcover_intersected['geometry'] = landcover_intersected.geometry.simplify(tolerance=2.0, preserve_topology=True)

# 4. Ensure everything is stored as MultiPolygon
print("Converting to MultiPolygons...")
def ensure_multipolygon(geom):
    if geom.is_empty:
        return geom
    if geom.geom_type == 'Polygon':
        return MultiPolygon([geom])
    elif geom.geom_type == 'MultiPolygon':
        return geom
    elif geom.geom_type == 'GeometryCollection':
        # Extract only Polygons/MultiPolygons
        polys = [p for p in geom.geoms if p.geom_type in ['Polygon', 'MultiPolygon']]
        if not polys:
            return None
        
        # If we have multiple polygons, combine them. 
        # If there's only one Polygon, wrap it in MultiPolygon to keep types consistent.
        if len(polys) == 1:
            if polys[0].geom_type == 'Polygon':
                return MultiPolygon([polys[0]])
            else:
                return polys[0] # it's already a MultiPolygon
        
        # Create a MultiPolygon from the list of polygons/multipolygons
        # We need to handle the case where we have a list of MultiPolygons by flattening
        combined_geoms = []
        for p in polys:
            if p.geom_type == 'Polygon':
                combined_geoms.append(p)
            else:
                combined_geoms.extend(list(p.geoms))
        return MultiPolygon(combined_geoms)
    return geom

landcover_intersected['geometry'] = landcover_intersected['geometry'].apply(ensure_multipolygon)

# Remove any None values resulting from the conversion
landcover_intersected = landcover_intersected[landcover_intersected.geometry.notnull()]

# 5. Prepare final columns
# We only need 'class', 'area_m2', and 'geometry'
final_gdf = landcover_intersected[['class', 'area_m2', 'geometry']]

# 6. Convert to WGS84 (EPSG:4326) for GeoJSON standard/web previewing
final_gdf = final_gdf.to_crs(epsg=4326)

# 7. Write to GeoJSON
print("Writing to GeoJSON...")
final_gdf.to_file('bma_landcover_intersect.geojson', driver='GeoJSON')

print(f"Successfully created bma_landcover_intersect.geojson")
print(f"Total features: {len(final_gdf)}")
print(f"Column names: {final_gdf.columns.tolist()}")
Wrote /work/solve.py (3325 chars).
0:53
Bash python /work/solve.py
python /work/solve.py
Fixing landcover geometries...
Fixing study_area geometries...
Clipping landcover...
Calculating areas...
Simplifying geometries...
Converting to MultiPolygons...
Writing to GeoJSON...
Successfully created bma_landcover_intersect.geojson
Total features: 3453
Column names: ['class', 'area_m2', 'geometry']
0:56
Bash head -n 20 bma_landcover_intersect.geojson
head -n 20 bma_landcover_intersect.geojson
{
"type": "FeatureCollection",
"name": "bma_landcover_intersect",
"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } },
"features": [
{ "type": "Feature", "properties": { "class": "mangrove", "area_m2": 4736.4681768837008 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 100.581475394256017, 13.543275311816137 ], [ 100.581539864970097, 13.543571175860935 ], [ 100.581993157301184, 13.543601331637706 ], [ 100.582683465526173, 13.543189518999844 ], [ 100.583010889411213, 13.543176277630829 ], [ 100.583126460999011, 13.54307895980056 ], [ 100.581510035229002, 13.543213807098317 ], [ 100.581475394256017, 13.543275311816137 ] ] ] ] } },
{ "type": "Feature", "properties": { "class": "urban", "area_m2": 23885.211831935558 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 100.581048310503306, 13.543605490767117 ], [ 100.581037352478376, 13.543836510967521 ], [ 100.580803961010616, 13.544044338156169 ], [ 100.580907055369181, 13.544427555411238 ], [ 100.581519592164241, 13.544782250378102 ], [ 100.582033333, 13.543830879113758 ], [ 100.58200961146396, 13.543572444588792 ], [ 100.581740900645812, 13.543194548225822 ], [ 100.580784274593626, 13.543274348904013 ], [ 100.581048310503306, 13.543605490767117 ] ] ], [ [ [ 100.578623197970202, 13.543571175861011 ], [ 100.579005557023308, 13.543633520038769 ], [ 100.579239110588759, 13.544009611463945 ], [ 100.579538993210306, 13.544029372398603 ], [ 100.579850132526175, 13.543689518999843 ], [ 100.580293469029797, 13.543654508861009 ], [ 100.580400679969202, 13.54330634690583 ], [ 100.578585465982499, 13.543457757112806 ], [ 100.578623197970202, 13.543571175861011 ] ] ] ] } },
{ "type": "Feature", "properties": { "class": "forest", "area_m2": 0.5411926562059699 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 100.58190982278272, 13.543184664882933 ], [ 100.581912918588159, 13.54318019829052 ], [ 100.581891439935191, 13.543181990071044 ], [ 100.58190982278272, 13.543184664882933 ] ] ] ] } },
{ "type": "Feature", "properties": { "class": "forest", "area_m2": 528.31582562349195 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 100.578392060672812, 13.543474688593792 ], [ 100.578563741726086, 13.543615583593073 ], [ 100.578851331153587, 13.543493157201739 ], [ 100.578849435681292, 13.543435739757156 ], [ 100.578392060672812, 13.543474688593792 ] ] ] ] } },
{ "type": "Feature", "properties": { "class": "shrub", "area_m2": 19572.676171932188 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 100.610264673047439, 13.541060895705709 ], [ 100.610006842798342, 13.541065335513041 ], [ 100.609595491134129, 13.541373197850771 ], [ 100.60962319785078, 13.541821175532545 ], [ 100.610558021927247, 13.541857939327137 ], [ 100.610781284507809, 13.54144276884456 ], [ 100.611057231155414, 13.541614617841146 ], [ 100.61115577750293, 13.541926277893481 ], [ 100.611499526980865, 13.541861047045 ], [ 100.611592944560172, 13.541155777502974 ], [ 100.611134871033627, 13.540740742118478 ], [ 100.610263478914661, 13.54081353582953 ], [ 100.610264673047439, 13.541060895705709 ] ] ] ] } },
{ "type": "Feature", "properties": { "class": "barren", "area_m2": 7219.8922849964611 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 100.578417139685811, 13.543611047044999 ], [ 100.579072444169597, 13.544176277893484 ], [ 100.579361047045055, 13.544166193647506 ], [ 100.579532250259732, 13.543936258273819 ], [ 100.579434664486925, 13.543423509464926 ], [ 100.579372594969655, 13.543392102920164 ], [ 100.578364228772145, 13.543476209993502 ], [ 100.578417139685811, 13.543611047044999 ] ] ] ] } },
{ "type": "Feature", "properties": { "class": "forest", "area_m2": 23309.803089361369 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 100.608383333333336, 13.542101410654347 ], [ 100.608025311406081, 13.542058727339526 ], [ 100.607558727339494, 13.542358644739538 ], [ 100.607565335513073, 13.542659823868403 ], [ 100.607858644739423, 13.543024605993804 ], [ 100.60814133607937, 13.542974669412779 ], [ 100.6082, 13.542693282048642 ], [ 100.60883087847111, 13.5427 ], [ 100.609155777502934, 13.543009611226815 ], [ 100.60955, 13.543116666666664 ], [ 100.609638952954953, 13.543666193647505 ], [ 100.609974688593908, 13.543691272660467 ], [ 100.61016619364753, 13.543527713711669 ], [ 100.609999526980857, 13.542972286288331 ], [ 100.6092, 13.542383333333333 ], [ 100.609184664486918, 13.542006842798259 ], [ 100.608993157201638, 13.541815335513039 ], [ 100.608506842798349, 13.541815335513039 ], [ 100.608383333333336, 13.542101410654347 ] ] ] ] } },
{ "type": "Feature", "properties": { "class": "mangrove", "area_m2": 19821.451689226018 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 100.610134416406922, 13.542602924940484 ], [ 100.610322444169597, 13.542842944560149 ], [ 100.611340176131677, 13.543767997820289 ], [ 100.611724688593924, 13.543774605993805 ], [ 100.611934664486938, 13.543576490535074 ], [ 100.61168466448693, 13.542590176131593 ], [ 100.611493157201636, 13.542398668846374 ], [ 100.610936246222025, 13.542547795277622 ], [ 100.610760889163728, 13.542240388773186 ], [ 100.61025684279835, 13.542148668846371 ], [ 100.610134416406922, 13.542602924940484 ] ] ] ] } },
{ "type": "Feature", "properties": { "class": "crop", "area_m2": 29580.368888353394 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 100.611884389004103, 13.542435700551781 ], [ 100.611044338796759, 13.542470627892945 ], [ 100.610892060672811, 13.542608644739541 ], [ 100.61094199725396, 13.54297466941278 ], [ 100.611216667, 13.543026615298473 ], [ 100.611305619700232, 13.543332860491427 ], [ 100.611591064666314, 13.543379166251734 ], [ 100.611315335513083, 13.54350684279826 ], [ 100.611388952954954, 13.543832860314174 ], [ 100.61180802192726, 13.543857939327136 ], [ 100.612361047299771, 13.543582860491432 ], [ 100.61245, 13.543148589551782 ], [ 100.612691978816159, 13.543441272743983 ], [ 100.613249527361276, 13.543361046126922 ], [ 100.613249527361234, 13.542972286873011 ], [ 100.612361047299771, 13.542083806508568 ], [ 100.612055619700229, 13.542083806508568 ], [ 100.611884389004103, 13.542435700551781 ] ] ] ] } },
{ "type": "Feature", "properties": { "class": "shrub", "area_m2": 23375.959788428718 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 100.57988441637238, 13.543602923482151 ], [ 100.580174397961315, 13.543795832970044 ], [ 100.580108663920655, 13.544224669412779 ], [ 100.580705661203226, 13.544529372107055 ], [ 100.581404508860999, 13.544126802029808 ], [ 100.58145, 13.543648589345651 ], [ 100.581730408392758, 13.543865583593075 ], [ 100.582224669412696, 13.543724669412777 ], [ 100.582282250259738, 13.543230408392846 ], [ 100.582241865381945, 13.543152756837911 ], [ 100.579947550456112, 13.543344144480624 ], [ 100.57988441637238, 13.543602923482151 ] ] ] ] } },
{ "type": "Feature", "properties": { "class": "crop", "area_m2": 8420.0537782358479 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 100.581887294904433, 13.543622328253104 ], [ 100.582358644982989, 13.543941272743977 ], [ 100.582710135029799, 13.54390450886101 ], [ 100.583029372398599, 13.543288993210334 ], [ 100.583012686068841, 13.543088451605197 ], [ 100.581999656694833, 13.543172962452415 ], [ 100.581887294904433, 13.543622328253104 ] ] ] ] } },
{ "type": "Feature", "properties": { "class": "barren", "area_m2": 57998.284369547575 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 100.607961006789694, 13.542220627601397 ], [ 100.607720627662104, 13.542622326619556 ], [ 100.6083, 13.543495358592629 ], [ 100.608441997253962, 13.544141336079447 ], [ 100.608760889163733, 13.544176277893481 ], [ 100.608859948631832, 13.543783333 ], [ 100.609038767995102, 13.543833571837935 ], [ 100.608884416406923, 13.544230408392842 ], [ 100.608928824467455, 13.544793468815891 ], [ 100.609552048932471, 13.544776102151111 ], [ 100.609500473019125, 13.545277713711668 ], [ 100.609974688593908, 13.545441272660472 ], [ 100.610116666666656, 13.5451691215287 ], [ 100.609974047201916, 13.544941433314911 ], [ 100.610666193491468, 13.544111047299706 ], [ 100.610691272744006, 13.543775311816184 ], [ 100.610571175532542, 13.543456531184104 ], [ 100.610177555411198, 13.543157055369162 ], [ 100.609980409517732, 13.543134416372389 ], [ 100.609813905607254, 13.543216626977708 ], [ 100.609652025371844, 13.5432 ], [ 100.609862705440364, 13.543038994536682 ], [ 100.609760889163724, 13.542740388773185 ], [ 100.609423509465017, 13.542732002179704 ], [ 100.609306717951341, 13.54305 ], [ 100.609182476534968, 13.542991092464176 ], [ 100.609184664486918, 13.542340176131594 ], [ 100.60901959160725, 13.542217749740258 ], [ 100.607961006789694, 13.542220627601397 ] ] ] ] } },
{ "type": "Feature", "properties": { "class": "barren", "area_m2": 17516.274996602322 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 100.579845491134137, 13.543793468815892 ], [ 100.580340176131685, 13.54393466448696 ], [ 100.580482002880743, 13.544493158750178 ], [ 100.5807898649702, 13.544904508861014 ], [ 100.581063740835774, 13.545032250378103 ], [ 100.581571175861029, 13.544960135029777 ], [ 100.581582860491437, 13.544638952700266 ], [ 100.581071974490229, 13.544283741751581 ], [ 100.5812, 13.543752455583345 ], [ 100.581043469029922, 13.543512158139063 ], [ 100.579872895997582, 13.543350371666216 ], [ 100.579845491134137, 13.543793468815892 ] ] ] ] } },
{ "type": "Feature", "properties": { "class": "forest", "area_m2": 18256.981931122329 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 100.576240388773144, 13.543844222497025 ], [ 100.576768077448236, 13.54455 ], [ 100.576191997253957, 13.544691997253887 ], [ 100.576191997253957, 13.545141336079446 ], [ 100.576974688593921, 13.545107939327135 ], [ 100.577116666666655, 13.544815256249651 ], [ 100.577388952954948, 13.545249526980841 ], [ 100.577724669412689, 13.545224669412779 ], [ 100.577774605993838, 13.544941978072874 ], [ 100.577499527361297, 13.544388953873096 ], [ 100.576748894096056, 13.54361093533228 ], [ 100.576166576081206, 13.543659500397885 ], [ 100.576240388773144, 13.543844222497025 ] ] ] ] } },
{ "type": "Feature", "properties": { "class": "mangrove", "area_m2": 13626.579588744435 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 100.582238268343232, 13.544042387953249 ], [ 100.581608663920633, 13.544025330587219 ], [ 100.581633333333329, 13.544747545137966 ], [ 100.581739110836253, 13.544926277893481 ], [ 100.582019591607235, 13.544948916926408 ], [ 100.582724669412698, 13.544641336079446 ], [ 100.582866666666646, 13.544330878471296 ], [ 100.582724669412698, 13.543608663920553 ], [ 100.582373197850771, 13.543595491134115 ], [ 100.582238268343232, 13.544042387953249 ] ] ] ] } },
1:12