SSブログ
前の10件 | -

Excel 平面直角座標XYからgeojsonファイル作成 [VBA/VBS]

 Excel表で作成された平面直角座標XYのデータをGoogle Mapに簡単に登録することができるGeojson形式にする機会があり、GeoJson fileを作成するExcel VBAを作成してみました。

【使用方法】
ここからExcel(Excel2geojson.xlsm)ファイルをダウンロートする。
・直角平面座標→緯度経度変換(xy2geojsonシート)
 -geojsonファイル名を入力
 -直角座標系を選択
 -X、Y列に入力して「変換」ボタンをオンするとgeojsonファイルが作成される。
・緯度経度座標→直角平面変換(latLng2geojsonシート)
 -geojsonファイル名を入力
 -直角座標系を選択
 -緯度、経度列に入力して「変換」ボタンをオンするとgeojsonファイルが作成される。

【geojsonファイル】
・geojsonファイルはExcelがあるフォルダー内に出力される。
・Excel表の先頭行と最終行の座標値が等しい場合はPolygon、等しくない場合はLinestringとなる。
・geojsonファイルはUTF-8文字コード、改行コードはLF、BOM付きで出力される。

excel2geojson.png
nice!(0)  コメント(0) 

平面直角座標XY⇔緯度経度 変換Excelプログラム [VBA/VBS]

 先日「Excelで写真のExif情報を読み取りKLM ファイルを作成し、GoogleEarthに貼付」で作成したExcelから緯度・経度⇔直角平面座標XY変換の部分のみを抜き取り、緯度・経度を直角平面座標に直角平面座標を緯度・経度に変換するExcelを作成してみました。

【使用方法】
ここからExcel xyLatlngTran.xlsmファイルをダウンロートする。
・平面直角座標→緯度経度変換(xy->latlngシート)
 -直角座標系を選択
 -X、Y列に入力して「変換」ボタンをオンすると、緯度、経度列に出力
・緯度経度座標→直角平面変換(latlng->xyシート)
 -直角座標系を選択
 -緯度、経度列に入力して「変換」ボタンをオンすると、X、Y列に出力

xyLatlngTran.jpg
nice!(1)  コメント(2) 

Excelで写真のExif情報を読み取りKMLファイルを作成し、GoogleEarthに貼付 [VBA/VBS]

 Google Earthに写真のExif情報を利用して写真を貼付るためのkmlファイルをExcelで作成しててみました。

【処理内容】
・Excelで写真(JPEG)を読み込み
・Exif情報を抽出(抽出方法はこちらを参照)
・写真中心座標をExif GPSで取得
・中心座標(緯度・経度)を直角平面座標(XY)に変更(変更はこちらを参照)
・Exif情報の焦点距離(mm)、高度(m)、方向(度)を取得
・Exif情報に高度・方向が無い場合を想定してマニアル入力も可能とする
・イメージセンサー幅(mm)・高さ(mm)をマニアル入力
・焦点距離(mm)、高度(m),イメージセンサー幅(mm)・高さ(mm)から
  写真撮影範囲を計算(計算方法はこちらを参照)
・写真左上座標(XY)、右下座標(XY)を計算(計算方法はこちらを参照)
・写真左上座標(XY)、右下座標(XY)を緯度・経度に変換
 (計算方法はこちらを参照)
・写真左上座標、右下座標の緯度・経度をdoc.klmに書き込み

【使用方法】
ここからklm.xlsmをダウンロードする。
・klm.xlsmを開く
  -イメージセンサ(W x H)mmを入力する(必須)
  -直角平面座標系番号(プルダウン選択)
  -高度・写真傾きがExifに無い場合、補正が必要な場合は入力する
・「写真貼付ボタン」をオンして貼付る写真を選択する
・Excel表に写真、Exif情報が表示されexcelが置いてあるフォルダーに
 doc.klmファイル、filesフォルダーが作成される
 注)高度、撮影方向がマニアルで入力された場合は赤文字で表示される
・作成されたdoc.klm,filesを圧縮プログラムを使用して圧縮して
 {適当な名前.kmz}で保存する
・作成したkmzファイルのダブルクリックでGoogle Earthを起動する。

注意:
・本プログラムはエラー処理を一切していません!

nice!(0)  コメント(0) 

写真からworldfile作成 [Webシステム]

 ドローンから撮影した写真を地図に貼り付ける必要があり、写真(jpeg)からworldfileを作成するwebアプリを作成してみた。今回は説明を簡単にするため、傾き無し(北方向に向かって撮影)、本来worldfileの原点座標は左上隅のピクセルの中心ですが左上隅にしています。

写真から取得するデータ(exif data)
・サブ情報
 - 焦点距離(FocalLength), 画像幅(PixelXDimension), 画像高さ(PixelYDimension)

・GPS情報
 - 緯度(GPSLatitude), 経度(GPSLongitude), 高度(GPSAltitude)

カメラのカタログから
・CMOSイメージセンサー大きさ

計算方法
 ・写真のExif情報はPHPのexif_read_dataで簡単に取得できます。
 ・緯度・経度から平面直角座標XYへの変換は、国土地理院の「緯度、経度への換算」サイトの計算式をPHPで組めば簡単作成できます。VBSの場合はこちらで公開しています。

 ・worldの作製は下図を参照すれば簡単に実装できると思います。
 
worldfile.jpg



nice!(0)  コメント(0) 

Wordpressの管理画面ログインがPHP7.1に変更後500エラー [WordPress]


 先日、Wordpressで運用しているホームページの移行があり、高速化も兼ね同時にPHP7.1 にしました。移行は無事に終了しホームページも問題なく閲覧可能に、しかし、後日ホームページの変更のため管理画面にログインしたところ500エラーでログインできない事態が発生し、頭が真っ白に。
500エラーだけでは何も分からないため、設定ファイルwp-config.phpを以下に変更してエラーを表示。
 define ('WP_DEBUG', false); → define('WP_DEBUG', true);

エラー内容
PHP Warning: Illegal string offset 'remember' in /tmp/wordpress/wp-includes/user.php on line 41

user.phpを解読して自分で修正しようかと思ったが、検索するとWordpress本家に対処方法が載っていました。
 
      $reauth = empty($_REQUEST['reauth']) ? false : true;
  
 -      $user = wp_signon( '', $secure_cookie );
 +      $user = wp_signon( array(), $secure_cookie );
  
        if ( empty( $_COOKIE[ LOGGED_IN_COOKIE ] ) ) {
                if ( headers_sent() ) {

nice!(0)  コメント(0) 

直角平面座標CSVファイルから緯度経度CSVファイルへの一括変換プログラム(VBS) [VBA/VBS]


 csvで作成された大量の直角座標XYを緯度経度に変換する必要があり、国土地理院の「緯度、経度への換算」サイトの一括変換も考えたたが、geojsonへ変換することもあり,Windowsなら他に何もプログラムがなくても動くようにvbsで自作することにしました。
 自作といっても国土地理院の「緯度、経度への換算」サイトの計算式をVBSで書き直しただけですが。。。

ここで公開していますのでお使いください。
【使用方法】
・XY2LatLng.zipを解凍するとXY2LatLng.txtができる
・XY2LatLng.txtをXY2LatLng.vbsに名前変更
・XY2LatLng.vbsにcsvファイルDrag&Dropするだけ
・変換元csvがあったフォルダーに緯度経度に変換された"元ファイル名_LatLng.csv"
 ファイルが作成されます。

【ソース XYLatLng.vbs】
Option Explicit
Dim args, arg, k, FName

Set args = WScript.Arguments
For Each arg In args
	Call MsgBox(arg & "を処理中")
	Do
		k = InputBox("平面直角座標系:" & vbCr & "系番号入力(1から19)")
	Loop While (k < 1 or k > 19)
	
	genLatLng(arg)
	
	Call MsgBox(FName & "_LatLng.csv" & " 書込み完了")
Next

Sub genLatLng(arg)
	Dim fso, pos, PathName
	Set fso = WScript.CreateObject("Scripting.FileSystemObject")

	Dim inputFile
	Set inputFile = fso.OpenTextFile(arg, 1, False, 0)
	
	' パス、ファイル名取得
	pos = InStrRev(arg,".")
	PathName = Left(arg, pos - 1)
	FName = Mid(arg, InStrRev(arg,"\") + 1, pos - InStrRev(arg,"\") - 1)
	
	' 出力ファイル
	Dim outputFile
	Set outputFile = fso.OpenTextFile(PathName & "_LatLng.csv", 2, True)

	Do Until inputFile.AtEndOfStream
		Dim lineStr,aryStrings
		lineStr = inputFile.ReadLine
		aryStrings = Split(lineStr, ",")
		If aryStrings(0) = "" Then
			Exit Do
		End If

		Dim latLngStr
		latLngStr = xy2LatLng(k, aryStrings(0), aryStrings(1))
		outputFile.WriteLine latLngStr
	Loop
	
	inputFile.Close
	outputFile.Close

End Sub

Function xy2LatLng(k, x, y)
	Dim b0, L0
	Select Case k
		case  1
			b0=33.0
			L0=129.5
		case  2
			b0=33.0
			L0=131.0
		case  3
			b0=36.0
			L0=132.1666666666666
		case  4
			b0=33.0
			L0=133.5
		case  5
			b0=36.0
			L0=134.3333333333333
		case  6
			b0=36.0
			L0=136.0
		case  7
			b0=36.0
			L0=137.1666666666666
		case  8
			b0=36.0
			L0=138.5
		case  9
			b0=36.0
			L0=139.833333333333
		case 10
			b0=40.0
			L0=140.833333333333
		case 11
			b0=44.0
			L0=140.25
		case 12
			b0=44.0
			L0=142.25
		case 13
			b0=44.0
			L0=144.25
		case 14
			b0=26.0
			L0=142.0
		case 15
			b0=26.0
			L0=127.5
		case 16
			b0=26.0
			L0=124.0
		case 17
			b0=26.0
			L0=131.0
		case 18
			b0=20.0
			L0=136.0
		case 19
			b0=26.0
			L0=154.0
	End Select

  Const a  = 6378137.0             ' 長半径
  Const F  = 298.257222101         ' 逆扁平率
  Const m0 = 0.9999                ' 平面直角座標系のX軸上における縮尺係数
	Const Pi = 3.1415926535897932

	' 緯度経度をラジアン変換
	Dim radLat0, radLng0
	radLat0 = deg2rad(b0)            ' 座標原点の緯度
	radLng0 = deg2rad(L0)            ' 座標原点の経度

	Dim n
	n  = 1/(2*F-1)
	
	Dim beta1, beta2, beta3, beta4, beta5
	beta1 = n/2 - 2/3*(n^2.0) + 37/96*(n^3.0) - 1/360*(n^4.0) - 81/512*(n^5.0)
	beta2 = 1/48*(n^2.0) + 1/15*(n^3.0) - 437/1440*(n^4.0) + 46/105*(n^5.0)
	beta3 = 17/480*n^3.0 - 37/840*(n^4.0) - 209/4480*(n^5.0)
	beta4 = 4397/161280*(n^4.0) - 11/504*(n^5.0)
	beta5 = 4583/161280*(n^5.0)

	Dim delta1, delta2, delta3, delta4, delta5, delta6
	delta1 = 2*n - 2/3*(n^2.0) - 2*(n^3.0) + 116/45*(n^4.0) + 26/45*(n^5.0) - 2854/675*(n^6.0)
	delta2 = 7/3*(n^2.0) - 8/5*(n^3.0) - 227/45*(n^4.0) + 2704/315*(n^5.0) + 2323/945*(n^6.0)
	delta3 = 56/15*(n^3.0) - 136/35*(n^4.0) - 1262/105*(n^5.0) + 73814/2835*(n^6.0)
	delta4 = 4279/630*(n^4.0) - 332/35*(n^5.0) - 399572/14175*(n^6.0)
	delta5 = 4174/315*(n^5.0) - 144838/6237*(n^6.0)
	delta6 = 601676/22275*(n^6.0)
	
	Dim A0, A1, A2, A3, A4, A5, A6
	A0 = 1 + n^2.0/4 + (n^4.0)/64
	A1 = -3/2*(n - n^3.0/8 - (n^5.0)/64)
	A2 = 15/16*(n^2.0 - (n^4.0)/4)
	A3 = -35/48*(n^3.0 - 5/16*(n^5.0))
	A4 = 315/512*(n^4.0)
	A5 = -693/1280*(n^5.0)

	Dim Sbar, Abar, xi, eta
	Sbar = (m0*a/(1 + n))*(A0*radLat0 + (A1*Sin(2*1*radLat0) + A2*Sin(2*2*radLat0)) + A3*Sin(2*3*radLat0) + A4*Sin(2*4*radLat0) + A5*Sin(2*5*radLat0))
	Abar = (m0*a/(1 + n))*A0
	xi   = (x + Sbar)/Abar
	eta  = y/Abar
	
	Dim xi_d, eta_d, chi, lat, lng
	xi_d = xi - (beta1*Sin(2*1*xi)*cosh(2*1*eta) + beta2*Sin(2*2*xi)*cosh(2*2*eta) + beta3*Sin(2*3*xi)*cosh(2*3*eta) + beta4*Sin(2*4*xi)*cosh(2*4*eta) + beta5*Sin(2*5*xi)*cosh(2*5*eta))
	eta_d = eta - (beta1*Cos(2*1*xi)*sinh(2*1*eta) + beta2*Cos(2*2*xi)*sinh(2*2*eta) + beta3*Cos(2*3*xi)*sinh(2*3*eta) + beta4*Cos(2*4*xi)*sinh(2*4*eta) + beta5*Cos(2*5*xi)*sinh(2*5*eta))
	chi = asin(Sin(xi_d)/cosh(eta_d))

	lat = chi + (delta1*Sin(2*1*chi) + delta2*sin(2*2*chi) + delta3*Sin(2*3*chi) + delta4*Sin(2*4*chi) + delta5*Sin(2*5*chi) + delta6*Sin(2*6*chi))
	lng = radLng0 + Atn(sinh(eta_d)/Cos(xi_d))
	
	lat = lat * (180/Pi)
	lng = lng * (180/Pi)
	xy2LatLng = lat & "," & lng
End Function

Function deg2rad(x)
	Const Pi = 3.1415926535897932
	deg2rad = (x * Pi)/180
End Function

Function asin(x)
	asin =  Atn(X / Sqr(-X * X + 1))
End Function

Function cosh(x)
	cosh = (Exp(X) + Exp(-X)) / 2
End Function

Function sinh(x)
	sinh = (Exp(X) - Exp(-X)) / 2
End Function

nice!(0)  コメント(2) 

JavaScriptの数値計算誤差で悩む(図形の内外判定) [HTML/CSS/JavaScript]

地図上の任意の点があるある特定の範囲内かを判定するスクリプトを、「点の多角形に対する内外判定」をそのまま使用させて戴き、JavaScriptで実装しました。しかし特定の形状時のみ判定結果が間違う結果となることが判明。色々考えたが原因が不明、困ってしまって初心に戻り同じ計算をExcel表にて実施し、順番にJavaScriptとExcelの結果を比較することで、漸く原因が判明しました。"考えるより手を動かせ!"ですね。

【原因】
このif文の結果がExcelの結果と異なるために誤判定となることが判明

if(point.x < (polygon.v[i].x + (vt * (polygon.v[i+1].x - polygon.v[i].x)))){

右辺のvt * (polygon.v[i+1].x - polygon.v[i].x))が十分小さいと、計算誤差により情報落ちが発生してvt * (polygon.v[i+1].x - polygon.v[i].x))分が無くなってしまいif判定が逆転し内外判定に誤りが生じることが判明。

【対策】
数値計算JavaScriptライブラリの利用も考えたたが、とりあえず以下の方法にて対処しました。

if(point.x - polygon.v[i].x) < (vt * (polygon.v[i+1].x - polygon.v[i].x))){

そういえば、その昔数値計算の誤差で習ったような記憶が。。

nice!(0)  コメント(0) 

CPIサーバーの処理が遅い? [Webシステム]

 WEBアプリのある処理画面が、開発用のロリポップ!レンタルサーバー (プラン:ライト)では5秒程度であったが、本番環境のCPIサーバー(シェアードプラン ACE01)で20数秒かかる事態が発生。通常の処理はCPIサーバーのほうが早いのに!と思い調査をしました。

【原因】
 とりあえずChromeのデベロッパーツールF12 performance にてどこで時間がかかっているか調べると、なんと10Mb程度のデータ転送に20秒以上かかっていることが判明。

 F12 network Response Header
  ・CPI:content-encoding: gzipになっていない
  ・ロリポップ:content-encoding: gzip

転送データが座標データであることもあり、圧縮率が高いことから転送時間に大幅に違う結果となったようです。共有サーバーであり圧縮処理によるサーバー負荷を気にしての対応と思うがデフォルトで圧縮処理のほうがよいのでは?

【対策】
 データ転送を圧縮するよう、Apacheの設定を.htaccessに以下の行を追加することで解決しました。
 
 # gifやjpgなど圧縮済みのコンテンツは再圧縮しない
 SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png|ico)$ no-gzip dont-vary
 SetEnvIfNoCase Request_URI _\.utxt$ no-gzip

nice!(0)  コメント(0) 

Excel でQRコード作成(Google Chart API) [VBA/VBS]

 Google Chart APIを使用すると簡単にQRコードが簡単に作成できることが「Google Chart APIを使ってQRコードを作る」でわかったので、ここを参照にしてExcel表 に入力された文字列をQRコードに変換するVBAで作成してみた。ここでExcelファイルを公開しています。
試してみてください。

VBAスクリプト概要
URLDownloadToFileを使用してGoogle chart APIで"http://chart.apis.google.com/chart?chs=150x150&cht=qr&chl=文字列"から取り込んだQRコード画像データをファイルにダウンロード後、Excelセルに貼付しています。

サンプルExcel画像
作成文字列の入力行数は任意です。
excel_qrcode_20180214.png
nice!(0)  コメント(1) 

スマホからQRCodeでデータ登録(instascan) [Webシステム]

 外回りでスマホからデータを入力する必要がある場合が最近多くなってきているようである。スマホからの文字入力は大変なので、QRCodeでデータ登録ができれば便利ではないかと思い作成してみた。
使用したのはJavascriptのInstascan.jsここを参照させていただきました。ここで公開していますので試してください。

QRCode読み取り画面
qrcode2_20180213.png

登録結果確認画面
qrcode_20180213.png
nice!(0)  コメント(0) 
前の10件 | -

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。