dc-l1-capetown-waterway-nulls
Map (reference ← swipe → agent)
0:00
Hi, first time asking for help with this. The contractor delivered capetown_waterways.geojson but some features are unusable for our mapping pipeline. Drop any features that cannot represent a valid, usable waterway (a feature needs both a drawable geometry and a proper type to be useful) and keep the rest. I'd also like a top-level dropped_count so I can show my supervisor what we're flagging back at the contractor. Filename waterways_clean.geojson, please.
The output should contain only LineString features, each preserving all original columns, with feature_id as the key field. The FeatureCollection must include a top-level dropped_count foreign member (an integer) reporting how many features were removed.
0:00
System info
{
"adapter": "openrouter",
"model": "google/gemma-4-26b-a4b-it",
"base_url": "https://openrouter.ai/api/v1"
}
0:02
Bash
ls -F
capetown_waterways.geojson
0:04
Bash
head -n 20 capetown_waterways.geojson
{
"type": "FeatureCollection",
"name": "capetown_waterways",
"crs": {
"type": "name",
"properties": {
"name": "urn:ogc:def:crs:OGC:1.3:CRS84"
}
},
"features": [
{
"type": "Feature",
"geometry": null,
"properties": {
"feature_id": 1,
"name": "Black River Stream",
"waterway_type": "river"
}
},
{
0:47
Write
/work/solve.py
content · 67 lines · py
import json
import geopandas as gpd
from shapely.geometry import LineString
def clean_waterways(input_file, output_file):
# Read the geojson file
# Using standard json load first to handle the 'dropped_count' requirement easily
# since it's a top-level member, not a standard GeoJSON feature property.
with open(input_file, 'r') as f:
data = json.load(f)
original_features = data.get('features', [])
original_count = len(original_features)
valid_features = []
for feature in original_features:
geom = feature.get('geometry')
props = feature.get('properties', {})
# Criteria:
# 1. Must have geometry
# 2. Geometry must be LineString
# 3. Must have a 'waterway_type' (as implied by 'proper type to be useful')
# Actually, the prompt says "a proper type to be useful".
# Let's check if 'waterway_type' exists and is not null/empty.
is_valid = True
# Check geometry
if geom is None:
is_valid = False
elif geom.get('type') != 'LineString':
is_valid = False
# Check type property (assuming 'waterway_type' is the key)
# Or just check if any type property exists?
# Usually in OSM-like data it's 'waterway' or 'waterway_type'.
# Let's look at the sample again. It has 'waterway_type'.
if is_valid:
if not props.get('waterway_type'):
is_valid = False
if is_valid:
valid_features.append(feature)
dropped_count = original_count - len(valid_features)
# Construct the new FeatureCollection
new_data = {
"type": "FeatureCollection",
"name": data.get("name", "waterways_clean"),
"crs": data.get("crs"),
"features": valid_features,
"dropped_count": dropped_count
}
with open(output_file, 'w') as f:
json.dump(new_data, f, indent=2)
print(f"Processed {original_count} features.")
print(f"Dropped {dropped_count} features.")
print(f"Saved {len(valid_features)} features to {output_file}")
if __name__ == "__main__":
clean_waterways('capetown_waterways.geojson', 'waterways_clean.geojson')
Wrote /work/solve.py (2287 chars).
0:52
Bash
python solve.py
Processed 100 features. Dropped 15 features. Saved 85 features to waterways_clean.geojson
0:55
Bash
head -n 30 waterways_clean.geojson
{
"type": "FeatureCollection",
"name": "capetown_waterways",
"crs": {
"type": "name",
"properties": {
"name": "urn:ogc:def:crs:OGC:1.3:CRS84"
}
},
"features": [
{
"type": "Feature",
"geometry": {
"type": "LineString",
"coordinates": []
},
"properties": {
"feature_id": 6,
"name": "Hout Bay River",
"waterway_type": "river"
}
},
{
"type": "Feature",
"geometry": {
"type": "LineString",
"coordinates": []
},
"properties": {
"feature_id": 7,
1:02
Bash
python -c "import json; data = json.load(open('waterways_clean.geojson')); print...
File "<string>", line 1
import json; data = json.load(open('waterways_clean.geojson')); print(f'Type: {data["type"]}'); print(f'Dropped: {data["dropped_count"]}'); print(f'Features: {len(data["features"])}; print(f'First geom type: {data["features"][0]["geometry"]["type"]}')
^
SyntaxError: unterminated string literal (detected at line 1)
1:10
Bash
python -c "import json; data = json.load(open('waterways_clean.geojson')); print...
File "<string>", line 1
import json; data = json.load(open('waterways_clean.geojson')); print(f'Type: {data["type"]}'); print(f'Dropped: {data["dropped_count"]}'); print(f'Features: {len(data["features"])'); print(f'First geom type: {data["features"][0]["geometry"]["type"]}')
^
SyntaxError: closing parenthesis ')' does not match opening parenthesis '{'
1:14
Bash
python -c "import json; data = json.load(open('waterways_clean.geojson')); print...
Type: FeatureCollection Dropped: 15 Features: 85 First geom type: LineString
1:24