2016年11月5日土曜日

VBA から WIA Object を使って Exif 情報を取得

GPS 付きのデジカメで撮った JPG 写真に付加されている Exif 情報を取り出したいと思って、最近手を出し始めた Python を使うことを考えたのですが、これは仕事上必要な処理になるので、不慣れな Python で不安定なプログラムを書くより、使い慣れた VBA でどうにかならんかな?と考えていたら、こんな素晴らしいものがあることが分かりました。

WIA Object
Access(or Excel) で参照設定すれば使えます。
参照するライブラリの名前は Microsoft Windows Image Aquisition Library です。
私の環境には、 V2.0 が入ってました。( Office 2010 の Access14)

Sub GetExif()
  Dim ObjWia As Object 'WIA.ImageFile
  Set ObjWia = CreateObject("Wia.ImageFile")
    ObjWia.LoadFile "C:\Users\USER\Downloads\P12345.JPG"  '対象の写真ファイル

  On Error Resume Next
  For Each p In ObjWia.Properties
    i = i + 1
    V_ID = p.PropertyID
    V_Name = p.Name

    If p.PropertyID = 2 Or p.PropertyID = 4 Then
      V_Value = p.Value(1) + p.Value(2) / 60 + p.Value(3) / 3600  'ID=2=緯度 ID=4=経度
    Else
      V_Value = p.Value
    End If
   
    Debug.Print V_ID & " " & V_Name & " " & V_Value
   
  Next
  On Error GoTo 0
 
  Set ObjWia = Nothing
End Sub


イミディエイトウィンドウ
----------------------------------------------------------
PropertyID PropertyName PropertyValue
271 EquipMake Panasonic
272 EquipModel DMC-TZ40
274 Orientation 1
282 XResolution 180
283 YResolution 180
296 ResolutionUnit 2
305 SoftwareUsed PPP
306 DateTime 2016:11:06 11:59:33
315 Artist
531 YCbCrPositioning 2
33434 ExifExposureTime 0.025
33437 ExifFNumber 3.3
34850 ExifExposureProg 2
34855 ExifISOSpeed 400
34864 34864 1
36864 ExifVer
36867 ExifDTOrig 2016:11:06 11:59:33
36868 ExifDTDigitized 2016:11:06 11:59:33
37121 ExifCompConfig
37122 ExifCompBPP 4
37380 ExifExposureBias 0
37381 ExifMaxAperture 3.4453125
37383 ExifMeteringMode 5
37384 ExifLightSource 0
37385 ExifFlash 16
37386 ExifFocalLength 4.3
37500 ExifMakerNote
40960 ExifFPXVer
40961 ExifColorSpace 1
40962 ExifPixXDim 4896
40963 ExifPixYDim 2752
20545 20545 R98
20546 20546
41495 ExifSensingMethod 2
41728 ExifFileSource 3
41729 ExifSceneType 1
41985 41985 0
41986 41986 0
41987 41987 0
41988 41988 0
41989 41989 27
41990 41990 0
41991 41991 2
41992 41992 0
41993 41993 0
41994 41994 0
42016 42016 e97cd362db94a78a0000000000000000
0 GpsVer
1 GpsLatitudeRef N
2 GpsLatitude 36.0319055555556
3 GpsLongitudeRef E
4 GpsLongitude 138.210838888889
5 GpsAltitudeRef 0
6 GpsAltitude 0
7 GpsGpsTime
9 GpsGpsStatus A
10 GpsGpsMeasureMode 2
11 GpsGpsDop 1.9
16 GpsImgDirRef T
17 GpsImgDir 45
18 GpsMapDatum WGS-84  
27 27
28 28
29 29 2016:10:22
50341 50341
50898 50898
50899 50899
20507 ThumbnailData
20515 ThumbnailCompression 6
20525 ThumbnailResolutionX 72
20526 ThumbnailResolutionY 72
20528 ThumbnailResolutionUnit 2
513 JPEGInterFormat 5556
514 JPEGInterLength 7219
20625 ChrominanceTable
20624 LuminanceTable
----------------------------------------------------------

元々 GPS 情報が取得できているかどうかの判定に使用したくて探していたんですが、これがあれば、撮影日時やシャッタースピードなどの撮影情報も全部把握できます。
夢が広がりました。

2016年10月25日火曜日

Access から ODBC で SQLServer に接続したら全部 #Deleted と返ってきた

Access から ODBC経由で SQLServer へリンクテーブルを作成したら、特定のテーブルから返ってくる値が全部「#Deleted」になってる。

他のテーブルは問題ないので、ODBCの設定誤りではなさそう。

#Deleted になるのは SQLServer 2008 から対応した Geometry型のカラムを持つテーブルなので、これが怪しい。

色々調べたところ、「Access からの ODBC 接続では SQLServer の bigint 型に対応できない。」ことがわかりました。
しかも回避方法はないらしい。
多分、Geometry型もダメでなんでしょうね。

仕方ないので、 SQLServer 上で Geometry型のカラムを外したビューを作成して、そのビューに対してリンクテーブルを作成することで対応できました。

今回は、Geometry自体は使用しないのと、参照のみで更新しないので、偶然OKかな。

Geometry 自体を使用したい場合は、パススルーなら取ってこれるような感じです。(未検証)

2016年10月6日木曜日

Python から ODBC で SQLServer に接続する

やっと SQLServer 関連の話題に戻ってきました。

と言っても、Python からの接続という、ひねりものです。

最近流行りの Python ですが、噂によるとどうも GIS系に人気とか。
私も GISを使っているので、しかも、本物の業務として2種類+その補完用として QGIS を使っています。
それぞれの GIS でデータをやり取りするうえで、色々バッチ処理とかしたいこともあり、 Python でなんとかなならないかなと考えています。

業務で使う GIS 2種類の中には、 ArcGIS は入ってないんですよね。
どれもマニアックなのばかり。

そのうちの一つは、SQLServer の Geometory フィールドを使っています。

なので、これを直接 Python で読み込んで、Shape ファイル等に出力できれば、希望のバッチ処理ができるかも。

とりあえず、ネットを彷徨って、その名も PyODBC というのがあることを発見。
これを Python のスクリプトで Import してしまえば、あーら不思議、簡単に接続できてしまいました。

今のところ、 Local のSQLServer に対して、 Windows認証での接続ですけどね。
ODBC で接続できてしまえば、あとは Python ほどのスクリプト言語なら少々なんでもできるでしょう。

どなたか、 Geometry型のフィールから ShapeFile に一発で出力できる方法をご存知の方いらっしゃいませんでしょうか?


2016年10月3日月曜日

初代 CANON EOS Kiss は5Vでは動かない

以前に、初代 EOS KISS がUSB給電で動くか?という実験をして、見事「動かない。」という証明をしましたが、写真を追加しておきます。


外部電源用のケーブル取り出し口からUSBケーブルを出してます。



給電はできませんでしたが、普通にバッテリー駆動で、スマホからOTGケーブルを使って、リモート撮影はできました。

普通のUSBケーブルは、パソコン側(A型)の平べったい端子からプリンターなどに挿す(B型)四角っぽい端子の組み合わせが一般的です。
この場合、パソコンがホストとなります。

もしくは、スマホの充電ケーブルのように、充電器側(A型)からスマホ側(Micro-B型)ですね。
この場合は、充電器がホストとなります。

基本的には、流れがホスト→ゲスト(パソコン→プリンターや、充電器→スマホ)のようにある意味一方通行です。

OTGケーブルとは、本来、ゲスト側であるはずのスマホをホスト側にするものです。
ホスト側(Micro-B)とゲスト側(Mini-B)という組み合わせになります。

内部の結線状況も違います。
通常のMicro-Bタイプの結線は、4番ピンがフリー(何も結線されていない。)ですが、OTGケーブルは、この4番ピンと5番ピンがショートしています。
これでスマホ側がホストと認識します。

EOSをリモートするアプリについては、また後日。






2016年10月1日土曜日

ポチガー取り付け完了

あとは内貼りを元通りに取り付ければ完成です。

作業中いろいろ写真を撮ったつもりですが、全然いいのがなかったです。
とりあえず、載せておきます。何かの参考になれば。










取り付け完了
これはすごく便利です。日産系には標準装備されているようですが、なぜトヨタ系にはないのでしょうね。ぜひ採用してほしいと思います。

ポチガー取り付け その4

あとは説明書に従って配線していくだけです。

配線はたった4本で、そのうち2本はポチガーのスイッチ部分の線に接続するだけなので、車体自体に接続するのは、残り2本だけ。簡単です。
右手で持っているのがユニット部分です。
配線は全てエレクトロタップです。
エレクトロタップについて詳しく説明しているページを見つけましたので、URL貼っておきます。
http://www.diylabo.jp/basic/basic-30.html

ポチガーユニットの配線をそのまま使うと、ドアロックモーターに接続する線がちょっとだけ長さが足りません。
ポチガー製造者の方はもうちょっとだけ長い仕様にしておいてもらうと助かるのですが。

この足りない分は、ポチガースイッチに配線されている、黒赤の配線が余るので、適当な長さに切って、流用します。黒赤を分離して、赤側を使う方が、後々なにか異常が発生したときに追いやすいと思います。

これらの車体側の配線は全部カプラーがあるので、ほんとはポチガーをカプラーオンで作ってもらえればエレクトロタップという不安定な配線をしなくても、簡単に完成するんですが、トヨタの純正カプラーは高いので、仕方ないですね。

ポチガー取り付け その3

ドアノブ部分にポチガースイッチを取り付けます。

取り付け「その1」で取り外したところに、購入したポチガースイッチをはめて、元通りトルクスネジで止めます。

配線は、スピーカー部分にドアロック用ワイヤケーブルが2本出ていますので、その隙間を使って外に出します。

スピーカーは、黒い外枠に固定されていて、ネジロックされています。
そのネジは触らずに、黒い外枠ごと外します。ネジ3本外すだけです。

ドアノブ部分から落としてきたポチガースイッチの配線を探って、室内側に出したら、スピーカー土台を元通りに戻します。