73 lines
2.6 KiB
Python
73 lines
2.6 KiB
Python
import geopandas as gpd
|
|
import os
|
|
|
|
# -----------------------------
|
|
# Settings
|
|
# -----------------------------
|
|
output_dir = "/mnt/storage/docker-data/pupmap/www/data/sources/"
|
|
os.makedirs(output_dir, exist_ok=True)
|
|
|
|
# Europe + Nordics country codes (for cities)
|
|
europe_nordics = [
|
|
'AL','AD','AT','BE','BA','BG','HR','CY','CZ','DK','EE','FI','FR','DE',
|
|
'GR','HU','IS','IE','IT','LV','LI','LT','LU','MT','MD','MC','ME','NL',
|
|
'MK','NO','PL','PT','RO','RU','SM','RS','SK','SI','ES','SE','CH','UA','GB'
|
|
]
|
|
|
|
# -----------------------------
|
|
# Process Cities
|
|
# -----------------------------
|
|
print("Processing cities...")
|
|
cities = gpd.read_file("ne_10m_populated_places/ne_10m_populated_places.shp")
|
|
cities_filtered = cities[cities['ADM0_A3'].isin(europe_nordics)].copy()
|
|
|
|
# Extract coordinates from geometry
|
|
cities_filtered['lon'] = cities_filtered.geometry.x
|
|
cities_filtered['lat'] = cities_filtered.geometry.y
|
|
|
|
# Keep needed columns + geometry
|
|
cities_filtered = cities_filtered[['NAME','ADM0NAME','lat','lon','POP_MAX','geometry']]
|
|
cities_filtered = cities_filtered.rename(columns={
|
|
'NAME':'name',
|
|
'ADM0NAME':'country',
|
|
'POP_MAX':'population'
|
|
})
|
|
|
|
# Drop any duplicate columns
|
|
cities_filtered = cities_filtered.loc[:, ~cities_filtered.columns.duplicated()]
|
|
|
|
cities_geojson_path = os.path.join(output_dir, "world_cities_europe.geojson")
|
|
cities_filtered.to_file(cities_geojson_path, driver='GeoJSON')
|
|
print(f"Saved {cities_geojson_path}")
|
|
|
|
# -----------------------------
|
|
# Process Roads
|
|
# -----------------------------
|
|
print("Processing roads...")
|
|
roads = gpd.read_file("ne_10m_roads/ne_10m_roads.shp")
|
|
|
|
# Filter by Europe/Nordics bounding box
|
|
minx, miny, maxx, maxy = -25.0, 34.0, 40.0, 72.0
|
|
roads_filtered = roads.cx[minx:maxx, miny:maxy].copy()
|
|
|
|
# Remove duplicate columns
|
|
roads_filtered = roads_filtered.loc[:, ~roads_filtered.columns.duplicated()]
|
|
|
|
# Pick columns: use FULLNAME/FCLASS if they exist
|
|
if 'FULLNAME' in roads_filtered.columns and 'FCLASS' in roads_filtered.columns:
|
|
roads_filtered = roads_filtered[['FULLNAME','FCLASS','geometry']]
|
|
roads_filtered = roads_filtered.rename(columns={'FULLNAME':'name','FCLASS':'type'})
|
|
else:
|
|
# fallback: take first two non-geometry columns
|
|
geom_col = 'geometry'
|
|
other_cols = [c for c in roads_filtered.columns if c != geom_col]
|
|
roads_filtered = roads_filtered[other_cols[:2] + [geom_col]]
|
|
roads_filtered = roads_filtered.rename(columns={other_cols[0]:'name', other_cols[1]:'type'})
|
|
|
|
roads_geojson_path = os.path.join(output_dir, "roads_europe.geojson")
|
|
roads_filtered.to_file(roads_geojson_path, driver='GeoJSON')
|
|
print(f"Saved {roads_geojson_path}")
|
|
|
|
print("✅ All GeoJSON files are ready for MapLibre!")
|
|
|