2021/05/08

【Python】foliumで活断層を表示する方法

昔書いた記事ですが、「Google Earth上に活断層を表示する方法」にそこそこアクセスがあるので、同様に、産総研が公開している活断層データベースのkmzファイルをfoliumを使って表示するプログラムを書いたので公開します。

kmzを開いて、kmlの中身をPolylineとして表示するプログラムとなっています。

kmzファイルの仕様を確認して作成したわけではないので、kmzファイルによってはそのまま使用できないと思いますが、参考になれば幸いです。



出力参考:


関連記事

2020/08/26

【Python】img2pdfを使って複数画像をPDFに変換する

前回からだいぶ時間が経ちましたが、目標である「漫画などの固定レイアウトEpubを目次付きPDFに変換するプログラムを作る」を達成するため、今回は前段階として、Pythonで連番を付けた複数画像ファイルをPDFに変換する方法を検討しました。

PythonのPDF関連のライブラリは、多い様で、PyPDF2やReportLabなどを使用した例の記事が多数ヒットしますが、これらのライブラリの更新はしばらく行われていない様です。

img2pdf

最近、img2pdfというライブラリが手軽かつ画像の再変換無しに使えるということで、日本語の紹介記事が多数書かれています。img2pdfでは、pdfの処理にpikepdfやpdfrwが用いられている様です。またpikepdfは、Python3.8にも対応するなど積極的に更新されています。

参考リンク


ただ、簡単に変換するという目的以外の細かい設定を解説しているサイトが見つからなかったので、少し細かい設定を試してみました。
画像ファイルは、左からゼロ埋めしたファイル名になったもの(001.png, 002.png, ...)を使用しました。
img2pdfを用いてタイトル、作成者、およびキーワードなどのプロパティを設定したPDFが作成可能です。

また、見開きや表示倍率、フルスクリーン表示などの設定もできます。

img2pdfをコマンドラインから使う際は、見開きなどの設定ができますが、img2pdf(version 0.4.0)のconvert関数を使うと上手くいかず手こずりました。

上記の通り、parse_layout関数を通すなどすると動きました。
恐らくバグだと思いますが誰もこの機能を使っていない為、指摘されていないのかも知れません。

問題点:TwoPageRight、TwoPageLeftに対応していない

ページレイアウトは、現在(img2pdf version 0.4.0)では
single:「単一ページ」に相当
onecolumn:「連続ページ」に相当
twocolumnright:「連続見開きページ(表紙)」に相当
twocolumnleft:「連続見開きページ」に相当
にしか対応していません。

img2pdf.py(「PageLayout」に関する部分)を少し書き換えれば、
TwoPageRight: 「見開きページ(表紙)」に相当
TwoPageLeft: 「見開きページ」に相当
にも対応されることができます。

問題点:R2L (右綴じ)に対応していない


pdfrwは対応している様なので、こちらとの併用が必要になるかと思います。

追記:2022/12/09
pikepdfで右綴じ変換のプログラムを作成されている方がいらっしゃったので、リンクを貼ります。

続き

2020/08/17

【Python】Google People API でGoogle連絡先と住所録CSVを同期する

前々回、前回とサラミした記事になってしましましたが、Google People APIを使って住所録のcsvをGoogle連絡先に同期するプログラムが完成したので公開します。
これまで作成したコードを利用していますので、仕様が分からない時は、これまでの記事を参照下さい。

sample.csvについて

Fake Name Generatorや疑似個人情報データ生成サービスで作成した偽個人情報です。
たまたま実在する人物になっている可能性は低いと思いますが、利用の際はご留意ください。
Google CSV形式に近づけてありますが、微妙に間違っているかもしれません。create_contact_bodyの関数を弄れば、好きなCSV形式に対応できます。

同期方法について

userDefinedに修正日と住所録内のidを設定することで、更新差分を判定しています。

問題点:credentials.jsonの流用

credentials.jsonがQuickstart.pyのものを流用したプログラムとなっているので、アプリケーション名などが正しく設定できていません。今後、設定の仕方が分かれば更新したいと思います。
とりあえず動かす分には現状で問題ないはず...

【関連記事】

2020/06/20

【Python】Google People API でGoogle連絡先の追加/削除する

前回に引き続き、Google People APIを触ってみます。
会社のデータベースや年賀状作成ソフトから出力した住所録のcsvをGoogle連絡先に同期させることを目標として設定しました。
本記事では、csvのファイルを読み込んで、Google連絡先に追加する部分を作成したので公開します。

住所録のcsvファイルの構成は、色々あるかと思いますが、Google連絡先からエクスポートされる際にも使用されているGoogle CSV 形式に事前に合わせてあると仮定して、プログラムを作成します。

Google CSV 形式について

Google CSV形式は恐らく以下のような構成になっているかと思います。

各列名各列の説明
Name氏名
Given Name名
Additional Nameミドルネームなど
Family Name姓
Yomi Name氏名のよみがな
Given Name Yomi名のよみがな
Additional Name Yomiミドルネームなどのよみがな
Family Name Yomi姓のよみがな
Name Prefix敬称(名前の前);Mr.やMrs.、Dr.など
Name Suffix敬称(名前の後);様、先生など
Initialsイニシャル
Nicknameニックネーム
Short Nameショートネーム
Maiden Name旧姓
Birthday誕生日
Gender性別
Location
Billing Information請求情報
Directory Server
Mileage
Occupation職業
Hobby趣味
Sensitivity
Priority
Subject
Notesメモ
Language言語
Photo
Group Membershipグループ
E-mail 1 - TypeE-mail 1の種類;Home、Work、Mobileなど
E-mail 1 - ValueE-mail 1のアドレス
E-mail 2 - TypeE-mail 2の種類;Home、Work、Mobileなど
E-mail 2 - ValueE-mail 2のアドレス
Phone 1 - TypePhone 1の種類;Home、Work、Mobileなど
Phone 1 - ValuePhone 1の電話番号
Phone 2 - TypePhone 2の種類;Home、Work、Mobileなど
Phone 2 - ValuePhone 2の電話番号
Phone 3 - TypePhone 3の種類;Home、Work、Mobileなど
Phone 3 - ValuePhone 3の電話番号
Address 1 - TypeAddress 1の種類;Home、Workなど
Address 1 - FormattedAddress 1の住所
Address 1 - StreetAddress 1の番地・区画
Address 1 - CityAddress 1の市町村
Address 1 - PO BoxAddress 1の私書箱
Address 1 - RegionAddress 1の都道府県
Address 1 - Postal CodeAddress 1の郵便番号
Address 1 - CountryAddress 1の国
Address 1 - Extended AddressAddress 1のアパートの部屋番号など
Address 2 - TypeAddress 2の種類;Home、Workなど
Address 2 - FormattedAddress 2の住所
Address 2 - StreetAddress 2の番地・区画
Address 2 - CityAddress 2の市町村
Address 2 - PO BoxAddress 2の私書箱
Address 2 - RegionAddress 2の都道府県
Address 2 - Postal CodeAddress 2の郵便番号
Address 2 - CountryAddress 2の国
Address 2 - Extended AddressAddress 2のアパートの部屋番号など
Organization 1 - TypeOrganization 1の種類;会社、学校など
Organization 1 - NameOrganization 1の名前
Organization 1 - Yomi NameOrganization 1のよみがな
Organization 1 - TitleOrganization 1での役職
Organization 1 - DepartmentOrganization 1での部署
Organization 1 - Symbol
Organization 1 - LocationOrganization 1の場所
Organization 1 - Job DescriptionOrganization 1での仕事内容
Custom Field 1 - Typeカスタムフィールド(自由に設定可能な領域)
Custom Field 1 - Valueカスタムフィールド(自由に設定可能な領域)
参考:http://googleapis.github.io/google-api-python-client/docs/dyn/people_v1.people.html#createContact

と以上の様に多くの情報が、Google連絡先には登録可能です。
人によっては列の項目がこれよりも多かったりするかも知れませんが、上記の場合のcsvを、インポートするプログラムを組みます。
上記のカスタムフィールドは同期させる時に必要な「修正日」や「住所録内でのID」などを想定しています。
また、CP932やShift_JISで保存されたcsvを想定していません。事前に他のプログラムで処理してあるものとします。

問題点:削除用のバッチ処理コードが実装されていない


一時的に削除用のグループを作成して、そこに削除したい全てのメンバーを移動し、一時的なグループごと削除するという方法が掲示されていました。

しかし、contactGroups.members.modifyでは、連絡先全体(people/me)を指定することができない様なので、結局は、逐次のグループ移動処理が必要になると思います。

前回作成したコードを一部流用して作成したのが以下のものです。

作成したコード

必要なファイル:credentials.json、contacts.csv

以下のページにAPIの仕様がまとまっているので開発の上で役に立つかと思います。

続き

2020/06/19

【Python】Google People API でGoogle連絡先を取得する


Google連絡先の取得、追加、削除などを行うにはGoogle Contacts APIやGoolge People APIが利用できます。
しかし、Contacts APIは、People APIに置き換わっていくそうなので、これからGoogle連絡先と連携するアプリケーションを作成する際はPeople APIの方を用いると良いかも知れません。
個人的な経験ですが、G SuiteのGoogle連絡先を更新する時Contacts APIでは上手く行きませんでしたが、People APIでは更新できました。ですが、今のところ、People APIではContacts APIの機能を全て互換出来ている訳ではない様です…

PythonからPeople APIを使う

Google People APIをPythonから使うためのサンプルコードとしては、公式ドキュメントに記載してあるPython Quickstartがあります。

本サイトでは、会社のデータベースや年賀状作成ソフトから出力した住所録のcsvをGoogle連絡先に同期させることを目標として、プログラムを作成しようと思います。
本記事では、Python Quickstart内のquickstart.pyを元にGoogle連絡先のデータを取得・表示するコードを作成したものを公開します。

People APIの有効化と必要なライブラリのインストール

まずは、Python Quickstartの内容に従って、サンプルコードquickstart.pyが動く状態にします。
下記のコードでは、ここでダウンロードしたcredentials.jsonをそのまま利用します。
また、People APIは、現時点ではPython 2.6以上に対応していますが、Python 2系統はサポートが終了し、Python 3系への移行が推奨されることから、
本サイト記載のコードは、Python 3系環境で実行することを想定しています。

問題点:people.connections.listのpageSizeの上限

公式ドキュメントによると、記事作成時(2019.06.19)時点では、pageSizeは1~1000の間しか設定出来ない様です。(少し前まで上限は2000だった様な…?)
この上限を超える件数の連絡先を取得したい場合は、nextPageTokenを利用すると良い様です。


作成したコード

必要なファイル:credentials.json

以下のページにAPIの仕様がまとまっているので開発の上で役に立つかと思います。

続き