ラベル Python の投稿を表示しています。 すべての投稿を表示
ラベル Python の投稿を表示しています。 すべての投稿を表示

2025/05/28

【Python】foliumでGoogleMapsや航空写真を表示する方法

過去に似たようなfoliumの使い方の記事を何本か書いていますが、今回はGoogle MapsなどGoolge系を中心に背景地図として重ねる方法をまとめておきます。

 
 ⚠️ 注意
本記事では、Google Maps系の地図タイルを foliumに読み込んで表示する方法を紹介していますが、これらのタイルURLはGoogleが公式に公開しているものではありません。今回の方法はあくまで個人の検証・学習・備忘録用として記録しており、自己責任での利用を前提としています。公開用途や商用利用には適さない点をご注意ください


Google Mapsの背景地図タイルURL一覧

表示モード タイルURL(tiles= に指定) 説明
Google Maps https://mt1.google.com/vt/lyrs=m&x={x}&y={y}&z={z} 通常の地図表示
Google Satellite https://mt1.google.com/vt/lyrs=s&x={x}&y={y}&z={z} 航空写真
Google Hybrid https://mt1.google.com/vt/lyrs=y&x={x}&y={y}&z={z} 航空写真 + ラベル
Google Terrain https://mt1.google.com/vt/lyrs=p&x={x}&y={y}&z={z} 地形図(陰影・地勢)
Google Maps系のタイルは通常、ズームレベル 0〜18 に対応しているみたいです。


サンプルコード



foliumで使う場合の操作制限について

foliumでGoogle Maps系のタイルを表示する場合、Google Maps公式のような細かい操作はできません。
  • 背景地図は静的なタイル画像を重ねているだけなので、マップ上のオブジェクトをクリックして情報取得やルート検索はできません。
  • ズームやパンはfolium(Leaflet)が対応しますが、Google Maps特有のストリートビューや動的情報の表示はありません。
  • マーカーやポップアップはfoliumで自由に配置できますが、Google Mapsのような豊富な連携機能はありません。

これらの点を理解したうえで、用途に応じて使い分けるのがおすすめです。
Google Mapsのようなインタラクティブな地図体験を期待する場合は、Google Maps APIなどの公式ライブラリを利用しましょう。


関連記事

2023/05/04

【Python】画像ファイルのPDF変換を並列処理で高速化する

これまでに何度も画像ファイルのPDF変換の記事を書いてきたのですが、これまでの変換プログラムの中で最も高速かつ簡単に動作していたのは、「img2pdf」でした。
img2pdfの使い方や速度比較などは、下記の過去記事にて紹介していますのでご参照ください。


これまで記事を作成する中で得られた経験から、concurrent.futuresで並列処理を実装すると、(動かすマシン次第ですが、)処理速度が結構早くなる可能性が見えてきました。
本記事では、並列処理を実装することでimg2pdfの処理速度を超えることを目指した結果をご紹介します。

本記事では、下記の三通りの比較を行います。
  • Method1: img2pdfを使用する
  • Method2: pikepdfとPillowを使用する
  • Method3: Method2をconcurrent.futuresで並列処理
前回までの記事と同様に、書籍をスキャンしたpngファイル(連番ファイル名)群を、pdfに変換することを想定しています。

実行環境は、以下の通りです。
MacBook Air(8コアCPU、10コアGPU、16コアNeural Engine搭載Apple M2チップ, 16GBメモリ)
------
Python 3.10.10
img2pdf 0.4.4
pikepdf 7.1.1
Pillow 9.3.0

Method1 : img2pdfを使う


Method2: pikepdfとPillowを使用する


Method3: Method2をconcurrent.futuresで並列処理

ライブラリとして、下記のようにpic2pdfという名前で整理しました。
一部の関数はimg2pdfのように動かせます。

10個の異なるpng画像ファイル群での出力ファイルサイズと実行時間の比較は、以下の通りです。


まとめ

今回作成したMethod2やMethod3による出力は、img2pdfで作成したPDFと完全に同じサイズのPDFにはなりませんでした。 img2pdfはロスレスらしいので、今回作成したものとは異なる処理でロスレスを実現しているみたいです。
なので、Method2やMethod3による出力はロスレスではなく、注意が必要です。

Method2は、img2pdfのソースコード(4000行超)と比較すればかなりシンプルに書くことができましたが、変換処理に2~3倍時間がかかっています。
それをconcurrent.futuresで並列処理を実装して、力技で高速化したのがMethod3です。あくまで、私の環境での計測結果になりますが、Method2よりも5倍以上早くなっています。
結果的に、img2pdfと比較して、半分程度で処理されるようになりました。また、プログレスバーを実装したので、処理時間が長い場合でも処理が動いていることが分かるようになりました。

今後も改良を重ねて、行こうと考えているので気になる方はGithubの方をチェックして下さい。

下記のようなPDF変換用のプログラムも作成していますので、今回の成果は、こちらで使用しようと考えています。

2023/03/17

【Python】自作のPythonパッケージをPyPIに登録しました!

今回は、自作のPythonパッケージをPyPIに登録することができたので報告したいと思います。

作成したパッケージは、以前の記事などで、作ってきたものを拡張したもので、自炊した漫画の画像ファイルをpdfに変換するためのプログラムです。別の記事で作ったePubからpdfに変換するプログラムも組み込んでいます。

PyPIへの登録手順は、他のサイトでも紹介されているため、ここでは割愛します。詳しい手順は、参考記事などをご確認ください。

参考記事:
setup.pyファイルの書き方も初めてだったので、ドキュメントを読みながら苦労しました。結局、setup.pyファイルでミスをしてしまい、PyPIにファイルをあげて直ぐに更新版をリリースすることになってしまいました。
似たような名前のパッケージがすでに登録されていることもあるので、パッケージ名を考えるところが難しいかもしれません。

今回、私が登録したPythonパッケージのソースコードは以下のGitHubリポジトリで閲覧することができます。また、改良のアイデアやバグ報告などがあれば、Github上でIssueを立てていただければ幸いです。

2023/02/14

【Python】foliumでGoogle Mapのマーカーアイコンを表示する

以前もfolium関連で似たような記事を書きましたが、今回は別の機能を試してみます。

folium.features.CustomIcon()は、自作のアイコンなどを表示するための機能ですが、自前の画像でなくても指定できるようなので、Googleがホストしているアイコン画像を試してみました。
また、今回の記事からGithub Gistを使って、コードだけでなく、実行結果のマップのhtmlを記事に埋め込んでいます。過去の記事の一部も書き換えました。

参考: 実装例: 実行例:

注意点:ループを使用して、複数点に同じカスタムアイコンを設定する際には、ループ内でカスタムアイコンを初期化する必要がある。

参考:
Google Chart APIで数字のアイコンを設定した例:
二桁までの数字なら問題なく表示できそうです。
実行例:

2023/01/07

【Python】複数枚のPNG画像をJPEGに圧縮してPDFに変換する

過去に何度もimg2pdfを利用した複数画像からPDFへの変換を記事にしていますが、本記事ではPNG画像をJPEG画像に圧縮してからPDFに変換する方法を試します。
PNG画像とJPEG画像の特性については解説しませんが、PDFにした時のファイルサイズの削減が目的です。 変換処理を挟むので、処理時間が増加しますがファイルサイズ低減のメリットが大きければ採用する価値があると思います。
以前の記事に倣って、またいくつかの手法を比較しました。

実行環境は、以下の通りです。
------
MacBook Air (M2, 2022, メモリ:16 GB)
Python 3.10.9
img2pdf 0.4.4
Pillow 9.3.0


Method1 : 画像変換によって圧縮してからPDFにする(PNG画像→JPEG画像→PDF):本記事のタイトルの手法

Method2 : img2pdfをだけ使う(PNG画像→PDF, ロスレス):以前の記事の中で書いたもの

Method3 : Pillowだけを使う(PNG画像→PDF, 圧縮):以前の記事の中で書いたもの

Method4 : Pillowだけを使う(PNG画像→PDF, 圧縮):Method3をconcurrent.futuresで並列化(Method1でもconcurrent.futuresを使用して並列化による高速化を試したため比較)

10個の異なるpng画像ファイル群での出力ファイルサイズと実行時間の比較は、以下の通りです。

Method1とMethod2の比較から分かりますが、JPEGに一度変換することでファイルサイズが小さくなり、処理速度も上がっています。
Method3とMethod4では、ファイル変換処理は同じなので当然出力ファイルサイズは同じですが、Method3とMethod4の比較から並列化の効果が分かります。今回使用した環境では、だいたい半分の時間で処理できています。


img2pdfで扱えないアルファチャンネルのある透過PNG画像も、Method1を使えば取り扱えそうです。

2022/12/16

【Python】画像のみの固定レイアウトのePubをPDFに変換する

だいぶ前から漫画などの固定レイアウトEpubを目次付きPDFに変換するプログラムをPythonで作りたい、ということで色々と検討してきました。 前回前々回の記事で紹介した内容になりますが、PythonのライブラリのEbookLibimg2pdfが使い勝手が良さそうだということがわかりました。

そこで本記事では、流行りの「ChatGPT」に、プログラムを作成してもらいました。
「画像のみの固定レイアウトepubを、PDFに変換するプログラムをPythonのebooklibとimg2pdfを使って作成してください」とチャットに送信した結果、以下の動画のようになりました。実際には、複数回実行して、ある程度欲しい結果になるまで繰り返し実行しています。



ChatGPTに何回か出力させたプログラムを組み合わせて、さらに足りてない部分などを加えて、修正したものが以下になります。


かなり実行速度が速く、体感的には一瞬で変換してくれました。まだ、目次の移植や右綴じへの変換などは出来ていないので、追々検討しようと思います。

ChatGPTが、吐き出したプログラムが実際には動かないプログラムというケースもありますが、今回の事例では良い精度で実行したい内容を動くプログラムにしてくれたので驚いています。 今後は、知りたいことを検索エンジンで似たようなことをやっている記事を探すのではなく、チャットで正解例を教わるような時代になるのでしょうか?
今後の進展が気になります。

追記:2022/12/18
pikepdfで右綴じにする部分を追加しました。

追記:2023/01/09
ePubからの目次を移植する部分を追加しました。
追追記:2023/02/24
Ebooklibを使わずに、BeautifulSoupを使うバージョンを作成しました。
コマンドライン実行を想定していて、綴じ方なども指定できるように変更しました。


今後は、逆に画像のみのPDFから固定レイアウトのePubへの変換プログラム作成に取り組みたいと思います。

2022/11/22

【Python】DEMデータをvtkに変換して、ParaViewで表示する

ParaViewは、2次元・3次元データの可視化のためのオープンソースソフトウェアです。可視化機能が強力でフリーで使えるため人気があります。
Pythonの可視化ライブラリには、matplotlibやplotlyなどがありますが、基本的には2次元までデータの可視化向きで、3次元データの可視化にはParaViewを使った方が動作も軽いです。

本記事では、以前の記事と同様に、国土地理院の基盤地図情報(数値標高モデル)のDEMデータから変換したGeoTIFFを用いました。DEMデータの結合方法やGDALの導入については、本記事でも割愛します。
また今回は、3次元表示に当たり軸の単位が揃っていた方が都合が良いため、GeoTIFFへの変換時にUTM座標に変換したデータを用いました。

実行環境:MacBook Air(M2、2022、メモリ:16GB)

ParaViewでは、GeoTIFF形式のDEMデータも読み込めるようですが、下記の例では、DEMデータの指定範囲での切り出しや解像度変更、vtk(Visualization Toolkit)形式への変換を試しました。

スクリプト例:

出力例:Scaleの設定からZ軸方向を10倍に強調
参考:

また、以下のようにカラーマップを作成すると好きなカラーマップを追加できます。

スクリプト例:前回の記事と同様にwiki-schwarzwald-contを設定

出力例:
関連記事

2022/08/08

【Python】PDF内の表をExcelに変換する

本記事のタイトルの内容で検索して出てくるのは、tabula-pyを使用した例が多いです。tabula-pyは、Javaのライブラリのラッパーであるため、Javaのインストールや設定が必要とのことで、どうにかtabula-pyを使わずにやる方法がないか検討しました。

そこで思いついたのが、以前紹介したwin32comを使用する方法です。win32comを使うことで、Microsoft Officeを操作できるため、Pythonから下記の動作を実行することができます。
  1. PDFファイルをWordで開く
  2. 表を選択してコピー
  3. Excelに貼り付け、名前をつけて保存
これで、PDF内の表をExcelファイルに変換する作業の自動化が可能です。xlsxにした後は、Pandasで読み込むなど自由に操作可能です。


注意 : 使用できる環境等に条件があります。
  • win32comを使用するため、WindowsにMicrosoft Officeがインストールされている環境であること
  • PDFファイルの「セキュリティ設定」でコピーが禁止されていないこと
参考:

2022/06/19

calibreで出力したepubをKindleGenで処理できるように再変換する

以前の記事でKindleGenなどの使い方を紹介しましたが、Kindleもepub対応するとニュースになっていました。メール転送でepubが使えるようになるだけみたいなので、個人的にはもうしばらくはKindleGenも使って行きたいと思っています。

電子書籍管理ソフトウェアの「Calibre」で変換したepubが、KindleGenで変換できないケースがあります。Calibreでmobiなりazw3なりに変換すれば良いのでしょうが、設定が正しくないためか、レイアウトが崩れ表示が壊れるケースに見舞われたので、Pythonで変換スクリプトを書きました。

と言っても、画像中の左のファイル構成になっているものを、右のファイル構成に変換するのが主な処理です。万能なコードではなく、KindleGenが上手く処理できない一部のケースのみに対応しているので、ご留意ください。

日本語の縦書き書籍(漫画などではない)を想定しており、スタイルシートは、「電書協 EPUB 3 制作ガイド ver.1.1.3 2015年1月1日版」から一部のファイルをコピーして使用しています。事前にダウンロードして解凍して同一階層に必要なファイルを置いてください。


バグ等もあるかと思いますので、参考程度にご利用いただけると幸いです。

関連記事

2022/03/20

【Python】foliumで複数の地図タイルを切り替えて表示する方法

以前、「【Python】foliumで地質図を表示する方法」という記事を書きましたが、実用していく上で、地図タイルを切り替えられると便利だなと思い当たりました。

本記事では、複数の地図タイルを切り替えて表示する方法を紹介します。

以前の記事で紹介した地理院地図のタイルとシームレス地質図のタイルを例として、地図タイルの切り替えを行います。

出力結果


関連記事

2022/03/15

【Python】pptx形式のPowerPointファイルからテキストデータを抽出する

PowerPointファイルからテキストデータを抽出することで、テキストマイニングや文書ファイルの検索といった応用が可能になります。
本記事では、pptx形式のPowerPointファイルからテキストデータを抽出するPythonスクリプトについて、三種類の手法を比較して紹介します。

python-pptxを使用する


python powerpoint テキスト 抽出」などで検索してよくヒットするのが、「python-pptx」を使用する方法です。
python-pptxは、pptx形式のPowerPointファイルを操作できるpythonライブラリで、Pythonによるスライド作成の自動化などの記事をよく見かけますが、作成だけでなく読み取りも可能です。
注意点として、読み取り・書き込みパスワードや権限が設定されている場合は利用出来ないという問題があります。また、「x」のついていない方の.ppt形式のPowerPointファイルは開けないので、何らかの方法で.pptxに変換する必要があります。

例1:

Pythonの標準ライブラリを使用する


Office 2007 以降で保存可能になった.docx, .xlsx, .pptx といった拡張子のOfficeファイルは、XMLファイルなどをzip圧縮したものです。したがって、「re」や「zipfile」、「xml.etree.ElementTree」といった標準ライブラリだけを用いて読み取ることができます。
python-pptxを使用する場合と同様に、読み取り・書き込みパスワードや権限が設定されている場合はzipが解凍できないため利用出来ないという問題があります。また、.ppt形式の場合も、zipファイルではないので開けません。
ライブラリを追加したくない場合などはこの手法が使えると思います。

例2:
参考:

pywin32(win32com)を使用する


Windows環境で実行するという条件がつきますが、この方法であればパスワードや権限が設定されているPowerPointファイルからもテキストが取り出せます。win32comとかPyWin32とかPython for Windows extensionsとか呼ばれているライブラリを用いる方法です。
VBAで操作することに慣れている場合は、細かいところまで手が届くので良いかと思います。この方法だと、PowerPointのアプリケーションを経由して情報が抽出されるので、PowerPointアプリにアカウント設定がされていれば、権限設定のある.pptx形式のみならず、.ppt形式のPowerPointファイルの場合も操作可能です。
問題として、WindowsPowerPointアプリのインストール・設定が必要となるので、環境構築の手間がかかります。

例3:
参考:

win32comを使用することで、.pptファイルを.pptxファイルやpdfに変換することもできるので、上記の手法などと組み合わせて使うというのも一つの手かもしれません。

ここまで紹介した例では、「ノート」の中身のテキスト抽出について触れていませんでしたが、やり方を紹介されている方を見つけたのでリンクを掲載させていただきます。


関連記事:

2021/09/14

【Python】matplotlibでDEMデータを表示する

国土地理院の基盤地図情報(数値標高モデル)などのDEMデータをその他のデータと組み合わせてmatplotlibでプロットしたい時に使えそうなプログラムが出来たので公開します。
例で使用したDEMデータは、国土地理院からダウンロードしたデータを予め結合したGeoTIFFを使用しています。
また、GeoTIFFの読み込みには、GDALを使用しています。

DEMデータの結合方法やGDALの導入については、色々なサイトで公開されているので、検索してください。本記事では、割愛します。
matplotlibでの標高塗り分けが本記事の中心部分となります。matplotlibのterrainでの塗り分けで満足出来ない場合にご活用いただければ幸いです。


スクリプト例


出力例


matplotlibのカラーマップに好みのものがなかったので、ArcGISっぽい?カラーマップを外部サイトから読み込んで使用しています。
カラーマップのファイルは、ローカルから直接読み込んで使用した方が良いと思いますので、上記のコードを利用される際はファイルをダウンロードして、コードを書き換えてください。


関連記事

2021/08/06

【Python】複数画像をPDFに変換する方法の比較

以前も、複数画像をPDFに変換する方法に関して、img2pdfの紹介記事を書いたのですが、img2pdfやそれ以外の手法での実行時間やファイルサイズなどを比較してみました。

本記事では、img2pdfを用いてpdfにする方法と、reportlabとPillowを組み合わせる方法、Pillowのみを使う方法の三種類を比較した結果を紹介します。

実行時間は、実行環境などで変わるため、あくまで目安です。計測に関しても、Jupyter Lab上で、実行した結果であり、複数回測って平均をとるというような厳密なことはしておりません。

実行環境は、以下の通りです。

MacBook Pro 13-inch (2017)
------
Python 3.8.11
img2pdf 0.4.1
reportlab 3.3.0
Pillow 8.1.0

下記のスクリプトは、いずれも書籍をスキャンしたpngファイル(連番ファイル名)を、pdfに変換することを想定しています。

Method1 : img2pdfを使う

Method2 : reportlabとPillowを組み合わせる

Method3 : Pillowだけを使う


10個の異なるpng画像ファイル群での実行時間と出力ファイルサイズの比較は、以下の通りです。


img2pdfを用いた方法は、実行時間(変換にかかる時間)が特に短いです。 出力されたpdfファイルサイズは、pngファイルの合計サイズよりとほぼ同じサイズになっており、pngファイルを複雑に処理していないことが伺われます。 img2pdfに関して、残念なのはアルファチャンネルのある透過pngに対応していない点です。事前に処理しておいてね、という仕様となっています。


reportlabとPillowを組み合わせる方法ですが、実行時間が特に長く、画像のみのpdfを作るのであれば、reportlabを組み合わせる必要はないかなと感じました。


Pillowだけを用いる方法は、入力ファイルによって結果がばらついていますが、基本的にはファイルサイズが圧縮されています。リサンプリングしているため実行時間が伸びますが、この方法では、qualityの値を調整することでファイルサイズをさらに圧縮することも可能なので、ファイルサイズを調整したい時には良い方法だと思います。
ただし、img2pdfのように、見開きの設定など複雑なことはできないようなので、割り切って使うか他のツールと組み合わせる必要があります。


追記:2022/12/09
PyMuPDFを使って、変換する方法が分かったので追加しました。実行速度などは測っていません。

Method4 : PyMuPDFを使う

参考:

Method5 : borbを使う

borbを使って変換することも出来ましたが、v2.1.7では画像をPDFにする際に自動でOCR処理をするようで変換処理が遅いです。OCR処理をスキップ指定できる方法が分かれば更新します。基本的には余白が自動で入る設計で、このような変換は想定していないと思われます。
続き

2021/05/10

【Python】foliumで地質図を表示する方法

 先日「【Python】foliumで活断層を表示する方法」という記事を書いたばかりですが、今回もfoliumネタです。

foliumは、LeafletというJavaScriptライブラリをPythonから使える様にしたものですので、地図タイルとして様々な地図が利用できます。有名どころでは、国土地理院の地理院地図の地理院タイルなどがあります。そのほかにも、foliumにビルドインされている地図もあります(参考)。


本記事では、日本シームレス地質図を地図タイルとして使う際のサンプルコードを掲載します。

出力参考:


地理院地図を使う際のサンプルコードも併せて掲載します。

出力参考:


地理院タイルでは、ズームレベルの制限などもありますが、英語版や土地利用図、火山基本図、衛星画像など様々なタイルが公開されています。

利用にあたっては、承認などが必要な場合もある様ですのでご注意下さい。

参考:「国土地理院の地図の利用手続

関連記事

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関連のライブラリは、多い様で、PyPDF2ReportLabなどを使用した例の記事が多数ヒットしますが、これらのライブラリの更新はしばらく行われていない様です。

img2pdf

最近、img2pdfというライブラリが手軽かつ画像の再変換無しに使えるということで、日本語の紹介記事が多数書かれています。img2pdfでは、pdfの処理にpikepdfpdfrwが用いられている様です。また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 APIGoolge 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の仕様がまとまっているので開発の上で役に立つかと思います。

続き

2020/01/11

【Python】バリオグラムマップを計算する

以前の記事では、等方性(isotropy)バリオグラムをPythonで計算するプログラムを書きましたが、今回は、異方性 (anisotropy)を考慮したバリオグラムを計算し、バリオグラムマップを描画するプログラムを書きました。

空間自己相関が方向によって変化する時、データには異方性がある状態です。この場合、バリオグラムは距離のみの関数でなく、距離と方向の関数となります。
今回のプログラムでは、複素数を使って、データ間の距離と方向を求め、異方性バリオグラムを計算しました。
バリオグラムマップでは、異方性を直感的に表示することができます。


デモファイルに対する実行結果