Necesito convertir las coordenadas del mapa en píxeles (para hacer un mapa cliqueable en html).Calcular valores de píxeles a partir de las coordenadas de latitud/longitud (usando el mapa base matplotlib)
Aquí hay un mapa de muestra (hecho usando el paquete Basemap de matplotlib). He puesto algunas etiquetas en él y trató de calcular los puntos medios de las etiquetas en píxeles:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
## Step 0: some points to plot
names = [u"Reykjavík", u"Höfn", u"Húsavík"]
lats = [64.133333, 64.25, 66.05]
lons = [-21.933333, -15.216667, -17.316667]
## Step 1: draw a map using matplotlib/Basemap
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
M = Basemap(projection='merc',resolution='c',
llcrnrlat=63,urcrnrlat=67,
llcrnrlon=-24,urcrnrlon=-13)
x, y = M(lons, lats) # transform coordinates according to projection
boxes = []
for xa, ya, name in zip(x, y, names):
box = plt.text(xa, ya, name,
bbox=dict(facecolor='white', alpha=0.5))
boxes.append(box)
M.bluemarble() # a bit fuzzy at this resolution...
plt.savefig('test.png', bbox_inches="tight", pad_inches=0.01)
# Step 2: get the coordinates of the textboxes in pixels and calculate the
# midpoints
F = plt.gcf() # get current figure
R = F.canvas.get_renderer()
midpoints = []
for box in boxes:
bb = box.get_window_extent(renderer=R)
midpoints.append((int((bb.p0[0] + bb.p1[0])/2),
int((bb.p0[1] + bb.p1[1])/2)))
Estos puntos calculados están en la relación relativa aproximadamente correcta entre sí, pero no coinciden con los puntos verdaderos. El siguiente fragmento de código debe poner un punto rojo en el punto medio de cada etiqueta:
# Step 3: use PIL to draw dots on top of the labels
from PIL import Image, ImageDraw
im = Image.open("test.png")
draw = ImageDraw.Draw(im)
for x, y in midpoints:
y = im.size[1] - y # PIL counts rows from top not bottom
draw.ellipse((x-5, y-5, x+5, y+5), fill="#ff0000")
im.save("test.png", "PNG")
- Los puntos rojos deben estar en el medio de las etiquetas.
Supongo que el error viene donde extraigo las coordenadas de los cuadros de texto (en el Paso # 2). Cualquier ayuda muy apreciada.
Notas
- Tal vez la solución es algo a lo largo de las líneas de this answer?
¿Podría utilizar el mapa base para dibujar los puntos rojos? Ver http://matplotlib.org/basemap/api/basemap_api.html#mpl_toolkits.basemap.Basemap.plot –