質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

548閲覧

basemapを使って地図に駅と利用者を描画したい

kenken0023

総合スコア15

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/12/06 04:07

編集2018/12/06 04:10

前提・実現したいこと

https://qiita.com/duonys/items/c941bc2818abe5cc1da7に記載されている、basemapを用いて山手線の駅の座標に利用者数を表した円を表示するというもので、実際に自分で行った際にエラーが出て実現できていない。

ちなみに私はwindows10を使っているのですが、記載されているプログラムの環境はMacです。

発生している問題・エラーメッセージ

記載されているプログラムは2つに分かれており、それらを一つにまとめた際、よくわからないエラーが出てしまう。

エラーメッセージ

Traceback (most recent call last):
File "mapping3.py", line 92, in <module>
bg_img = Image.open(file_name)
File "C:\Users\mikihome2015\Anaconda3\lib\site-packages\PIL\Image.py", line 2477, in open
fp = builtins.open(filename, "rb")
FileNotFoundError: [Errno 2] No such file or directory: 'osm.png'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "mapping3.py", line 94, in <module>
bg_img = get_osm_img(minlat=minlat, minlon=minlon, maxlat=maxlat, maxlon=maxlon, scale=60000)
File "mapping3.py", line 80, in get_osm_img
return Image.open(BytesIO(response.content))
File "C:\Users\mikihome2015\Anaconda3\lib\site-packages\PIL\Image.py", line 2519, in open
% (filename if filename else fp))
OSError: cannot identify image file <_io.BytesIO object at 0x0000019AF7C1CF68>

該当のソースコード

python

1import pandas as pd 2from http.client import IncompleteRead 3import time 4#----------------------------------------------- 5import requests 6from io import BytesIO 7import matplotlib.pyplot as plt 8from mpl_toolkits.basemap import Basemap 9from PIL import Image 10#%matplotlib inline 11#もともとこの上の%matplotlib inlineの行はコメントアウトしていなかったがsegmentErrorのためコメントアウト 12#----------------------------------------------- 13 14 15# Retrieve station's lat/lon 16def fetch_latlon(): 17 url = 'http://qiita.com/butchi_y/items/3a6b70b38e13dc56ef13' 18 data = pd.read_html(url)[0] 19 data.columns = ['name', 'lat', 'lon'] 20 return data 21 22# Retrieve the number of passenger 23def fetch_passenger(): 24 # fetch data 25 urls = ['http://www.jreast.co.jp/passenger/index.html', 'http://www.jreast.co.jp/passenger/2014_01.html'] 26 data = pd.DataFrame() 27 for url in urls: 28 df = None 29 for i in range(5): 30 try: 31 df = pd.read_html(url) 32 break 33 except IncompleteRead as ir: 34 time.sleep(0.1) 35 # Sometimes fetching passenger fails 36 if df is None: 37 print('Failed to fetch passenger.') 38 sys.exit(1) 39 40 for i in range(2): 41 # Delete rank column in the first table 42 if url == urls[0]: 43 df[i] = df[i].iloc[:, 1:] 44 df[i].columns = [col for col in range(len(df[i].columns))] 45 data = data.append(df[i]) 46 # arrange data 47 data = data.iloc[2:, [0, 3]] 48 data.columns = ['name', 'passenger'] 49 data.reset_index(inplace=True, drop=True) 50 return data 51 52# Retrieve lat/lon and passenger info and merge them into one data 53def fetch_data(): 54 latlon = fetch_latlon() 55 passenger = fetch_passenger() 56 data = latlon.merge(passenger, how='inner', on='name') 57 return data 58 59data = fetch_data() 60 61#------------------------------------------------------------------- 62 63# min/max circle size of plot 64min_size = 200 65max_size = 2000 66 67# Retrive static OpenStreetMap 68def get_osm_img(minlat, minlon, maxlat, maxlon, scale=60000, img_format='png'): 69 url = 'http://www.openstreetmap.org/export/finish' 70 payload = { 71 'mapnik_format': img_format, 72 'mapnik_scale': scale, 73 'minlon': minlon, 74 'minlat': minlat, 75 'maxlon': maxlon, 76 'maxlat': maxlat, 77 'format': 'mapnik' 78 } 79 response = requests.post(url, payload) 80 return Image.open(BytesIO(response.content)) 81 82fig = plt.figure(figsize=(15, 15)) 83 84minlat, minlon, maxlat, maxlon = 35.61, 139.67, 35.75, 139.80 85bmap = Basemap(projection='merc', llcrnrlat=minlat, urcrnrlat=maxlat, llcrnrlon=minlon, urcrnrlon=maxlon, lat_ts=0, resolution='l') 86 87x, y = bmap(data['lon'].values, data['lat'].values) 88 89file_name = 'osm.png' 90bg_img = None 91try: 92 bg_img = Image.open(file_name) 93except FileNotFoundError as fnfe: 94 bg_img = get_osm_img(minlat=minlat, minlon=minlon, maxlat=maxlat, maxlon=maxlon, scale=60000) 95 bg_img.save(file_name) 96bmap.imshow(bg_img, origin='upper') 97bmap.scatter(x, y, c=data['passenger'], cmap=plt.cm.get_cmap('seismic'), alpha=0.5, s=data['passenger'].map(lambda x: (x - data['passenger'].min()) / (data['passenger'].max() - data['passenger'].min()) * (max_size - min_size) + min_size)) 98 99# plt.colorbar() 100plt.show() 101# plt.savefig('out.png') 102 103

試したこと

まず2つあったプログラムの内の1つ(山手線の駅の座標データをスクレイピングするもの)だけでプログラムを動かしてみて、エラーが出ないことをか確認した。

その後、プログラムをつなげた際エラーが出たのでpythonに必要なライブラリとbasemapがきちんとインストールされているか確認した。

補足情報(FW/ツールのバージョンなど)

python3.7.0
プログラム上から11行目にある%matplotlib inlineの%の意味も分かりませんでした。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

t_obara

2018/12/06 08:15

エラーメッセージをよく読んでみましたか?そこから何がわかったか、それに対して何をしたけれど解決しなかったのかをご提示ください。
kenken0023

2018/12/07 02:20

エラー文について一通り読んでみたのですが、画像を描画しているポイントでエラーが出ていることが分かりました。ただ、今まで文章のスクレイピングについてはしたことがあるのですが、地図や画像はしたことがなかったのでエラー箇所を見ても理解できず、ここに掲載させていただきました。私の知識不足でこのようなことになってしまって申し訳ないですが、また新たに分かったことがあればよろしくお願いします。
t_obara

2018/12/07 02:26

FileNotFoundError: [Errno 2] No such file or directory: 'osm.png' というエラーについてはいかがですか?
kenken0023

2018/12/07 02:43

返信ありがとうございます。このエラーについてはfile_name='osm.png'という時点ではただの何もない画像ファイルですがtry、except文で恐らくfile_nameを開くことが出来なければ、exceptに入ってbs_omg_img関数に具体的なステータスを入れて画像データとして入手するという構造になっているんだと思っています。try,exceptについては私自身使ったことがないのでどのような挙動になるか調べてみようと思います。
kenken0023

2018/12/07 03:24

try,except文をなくして、直接もともとexcept文に書いてる内容を書くとNo such fileのエラーは消えました。
guest

回答1

0

ベストアンサー

Open Street MapはWebAPIを介したアクセスが許容されていないそうです。そのため、get_osm_imgの結果である地図画像がないため、エラーになっています。どうしても地図画像が必要であればマニュアル操作で取得することを考えるべきでしょう。

投稿2018/12/06 14:26

R.Shigemori

総合スコア3376

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kenken0023

2018/12/07 02:29

回答ありがとうございます。 マニュアル操作というのはいわゆる手動でということでしょうか?
kenken0023

2018/12/10 11:24

回答ありがとうございます。少し遅くなりましたが、今からやってみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問