geo-l2-bangkok-landuse-intersect
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:01
Bash
ls -F
bangkok_landcover.parquet bma_study_area.geojson
0:06
Bash
head -n 5 bangkok_landcover.parquet
PAR1��i��[L�� ��4�$ 00023927-8760-5550-a47d-48ae7f087574$ (|ad8a-093a-539c-8f6c-0fb0b4f2c3c1 P�1206dc-28bb-593e-87bd-72efd2f32c65$P�1748f2-f294-53b7-be74-29acd35b3af6$ (Lca192-b61e-56b8-a9b1} d429f6fc0 x�e31cc-6a5f-5c6e-84e4-2f5cba3966bd (Dff542-0ee6-58e9-b6x(08f6a5e294b (�21f6dd-50e9-53cc-835d-a24c79606daf$��250870-2aa2-5e91-94fb-73b80cf6b05(|80538-2318-501c-8a51-147ea783041 � 295bda-30�P5bf-bf5d-d495c5f15a92 �ac31b-1(P37d-a3b4-0667280f5fc3 (P361883-b14e-5003-b2e3�2e51b658-��367866-63e4-5b8e-a5eb-04f2fc94c7da$��37e0e3-e4bd-52e4-89c6-b4748671e55M0�448ffc-86b2-59d1-b099-1f523b9d303-h�458581-0c65-5601-8552-c457223d99fe$x�4709eb-d772-5da4-b008-333639afed5 ��4e3263-0f86-5fd3-ad04-54589294687c$ Pf6!;dba29-5258-892b-e721d7bb870 (�582830-4580-52d1-a59b-ca6827d6b6aM�45a9d35-f8a1-55A�<831-58f15df21647)�(5bdb0f-26cbA�H0-be82-903a89e253c8 (c3da0-90!�Le92-80fb-c7f71d44982 ��5f7f38-f23c-5c21-9b35-c5c2e8a1b8d9$�$62d98d-6c5�H87-bfa3-39aab2ba168 x464132d-c7a5-54!�86c4-9120c61c384M0�64c1e1-7a01-5c56-89ae-6d7f56927ceM0|66c2f0-15f4-59e3-82a6-c022a4547eQ$68d566-a21A�L2d-9d58-b0701cbe1611)691174-baMP5fed-b5f8-7426cf5c5b9-� 6b3975-16AX 2�`8589-ce7fc34fb98MX�6c99e7-d66f-5d2f-a834-1de62d8a037M�(6d419d-df20A�D4-8c0a-135185ab78a��46f3f1e-9fdb-5aA�824-fc6�c609d �h73303a-35ce-57f5-bd11-2a345��87 ��85f2be-40b7-53f8-b9c3-38620e104ae��864dcb-6b98-5ddf-95bc-7b902a47652��8692f6-!-53�8e51-45c49aba806MX 876d5d-bePD29-93f6-9cf94f1362� 89d3a6-05�16-acd���cf66M�(91ff17-0303�PDb-bc9f-b66f1745633mp(963c2d-faf7i�89a83-c3ce2d9f92QX|98a444-34bf-5769-b856-e0b9b261e8Q�98ea� 4615-5bbd�� eA?1261182a �$9ce8b7-f85� e0-ae54-b�M48ed67M�9e5�[ 0A�P5b9a-9fa4-d2f8c36e1a4-�(a0e13b-568f�D7-b1d4-e01b230ab0e�a39da2AT4-5a14-8ee6-4abf090580q�$a59a7a-deb�04a-9��(3c26f517761M0�a86ec0-44c3-5153-b34b-db0cc1db884(Hed27b-a516-559c-b49�� 6f7da82af�� b0ac7b-19AL562-bc5e-fc7d6440182 � b34257-ec��38a�,b-a9ed3e1968�P b39044-25apae9-9f�$2ac481c4cbM<b3d5b8-e0f6-5e75A�,7-24ba909f6cx0f0971-e164-5c�K4181-6aed665b9e���c0c95b-cf87-551a-bc83-4ada000661f�8c63902-5236-533p01b-84cd0eaba21h(cf70da-8584�D3-9a4e-242bc8fd053-�Ld2ed28-a71c-55c0-af4!� 614d561ca x$d93548-d0dHHf7-acc3-a706a76dc36�` e074bb-95�L2da-b686-a45e31f2cd9MЀe227c6-654f-5bee-9ef9-8864bd520c9P26d27-95�h��<9bfa-c57587eb4d0�P�e36de6-ba06-5d37-a15a-d0c209069c6�@e48540-f��50aA�470-c9640cebfbc- e55ef6-7b��L729-b7be-345a765140dP 7e10b-b17��f3-bf98��e588c7b1�(e8466f-9627aHD3-926f-b286f8e4028�$cb876-2d32��5-affe_6cf7a7f1M�(eeefba-ff25� b�0d-d6f774af637-h(f0ff52-23e7P 7��02-4f7f7e6128f� f415��T4d9-582d-8f30-548d9495v�$fa9608-98cA0H36-838c-841b8256c98͐ fd7d46-f2pLc0d-98e1-65a83a75f51xf2) 29e2-5aA�8906-a6708c11e0fm�Lff2ce8-edd5-5861-827A 5c9f3bc37),100b1ec-a811)h87d3x 1be6� �`(1017a7c-66a�ca-90A�6db26d�@1068919-240b-5d59�08-e870f273023I�,1069909-f982�@Dd-8033-677c5654850�� 1�!610A�az4388-f45c09cbef�10a1A��P-5a25-a267-969ad2fd89xa4b0e-8d�<a0a6-78e23cc26b4I�10d8f6�cd-51E�4d2-e94964d1138 Ȁ102f2c-fb96-5467-a847-8ba911f512f8 1139��2a�.L10e-9498-64e574c9bf8I0T1140c4e-592c-517b-9a22e�16cc1ce �(15ffa1-3f61��a8�� e400be8beM��116776c-e334-50db-88f0-82864032fb � 8b4-4bd�50A,7-2cdcf482c11�17cfd0�^Xd-570a-9e0f-36566a66ba5I�11a3!c93a He50-b58a-735c2777ca��$12220a1-20�L754-ac08-d278c756342M�<278188-b317-5973Z 06-1db0b1a709b-h 2cb259-06�a3d-90�= a65ab8e3cm ,12fc203-f339� <bcf3-7adbe35c857iH$133f0bd-fea�Lb55-89b6-447d433a642M�459f7�X2d-58d5-806d-dadbabf5a9X 1483c24-0�PL710-bc47-cdbb7d0e8b5��14a1 7aa�H99f-9194-eaa662fb76�x14a70!6\9d3-5617-b705-d579a41e191�$5010c9-729apH2d-aca8-e653dfe6258ɸ150837c��X2-55cd-99ea-0462088e624�(,151d616-c35eA�@5-9ea4-935bbbdabcpA�tf09-8afc-5918-ac1b-b62fefbb368m�(628b62-031a�@c-af0a-6d99745951p 16cd90d-7. 5��<a788-7c74c21d03c �743 ec5b66�0f-fc0f33c91bb-� 79cb61-63��cf7-bae� 4c35d5d0c- 7a80f0-6a�hb5c 0e-468a8013e99M�,7beca5-2c2a-A�@-90b4-8a2a14b9dc5Pe0�a9A�7c9�
0:08
Write
/work/check_columns.py
content · 13 lines · py
import geopandas as gpd
import pandas as pd
# Check landcover columns
lc = gpd.read_parquet('bangkok_landcover.parquet')
print("Landcover columns:", lc.columns.tolist())
print("Landcover head:\n", lc.head())
# Check study area columns
sa = gpd.read_file('bma_study_area.geojson')
print("\nStudy area columns:", sa.columns.tolist())
print("Study area head:\n", sa.head())
Wrote /work/check_columns.py (373 chars).
0:09
Bash
python check_columns.py
Landcover columns: ['id', 'class', 'geometry']
Landcover head:
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]
Study area columns: ['name', 'geometry']
Study area head:
name geometry
0 BMA study area POLYGON ((653609.601 1506149.152, 662313.016 1...
0:38
Write
/work/solve.py
content · 60 lines · py
import geopandas as gpd
from shapely.geometry import MultiPolygon
def solve():
# 1. Load data
print("Loading data...")
lc = gpd.read_parquet('bangkok_landcover.parquet')
sa = gpd.read_file('bma_study_area.geojson')
# Ensure same CRS
if lc.crs != sa.crs:
print(f"Reprojecting study area from {sa.crs} to {lc.crs}")
sa = sa.to_crs(lc.crs)
# 2. Intersect landcover with study area
print("Intersecting landcover with study area...")
# Use overlay for intersection to get clipped geometries
# Note: overlay returns a GeoDataFrame of the intersection
intersected = gpd.overlay(lc, sa, how='intersection')
if intersected.empty:
print("No intersection found.")
return
# 3. Calculate area in m2
# Since it's already in a metric CRS (based on coordinate values in preview)
# but let's double check. The preview shows 647454 1506832 which looks like UTM/metric.
print("Calculating area...")
intersected['area_m2'] = intersected.geometry.area
# 4. Simplify geometries to reduce file size
# We need to pick a tolerance. Since coordinates are in meters,
# a tolerance of 1-5 meters should be invisible for a browser preview
# but significantly reduces vertex count.
print("Simplifying geometries...")
tolerance = 1.0
intersected['geometry'] = intersected.geometry.simplify(tolerance, preserve_topology=True)
# 5. Convert everything to MultiPolygon as requested
print("Converting to MultiPolygons...")
def ensure_multipolygon(geom):
if geom.geom_type == 'Polygon':
return MultiPolygon([geom])
return geom
intersected['geometry'] = intersected.geometry.apply(ensure_multipolygon)
# 6. Select only required columns
# "with the original 'class' string and a per-feature 'area_m2' in square metres"
# The overlay might have kept 'name' from sa, so we filter.
final_gdf = intersected[['class', 'area_m2', 'geometry']]
# 7. Write to GeoJSON
print(f"Writing to bma_landcover_intersect.geojson...")
final_gdf.to_file('bma_landcover_intersect.geojson', driver='GeoJSON')
print("Done!")
if __name__ == "__main__":
solve()
Wrote /work/solve.py (2218 chars).
0:41
Bash
python solve.py
Loading data... Intersecting landcover with study area... Calculating area... Simplifying geometries... Converting to MultiPolygons... Writing to bma_landcover_intersect.geojson... Done!
0:43
Bash
ls -lh bma_landcover_intersect.geojson
-rw-r--r-- 1 agent agent 5.8M Jun 17 21:16 bma_landcover_intersect.geojson
1:02
Write
/work/solve.py
content · 56 lines · py
import geopandas as gpd
from shapely.geometry import MultiPolygon
def solve():
# 1. Load data
print("Loading data...")
lc = gpd.read_parquet('bangkok_landcover.parquet')
sa = gpd.read_file('bma_study_area.geojson')
# Ensure same CRS
if lc.crs != sa.crs:
print(f"Reprojecting study area from {sa.crs} to {lc.crs}")
sa = sa.to_crs(lc.crs)
# 2. Intersect landcover with study area
print("Intersecting landcover with study area...")
intersected = gpd.overlay(lc, sa, how='intersection')
if intersected.empty:
print("No intersection found.")
return
# 3. Calculate area in m2
print("Calculating area...")
intersected['area_m2'] = intersected.geometry.area
# 4. Simplify geometries
# Increase tolerance to 5.0m to ensure small file size for browser preview
print("Simplifying geometries (tolerance=5.0)...")
tolerance = 5.0
intersected['geometry'] = intersected.geometry.simplify(tolerance, preserve_topology=True)
# 5. Convert everything to MultiPolygon
print("Converting to MultiPolygons...")
def ensure_multipolygon(geom):
if geom.is_empty:
return None
if geom.geom_type == 'Polygon':
return MultiPolygon([geom])
return geom
intersected['geometry'] = intersected.geometry.apply(ensure_multipolygon)
# Remove any None entries from invalid/empty simplifications
intersected = intersected[intersected.geometry.notnull()]
# 6. Select only required columns
final_gdf = intersected[['class', 'area_m2', 'geometry']]
# 7. Write to GeoJSON
print(f"Writing to bma_landcover_intersect.geojson...")
final_gdf.to_file('bma_landcover_intersect.geojson', driver='GeoJSON')
print("Done!")
if __name__ == "__main__":
solve()
Wrote /work/solve.py (1821 chars).
1:03
Bash
python solve.py
Loading data... Intersecting landcover with study area... Calculating area... Simplifying geometries (tolerance=5.0)... Converting to MultiPolygons... Writing to bma_landcover_intersect.geojson... Done!
1:07
Bash
ls -lh bma_landcover_intersect.geojson
-rw-r--r-- 1 agent agent 5.7M Jun 17 21:16 bma_landcover_intersect.geojson
1:34
Write
/work/solve.py
content · 56 lines · py
import geopandas as gpd
from shapely.geometry import MultiPolygon
def solve():
# 1. Load data
print("Loading data...")
lc = gpd.read_parquet('bangkok_landcover.parquet')
sa = gpd.read_file('bma_study_area.geojson')
# Ensure same CRS
if lc.crs != sa.crs:
print(f"Reprojecting study area from {sa.crs} to {lc.crs}")
sa = sa.to_crs(lc.crs)
# 2. Intersect landcover with study area
print("Intersecting landcover with study area...")
# Using clip is faster and often more robust for simple intersection
intersected = lc.clip(sa)
if intersected.empty:
print("No intersection found.")
return
# 3. Calculate area in m2
print("Calculating area...")
intersected['area_m2'] = intersected.geometry.area
# 4. Simplify geometries
# Try an even more aggressive simplification for the 'preview' requirement
print("Simplifying geometries (tolerance=20.0)...")
tolerance = 20.0
intersected['geometry'] = intersected.geometry.simplify(tolerance, preserve_topology=True)
# 5. Convert everything to MultiPolygon
print("Converting to MultiPolygons...")
def ensure_multipolygon(geom):
if geom.is_empty:
return None
if geom.geom_type == 'Polygon':
return MultiPolygon([geom])
return geom
intersected['geometry'] = intersected.geometry.apply(ensure_multipolygon)
intersected = intersected[intersected.geometry.notnull()]
# 6. Select only required columns
final_gdf = intersected[['class', 'area_m2', 'geometry']]
# 7. Write to GeoJSON
print(f"Writing to bma_landcover_intersect.geojson...")
final_gdf.to_file('bma_landcover_intersect.geojson', driver='GeoJSON')
print("Done!")
if __name__ == "__main__":
solve()
Wrote /work/solve.py (1803 chars).
1:37
Bash
python solve.py
Loading data... Intersecting landcover with study area...
Traceback (most recent call last):
File "/work/solve.py", line 55, in <module>
solve()
~~~~~^^
File "/work/solve.py", line 18, in solve
intersected = lc.clip(sa)
File "/usr/local/lib/python3.14/site-packages/geopandas/geodataframe.py", line 2776, in clip
return geopandas.clip(self, mask=mask, keep_geom_type=keep_geom_type, sort=sort)
~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
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.
2:06
Write
/work/solve.py
content · 63 lines · py
import geopandas as gpd
from shapely.geometry import MultiPolygon
def solve():
# 1. Load data
print("Loading data...")
lc = gpd.read_parquet('bangkok_landcover.parquet')
sa = gpd.read_file('bma_study_area.geojson')
# Ensure same CRS
if lc.crs != sa.crs:
print(f"Reprojecting study area from {sa.crs} to {lc.crs}")
sa = sa.to_crs(lc.crs)
# Fix invalid geometries in both
print("Fixing invalid geometries...")
lc['geometry'] = lc.geometry.buffer(0)
sa['geometry'] = sa.geometry.buffer(0)
# 2. Intersect landcover with study area
print("Intersecting landcover with study area...")
# Using overlay instead of clip to avoid some GEOS issues, and we know overlay handles it
# But we'll use the safe way with overlay
intersected = gpd.overlay(lc, sa, how='intersection')
if intersected.empty:
print("No intersection found.")
return
# 3. Calculate area in m2
print("Calculating area...")
intersected['area_m2'] = intersected.geometry.area
# 4. Simplify geometries
# Use a tolerance that balances size and detail.
# 10m is a good middle ground for a 'preview'
print("Simplifying geometries (tolerance=10.0)...")
tolerance = 10.0
intersected['geometry'] = intersected.geometry.simplify(tolerance, preserve_topology=True)
# 5. Convert everything to MultiPolygon
print("Converting to MultiPolygons...")
def ensure_multipolygon(geom):
if geom.is_empty:
return None
if geom.geom_type == 'Polygon':
return MultiPolygon([geom])
return geom
intersected['geometry'] = intersected.geometry.apply(ensure_multipolygon)
intersected = intersected[intersected.geometry.notnull()]
# 6. Select only required columns
final_gdf = intersected[['class', 'area_m2', 'geometry']]
# 7. Write to GeoJSON
print(f"Writing to bma_landcover_intersect.geojson...")
final_gdf.to_file('bma_landcover_intersect.geojson', driver='GeoJSON')
print("Done!")
if __name__ == "__main__":
solve()
Wrote /work/solve.py (2089 chars).
2:08
Bash
python solve.py
Loading data... Fixing invalid geometries... Intersecting landcover with study area... Calculating area... Simplifying geometries (tolerance=10.0)... Converting to MultiPolygons... Writing to bma_landcover_intersect.geojson... Done!
2:12
Bash
ls -lh bma_landcover_intersect.geojson
-rw-r--r-- 1 agent agent 5.6M Jun 17 21:17 bma_landcover_intersect.geojson
2:48
Write
/work/solve.py
content · 60 lines · py
import geopandas as gpd
from shapely.geometry import MultiPolygon
def solve():
# 1. Load data
print("Loading data...")
lc = gpd.read_parquet('bangkok_landcover.parquet')
sa = gpd.read_file('bma_study_area.geojson')
# Ensure same CRS
if lc.crs != sa.crs:
print(f"Reprojecting study area from {sa.crs} to {lc.crs}")
sa = sa.to_crs(lc.crs)
# Fix invalid geometries in both
print("Fixing invalid geometries...")
lc['geometry'] = lc.geometry.buffer(0)
sa['geometry'] = sa.geometry.buffer(0)
# 2. Intersect landcover with study area
print("Intersecting landcover with study area...")
intersected = gpd.overlay(lc, sa, how='intersection')
if intersected.empty:
print("No intersection found.")
return
# 3. Calculate area in m2
print("Calculating area...")
intersected['area_m2'] = intersected.geometry.area
# 4. Simplify geometries
# VERY aggressive simplification for a small file size as requested
print("Simplifying geometries (tolerance=50.0)...")
tolerance = 50.0
intersected['geometry'] = intersected.geometry.simplify(tolerance, preserve_topology=True)
# 5. Convert everything to MultiPolygon
print("Converting to MultiPolygons...")
def ensure_multipolygon(geom):
if geom.is_empty:
return None
if geom.geom_type == 'Polygon':
return MultiPolygon([geom])
return geom
intersected['geometry'] = intersected.geometry.apply(ensure_multipolygon)
intersected = intersected[intersected.geometry.notnull()]
# 6. Select only required columns
final_gdf = intersected[['class', 'area_m2', 'geometry']]
# 7. Write to GeoJSON
print(f"Writing to bma_landcover_intersect.geojson...")
final_gdf.to_file('bma_landcover_intersect.geojson', driver='GeoJSON')
print("Done!")
if __name__ == "__main__":
solve()
Wrote /work/solve.py (1917 chars).
2:49
Bash
python solve.py
Loading data... Fixing invalid geometries... Intersecting landcover with study area... Calculating area... Simplifying geometries (tolerance=50.0)... Converting to MultiPolygons... Writing to bma_landcover_intersect.geojson... Done!
2:55
Bash
ls -lh bma_landcover_intersect.geojson
-rw-r--r-- 1 agent agent 2.4M Jun 17 21:18 bma_landcover_intersect.geojson
3:04
Write
/work/solve.py
content · 72 lines · py
import geopandas as gpd
from shapely.geometry import MultiPolygon
import json
def solve():
# 1. Load data
print("Loading data...")
lc = gpd.read_parquet('bangkok_landcover.parquet')
sa = gpd.read_file('bma_study_area.geojson')
# Ensure same CRS
if lc.crs != sa.crs:
print(f"Reprojecting study area from {sa.crs} to {lc.crs}")
sa = sa.to_crs(lc.crs)
# Fix invalid geometries in both
print("Fixing invalid geometries...")
lc['geometry'] = lc.geometry.buffer(0)
sa['geometry'] = sa.geometry.buffer(0)
# 2. Intersect landcover with study area
print("Intersecting landcover with study area...")
intersected = gpd.overlay(lc, sa, how='intersection')
if intersected.empty:
print("No intersection found.")
return
# 3. Calculate area in m2
print("Calculating area...")
intersected['area_m2'] = intersected.geometry.area
# 4. Simplify geometries
# Aggressive simplification for small file size
print("Simplifying geometries (tolerance=50.0)...")
tolerance = 50.0
intersected['geometry'] = intersected.geometry.simplify(tolerance, preserve_topology=True)
# 5. Convert everything to MultiPolygon
print("Converting to MultiPolygons...")
def ensure_multipolygon(geom):
if geom.is_empty:
return None
if geom.geom_type == 'Polygon':
return MultiPolygon([geom])
return geom
intersected['geometry'] = intersected.geometry.apply(ensure_multipolygon)
intersected = intersected[intersected.geometry.notnull()]
# 6. Select only required columns
final_gdf = intersected[['class', 'area_m2', 'geometry']]
# 7. Write to GeoJSON
print(f"Writing to bma_landcover_intersect.geojson...")
# To ensure the output is strictly a GeoJSON FeatureCollection with MultiPolygons
# we use to_file.
final_gdf.to_file('bma_landcover_intersect.geojson', driver='GeoJSON')
# Final check on the output format
with open('bma_landcover_intersect.geojson', 'r') as f:
data = json.load(f)
print(f"Output type: {data['type']}")
if len(data['features']) > 0:
print(f"First feature geometry type: {data['features'][0]['geometry']['type']}")
print(f"Columns in first feature: {data['features'][0]['properties'].keys()}")
print("Done!")
if __name__ == "__main__":
solve()
Wrote /work/solve.py (2418 chars).
3:05
Bash
python solve.py
Loading data... Fixing invalid geometries... Intersecting landcover with study area... Calculating area... Simplifying geometries (tolerance=50.0)... Converting to MultiPolygons... Writing to bma_landcover_intersect.geojson... Output type: FeatureCollection First feature geometry type: MultiPolygon Columns in first feature: dict_keys(['class', 'area_m2']) Done!
3:15