晴歩雨描

晴れた日は外に出て歩き、雨の日は部屋で絵を描く

「Google レンズ」のOCR機能はWindows(PC)でも使える。もちろん無料。

以前、「Windowsでフリーで使えるOCR機能「Google フォト」」という記事を書いた。

この時は、OCR機能を使う方法として、スマホでは「Google レンズ」を使ったが、Windowsでは「Google フォト」を使った。

しかし、Windows版ブラウザChromeでも、「Google レンズ」のOCR機能が使える。「Google フォト」よりも速くて使いやすい。

以下のサンプル画面は、「文春文庫)教科書でおぼえた名文」の中から、夏目漱石の「坊っちゃん」をスキャンしたもの。

スキャンする画像は、以下のように脚注等が付いていると、本文の文字列と混在してしまうので、必要な部分だけを切り取った画像にした方が良い。

この画像ファイルをChromeの画面にドラッグ&ドロップする。

マウスの右ボタンで「Google レンズで画像を検索」を選ぶ。

以下のように右側にスキャン画面が表示されるので、「テキスト」を選択する。次に「テキストをすべて選択」を選ぶ。

「コピー」または「テキストをコピー」をクリック。

コピーしたテキストを任意のアプリにペーストする。

以下がテキスト変換された文字列。残念ながら、ルビが振られているとふりがな文字が本文の中に混在してしまう。


坊っちゃん(中学一年)
夏目漱石
こども 親譲りの無鉄砲で小供の時から損ばかりしている。 小学校にいる 時分、学校の二階から飛び降りて一週間ほど腰を抜かしたことがあ むやみ る。なぜそんな無闇をしたと聞く人があるかもしれぬ。別段深い理 由でもない。 新築の二階から首を出していたら、同級生の一人が冗 いば 談に、いくら威張っても、そこから飛び降りる事は出来まい。 弱虫 やーい。と難したからである。小使いに負ぶさって帰って来た時、 おやじが大きな眼をして、二階位から飛び降りて腰をぬかす奴があ るかといったから、この次は抜かさずに飛んで見せますと答えた。
親類のものから西洋製のナイフを貰って、奇麗な刃を日に翳して
友達に見せていたら、一人が光ることは光るが切れそうもないとい
った。切れぬ事があるか、何でも切って見せると受け合った。 そん
なら君の指を切って見ろと注文したから、何だ指位この通りだと、
さいわい
右の手の親指の甲をはすに切り込んだ。 幸ナイフが小さいのと、親
きずあと
指の骨が堅かったので、今だに親指は手に付いている。しかし創痕
は死ぬまで消えぬ。
庭を東へ二十歩に行き尽すと、南上がりに聊かばかりの菜園があ って、真中に栗の木が一本立っている。これは命より大事な栗だ。 実の熟する時分は起き抜けに背戸を出て落ちた奴を拾ってきて、学 やましろ 校で食う。 菜園の西側が山城屋という質屋の庭続きで、この質屋に 太郎という十三、四の枠がいた。 勘太郎は無論弱虫である。弱虫 のくせに四つ目垣を乗り越えて、栗を盗みに来る。 ある日の夕方、 折戸の陰にかくれて、とうとう勘太郎を捕まえてやった。 その時勘 太郎は逃げ路を失って、一生懸命に飛びかかって来た。 向うは二つ ばかり年上である。 弱虫だが力は強い。鉢の開いた頭を、こっちの 胸へ宛ててぐいぐい押した拍子に、勘太郎の頭がすべって、おれの あわせ 袷の袖の中に這入った。邪魔になって手が使えぬから、むやみに手 なび を振ったら、袖の中にある勘太郎の頭が、右左へぐらぐら靡いた。


Leaflet地図:「日本)鉄道難読駅マップ」を作成。CSV使用。

地図データを扱うJavaScript ライブラリ「Leaflet」を使って、地図をいくつか作成してきた。

今回、「日本)鉄道難読駅マップ」を作成。

駅マーカーをクリックすると読みを確認できる。

難読駅データは、以下の「ORIGAMI - 日本の伝統・伝承・和の心」の「日本全国難読駅名一覧」を使わせてもらった。一部駅名は修正して使用。

上記「難読駅データ」に以下の「駅データ.jp」の駅名をマッチングして緯度経度を合わせたCSVファイルを使用。一部、マッチングミス(同じ駅名がある場合)で違う場所に紐づいている駅があるかもしれない。

JavaScriptサンプルソース(抜粋)≫

<script>
fetch('csv/nandoki-eki.csv')
.then((response) => {
	if(response.ok) {
		return response.text();
	} else {
		throw new Error();
	}
})
.then((text) => {
	csv2map(text);
})
function csv2map(csv) {
	var place = Array();
	line = csv.split("\n");
	for (var i=0; i<line.length; ++i) {
		data = line[i].split(',');
		if (data.length > 2) {
			var popStr = '<a class="ekimei" href="https://www.google.co.jp/search?q=' + data[2] + '駅" target="_blank">' + data[2] + '</a>';
			popStr += '<br>読み:<span class="yomi">' + data[6] + '</span>';
			popStr += '<br>' + data[7];
			place.push([data[2], data[4], data[5], popStr]);
		}
	}
	place2map(place);	// place[0] = ['地名', 緯度, 経度, 'ポップアップ文字']
}
</script>

Leaflet地図:世界地図に国別宗教構成を円グラフ(Google Image Charts)で表示。

先日、Leafletで世界地図に国別宗教構成を表示するページを作成した。

前回は、世界地図に国旗を表示し、国旗をクリックすると、その国の宗教構成を表示する方式だった。

今回は、全世界の各国の宗教構成を円グラフで一覧表示する方式にした。

宗教構成データは、前回と同じく「Religious Composition by Country, 2010-2050 - Pew Research Center」の2020年データを使用。

このデータによれば、全世界では、

各国の円グラフをクリックすると、宗教構成を数字で表示する。民間信仰ユダヤ教は、円グラフでは「その他」に入れている。このデータでは、道教儒教等は民間信仰に含まれている。

このデータによれば、ヨーロッパや東アジアでは無宗教(ピンク色表示)の比率が高い。

アフリカは北部と南部で大きく分かれる。北部はイスラム教(赤色表示)が大半。南部はキリスト教(青色表示)が大半。

仏教(緑色表示)は東南アジアから東アジア。

中国や台湾では民間信仰の比率が高いが、民間信仰には道教儒教が含まれる。民間信仰は円グラフ上では「その他(グレー色)」に入っている。

円グラフには「Google Charts > Image Charts」を使っている。(ただし、非推奨になっているようなので、そのうち使えなくなるかもしれない。)

URLでパラメーター指定でPNG画像で円グラフを取得できる。

https://chart.apis.google.com/chart?cht=p&chs=200x200&chco=3366CC|DC3912|FF9900|109618|da70d6|aaaaaa&chf=bg,s,ffffff00&chd=t:31,23,15,7,16,7&chdl=キリスト教|イスラム教|ヒンズー教|仏教|無宗教|その他

JavaScriptソース抜粋≫
function csv2map(csv) {
	var chartIcon;
	var line = csv.split("\n");
	for (var i=0; i<line.length; ++i) {
		var data = line[i].split('\t');
		if (data.length > 2) {
/*
			data[0]	country_code
			data[1]	name_jp
			data[3]	capital_jp
			data[7]	lat
			data[8]	lon
*/
			var country_code = data[0].toUpperCase();
			var popStr = '<div class="country_box">';
			popStr += '<img class="flag" src="worldflags/80px/' + data[0].toLowerCase() + '.png">';
			popStr += '<span class="country_code">' + country_code + '</span> ';
			popStr += '<span class="country">' + data[1] + '</span><br>';
			popStr += '<span class="capital">' + data[3] + '</span><br>';
			popStr += '<span class="lat_lng">緯度:' + data[7] + ' 経度:' + data[8] + '</span>';
			if (country[country_code]) {
/*
				country[0] 国名
				country[1] 人口
				country[2] キリスト教
				country[3] イスラム教
				country[4] 無宗教
				country[5] ヒンズー教
				country[6] 仏教
				country[7] 民間信仰
				country[8] ユダヤ教
				country[9] その他
*/
				popStr += '<br>人口: <span class="population">' + Number(country[country_code] [1]).toLocaleString() + ' 人</span>';
				popStr += '<br>キリスト教: <span class="religion">' + country[country_code] [2] + ' %</span>';
				popStr += '<br>イスラム教: <span class="religion">' + country[country_code] [3] + ' %</span>';
				popStr += '<br>ヒンズー教: <span class="religion">' + country[country_code] [5] + ' %</span>';
				popStr += '<br>仏教: <span class="religion">' + country[country_code] [6] + ' %</span>';
				popStr += '<br>無宗教: <span class="religion">' + country[country_code] [4] + ' %</span>';
				popStr += '<br>民間信仰: <span class="religion">' + country[country_code] [7] + ' %</span>';
				popStr += '<br>ユダヤ教: <span class="religion">' + country[country_code] [8] + ' %</span>';
				popStr += '<br>その他: <span class="religion">' + country[country_code] [9] + ' %</span>';
				popStr += '</div>';
				var pie_data = country[country_code] [2];		// キリスト教
				pie_data += ',' + country[country_code] [3];		// イスラム教
				pie_data += ',' + country[country_code] [5];		// ヒンズー教
				pie_data += ',' + country[country_code] [6];		// 仏教
				pie_data += ',' + country[country_code] [4];		// 無宗教
				pie_data += ',' + (100 - Number(country[country_code] [2]) - Number(country[country_code] [3]) - Number(country[country_code] [5]) - Number(country[country_code] [6]) - Number(country[country_code] [4]));		// その他
				chartIcon = L.icon({
					iconUrl: 'https://chart.apis.google.com/chart?cht=p&chs=80x80&chco=3366CC|DC3912|FF9900|109618|da70d6|aaaaaa&chf=bg,s,ffffff00&chd=t:' + pie_data,
					iconSize: [80, 80],
					iconAnchor: [50, 50],
					popupAnchor: [-10, -45]
				});
				L.marker([data[7],data[8]],{icon:chartIcon}).addTo(map).bindPopup(popStr);
			}
		}
	}
}

Leaflet地図:世界地図に国別宗教構成を表示。

地図データを扱うJavaScript ライブラリ「Leaflet」を使って、地図をいくつか作成してきた。

今回、世界地図に国別宗教構成を表示するようにした。

以前に作成した世界地図の国旗マーカーのクリックで、その国の宗教構成をポップアップで表示する。

宗教構成データは「Religious Composition by Country, 2010-2050 - Pew Research Center」の2020年データを使用。

作成した地図が以下。

国旗マーカーをクリックするとその国の2020年の人口と宗教構成の比率を表示する。データの都合上、一部表示されない国もある。比率が合計して100%にはならないかもしれない。

「Pew Research Center」のデータによれば、日本は無宗教が60%となっている。

ヨーロッパの英国、フランス、ドイツでも無宗教の比率が30%前後となっている。

JavaScriptサンプルソース(抜粋)≫

2つのCSVデータ「religion-country.csv」「capital.csv」を使っている。2桁の国コードで照合して使用。

fetch('csv/religion-country.csv')		// 国別宗教構成データ
.then((response) => {
	if(response.ok) {
		return response.text();
	} else {
		throw new Error();
	}
})
.then((text) => {
	csv2array(text);
	marker2map();
})
var country = Array();
function csv2array(csv) {
	var line = csv.split("\n");
	for (var i=0; i<line.length; ++i) {
		var data = line[i].split(',');
		if (data.length > 2) {
/*
			data[0] country_code
			data[1] 国名
			data[2] 人口
			---	data[3] 100%
			data[4] キリスト教
			data[5] イスラム教
			data[6] 無宗教
			data[7] ヒンズー教
			data[8] 仏教
			data[9] 民間信仰
			data[10] ユダヤ教
			data[11] その他
*/
			country[data[0]] = [data[1],data[2],data[4],data[5],data[6],data[7],data[8],data[9],data[10],data[11]];
		}
	}
}
// -----------------------------------
function marker2map() {
	fetch('csv/capital.csv')		// 世界の首都の緯度経度データ
	.then((response) => {
		if(response.ok) {
			return response.text();
		} else {
			throw new Error();
		}
	})
	.then((text) => {
		csv2map(text);
		map.setView([30,10], 2);
	})
}
function csv2map(csv) {
	var line = csv.split("\n");
	for (var i=0; i<line.length; ++i) {
		var data = line[i].split('\t');
		if (data.length > 2) {
/*
			data[0]	country_code
			data[1]	name_jp
			data[3]	capital_jp
			data[7]	lat
			data[8]	lon
*/
			var worldFlag = L.icon({
				iconUrl: 'worldflags/80px/' + data[0].toLowerCase() + '.png', 
				iconSize: [80, 80],
				iconAnchor: [40, 48],
				popupAnchor: [0, -36],
			});
			var country_code = data[0].toUpperCase();
			var popStr = '<span class="country_code">' + country_code + '</span> ';
			popStr += '<span class="country">' + data[1] + '</span><br>';
			popStr += '<span class="capital">' + data[3] + '</span><br>';
			popStr += '<span class="lat_lng">緯度:' + data[7] + ' 経度:' + data[8] + '</span>';
			if (country[country_code]) {
				popStr += '<br>人口: <span class="population">' + Number(country[country_code] [1]).toLocaleString() + ' 人</span>';
				popStr += '<br>キリスト教: <span class="religion">' + country[country_code] [2] + ' %</span>';
				popStr += '<br>イスラム教: <span class="religion">' + country[country_code] [3] + ' %</span>';
				popStr += '<br>無宗教: <span class="religion">' + country[country_code] [4] + ' %</span>';
				popStr += '<br>ヒンズー教: <span class="religion">' + country[country_code] [5] + ' %</span>';
				popStr += '<br>仏教: <span class="religion">' + country[country_code] [6] + ' %</span>';
				popStr += '<br>民間信仰: <span class="religion">' + country[country_code] [7] + ' %</span>';
				popStr += '<br>ユダヤ教: <span class="religion">' + country[country_code] [8] + ' %</span>';
				popStr += '<br>その他: <span class="religion">' + country[country_code] [9] + ' %</span>';
			}
			L.marker([data[7],data[8]],{icon:worldFlag}).addTo(map).bindPopup(popStr);
		}
	}
}

国旗の表示については、以下を参照。