Fix drawing outside borders

This commit is contained in:
Corentin 2025-09-09 15:38:37 +09:00
commit 931b30cbce

34
map.py
View file

@ -111,7 +111,6 @@ def main():
del arguments
bounds, nodes, ways, relations = parse_xml(osm_path)
print(f'{bounds} {len(nodes)=} {len(ways)=} {len(relations)=}')
if convert_data:
with (osm_path.parent / f'{osm_path.stem}.json').open(mode='w', encoding='utf-8') as json_file:
@ -169,9 +168,7 @@ def main():
coords = []
for node_id in way.nodes:
node = nodes[node_id]
new_coord = (
min(max((node.lon - bounds.minlon) * lon_scale, 0), map_width),
min(max(map_height - ((node.lat - bounds.minlat) * lat_scale), 0), map_height))
new_coord = ((node.lon - bounds.minlon) * lon_scale, map_height - ((node.lat - bounds.minlat) * lat_scale))
if not coords or new_coord != coords[-1]:
coords.append(new_coord)
draw.polygon(coords, fill=color, outline=outline, width=width)
@ -181,9 +178,7 @@ def main():
coords = []
for node_id in way.nodes:
node = nodes[node_id]
new_coord = (
min(max((node.lon - bounds.minlon) * lon_scale, 0), map_width),
min(max(map_height - ((node.lat - bounds.minlat) * lat_scale), 0), map_height))
new_coord = ((node.lon - bounds.minlon) * lon_scale, map_height - ((node.lat - bounds.minlat) * lat_scale))
if not coords or new_coord != coords[-1]:
coords.append(new_coord)
draw.line(coords, width=width, fill=color, joint=joint)
@ -221,29 +216,28 @@ def main():
if 'highway' in way.tags:
match way.tags['highway']:
case 'motorway' | 'motorway_link':
draw_way_line(way, 15, (220, 160, 160), joint='curve')
draw_way_line(way, 25, (220, 160, 160), joint='curve')
case 'trunk' | 'trunk_link':
draw_way_line(way, 13, bridge_outline if 'bridge' in way.tags else (230, 180, 130), joint='curve')
draw_way_line(way, 11, (240, 200, 170), joint='curve')
draw_way_line(way, 21, bridge_outline if 'bridge' in way.tags else (230, 180, 130), joint='curve')
draw_way_line(way, 19, (240, 200, 170), joint='curve')
case 'primary' | 'primary_link':
draw_way_line(way, 11, bridge_outline if 'bridge' in way.tags else (230, 200, 110), joint='curve')
draw_way_line(way, 9, (245, 225, 150), joint='curve')
draw_way_line(way, 19, bridge_outline if 'bridge' in way.tags else (230, 200, 110), joint='curve')
draw_way_line(way, 17, (245, 225, 150), joint='curve')
case 'secondary' | 'secondary_link':
draw_way_line(way, 11, bridge_outline if 'bridge' in way.tags else (200, 200, 140), joint='curve')
draw_way_line(way, 9, (220, 220, 180), joint='curve')
draw_way_line(way, 17, bridge_outline if 'bridge' in way.tags else (200, 200, 140), joint='curve')
draw_way_line(way, 15, (220, 220, 180), joint='curve')
case 'tertiary' | 'tertiraty_link':
draw_way_line(way, 9, bridge_outline if 'bridge' in way.tags else (160, 160, 160), joint='curve')
draw_way_line(way, 7, (245, 245, 245), joint='curve')
draw_way_line(way, 15, bridge_outline if 'bridge' in way.tags else (160, 160, 160), joint='curve')
draw_way_line(way, 13, (245, 245, 245), joint='curve')
case 'residential' | 'unclassified' | 'road':
draw_way_line(way, 7, bridge_outline if 'bridge' in way.tags else (160, 160, 160), joint='curve')
draw_way_line(way, 5, (250, 250, 250), joint='curve')
draw_way_line(way, 13, bridge_outline if 'bridge' in way.tags else (160, 160, 160), joint='curve')
draw_way_line(way, 11, (250, 250, 250), joint='curve')
elif 'waterway' in way.tags and way.tags['waterway'] in {'river', 'steam', 'tidal_channel', 'flowline'}:
draw_way_line(way, 11, (180, 200, 240), joint='curve')
draw_way_line(way, 21, (180, 200, 240), joint='curve')
elif 'building' in way.tags:
draw_way_polygon(way, (190, 180, 160), outline=(120, 120, 120))
image = cv2.cvtColor(np.asarray(image), cv2.COLOR_BGR2RGB)
print(f'{image.shape=}')
cv2.namedWindow('map', cv2.WINDOW_KEEPRATIO)
while cv2.waitKey(50) & 0xff != ord('q'):
cv2.imshow('map', image)