dc-l1-capetown-waterway-nulls

Status: done
Score: 59
Duration: 1:38
Cost: 0.39¢
Model: google/gemma-4-26b-a4b-it

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:30
Write /work/solve.py
content · 63 lines · py
import geopandas as gpd
import json

def clean_waterways(input_file, output_file):
    # Load the data
    gdf = gpd.read_file(input_file)
    
    original_count = len(gdf)
    
    # 1. Keep only LineString features
    # 2. Ensure geometry is not empty/null
    # Note: MultiLineString might be considered a "waterway" in some contexts, 
    # but the prompt specifically says "The output should contain only LineString features".
    
    mask = (gdf.geometry.type == 'LineString') & (gdf.geometry.is_valid) & (gdf.geometry.notnull())
    
    # Check if there are any other requirements for "proper type"
    # The prompt says "a feature needs both a drawable geometry and a proper type to be useful"
    # It doesn't specify what "proper type" means in terms of attributes, 
    # but it implies we should filter by the geometry type requested.
    
    cleaned_gdf = gdf[mask].copy()
    
    dropped_count = original_count - len(cleaned_gdf)
    
    # Convert to GeoJSON format manually to include the top-level dropped_count
    # Standard geopandas to_file doesn't allow adding top-level members easily outside the 'features' list
    
    # Get the features as a list of dicts
    features = []
    for _, row in cleaned_gdf.iterrows():
        # Create a feature dict
        # We need to handle the geometry properly
        feature = {
            "type": "Feature",
            "id": row.get("feature_id", None), # The prompt says feature_id is the key field
            "properties": row.drop("geometry").to_dict(),
            "geometry": json.loads(gpd.GeoSeries([row.geometry]).to_json())["features"][0]["geometry"]
        }
        # If feature_id exists in properties, it might be duplicated, but the prompt says 
        # "feature_id as the key field" which usually refers to the 'id' in GeoJSON
        if "feature_id" in feature["properties"]:
            feature["id"] = feature["properties"]["feature_id"]
            
        features.append(feature)

    # Construct the FeatureCollection
    feature_collection = {
        "type": "FeatureCollection",
        "dropped_count": dropped_count,
        "features": features
    }
    
    with open(output_file, 'w') as f:
        json.dump(feature_collection, f)
        
    print(f"Original: {original_count}")
    print(f"Cleaned: {len(cleaned_gdf)}")
    print(f"Dropped: {dropped_count}")

if __name__ == "__main__":
    clean_waterways('capetown_waterways.geojson', 'waterways_clean.geojson')
Wrote /work/solve.py (2479 chars).
0:32
Bash python solve.py
Original: 100
Cleaned: 90
Dropped: 10
/usr/local/lib/python3.14/site-packages/geopandas/geoseries.py:906: UserWarning: GeoSeries.notna() previously returned False for both missing (None) and empty geometries. Now, it only returns False for missing values. Since the calling GeoSeries contains empty geometries, the result has changed compared to previous versions of GeoPandas.
Given a GeoSeries 's', you can use '~s.is_empty & s.notna()' to get back the old behaviour.

To further ignore this warning, you can do: 
import warnings; warnings.filterwarnings('ignore', 'GeoSeries.notna', UserWarning)
  return self.notna()
1:10
Write /work/solve.py
content · 57 lines · py
import geopandas as gpd
import json

def clean_waterways(input_file, output_file):
    # Load the data
    gdf = gpd.read_file(input_file)
    
    original_count = len(gdf)
    
    # Filter for valid, non-empty LineStrings
    # We use ~gdf.geometry.is_empty to handle empty geometries correctly
    # and gdf.geometry.notna() for nulls
    mask = (gdf.geometry.type == 'LineString') & (~gdf.geometry.is_empty) & (gdf.geometry.notna())
    
    # Also check for valid geometries (not self-intersecting or other topological errors)
    # Note: LineStrings rarely have invalidity unless they are zero-length or have weirdness,
    # but is_valid is safe.
    mask = mask & gdf.geometry.is_valid
    
    cleaned_gdf = gdf[mask].copy()
    
    dropped_count = original_count - len(cleaned_gdf)
    
    # To build the FeatureCollection with a custom top-level member,
    # we'll use the standard GeoJSON structure.
    
    # We use a more robust way to get the JSON representation of the GeoDataFrame
    # and then inject the dropped_count.
    
    # Convert GeoDataFrame to GeoJSON dict
    # We use to_json() on the GeoDataFrame and parse it back to a dict
    geojson_str = cleaned_gdf.to_json()
    geojson_dict = json.loads(geojson_str)
    
    # The to_json() method doesn't necessarily set the 'id' field in the Feature 
    # level if it's just a column. The prompt says "feature_id as the key field".
    # In GeoJSON, 'id' is a top-level member of a Feature.
    
    # Let's ensure each feature has the 'id' field set to its 'feature_id' value.
    if 'feature_id' in cleaned_gdf.columns:
        for feature in geojson_dict['features']:
            # The id should be at the same level as 'type' and 'properties'
            feature['id'] = feature['properties'].get('feature_id')

    # Insert the dropped_count at the top level
    geojson_dict['dropped_count'] = dropped_count
    
    with open(output_file, 'w') as f:
        json.dump(geojson_dict, f)
        
    print(f"Original: {original_count}")
    print(f"Cleaned: {len(cleaned_gdf)}")
    print(f"Dropped: {dropped_count}")

if __name__ == "__main__":
    clean_waterways('capetown_waterways.geojson', 'waterways_clean.geojson')
Wrote /work/solve.py (2211 chars).
1:13
Bash python solve.py
Original: 100
Cleaned: 85
Dropped: 15
/work/solve.py:13: UserWarning: GeoSeries.notna() previously returned False for both missing (None) and empty geometries. Now, it only returns False for missing values. Since the calling GeoSeries contains empty geometries, the result has changed compared to previous versions of GeoPandas.
Given a GeoSeries 's', you can use '~s.is_empty & s.notna()' to get back the old behaviour.

To further ignore this warning, you can do: 
import warnings; warnings.filterwarnings('ignore', 'GeoSeries.notna', UserWarning)
  mask = (gdf.geometry.type == 'LineString') & (~gdf.geometry.is_empty) & (gdf.geometry.notna())
1:19
Bash head -n 20 waterways_clean.geojson
{"type": "FeatureCollection", "features": [{"id": 16, "type": "Feature", "properties": {"feature_id": 16, "name": "Steenbras Stream", "waterway_type": null}, "geometry": {"type": "LineString", "coordinates": [[18.675131, -34.097358], [18.644434, -34.095261], [18.593333, -34.054287]]}}, {"id": 17, "type": "Feature", "properties": {"feature_id": 17, "name": "Sir Lowry Stream", "waterway_type": null}, "geometry": {"type": "LineString", "coordinates": [[18.476831, -34.056422], [18.432213, -34.00126], [18.38696, -33.920017]]}}, {"id": 18, "type": "Feature", "properties": {"feature_id": 18, "name": "Constantia River", "waterway_type": null}, "geometry": {"type": "LineString", "coordinates": [[18.350029, -33.922963], [18.357716, -33.862693], [18.38548, -33.811815]]}}, {"id": 19, "type": "Feature", "properties": {"feature_id": 19, "name": "Klipfontein Stream", "waterway_type": null}, "geometry": {"type": "LineString", "coordinates": [[18.482936, -33.81301], [18.531519, -33.800031], [18.591089, -33.823751]]}}, {"id": 20, "type": "Feature", "properties": {"feature_id": 20, "name": "Plumstead Stream", "waterway_type": null}, "geometry": {"type": "LineString", "coordinates": [[18.678279, -33.822156], [18.695646, -33.867752], [18.698602, -33.945448]]}}, {"id": 21, "type": "Feature", "properties": {"feature_id": 21, "name": null, "waterway_type": "river"}, "geometry": {"type": "LineString", "coordinates": [[18.64611, -33.94245], [18.606483, -34.006979], [18.548438, -34.071103]]}}, {"id": 22, "type": "Feature", "properties": {"feature_id": 22, "name": null, "waterway_type": "drain"}, "geometry": {"type": "LineString", "coordinates": [[18.434177, -34.069308], [18.396375, -34.096669], [18.363484, -34.091471]]}}, {"id": 23, "type": "Feature", "properties": {"feature_id": 23, "name": null, "waterway_type": "canal"}, "geometry": {"type": "LineString", "coordinates": [[18.357053, -34.092439], [18.377185, -34.058844], [18.418269, -33.988844]]}}, {"id": 24, "type": "Feature", "properties": {"feature_id": 24, "name": null, "waterway_type": "ditch"}, "geometry": {"type": "LineString", "coordinates": [[18.529212, -33.991734], [18.577397, -33.92639], [18.631474, -33.852446]]}}, {"id": 25, "type": "Feature", "properties": {"feature_id": 25, "name": null, "waterway_type": "stream"}, "geometry": {"type": "LineString", "coordinates": [[18.69512, -33.854745], [18.699836, -33.814463], [18.68664, -33.800862]]}}, {"id": 26, "type": "Feature", "properties": {"feature_id": 26, "name": "Liesbeek Stream", "waterway_type": "river"}, "geometry": {"type": "LineString", "coordinates": [[18.608518, -33.800571], [18.562766, -33.820372], [18.501884, -33.878938]]}}, {"id": 27, "type": "Feature", "properties": {"feature_id": 27, "name": "Black River River", "waterway_type": "drain"}, "geometry": {"type": "LineString", "coordinates": [[18.397951, -33.876311], [18.36964, -33.938979], [18.351439, -34.018796]]}}, {"id": 28, "type": "Feature", "properties": {"feature_id": 28, "name": "Salt Stream", "waterway_type": "canal"}, "geometry": {"type": "LineString", "coordinates": [[18.375963, -34.016116], [18.407114, -34.067168], [18.458611, -34.098842]]}}, {"id": 29, "type": "Feature", "properties": {"feature_id": 29, "name": "Diep Stream", "waterway_type": "ditch"}, "geometry": {"type": "LineString", "coordinates": [[18.575191, -34.09844], [18.619566, -34.093491], [18.664324, -34.049485]]}}, {"id": 30, "type": "Feature", "properties": {"feature_id": 30, "name": "Eerste River", "waterway_type": "stream"}, "geometry": {"type": "LineString", "coordinates": [[18.699921, -34.05171], [18.691653, -33.995063], [18.663239, -33.913635]]}}, {"id": 31, "type": "Feature", "properties": {"feature_id": 31, "name": "Lourens Stream", "waterway_type": "river"}, "geometry": {"type": "LineString", "coordinates": [[18.565016, -33.916553], [18.516377, -33.857457], [18.456965, -33.809401]]}}, {"id": 32, "type": "Feature", "properties": {"feature_id": 32, "name": "Hout Bay Stream", "waterway_type": "drain"}, "geometry": {"type": "LineString", "coordinates": [[18.370716, -33.810475], [18.3539, -33.800308], [18.351676, -33.827404]]}}, {"id": 33, "type": "Feature", "properties": {"feature_id": 33, "name": "Disa River", "waterway_type": "canal"}, "geometry": {"type": "LineString", "coordinates": [[18.405419, -33.8257], [18.445387, -33.873302], [18.503651, -33.951992]]}}, {"id": 34, "type": "Feature", "properties": {"feature_id": 34, "name": "Sand Stream", "waterway_type": "ditch"}, "geometry": {"type": "LineString", "coordinates": [[18.617617, -33.948992], [18.655044, -34.012977], [18.687315, -34.074848]]}}, {"id": 35, "type": "Feature", "properties": {"feature_id": 35, "name": "Soet Stream", "waterway_type": "stream"}, "geometry": {"type": "LineString", "coordinates": [[18.692343, -34.07316], [18.671677, -34.0979], [18.630054, -34.089161]]}}, {"id": 36, "type": "Feature", "properties": {"feature_id": 36, "name": "Klein Liesbeek River", "waterway_type": "river"}, "geometry": {"type": "LineString", "coordinates": [[18.518682, -34.090253], [18.470597, -34.054239], [18.416862, -33.982488]]}}, {"id": 37, "type": "Feature", "properties": {"feature_id": 37, "name": "Kuils Stream", "waterway_type": "drain"}, "geometry": {"type": "LineString", "coordinates": [[18.354399, -33.98541], [18.350268, -33.919952], [18.364179, -33.847569]]}}, {"id": 38, "type": "Feature", "properties": {"feature_id": 38, "name": "Modder Stream", "waterway_type": "canal"}, "geometry": {"type": "LineString", "coordinates": [[18.443339, -33.849781], [18.489293, -33.811789], [18.550203, -33.801704]]}}, {"id": 39, "type": "Feature", "properties": {"feature_id": 39, "name": "Princess Vlei River", "waterway_type": "ditch"}, "geometry": {"type": "LineString", "coordinates": [[18.653489, -33.801283], [18.681318, -33.823787], [18.698818, -33.884768]]}}, {"id": 40, "type": "Feature", "properties": {"feature_id": 40, "name": "Riet Stream", "waterway_type": "stream"}, "geometry": {"type": "LineString", "coordinates": [[18.672923, -33.882079], [18.64132, -33.945514], [18.589435, -34.024544]]}}, {"id": 41, "type": "Feature", "properties": {"feature_id": 41, "name": "Schaapen Stream", "waterway_type": "river"}, "geometry": {"type": "LineString", "coordinates": [[18.472795, -34.021926], [18.428668, -34.071142], [18.384411, -34.099512]]}}, {"id": 42, "type": "Feature", "properties": {"feature_id": 42, "name": "Steenbras River", "waterway_type": "drain"}, "geometry": {"type": "LineString", "coordinates": [[18.350155, -34.09924], [18.359001, -34.091448], [18.388063, -34.044494]]}}, {"id": 43, "type": "Feature", "properties": {"feature_id": 43, "name": "Sir Lowry Stream", "waterway_type": "canal"}, "geometry": {"type": "LineString", "coordinates": [[18.487037, -34.046805], [18.535726, -33.98878], [18.59497, -33.907323]]}}, {"id": 44, "type": "Feature", "properties": {"feature_id": 44, "name": "Constantia Stream", "waterway_type": "ditch"}, "geometry": {"type": "LineString", "coordinates": [[18.680267, -33.910207], [18.69653, -33.852396], [18.698021, -33.807255]]}}, {"id": 45, "type": "Feature", "properties": {"feature_id": 45, "name": "Klipfontein River", "waterway_type": "stream"}, "geometry": {"type": "LineString", "coordinates": [[18.643034, -33.808206], [18.602732, -33.800869], [18.544256, -33.83129]]}}, {"id": 46, "type": "Feature", "properties": {"feature_id": 46, "name": "Plumstead Stream", "waterway_type": "river"}, "geometry": {"type": "LineString", "coordinates": [[18.430603, -33.82948], [18.393556, -33.878997], [18.36191, -33.958531]]}}, {"id": 47, "type": "Feature", "properties": {"feature_id": 47, "name": "Camps Bay Stream", "waterway_type": "drain"}, "geometry": {"type": "LineString", "coordinates": [[18.358285, -33.955535], [18.379483, -34.018855], [18.421638, -34.078355]]}}, {"id": 48, "type": "Feature", "properties": {"feature_id": 48, "name": "Bokramspruit River", "waterway_type": "canal"}, "geometry": {"type": "LineString", "coordinates": [[18.533422, -34.076777], [18.581401, -34.09885], [18.634786, -34.086587]]}}, {"id": 49, "type": "Feature", "properties": {"feature_id": 49, "name": "Mosselbank Stream", "waterway_type": "ditch"}, "geometry": {"type": "LineString", "coordinates": [[18.696058, -34.0878], [18.699603, -34.049435], [18.684979, -33.97607]]}}, {"id": 50, "type": "Feature", "properties": {"feature_id": 50, "name": "Skoolspruit Stream", "waterway_type": "stream"}, "geometry": {"type": "LineString", "coordinates": [[18.604792, -33.979019], [18.558642, -33.913571], [18.497715, -33.842887]]}}, {"id": 51, "type": "Feature", "properties": {"feature_id": 51, "name": "Vergenoegd River", "waterway_type": "river"}, "geometry": {"type": "LineString", "coordinates": [[18.395091, -33.845009], [18.367746, -33.809378], [18.35095, -33.802829]]}}, {"id": 52, "type": "Feature", "properties": {"feature_id": 52, "name": "Liesbeek Stream", "waterway_type": "drain"}, "geometry": {"type": "LineString", "coordinates": [[18.378214, -33.802278], [18.410262, -33.827442], [18.462528, -33.890721]]}}, {"id": 53, "type": "Feature", "properties": {"feature_id": 53, "name": "Black River Stream", "waterway_type": "canal"}, "geometry": {"type": "LineString", "coordinates": [[18.579211, -33.887977], [18.623083, -33.952058], [18.666833, -34.03015]]}}, {"id": 54, "type": "Feature", "properties": {"feature_id": 54, "name": "Salt River", "waterway_type": "ditch"}, "geometry": {"type": "LineString", "coordinates": [[18.699743, -34.027599], [18.69032, -34.074885], [18.660616, -34.099897]]}}, {"id": 55, "type": "Feature", "properties": {"feature_id": 55, "name": "Diep Stream", "waterway_type": "stream"}, "geometry": {"type": "LineString", "coordinates": [[18.560904, -34.099756], [18.512172, -34.089136], [18.453104, -34.039323]]}}, {"id": 56, "type": "Feature", "properties": {"feature_id": 56, "name": "Eerste Stream", "waterway_type": "river"}, "geometry": {"type": "LineString", "coordinates": [[18.368772, -34.041715], [18.353065, -33.982423], [18.352308, -33.901092]]}}, {"id": 57, "type": "Feature", "properties": {"feature_id": 57, "name": "Lourens River", "waterway_type": "drain"}, "geometry": {"type": "LineString", "coordinates": [[18.40853, -33.903937], [18.449161, -33.847521], [18.507838, -33.805381]]}}, {"id": 58, "type": "Feature", "properties": {"feature_id": 58, "name": "Hout Bay Stream", "waterway_type": "canal"}, "geometry": {"type": "LineString", "coordinates": [[18.621164, -33.806206], [18.657825, -33.801714], [18.688842, -33.835403]]}}, {"id": 59, "type": "Feature", "properties": {"feature_id": 59, "name": "Disa Stream", "waterway_type": "ditch"}, "geometry": {"type": "LineString", "coordinates": [[18.691062, -33.83349], [18.669337, -33.884828], [18.626655, -33.965055]]}}, {"id": 60, "type": "Feature", "properties": {"feature_id": 60, "name": "Sand River", "waterway_type": "stream"}, "geometry": {"type": "LineString", "coordinates": [[18.514474, -33.962067], [18.466609, -34.024602], [18.413581, -34.081619]]}}, {"id": 61, "type": "Feature", "properties": {"feature_id": 61, "name": "Soet Stream", "waterway_type": "river"}, "geometry": {"type": "LineString", "coordinates": [[18.35351, -34.080153], [18.350551, -34.099517], [18.365886, -34.083753]]}}, {"id": 62, "type": "Feature", "properties": {"feature_id": 62, "name": "Klein Liesbeek Stream", "waterway_type": "drain"}, "geometry": {"type": "LineString", "coordinates": [[18.447088, -34.085084], [18.493427, -34.044442], [18.554364, -33.969602]]}}, {"id": 63, "type": "Feature", "properties": {"feature_id": 63, "name": "Kuils River", "waterway_type": "canal"}, "geometry": {"type": "LineString", "coordinates": [[18.656311, -33.972572], [18.683167, -33.907259], [18.699257, -33.838409]]}}, {"id": 64, "type": "Feature", "properties": {"feature_id": 64, "name": "Modder Stream", "waterway_type": "ditch"}, "geometry": {"type": "LineString", "coordinates": [[18.670629, -33.840436], [18.638139, -33.807235], [18.5855, -33.804233]]}}, {"id": 65, "type": "Feature", "properties": {"feature_id": 65, "name": "Princess Vlei Stream", "waterway_type": "stream"}, "geometry": {"type": "LineString", "coordinates": [[18.46879, -33.803555], [18.425179, -33.831331], [18.381943, -33.896787]]}}, {"id": 66, "type": "Feature", "properties": {"feature_id": 66, "name": "Riet River", "waterway_type": "river"}, "geometry": {"type": "LineString", "coordinates": [[18.350383, -33.893993], [18.360383, -33.958598], [18.390725, -34.035604]]}}, {"id": 67, "type": "Feature", "properties": {"feature_id": 67, "name": "Schaapen Stream", "waterway_type": "drain"}, "geometry": {"type": "LineString", "coordinates": [[18.491161, -34.033124], [18.539928, -34.07839], [18.598811, -34.099997]]}}, {"id": 68, "type": "Feature", "properties": {"feature_id": 68, "name": "Steenbras Stream", "waterway_type": "canal"}, "geometry": {"type": "LineString", "coordinates": [[18.682166, -34.099986], [18.697315, -34.08656], [18.697339, -34.033982]]}}, {"id": 69, "type": "Feature", "properties": {"feature_id": 69, "name": "Sir Lowry River", "waterway_type": "ditch"}, "geometry": {"type": "LineString", "coordinates": [[18.63989, -34.036451], [18.598935, -33.976004], [18.540064, -33.894953]]}}, {"id": 70, "type": "Feature", "properties": {"feature_id": 70, "name": "Constantia Stream", "waterway_type": "stream"}, "geometry": {"type": "LineString", "coordinates": [[18.427083, -33.897755], [18.390813, -33.842841], [18.360429, -33.803782]]}}, {"id": 71, "type": "Feature", "properties": {"feature_id": 71, "name": "Klipfontein Stream", "waterway_type": "river"}, "geometry": {"type": "LineString", "coordinates": [[18.359614, -33.804481], [18.381865, -33.802842], [18.425067, -33.839733]]}}, {"id": 72, "type": "Feature", "properties": {"feature_id": 72, "name": "Plumstead River", "waterway_type": "drain"}, "geometry": {"type": "LineString", "coordinates": [[18.537628, -33.837721], [18.585372, -33.890782], [18.638035, -33.97155]]}}, {"id": 73, "type": "Feature", "properties": {"feature_id": 73, "name": "Camps Bay Stream", "waterway_type": "canal"}, "geometry": {"type": "LineString", "coordinates": [[18.696898, -33.968577], [18.699269, -34.030207], [18.683225, -34.084631]]}}, {"id": 74, "type": "Feature", "properties": {"feature_id": 74, "name": "Bokramspruit Stream", "waterway_type": "ditch"}, "geometry": {"type": "LineString", "coordinates": [[18.60102, -34.083282], [18.554499, -34.099899], [18.493562, -34.080664]]}}, {"id": 75, "type": "Feature", "properties": {"feature_id": 75, "name": "Mosselbank River", "waterway_type": "stream"}, "geometry": {"type": "LineString", "coordinates": [[18.392306, -34.082111], [18.365943, -34.039269], [18.350562, -33.963097]]}}, {"id": 76, "type": "Feature", "properties": {"feature_id": 76, "name": "Skoolspruit Stream", "waterway_type": "river"}, "geometry": {"type": "LineString", "coordinates": [[18.38055, -33.966083], [18.413476, -33.901029], [18.466481, -33.834144]]}}, {"id": 77, "type": "Feature", "properties": {"feature_id": 77, "name": "Vergenoegd Stream", "waterway_type": "drain"}, "geometry": {"type": "LineString", "coordinates": [[18.583201, -33.836072], [18.626544, -33.805364], [18.669259, -33.805916]]}}, {"id": 78, "type": "Feature", "properties": {"feature_id": 78, "name": "Liesbeek River", "waterway_type": "canal"}, "geometry": {"type": "LineString", "coordinates": [[18.699465, -33.80511], [18.68889, -33.835446], [18.657914, -33.902955]]}}, {"id": 79, "type": "Feature", "properties": {"feature_id": 79, "name": "Black River Stream", "waterway_type": "ditch"}, "geometry": {"type": "LineString", "coordinates": [[18.55677, -33.900116], [18.507975, -33.965121], [18.449284, -34.040895]]}}, {"id": 80, "type": "Feature", "properties": {"feature_id": 80, "name": "Salt Stream", "waterway_type": "stream"}, "geometry": {"type": "LineString", "coordinates": [[18.366919, -34.03849], [18.35233, -34.081651], [18.353039, -34.099811]]}}, {"id": 81, "type": "Feature", "properties": {"feature_id": 81, "name": "Diep River", "waterway_type": "river"}, "geometry": {"type": "LineString", "coordinates": [[18.411707, -34.099932], [18.452979, -34.083723], [18.512036, -34.028481]]}}, {"id": 82, "type": "Feature", "properties": {"feature_id": 82, "name": "Eerste Stream", "waterway_type": "drain"}, "geometry": {"type": "LineString", "coordinates": [[18.624656, -34.031022], [18.660529, -33.969536], [18.690275, -33.88892]]}}, {"id": 83, "type": "Feature", "properties": {"feature_id": 83, "name": "Lourens Stream", "waterway_type": "canal"}, "geometry": {"type": "LineString", "coordinates": [[18.689685, -33.891672], [18.666913, -33.838365], [18.623197, -33.802461]]}}, {"id": 84, "type": "Feature", "properties": {"feature_id": 84, "name": "Hout Bay River", "waterway_type": "ditch"}, "geometry": {"type": "LineString", "coordinates": [[18.510272, -33.803032], [18.462655, -33.804249], [18.410365, -33.844273]]}}, {"id": 85, "type": "Feature", "properties": {"feature_id": 85, "name": "Disa Stream", "waterway_type": "stream"}, "geometry": {"type": "LineString", "coordinates": [[18.35272, -33.842166], [18.350936, -33.896849], [18.367686, -33.978004]]}}, {"id": 86, "type": "Feature", "properties": {"feature_id": 86, "name": "Sand Stream", "waterway_type": "river"}, "geometry": {"type": "LineString", "coordinates": [[18.450883, -33.975051], [18.49758, -34.035659], [18.558508, -34.087388]]}}, {"id": 87, "type": "Feature", "properties": {"feature_id": 87, "name": "Soet River", "waterway_type": "drain"}, "geometry": {"type": "LineString", "coordinates": [[18.659058, -34.086157], [18.684924, -34.099996], [18.699594, -34.077327]]}}, {"id": 88, "type": "Feature", "properties": {"feature_id": 88, "name": "Klein Liesbeek Stream", "waterway_type": "canal"}, "geometry": {"type": "LineString", "coordinates": [[18.668251, -34.078887], [18.634893, -34.033927], [18.58153, -33.956568]]}}, {"id": 89, "type": "Feature", "properties": {"feature_id": 89, "name": "Kuils Stream", "waterway_type": "ditch"}, "geometry": {"type": "LineString", "coordinates": [[18.464817, -33.959563], [18.421748, -33.894891], [18.379559, -33.830098]]}}, {"id": 90, "type": "Feature", "properties": {"feature_id": 90, "name": "Modder River", "waterway_type": "stream"}, "geometry": {"type": "LineString", "coordinates": [[18.350713, -33.831925], [18.36186, -33.803767], [18.393466, -33.807872]]}}, {"id": 91, "type": "Feature", "properties": {"feature_id": 91, "name": "Princess Vlei Stream", "waterway_type": "river"}, "geometry": {"type": "LineString", "coordinates": [[18.495303, -33.806941], [18.544121, -33.839778], [18.602609, -33.909212]]}}, {"id": 92, "type": "Feature", "properties": {"feature_id": 92, "name": "Riet Stream", "waterway_type": "drain"}, "geometry": {"type": "LineString", "coordinates": [[18.683973, -33.906333], [18.698, -33.971616], [18.696557, -34.046013]]}}, {"id": 93, "type": "Feature", "properties": {"feature_id": 93, "name": "Schaapen River", "waterway_type": "canal"}, "geometry": {"type": "LineString", "coordinates": [[18.636679, -34.043689], [18.595096, -34.084661], [18.535863, -34.09934]]}}, {"id": 94, "type": "Feature", "properties": {"feature_id": 94, "name": "Steenbras Stream", "waterway_type": "ditch"}, "geometry": {"type": "LineString", "coordinates": [[18.42362, -34.099592], [18.388148, -34.080632], [18.359045, -34.022831]]}}, {"id": 95, "type": "Feature", "properties": {"feature_id": 95, "name": "Sir Lowry Stream", "waterway_type": "stream"}, "geometry": {"type": "LineString", "coordinates": [[18.361039, -34.025439], [18.38433, -33.963031], [18.428554, -33.883003]]}}, {"id": 96, "type": "Feature", "properties": {"feature_id": 96, "name": "Constantia River", "waterway_type": "river"}, "geometry": {"type": "LineString", "coordinates": [[18.541825, -33.8857], [18.589308, -33.834101], [18.641218, -33.801421]]}}, {"id": 97, "type": "Feature", "properties": {"feature_id": 97, "name": "Klipfontein Stream", "waterway_type": "drain"}, "geometry": {"type": "LineString", "coordinates": [[18.697637, -33.801863], [18.698834, -33.805934], [18.68138, -33.849015]]}}, {"id": 98, "type": "Feature", "properties": {"feature_id": 98, "name": "Plumstead Stream", "waterway_type": "canal"}, "geometry": {"type": "LineString", "coordinates": [[18.597204, -33.846817], [18.550338, -33.903018], [18.489427, -33.984405]]}}, {"id": 99, "type": "Feature", "properties": {"feature_id": 99, "name": "Camps Bay River", "waterway_type": "ditch"}, "geometry": {"type": "LineString", "coordinates": [[18.389598, -33.981478], [18.364233, -34.040948], [18.350275, -34.089883]]}}, {"id": 100, "type": "Feature", "properties": {"feature_id": 100, "name": "Bokramspruit Stream", "waterway_type": "stream"}, "geometry": {"type": "LineString", "coordinates": [[18.382969, -34.088772], [18.416754, -34.099808], [18.470467, -34.073747]]}}], "dropped_count": 15}
1:38