지도 좌표를 픽셀로 변환해야합니다 (HTML에서 클릭 가능한지도를 만들기 위해).위도/경도 좌표에서 픽셀 값을 계산하십시오 (matplotlib Basemap 사용)
다음은 샘플지도입니다 (matplotlib의 Basemap 패키지를 사용). 나는 거기에 약간의 라벨을 넣고 픽셀 레이블의 중간 점을 계산하려고했습니다 :
#!/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)))
이 계산 된 포인트가 서로에 약 올바른 상대 관계에 있지만, 진정한 점과 일치하지 않습니다. 다음 코드는 각 레이블의 중간에 빨간 점을 넣어해야합니다
# 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")
- 레드 도트는 라벨의 중앙에 있어야합니다.
나는 (2 단계에서) 텍스트 상자의 좌표를 추출하는 곳에서 오류가 발생한다고 생각합니다. 어떤 도움을 많이 주셨습니다.
노트
- 아마도 솔루션은 this answer의 라인을 따라 뭔가?
대신 빨간색 점을 그리려면 Basemap을 사용할 수 있습니까? 놀라운 http://matplotlib.org/basemap/api/basemap_api.html#mpl_toolkits.basemap.Basemap.plot –