72 lines
2.3 KiB
Python
72 lines
2.3 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
geopandasconvert_fixed.py
|
|
BoopLabs Pupmap Europe/Nordics GeoJSON generator
|
|
Version: 2025-10-03
|
|
"""
|
|
|
|
import geopandas as gpd
|
|
|
|
# ---------- User paths ----------
|
|
cities_shp = "ne_10m_populated_places.shp"
|
|
roads_shp = "ne_10m_roads.shp"
|
|
output_dir = "/mnt/storage/docker-data/pupmap/www/data/sources/"
|
|
|
|
# ---------- Europe + Nordics filter ----------
|
|
europe_nordics = [
|
|
'ALB','AND','AUT','BEL','BIH','BGR','HRV','CYP','CZE','DNK','EST','FIN','FRA','DEU',
|
|
'GRC','HUN','ISL','IRL','ITA','LVA','LTU','LUX','MLT','MDA','MCO','MNE','NLD','NOR',
|
|
'POL','PRT','ROU','RUS','SMR','SRB','SVK','SVN','ESP','SWE','CHE','UKR','GBR','VAT'
|
|
]
|
|
|
|
# ---------- Convert cities ----------
|
|
print("Processing cities...")
|
|
|
|
cities = gpd.read_file(cities_shp)
|
|
|
|
# Keep only Europe/Nordics
|
|
cities_filtered = cities[cities['ADM0_A3'].isin(europe_nordics)].copy()
|
|
|
|
# Ensure expected properties exist
|
|
cities_filtered = cities_filtered.rename(columns={
|
|
'NAME': 'name',
|
|
'ADM0NAME': 'country',
|
|
'POP_MAX': 'population'
|
|
})
|
|
|
|
# Keep only required columns
|
|
cities_filtered = cities_filtered[['name','country','population','geometry']]
|
|
|
|
# Save to GeoJSON
|
|
cities_geojson_path = output_dir + "world_cities_europe.geojson"
|
|
cities_filtered.to_file(cities_geojson_path, driver='GeoJSON')
|
|
print(f"Saved {cities_geojson_path} ({len(cities_filtered)} features)")
|
|
|
|
# ---------- Convert roads ----------
|
|
print("Processing roads...")
|
|
|
|
roads = gpd.read_file(roads_shp)
|
|
|
|
# Keep only Europe/Nordics
|
|
roads_filtered = roads[roads['ADM0_A3'].isin(europe_nordics)].copy()
|
|
|
|
# Rename the main type column to 'type' (if needed)
|
|
if 'TYPE' in roads_filtered.columns:
|
|
roads_filtered = roads_filtered.rename(columns={'TYPE': 'type'})
|
|
elif 'fclass' in roads_filtered.columns:
|
|
roads_filtered = roads_filtered.rename(columns={'fclass': 'type'})
|
|
else:
|
|
roads_filtered['type'] = 'road' # fallback
|
|
|
|
# Keep only necessary columns
|
|
roads_filtered = roads_filtered[['type','geometry']]
|
|
|
|
# Remove duplicate column names (sometimes shapefiles have duplicates)
|
|
roads_filtered = roads_filtered.loc[:, ~roads_filtered.columns.duplicated()]
|
|
|
|
# Save to GeoJSON
|
|
roads_geojson_path = output_dir + "roads_europe.geojson"
|
|
roads_filtered.to_file(roads_geojson_path, driver='GeoJSON')
|
|
print(f"Saved {roads_geojson_path} ({len(roads_filtered)} features)")
|
|
|