fio-l1-vienna-shapefile-recovery

Status: done
Score: 100
Duration: 0:50
Cost: 0.17¢
Model: deepseek/deepseek-v4-flash

Map (reference ← swipe → agent)

0:00
I'm migrating an old parcel shapefile (`parcels.shp`) into our web viewer, and a reference file `column_map.csv` is provided alongside it. Can you produce a clean GeoJSON `parcels.geojson` with the correct full column names and proper character encoding? The features should come through as Polygon or MultiPolygon.
0:00
System info
{
  "adapter": "openrouter",
  "model": "deepseek/deepseek-v4-flash",
  "base_url": "https://openrouter.ai/api/v1"
}
0:03
Let me start by examining the files in the working directory to understand what we're working with.
0:03
Bash ls -la /work/
total 56
drwxr-xr-x 1 agent agent   138 Jun 19 00:04 .
drwxr-xr-x 1 root  root     14 Jun 19 00:04 ..
-rw-r--r-- 1 agent agent   188 Jun 19 00:04 column_map.csv
-rw-r--r-- 1 agent agent     6 Jun 19 00:04 parcels.cpg
-rw-r--r-- 1 agent agent 25726 Jun 19 00:04 parcels.dbf
-rw-r--r-- 1 agent agent   457 Jun 19 00:04 parcels.prj
-rw-r--r-- 1 agent agent  8260 Jun 19 00:04 parcels.shp
-rw-r--r-- 1 agent agent   580 Jun 19 00:04 parcels.shx
0:07
Let's start by examining the column_map.csv and the shapefile structure.
0:07
Read /work/column_map.csv
     1	truncated,original
     2	KATASTRALG,KATASTRALGEMEINDE_NAME
     3	GRUNDSTUEC,GRUNDSTUECKSNUMMER
     4	EIGENTUEME,EIGENTUEMER_NAME
     5	WIDMUNG_BE,WIDMUNG_BEZEICHNUNG
     6	STRASSE_NA,STRASSE_NAME
     7	FLAECHE_M2,FLAECHE_M2
0:07
Bash python3 -c "
python3 -c "
import geopandas as gpd
gdf = gpd.read_file('/work/parcels.shp')
print('Columns:', list(gdf.columns))
print('CRS:', gdf.crs)
print('Num features:', len(gdf))
print('Geometry types:', gdf.geometry.type.value_counts().to_dict())
print()
print(gdf.head(2).to_string())
"
Columns: ['KATASTRALG', 'GRUNDSTUEC', 'EIGENTUEME', 'WIDMUNG_BE', 'STRASSE_NA', 'FLAECHE_M2', 'geometry']
CRS: EPSG:31287
Num features: 60
Geometry types: {'Polygon': 60}

     KATASTRALG GRUNDSTUEC                   EIGENTUEME  WIDMUNG_BE             STRASSE_NA  FLAECHE_M2                                                                               geometry
0  Innere Stadt     0013/1                  Müller GmbH  Wohngebiet     Mariahilfer Straße      750.00  POLYGON ((625700 483400, 625700 483425, 625730 483425, 625730 483400, 625700 483400))
1     Mariahilf     0020/2  Schönbrunner Bauges. m.b.H.  Wohngebiet  Döblinger Hauptstraße      751.25  POLYGON ((625732 483400, 625732 483425, 625762 483425, 625762 483400, 625732 483400))
0:13
Let me understand the task:

1. We have a shapefile `parcels.shp` with truncated column names (10 char limit for DBF)
2. We have a `column_map.csv` that maps truncated names to full names
3. I need to produce a clean `parcels.geojson` with:
   - Correct full column names (from the mapping)
   - Proper character encoding
   - Features as Polygon or MultiPolygon

The column_map.csv has:
- KATASTRALG -> KATASTRALGEMEINDE_NAME
- GRUNDSTUEC -> GRUNDSTUECKSNUMMER
- EIGENTUEME -> EIGENTUEMER_NAME
- WIDMUNG_BE -> WIDMUNG_BEZEICHNUNG
- STRASSE_NA -> STRASSE_NAME
- FLAECHE_M2 -> FLAECHE_M2 (stays same)

The CPG file says the encoding - let me check that.

Let me also check the .cpg file and .prj file.
0:13
Read /work/parcels.cpg
     1	CP1252
0:13
Read /work/parcels.prj
     1	PROJCS["MGI_Austria_Lambert",GEOGCS["GCS_MGI",DATUM["D_MGI",SPHEROID["Bessel_1841",6377397.155,299.1528128]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Lambert_Conformal_Conic"],PARAMETER["False_Easting",400000.0],PARAMETER["False_Northing",400000.0],PARAMETER["Central_Meridian",13.3333333333333],PARAMETER["Standard_Parallel_1",49.0],PARAMETER["Standard_Parallel_2",46.0],PARAMETER["Latitude_Of_Origin",47.5],UNIT["Meter",1.0]]
0:22
Now I understand the full picture:

1. The shapefile has truncated 10-char column names: `KATASTRALG`, `GRUNDSTUEC`, `EIGENTUEME`, `WIDMUNG_BE`, `STRASSE_NA`, `FLAECHE_M2`
2. The `column_map.csv` maps them to full names:
   - `KATASTRALG` → `KATASTRALGEMEINDE_NAME`
   - `GRUNDSTUEC` → `GRUNDSTUECKSNUMMER`
   - `EIGENTUEME` → `EIGENTUEMER_NAME`
   - `WIDMUNG_BE` → `WIDMUNG_BEZEICHNUNG`
   - `STRASSE_NA` → `STRASSE_NAME`
   - `FLAECHE_M2` → `FLAECHE_M2`
3. The CPG file says CP1252 encoding - so I need to properly handle encoding (read the dbf with CP1252 encoding).
4. CRS is EPSG:31287 (MGI / Austria Lambert).
5. All geometries are Polygons.

Let me write a script that:
1. Reads the shapefile with proper encoding (CP1252)
2. Renames columns based on the map
3. Writes out a clean GeoJSON file (WGS84 is typical for web viewers, but let me check - should I reproject to WGS84? For a web viewer, usually yes. But the user didn't explicitly ask. However, GeoJSON typically uses WGS84 (EPSG:4326) by the spec. Let me reproject to WGS84.)

Actually, GeoJSON standard (RFC 7946) requires coordinates in WGS84 (EPSG:4326). So I should reproject.

Let me write the script.
0:22
0:22
Write /work/solve.py
content · 32 lines · py
#!/usr/bin/env python3
"""Convert parcels.shp to parcels.geojson with full column names and proper encoding."""

import geopandas as gpd
import pandas as pd

# 1. Read column mapping
col_map = pd.read_csv('/work/column_map.csv', encoding='utf-8')
rename_dict = dict(zip(col_map['truncated'], col_map['original']))
print("Rename mapping:", rename_dict)

# 2. Read shapefile with proper CP1252 encoding for the DBF
gdf = gpd.read_file('/work/parcels.shp', encoding='CP1252')

# 3. Rename columns (only those present in the mapping)
gdf = gdf.rename(columns=rename_dict)
print("Renamed columns:", list(gdf.columns))

# 4. Reproject to WGS84 (EPSG:4326) for valid GeoJSON
if gdf.crs and gdf.crs.to_epsg() != 4326:
    gdf = gdf.to_crs(epsg=4326)
    print("Reprojected to EPSG:4326")

# 5. Write GeoJSON with proper formatting
#    RFC 7946 spec: use WGS84, no Z coordinates, etc.
gdf.to_file('/work/parcels.geojson', driver='GeoJSON', encoding='utf-8')

# Quick verification
verify = gpd.read_file('/work/parcels.geojson')
print(f"\nVerification: {len(verify)} features, CRS: {verify.crs}")
print("Columns:", list(verify.columns))
print(verify.head(2).to_string())
Wrote /work/solve.py (1161 chars).
0:32
Let me run the script now.
0:32
Bash cd /work && python solve.py
Rename mapping: {'KATASTRALG': 'KATASTRALGEMEINDE_NAME', 'GRUNDSTUEC': 'GRUNDSTUECKSNUMMER', 'EIGENTUEME': 'EIGENTUEMER_NAME', 'WIDMUNG_BE': 'WIDMUNG_BEZEICHNUNG', 'STRASSE_NA': 'STRASSE_NAME', 'FLAECHE_M2': 'FLAECHE_M2'}
Renamed columns: ['KATASTRALGEMEINDE_NAME', 'GRUNDSTUECKSNUMMER', 'EIGENTUEMER_NAME', 'WIDMUNG_BEZEICHNUNG', 'STRASSE_NAME', 'FLAECHE_M2', 'geometry']
Reprojected to EPSG:4326

Verification: 60 features, CRS: EPSG:4326
Columns: ['KATASTRALGEMEINDE_NAME', 'GRUNDSTUECKSNUMMER', 'EIGENTUEMER_NAME', 'WIDMUNG_BEZEICHNUNG', 'STRASSE_NAME', 'FLAECHE_M2', 'geometry']
  KATASTRALGEMEINDE_NAME GRUNDSTUECKSNUMMER             EIGENTUEMER_NAME WIDMUNG_BEZEICHNUNG           STRASSE_NAME  FLAECHE_M2                                                                                                   geometry
0           Innere Stadt             0013/1                  Müller GmbH          Wohngebiet     Mariahilfer Straße      750.00  POLYGON ((16.37091 48.21019, 16.37092 48.21042, 16.37133 48.21041, 16.37131 48.21018, 16.37091 48.21019))
1              Mariahilf             0020/2  Schönbrunner Bauges. m.b.H.          Wohngebiet  Döblinger Hauptstraße      751.25   POLYGON ((16.37134 48.21018, 16.37135 48.2104, 16.37176 48.21039, 16.37174 48.21017, 16.37134 48.21018))
0:38
The GeoJSON has been produced successfully. Let me also check the content to make sure it looks correct.
0:38
Bash head -30 /work/parcels.geojson
{
"type": "FeatureCollection",
"name": "parcels",
"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } },
"features": [
{ "type": "Feature", "properties": { "KATASTRALGEMEINDE_NAME": "Innere Stadt", "GRUNDSTUECKSNUMMER": "0013/1", "EIGENTUEMER_NAME": "Müller GmbH", "WIDMUNG_BEZEICHNUNG": "Wohngebiet", "STRASSE_NAME": "Mariahilfer Straße", "FLAECHE_M2": 750.0 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 16.37090842626786, 48.210191277387686 ], [ 16.370921563632866, 48.210415996173097 ], [ 16.371325013587484, 48.210405458345434 ], [ 16.37131187447951, 48.210180739604695 ], [ 16.37090842626786, 48.210191277387686 ] ] ] } },
{ "type": "Feature", "properties": { "KATASTRALGEMEINDE_NAME": "Mariahilf", "GRUNDSTUECKSNUMMER": "0020/2", "EIGENTUEMER_NAME": "Schönbrunner Bauges. m.b.H.", "WIDMUNG_BEZEICHNUNG": "Wohngebiet", "STRASSE_NAME": "Döblinger Hauptstraße", "FLAECHE_M2": 751.25 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 16.371338771021136, 48.210180037036046 ], [ 16.371351910245306, 48.210404755773823 ], [ 16.371755360025311, 48.210394216452642 ], [ 16.371742219058159, 48.21016949775953 ], [ 16.371338771021136, 48.210180037036046 ] ] ] } },
{ "type": "Feature", "properties": { "KATASTRALGEMEINDE_NAME": "Währing", "GRUNDSTUECKSNUMMER": "0027/3", "EIGENTUEMER_NAME": "Müller GmbH", "WIDMUNG_BEZEICHNUNG": "Wohngebiet", "STRASSE_NAME": "Währinger Gürtel", "FLAECHE_M2": 752.5 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 16.371769115588148, 48.210168795091327 ], [ 16.371782256671491, 48.210393513781433 ], [ 16.372185706276849, 48.210382972966748 ], [ 16.372172563450533, 48.210158254321314 ], [ 16.371769115588148, 48.210168795091327 ] ] ] } },
{ "type": "Feature", "properties": { "KATASTRALGEMEINDE_NAME": "Döbling", "GRUNDSTUECKSNUMMER": "0034/4", "EIGENTUEMER_NAME": "Schönbrunner Bauges. m.b.H.", "WIDMUNG_BEZEICHNUNG": "Wohngebiet", "STRASSE_NAME": "Höfergasse", "FLAECHE_M2": 753.75 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 16.372199459968876, 48.210157551553507 ], [ 16.372212602911379, 48.210382270195986 ], [ 16.372616052342067, 48.210371727887782 ], [ 16.372602907656596, 48.210147009289997 ], [ 16.372199459968876, 48.210157551553507 ] ] ] } },
{ "type": "Feature", "properties": { "KATASTRALGEMEINDE_NAME": "Hütteldorf", "GRUNDSTUECKSNUMMER": "0041/5", "EIGENTUEMER_NAME": "Müller GmbH", "WIDMUNG_BEZEICHNUNG": "Wohngebiet", "STRASSE_NAME": "Schönbrunner Allee", "FLAECHE_M2": 755.0 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 16.372629804163282, 48.210146306422644 ], [ 16.372642948964963, 48.210371025017459 ], [ 16.373046398220957, 48.210360481215737 ], [ 16.373033251676318, 48.210135762665601 ], [ 16.372629804163282, 48.210146306422644 ] ] ] } },
{ "type": "Feature", "properties": { "KATASTRALGEMEINDE_NAME": "Floridsdorf", "GRUNDSTUECKSNUMMER": "0048/6", "EIGENTUEMER_NAME": "Schönbrunner Bauges. m.b.H.", "WIDMUNG_BEZEICHNUNG": "Wohngebiet", "STRASSE_NAME": "Bäckerstraße", "FLAECHE_M2": 750.0 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 16.373060148171362, 48.210135059698686 ], [ 16.373073294832199, 48.210359778245838 ], [ 16.373476743913471, 48.210349232950598 ], [ 16.373463595509669, 48.21012451444814 ], [ 16.373060148171362, 48.210135059698686 ] ] ] } },
{ "type": "Feature", "properties": { "KATASTRALGEMEINDE_NAME": "Brigittenau", "GRUNDSTUECKSNUMMER": "0055/7", "EIGENTUEMER_NAME": "Müller GmbH", "WIDMUNG_BEZEICHNUNG": "Wohngebiet", "STRASSE_NAME": "Naschmarkt", "FLAECHE_M2": 751.25 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 16.373490491993067, 48.210123811381656 ], [ 16.373503640513064, 48.210348529881138 ], [ 16.3739070894196, 48.210337983092401 ], [ 16.373893939156641, 48.210113264637606 ], [ 16.373490491993067, 48.210123811381656 ] ] ] } },
{ "type": "Feature", "properties": { "KATASTRALGEMEINDE_NAME": "Schönbrunn", "GRUNDSTUECKSNUMMER": "0062/8", "EIGENTUEMER_NAME": "Schönbrunner Bauges. m.b.H.", "WIDMUNG_BEZEICHNUNG": "Wohngebiet", "STRASSE_NAME": "Mariahilfer Straße", "FLAECHE_M2": 752.5 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 16.373920835628383, 48.210112561471547 ], [ 16.373933986007543, 48.210337279923358 ], [ 16.374337434739303, 48.210326731641089 ], [ 16.374324282617192, 48.210102013233964 ], [ 16.373920835628383, 48.210112561471547 ] ] ] } },
{ "type": "Feature", "properties": { "KATASTRALGEMEINDE_NAME": "Innere Stadt", "GRUNDSTUECKSNUMMER": "0069/9", "EIGENTUEMER_NAME": "Müller GmbH", "WIDMUNG_BEZEICHNUNG": "Wohngebiet", "STRASSE_NAME": "Döblinger Hauptstraße", "FLAECHE_M2": 753.75 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 16.374351179077287, 48.210101309968366 ], [ 16.374364331315594, 48.210326028372499 ], [ 16.374767779872563, 48.210315478596712 ], [ 16.374754625891303, 48.210090760237293 ], [ 16.374351179077287, 48.210101309968366 ] ] ] } },
{ "type": "Feature", "properties": { "KATASTRALGEMEINDE_NAME": "Mariahilf", "GRUNDSTUECKSNUMMER": "0076/1", "EIGENTUEMER_NAME": "Schönbrunner Bauges. m.b.H.", "WIDMUNG_BEZEICHNUNG": "Wohngebiet", "STRASSE_NAME": "Währinger Gürtel", "FLAECHE_M2": 755.0 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 16.374781522339742, 48.210090056872112 ], [ 16.374794676437205, 48.210314775228547 ], [ 16.375198124819356, 48.210304223959263 ], [ 16.375184968978939, 48.210079505647535 ], [ 16.374781522339742, 48.210090056872112 ] ] ] } },
{ "type": "Feature", "properties": { "KATASTRALGEMEINDE_NAME": "Währing", "GRUNDSTUECKSNUMMER": "0083/2", "EIGENTUEMER_NAME": "Müller GmbH", "WIDMUNG_BEZEICHNUNG": "Wohngebiet", "STRASSE_NAME": "Höfergasse", "FLAECHE_M2": 750.0 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 16.37092933879655, 48.210433798055966 ], [ 16.370942476313367, 48.210658516817759 ], [ 16.37134592814769, 48.210647978918551 ], [ 16.371332788887887, 48.210423260201395 ], [ 16.37092933879655, 48.210433798055966 ] ] ] } },
{ "type": "Feature", "properties": { "KATASTRALGEMEINDE_NAME": "Döbling", "GRUNDSTUECKSNUMMER": "0090/3", "EIGENTUEMER_NAME": "Schönbrunner Bauges. m.b.H.", "WIDMUNG_BEZEICHNUNG": "Wohngebiet", "STRASSE_NAME": "Schönbrunner Allee", "FLAECHE_M2": 751.25 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 16.371359685554822, 48.210422557627979 ], [ 16.371372824930827, 48.210647276342151 ], [ 16.371776276590531, 48.210636736949418 ], [ 16.371763135471532, 48.210412018279897 ], [ 16.371359685554822, 48.210422557627979 ] ] ] } },
{ "type": "Feature", "properties": { "KATASTRALGEMEINDE_NAME": "Hütteldorf", "GRUNDSTUECKSNUMMER": "0097/4", "EIGENTUEMER_NAME": "Müller GmbH", "WIDMUNG_BEZEICHNUNG": "Wohngebiet", "STRASSE_NAME": "Bäckerstraße", "FLAECHE_M2": 752.5 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 16.371790032126821, 48.210411315606898 ], [ 16.371803173362018, 48.210636034273428 ], [ 16.372206624847074, 48.210625493387155 ], [ 16.372193481868891, 48.210400774765311 ], [ 16.371790032126821, 48.210411315606898 ] ] ] } },
{ "type": "Feature", "properties": { "KATASTRALGEMEINDE_NAME": "Floridsdorf", "GRUNDSTUECKSNUMMER": "0104/5", "EIGENTUEMER_NAME": "Schönbrunner Bauges. m.b.H.", "WIDMUNG_BEZEICHNUNG": "Wohngebiet", "STRASSE_NAME": "Naschmarkt", "FLAECHE_M2": 753.75 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 16.372220378512541, 48.210400071992744 ], [ 16.372233521606912, 48.210624790611625 ], [ 16.372636972917295, 48.210614248231828 ], [ 16.372623828079931, 48.210389529657633 ], [ 16.372220378512541, 48.210400071992744 ] ] ] } },
{ "type": "Feature", "properties": { "KATASTRALGEMEINDE_NAME": "Brigittenau", "GRUNDSTUECKSNUMMER": "0111/6", "EIGENTUEMER_NAME": "Müller GmbH", "WIDMUNG_BEZEICHNUNG": "Wohngebiet", "STRASSE_NAME": "Mariahilfer Straße", "FLAECHE_M2": 755.0 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 16.372650724711942, 48.210388826785518 ], [ 16.372663869665498, 48.210613545356715 ], [ 16.373067320801184, 48.21060300148342 ], [ 16.373054174104642, 48.210378282956881 ], [ 16.372650724711942, 48.210388826785518 ] ] ] } },
{ "type": "Feature", "properties": { "KATASTRALGEMEINDE_NAME": "Schönbrunn", "GRUNDSTUECKSNUMMER": "0118/7", "EIGENTUEMER_NAME": "Schönbrunner Bauges. m.b.H.", "WIDMUNG_BEZEICHNUNG": "Wohngebiet", "STRASSE_NAME": "Döblinger Hauptstraße", "FLAECHE_M2": 750.0 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 16.373081070725004, 48.210377579985177 ], [ 16.373094217537734, 48.210602298508746 ], [ 16.373497668498693, 48.210591753141898 ], [ 16.373484519942977, 48.210367034663037 ], [ 16.373081070725004, 48.210377579985177 ] ] ] } },
{ "type": "Feature", "properties": { "KATASTRALGEMEINDE_NAME": "Innere Stadt", "GRUNDSTUECKSNUMMER": "0125/8", "EIGENTUEMER_NAME": "Müller GmbH", "WIDMUNG_BEZEICHNUNG": "Wohngebiet", "STRASSE_NAME": "Währinger Gürtel", "FLAECHE_M2": 751.25 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 16.373511416551686, 48.210366331591764 ], [ 16.373524565223605, 48.210591050067663 ], [ 16.37392801600982, 48.210580503207318 ], [ 16.373914865594926, 48.210355784776112 ], [ 16.373511416551686, 48.210366331591764 ] ] ] } },
{ "type": "Feature", "properties": { "KATASTRALGEMEINDE_NAME": "Mariahilf", "GRUNDSTUECKSNUMMER": "0132/9", "EIGENTUEMER_NAME": "Schönbrunner Bauges. m.b.H.", "WIDMUNG_BEZEICHNUNG": "Wohngebiet", "STRASSE_NAME": "Höfergasse", "FLAECHE_M2": 752.5 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 16.373941762191979, 48.210355081605286 ], [ 16.373954912723072, 48.2105798000335 ], [ 16.374358363334519, 48.210569251679608 ], [ 16.374345211060454, 48.210344533296137 ], [ 16.373941762191979, 48.210355081605286 ] ] ] } },
{ "type": "Feature", "properties": { "KATASTRALGEMEINDE_NAME": "Währing", "GRUNDSTUECKSNUMMER": "0139/1", "EIGENTUEMER_NAME": "Müller GmbH", "WIDMUNG_BEZEICHNUNG": "Wohngebiet", "STRASSE_NAME": "Schönbrunner Allee", "FLAECHE_M2": 753.75 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 16.374372107645854, 48.210343830025714 ], [ 16.374385260036121, 48.210568548406236 ], [ 16.374788710472767, 48.210557998558855 ], [ 16.374775556339536, 48.210333280223047 ], [ 16.374372107645854, 48.210343830025714 ] ] ] } },
{ "type": "Feature", "properties": { "KATASTRALGEMEINDE_NAME": "Döbling", "GRUNDSTUECKSNUMMER": "0146/2", "EIGENTUEMER_NAME": "Schönbrunner Bauges. m.b.H.", "WIDMUNG_BEZEICHNUNG": "Wohngebiet", "STRASSE_NAME": "Bäckerstraße", "FLAECHE_M2": 755.0 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 16.374802452913286, 48.210332576853084 ], [ 16.37481560716272, 48.210557295185914 ], [ 16.375219057424541, 48.210546743844986 ], [ 16.375205901432142, 48.210322025556884 ], [ 16.374802452913286, 48.210332576853084 ] ] ] } },
{ "type": "Feature", "properties": { "KATASTRALGEMEINDE_NAME": "Hütteldorf", "GRUNDSTUECKSNUMMER": "0153/3", "EIGENTUEMER_NAME": "Müller GmbH", "WIDMUNG_BEZEICHNUNG": "Wohngebiet", "STRASSE_NAME": "Naschmarkt", "FLAECHE_M2": 750.0 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 16.370950251520533, 48.210676318697566 ], [ 16.370963389189161, 48.210901037435747 ], [ 16.371366842903203, 48.210890499464952 ], [ 16.371353703491561, 48.210665780771436 ], [ 16.370950251520533, 48.210676318697566 ] ] ] } },
{ "type": "Feature", "properties": { "KATASTRALGEMEINDE_NAME": "Floridsdorf", "GRUNDSTUECKSNUMMER": "0160/4", "EIGENTUEMER_NAME": "Schönbrunner Bauges. m.b.H.", "WIDMUNG_BEZEICHNUNG": "Wohngebiet", "STRASSE_NAME": "Mariahilfer Straße", "FLAECHE_M2": 751.25 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 16.371380600283807, 48.210665078193252 ], [ 16.371393739811658, 48.210889796883784 ], [ 16.371797193351068, 48.210879257419457 ], [ 16.371784052080223, 48.210654538773582 ], [ 16.371380600283807, 48.210665078193252 ] ] ] } },
{ "type": "Feature", "properties": { "KATASTRALGEMEINDE_NAME": "Brigittenau", "GRUNDSTUECKSNUMMER": "0167/5", "EIGENTUEMER_NAME": "Müller GmbH", "WIDMUNG_BEZEICHNUNG": "Wohngebiet", "STRASSE_NAME": "Döblinger Hauptstraße", "FLAECHE_M2": 752.5 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 16.371810948860826, 48.21065383609583 ], [ 16.37182409024787, 48.210878554738713 ], [ 16.372227543612635, 48.210868013780875 ], [ 16.372214400482587, 48.210643295182635 ], [ 16.371810948860826, 48.21065383609583 ] ] ] } },
{ "type": "Feature", "properties": { "KATASTRALGEMEINDE_NAME": "Schönbrunn", "GRUNDSTUECKSNUMMER": "0174/6", "EIGENTUEMER_NAME": "Schönbrunner Bauges. m.b.H.", "WIDMUNG_BEZEICHNUNG": "Wohngebiet", "STRASSE_NAME": "Währinger Gürtel", "FLAECHE_M2": 753.75 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 16.372241297251556, 48.210642592405307 ], [ 16.372254440497795, 48.210867311000548 ], [ 16.372657893687883, 48.210856768549164 ], [ 16.372644748698644, 48.210632049998615 ], [ 16.372241297251556, 48.210642592405307 ] ] ] } },
{ "type": "Feature", "properties": { "KATASTRALGEMEINDE_NAME": "Innere Stadt", "GRUNDSTUECKSNUMMER": "0181/7", "EIGENTUEMER_NAME": "Müller GmbH", "WIDMUNG_BEZEICHNUNG": "Wohngebiet", "STRASSE_NAME": "Höfergasse", "FLAECHE_M2": 755.0 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 16.372671645455959, 48.210631347121705 ], [ 16.372684790561401, 48.210856065669297 ], [ 16.373088243576792, 48.210845521724401 ], [ 16.37307509672835, 48.210620803221474 ], [ 16.372671645455959, 48.210631347121705 ] ] ] } },
0:42
The GeoJSON has been created. Let me verify it's valid and check the geometry types.
0:42
Bash python3 -c "
python3 -c "
import json
with open('/work/parcels.geojson', 'r') as f:
    data = json.load(f)
print('Type:', data['type'])
print('Features count:', len(data['features']))
# Check geometry types
from collections import Counter
types = Counter(f['geometry']['type'] for f in data['features'])
print('Geometry types:', dict(types))
# Check CRS
if 'crs' in data:
    print('CRS:', data['crs'])
# Check all property keys
props = data['features'][0]['properties']
print('Properties:', list(props.keys()))
"
Type: FeatureCollection
Features count: 60
Geometry types: {'Polygon': 60}
CRS: {'type': 'name', 'properties': {'name': 'urn:ogc:def:crs:OGC:1.3:CRS84'}}
Properties: ['KATASTRALGEMEINDE_NAME', 'GRUNDSTUECKSNUMMER', 'EIGENTUEMER_NAME', 'WIDMUNG_BEZEICHNUNG', 'STRASSE_NAME', 'FLAECHE_M2']
0:48
Everything looks good. Let me verify:

1. ✅ Column names are renamed properly (matching the column_map.csv)
2. ✅ All 60 features are present
3. ✅ Geometry is Polygon (all 60 features are Polygon type)
4. ✅ CRS is WGS84 (EPSG:4326) which is proper for GeoJSON
5. ✅ UTF-8 encoding
6. ✅ German characters (Müller, Schönbrunner, Döblinger, etc.) are preserved

The GeoJSON is clean and ready for the web viewer.
0:48