crs-l2-svalbard-polar-areas
Map (reference ← swipe → agent)
0:00
svalbard_glaciers — I need an honest size ranking of these high-latitude glaciers using true geographic area, not the distorted values you'd get from raw lat/lon coordinates. Pick the most appropriate coordinate system for measuring area at these latitudes and give me the top 20 by area as CSV: columns name, area_km2, bbox_minx_polar, bbox_miny_polar, bbox_maxx_polar, bbox_maxy_polar, crs_epsg — bboxes in the same projected metres as the area, and crs_epsg the integer EPSG code of the CRS you used. Sort by area_km2 descending. File: svalbard_glaciers_top20.csv.
0:00
System info
{
"adapter": "openrouter",
"model": "deepseek/deepseek-v4-flash",
"base_url": "https://openrouter.ai/api/v1"
}
0:04
Let me start by looking at the input data to understand what we're working with.
0:04
Bash
ls /work/
svalbard_glaciers_wgs84.gpkg
0:19
Let me first inspect the input file to understand its structure.
0:19
Bash
cd /work && python3 -c "
cd /work && python3 -c "
import geopandas as gpd
gdf = gpd.read_file('svalbard_glaciers_wgs84.gpkg')
print('Columns:', gdf.columns.tolist())
print('CRS:', gdf.crs)
print('Shape:', gdf.shape)
print('Name column sample:', gdf.iloc[:,0].head(10).tolist() if gdf.columns[0] != 'geometry' else gdf.iloc[:,1].head(10).tolist())
print(gdf.head(3))
"
Columns: ['id', 'name', 'subtype', 'class', 'geometry']
CRS: EPSG:4326
Shape: (169, 5)
Name column sample: ['af2fac62-8f17-35dd-bb4b-cd7ac5f906b0', '12ba70b6-6f49-35fa-a072-bfdc8321c987', '5919887f-cdb2-3283-a884-b1146bdda8ee', 'cdbc3ec1-ce56-3dbc-89fe-f4bce34bd5a8', '81e675dd-427e-3cd8-ac05-929fbbd3c30e', 'e66b67bb-9088-3012-ba8e-69844a401ceb', '02db5839-e7b4-3015-9350-a5eacfd06a2a', 'a3082609-ec57-3fe8-8c0f-ee3ebbdc4e20', '10cfbc0d-d763-3739-ae98-0b4c5137e15c', 'f6634673-211f-3f0d-82e2-c23a6c626ed2']
id ... geometry
0 af2fac62-8f17-35dd-bb4b-cd7ac5f906b0 ... MULTIPOLYGON (((22.78865 80.14451, 22.73235 80...
1 12ba70b6-6f49-35fa-a072-bfdc8321c987 ... MULTIPOLYGON (((14.02517 77.97816, 14.02557 77...
2 5919887f-cdb2-3283-a884-b1146bdda8ee ... MULTIPOLYGON (((16.06338 78.22499, 16.06381 78...
[3 rows x 5 columns]
0:25
Svalbard is at high latitudes (roughly 74°N to 81°N). For measuring area accurately at these latitudes, we need a projected CRS that minimizes distortion. For Svalbard, the best CRS options are: 1. **EPSG:3411** - NSIDC Sea Ice Polar Stereographic North (true scale at 70°N) 2. **EPSG:3995** - WGS 84 / Arctic Polar Stereographic (true scale at 71°N) 3. **EPSG:5938** - WGS 84 / EPSG Arctic zone 1-33... actually for Svalbard specifically 4. **EPSG:32633** - UTM zone 33N (covers much of Svalbard around 0-6°E, but Svalbard spans multiple UTM zones) 5. **EPSG:32631-32637** - multiple UTM zones needed For polar regions, the best choice is a polar stereographic projection. EPSG:3995 (WGS 84 / Arctic Polar Stereographic) is specifically designed for the Arctic and has low distortion for area measurements. Its latitude of true scale is 71°N, which covers Svalbard well (74°-81°N). Another good option is EPSG:3411 (NSIDC Sea Ice Polar Stereographic North) with standard parallel at 70°N. Let me use EPSG:3995 - WGS 84 / Arctic Polar Stereographic. It's the standard for the Arctic region and appropriate for area measurements. Let me write the script.
0:25
Bash
cd /work && python3 -c "
cd /work && python3 -c "
import geopandas as gpd
gdf = gpd.read_file('svalbard_glaciers_wgs84.gpkg')
print('Names with actual names (not UUIDs):')
named = gdf[gdf['name'].notna() & (gdf['name'] != '')]
print(f'Total with names: {len(named)}')
print(named[['name']].head(20).to_string())
print('...')
print(named[['name']].tail(10).to_string())
"
Names with actual names (not UUIDs):
Total with names: 169
name
0 Ahlmannfonna
1 Aldegondabreen
2 Altbreen
3 Austgötabreen
4 Austre Brøggerbreen
5 Austre Grønfjordbreen
6 Austre Helvetiabreen
7 AustreLovenbreen
8 Baalsrudbreen
9 Bertilbreen
10 Billesholmbreen
11 Bivrostfonna
12 Bjuvbreen
13 Blackbreen
14 Blekumbreen
15 Bogerbreen
16 Bosarpbreen
17 Brandtbreen
18 Brattvaagbukta
19 Bullbreen
...
name
159 Vestre Helvetiabreen
160 Veteranen
161 Vetternbreen
162 Vinkelbreen
163 Vråbreen
164 Vøringbreen
165 Waldemar
166 Willebreen
167 Worsleybreen
168 Åsgardfonna
0:36
Now I need to pick the most appropriate CRS for measuring area at Svalbard's latitudes (roughly 74°N to 81°N). Svalbard is in the Arctic, so appropriate projected coordinate systems would be: 1. **EPSG:32631 to 32633** — UTM zones 31N to 33N cover Svalbard (zone 31: 0°-6°E, 32: 6°-12°E, 33: 12°-18°E, but Svalbard extends to about 30°E) 2. **EPSG:3413** — NSIDC Sea Ice Polar Stereographic North (WGS 84), centered on the North Pole. This is commonly used for Arctic applications. 3. **EPSG:3995** — WGS 84 / Arctic Polar Stereographic (true scale at 71°N) 4. **EPSG:5936** - WGS 84 / NSIDC EASE-Grid 2.0 North For the entire Svalbard archipelago spanning a wide range of longitudes (~10°E to ~30°E), a UTM zone would not cover the whole area. The polar stereographic projections are better. **EPSG:3413** (NSIDC Sea Ice Polar Stereographic North) — latitude of origin 70°N, central meridian -45°E, but this puts Svalbard off-center. **EPSG:3995** (WGS 84 / Arctic Polar Stereographic) — latitude of true scale 71°N, central meridian 0°. This is commonly used for the Arctic and covers Svalbard well. **EPSG:5936** (WGS 84 / NSIDC EASE-Grid 2.0 North) — also good for Arctic. Let me go with **EPSG:3995** (WGS 84 / Arctic Polar Stereographic) — it's designed for the Arctic region with true scale at 71°N, which is south of Svalbard (74-81°N), so it should give reasonable area measurements. Actually, let me reconsider. The most commonly used polar stereographic for Svalbard specifically might be EPSG:3995. Let me verify which EPSG codes are available and test area calculations.
0:36
Bash
cd /work && python3 -c "
cd /work && python3 -c "
import geopandas as gpd
import pyproj
gdf = gpd.read_file('svalbard_glaciers_wgs84.gpkg')
# Check the bounding box of all glaciers
print('Total bounds (WGS84):', gdf.total_bounds)
# Try EPSG:3995 - Arctic Polar Stereographic
gdf_3995 = gdf.to_crs('EPSG:3995')
gdf_3995['area_km2'] = gdf_3995.area / 1e6
print('EPSG:3995 total area:', gdf_3995['area_km2'].sum())
print('EPSG:3995 bounds:', gdf_3995.total_bounds)
# Also try EPSG:3413 - NSIDC Sea Ice Polar Stereographic North
gdf_3413 = gdf.to_crs('EPSG:3413')
gdf_3413['area_km2'] = gdf_3413.area / 1e6
print('EPSG:3413 total area:', gdf_3413['area_km2'].sum())
# Try EPSG:5936 - EASE-Grid 2.0 North
gdf_5936 = gdf.to_crs('EPSG:5936')
gdf_5936['area_km2'] = gdf_5936.area / 1e6
print('EPSG:5936 total area:', gdf_5936['area_km2'].sum())
# Also compute area on sphere using equal-area projection
# EPSG:6931 - WGS 84 / NSIDC EASE-Grid 2.0 North (EPSG:6931)
gdf_6931 = gdf.to_crs('EPSG:6931')
gdf_6931['area_km2'] = gdf_6931.area / 1e6
print('EPSG:6931 total area:', gdf_6931['area_km2'].sum())
"
Total bounds (WGS84): [10.7877123 77.4630249 33.4866675 80.3115547] EPSG:3995 total area: 10258.145267535201 EPSG:3995 bounds: [ 224550.5122728 -1325007.77810454 590653.56322425 -885258.51740589] EPSG:3413 total area: 10196.84609838404 EPSG:5936 total area: 10710.806115796817 EPSG:6931 total area: 10659.177672045638
0:45
Let's check which CRS is most appropriate. Svalbard spans roughly from 74°N to 81°N and 10°E to 35°E. For high-latitude Arctic areas, the most commonly used projected CRS for accurate area measurement is: - **EPSG:3995** (WGS 84 / Arctic Polar Stereographic) - standard for Arctic - **EPSG:3413** (NSIDC Sea Ice Polar Stereographic North) - **EPSG:6931** (NSIDC EASE-Grid 2.0 North) - equal-area projection EPSG:3995 is the official Arctic Polar Stereographic projection, valid north of 79°N. But Svalbard goes down to 77°N... Let me think about this more carefully. For area measurement, an equal-area projection is what we need. The best equal-area projections for the Arctic would be: - EPSG:6931 is a true equal-area projection (EASE-Grid 2.0 North, Lambert azimuthal equal-area) - EPSG:3413 is also equal-area (NSIDC Sea Ice Polar Stereographic North - actually it's stereographic, not equal-area) - EPSG:3995 is stereographic, not equal-area Actually, EPSG:6931 (WGS 84 / NSIDC EASE-Grid 2.0 North) is a Lambert Azimuthal Equal-Area projection. This would be the best choice for accurate area measurement. Let me verify and then build the output.
0:45
Bash
cd /work && python3 -c "
cd /work && python3 -c "
import geopandas as gpd
import pyproj
gdf = gpd.read_file('svalbard_glaciers_wgs84.gpkg')
# EPSG:6931 is WGS 84 / NSIDC EASE-Grid 2.0 North (Lambert Azimuthal Equal-Area)
# Best for area measurement at high latitudes
gdf_p = gdf.to_crs('EPSG:6931')
gdf_p['area_km2'] = gdf_p.area / 1e6
gdf_p['name'] = gdf['name']
# Get top 20 by area
top20 = gdf_p.sort_values('area_km2', ascending=False).head(20)
# Compute bbox
top20['bbox_minx_polar'] = top20.bounds['minx']
top20['bbox_miny_polar'] = top20.bounds['miny']
top20['bbox_maxx_polar'] = top20.bounds['maxx']
top20['bbox_maxy_polar'] = top20.bounds['maxy']
result = top20[['name', 'area_km2', 'bbox_minx_polar', 'bbox_miny_polar', 'bbox_maxx_polar', 'bbox_maxy_polar']].copy()
result['crs_epsg'] = 6931
# Round area to reasonable precision
result['area_km2'] = result['area_km2'].round(2)
# Round bbox coords
for c in ['bbox_minx_polar', 'bbox_miny_polar', 'bbox_maxx_polar', 'bbox_maxy_polar']:
result[c] = result[c].round(2)
print(result.to_string())
print()
print('CRS details:', pyproj.CRS.from_epsg(6931))
"
name area_km2 bbox_minx_polar bbox_miny_polar bbox_maxx_polar bbox_maxy_polar crs_epsg 140 Sørfonna 4335.83 408721.81 -1107462.31 511711.87 -1036927.31 6931 156 Vestfonna 2378.88 357790.57 -1081986.60 423181.18 -1016737.08 6931 168 Åsgardfonna 911.98 314043.06 -1141665.37 353268.42 -1087733.58 6931 78 Kvitøyjøkulen 623.62 574342.07 -945268.70 604942.48 -906782.78 6931 149 Valhallfonna 423.70 331830.62 -1109959.98 355442.62 -1077761.32 6931 103 Nordmannsfonna 130.75 405284.65 -1249107.45 423647.16 -1231056.30 6931 132 Sveabreen 126.29 289455.66 -1239004.96 315298.27 -1219149.46 6931 44 Gruvfonna 113.63 375736.39 -1292145.96 394989.38 -1274945.13 6931 160 Veteranen 96.50 349095.40 -1156267.91 361603.09 -1131112.58 6931 54 Himingbjørgfonna 84.11 336458.72 -1152460.32 351734.66 -1138205.99 6931 52 Hellefonna 82.14 394719.05 -1269626.11 405163.32 -1252096.24 6931 53 Heuglinbreen 71.06 409287.75 -1229657.55 420771.44 -1216975.55 6931 102 Nordenskiöldbreen 66.92 367639.29 -1211710.66 378079.92 -1198116.66 6931 29 Eidembreen 66.89 288405.25 -1263000.81 303436.36 -1250251.24 6931 60 Isrosa 46.95 411587.56 -1254317.42 423957.97 -1246299.67 6931 27 Edvardbreen 46.23 402432.72 -1295299.50 413325.29 -1280937.94 6931 32 Esmarkbreen 42.86 303651.27 -1266793.13 313962.33 -1255977.54 6931 154 Venernbreen 42.52 294349.03 -1267238.88 306668.98 -1257587.39 6931 25 Dunérbreen 40.50 325773.74 -1096690.68 334302.65 -1083441.70 6931 37 Fridtjovbreen 39.08 331355.82 -1318962.28 341964.07 -1307916.47 6931 CRS details: EPSG:6931
0:53
The results look reasonable. EPSG:6931 (WGS 84 / NSIDC EASE-Grid 2.0 North) is a Lambert Azimuthal Equal-Area projection centered on the North Pole, which is ideal for measuring area at high latitudes like Svalbard (77-80°N). Let me now write the final script and produce the CSV.
0:53
Write
/work/solve.py
content · 49 lines · py
import geopandas as gpd
import pandas as pd
# Read the WGS84 input data
gdf = gpd.read_file("/work/svalbard_glaciers_wgs84.gpkg")
# EPSG:6931 — WGS 84 / NSIDC EASE-Grid 2.0 North
# Lambert Azimuthal Equal-Area projection centred on the North Pole.
# This is the best choice for true-area measurement at Svalbard's latitudes (77–80°N).
CRS_POLAR = "EPSG:6931"
EPSG_CODE = 6931
# Reproject to the equal-area polar CRS
gdf_polar = gdf.to_crs(CRS_POLAR)
# Compute area in km²
gdf_polar["area_km2"] = gdf_polar.area / 1_000_000
# Extract bounding-box columns (in projected metres)
bounds = gdf_polar.bounds
gdf_polar["bbox_minx_polar"] = bounds["minx"]
gdf_polar["bbox_miny_polar"] = bounds["miny"]
gdf_polar["bbox_maxx_polar"] = bounds["maxx"]
gdf_polar["bbox_maxy_polar"] = bounds["maxy"]
# Keep the glacier name (from the original attribute column)
gdf_polar["name"] = gdf["name"]
# Sort descending by area and take the top 20
top20 = gdf_polar.sort_values("area_km2", ascending=False).head(20)
# Build output dataframe
out = pd.DataFrame({
"name": top20["name"],
"area_km2": top20["area_km2"].round(2),
"bbox_minx_polar": top20["bbox_minx_polar"].round(2),
"bbox_miny_polar": top20["bbox_miny_polar"].round(2),
"bbox_maxx_polar": top20["bbox_maxx_polar"].round(2),
"bbox_maxy_polar": top20["bbox_maxy_polar"].round(2),
"crs_epsg": EPSG_CODE,
})
# Write CSV
out.to_csv("/work/svalbard_glaciers_top20.csv", index=False)
print("Written svalbard_glaciers_top20.csv")
print(f"CRS used: EPSG:{EPSG_CODE} — {CRS_POLAR}")
print()
print(out.to_string())
Wrote /work/solve.py (1627 chars).
0:54
Let me run the script and verify the output.
0:54
Bash
cd /work && python solve.py
Written svalbard_glaciers_top20.csv
CRS used: EPSG:6931 — EPSG:6931
name area_km2 bbox_minx_polar bbox_miny_polar bbox_maxx_polar bbox_maxy_polar crs_epsg
140 Sørfonna 4335.83 408721.81 -1107462.31 511711.87 -1036927.31 6931
156 Vestfonna 2378.88 357790.57 -1081986.60 423181.18 -1016737.08 6931
168 Åsgardfonna 911.98 314043.06 -1141665.37 353268.42 -1087733.58 6931
78 Kvitøyjøkulen 623.62 574342.07 -945268.70 604942.48 -906782.78 6931
149 Valhallfonna 423.70 331830.62 -1109959.98 355442.62 -1077761.32 6931
103 Nordmannsfonna 130.75 405284.65 -1249107.45 423647.16 -1231056.30 6931
132 Sveabreen 126.29 289455.66 -1239004.96 315298.27 -1219149.46 6931
44 Gruvfonna 113.63 375736.39 -1292145.96 394989.38 -1274945.13 6931
160 Veteranen 96.50 349095.40 -1156267.91 361603.09 -1131112.58 6931
54 Himingbjørgfonna 84.11 336458.72 -1152460.32 351734.66 -1138205.99 6931
52 Hellefonna 82.14 394719.05 -1269626.11 405163.32 -1252096.24 6931
53 Heuglinbreen 71.06 409287.75 -1229657.55 420771.44 -1216975.55 6931
102 Nordenskiöldbreen 66.92 367639.29 -1211710.66 378079.92 -1198116.66 6931
29 Eidembreen 66.89 288405.25 -1263000.81 303436.36 -1250251.24 6931
60 Isrosa 46.95 411587.56 -1254317.42 423957.97 -1246299.67 6931
27 Edvardbreen 46.23 402432.72 -1295299.50 413325.29 -1280937.94 6931
32 Esmarkbreen 42.86 303651.27 -1266793.13 313962.33 -1255977.54 6931
154 Venernbreen 42.52 294349.03 -1267238.88 306668.98 -1257587.39 6931
25 Dunérbreen 40.50 325773.74 -1096690.68 334302.65 -1083441.70 6931
37 Fridtjovbreen 39.08 331355.82 -1318962.28 341964.07 -1307916.47 6931
0:58
Let me verify the output file exists and do a quick sanity check.
0:58
Bash
cd /work && head -5 svalbard_glaciers_top20.csv && echo "---" && wc -l svalbard_...
cd /work && head -5 svalbard_glaciers_top20.csv && echo "---" && wc -l svalbard_glaciers_top20.csv && echo "---" && python3 -c "
import pandas as pd
df = pd.read_csv('svalbard_glaciers_top20.csv')
print('Shape:', df.shape)
print('Columns:', df.columns.tolist())
print('CRS EPSG:', df['crs_epsg'].unique())
print('All names:', df['name'].tolist())
"
name,area_km2,bbox_minx_polar,bbox_miny_polar,bbox_maxx_polar,bbox_maxy_polar,crs_epsg Sørfonna,4335.83,408721.81,-1107462.31,511711.87,-1036927.31,6931 Vestfonna,2378.88,357790.57,-1081986.6,423181.18,-1016737.08,6931 Åsgardfonna,911.98,314043.06,-1141665.37,353268.42,-1087733.58,6931 Kvitøyjøkulen,623.62,574342.07,-945268.7,604942.48,-906782.78,6931 --- 21 svalbard_glaciers_top20.csv --- Shape: (20, 7) Columns: ['name', 'area_km2', 'bbox_minx_polar', 'bbox_miny_polar', 'bbox_maxx_polar', 'bbox_maxy_polar', 'crs_epsg'] CRS EPSG: [6931] All names: ['Sørfonna', 'Vestfonna', 'Åsgardfonna', 'Kvitøyjøkulen', 'Valhallfonna', 'Nordmannsfonna', 'Sveabreen', 'Gruvfonna', 'Veteranen', 'Himingbjørgfonna', 'Hellefonna', 'Heuglinbreen', 'Nordenskiöldbreen', 'Eidembreen', 'Isrosa', 'Edvardbreen', 'Esmarkbreen', 'Venernbreen', 'Dunérbreen', 'Fridtjovbreen']
1:05
Everything looks good. Let me summarize what I did: 1. Read the input GeoPackage with Svalbard glacier polygons (169 glaciers in WGS84 / EPSG:4326) 2. Reprojected to **EPSG:6931 — WGS 84 / NSIDC EASE-Grid 2.0 North**, which is a Lambert Azimuthal Equal-Area projection centred on the North Pole. This is the best choice for measuring true area at high latitudes (77–80°N) because equal-area projections preserve area measurements without distortion. 3. Computed area in km², extracted bounding boxes in projected metres, and sorted by area descending 4. Wrote the top 20 to CSV The coordinate magnitudes look correct — projected metres in the hundreds of thousands, which is typical for polar stereographic/ease-grid projections at these latitudes.
1:05