Improve map image generation #50
1 changed files with 7 additions and 19 deletions
26
scl.py
26
scl.py
|
@ -11,7 +11,7 @@ from PIL import Image, ImageDraw, ImageFont
|
||||||
from sqlalchemy import create_engine, select
|
from sqlalchemy import create_engine, select
|
||||||
from sqlalchemy.exc import NoResultFound
|
from sqlalchemy.exc import NoResultFound
|
||||||
from sqlalchemy.orm import DeclarativeBase, Mapped, Session, mapped_column
|
from sqlalchemy.orm import DeclarativeBase, Mapped, Session, mapped_column
|
||||||
from staticmap import CircleMarker, Polygon, StaticMap
|
from staticmap import Polygon, StaticMap
|
||||||
|
|
||||||
from geospatial import convert_outage_geometry
|
from geospatial import convert_outage_geometry
|
||||||
|
|
||||||
|
@ -45,10 +45,7 @@ class AttribStaticMap(StaticMap, object):
|
||||||
super(AttribStaticMap, self)._draw_features(image)
|
super(AttribStaticMap, self)._draw_features(image)
|
||||||
|
|
||||||
txt = Image.new("RGBA", image.size, (255, 255, 255, 0))
|
txt = Image.new("RGBA", image.size, (255, 255, 255, 0))
|
||||||
# get a font
|
fnt = ImageFont.truetype("fonts/PublicSans-Regular.otf", 24)
|
||||||
# fnt = ImageFont.truetype('FreeMono.ttf', 12)
|
|
||||||
fnt = ImageFont.load_default()
|
|
||||||
# get a drawing context
|
|
||||||
d = ImageDraw.Draw(txt)
|
d = ImageDraw.Draw(txt)
|
||||||
|
|
||||||
textSize = fnt.getbbox(self.attribution)
|
textSize = fnt.getbbox(self.attribution)
|
||||||
|
@ -132,10 +129,11 @@ def do_initial_post(
|
||||||
area_text = event["city"]
|
area_text = event["city"]
|
||||||
try:
|
try:
|
||||||
map = AttribStaticMap(
|
map = AttribStaticMap(
|
||||||
512,
|
1024,
|
||||||
512,
|
1024,
|
||||||
url_template="https://tiles.stadiamaps.com/tiles/outdoors/{z}/{x}/{y}.png?api_key="
|
url_template="https://tiles.stadiamaps.com/tiles/outdoors/{z}/{x}/{y}@2x.png?api_key="
|
||||||
+ stadiamaps_api_key,
|
+ stadiamaps_api_key,
|
||||||
|
tile_size=512,
|
||||||
)
|
)
|
||||||
assert event["polygons"]["type"] == "polygon"
|
assert event["polygons"]["type"] == "polygon"
|
||||||
for ring in event["polygons"]["rings"]:
|
for ring in event["polygons"]["rings"]:
|
||||||
|
@ -158,16 +156,6 @@ def do_initial_post(
|
||||||
# SE Corner
|
# SE Corner
|
||||||
assert outage_center.y > 47.2 and outage_center.x < -122
|
assert outage_center.y > 47.2 and outage_center.x < -122
|
||||||
|
|
||||||
marker_outline = CircleMarker(
|
|
||||||
(outage_center.x, outage_center.y), "white", 18
|
|
||||||
)
|
|
||||||
marker = CircleMarker(
|
|
||||||
(outage_center.x, outage_center.y), event_class["outage_color"], 12
|
|
||||||
)
|
|
||||||
|
|
||||||
map.add_marker(marker_outline)
|
|
||||||
map.add_marker(marker)
|
|
||||||
|
|
||||||
# Zoom level 17 ensures that we won't get any building/POI names, just street names
|
# Zoom level 17 ensures that we won't get any building/POI names, just street names
|
||||||
geocode_url = "{nominatim_url}/reverse?lat={lat}&lon={lon}&format=geocodejson&zoom=17".format(
|
geocode_url = "{nominatim_url}/reverse?lat={lat}&lon={lon}&format=geocodejson&zoom=17".format(
|
||||||
nominatim_url=nominatim_url,
|
nominatim_url=nominatim_url,
|
||||||
|
@ -230,7 +218,7 @@ def do_initial_post(
|
||||||
map_image = map.render()
|
map_image = map.render()
|
||||||
|
|
||||||
with io.BytesIO() as map_image_file:
|
with io.BytesIO() as map_image_file:
|
||||||
map_image.save(map_image_file, format="PNG", optimize=True)
|
map_image.save(map_image_file, format="WebP", method=6)
|
||||||
map_media_post = mastodon_client.media_post(
|
map_media_post = mastodon_client.media_post(
|
||||||
map_image_file.getvalue(),
|
map_image_file.getvalue(),
|
||||||
mime_type="image/png",
|
mime_type="image/png",
|
||||||
|
|
Loading…
Reference in a new issue