前の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付きで出力される。
【使用方法】
・ここからExcel(Excel2geojson.xlsm)ファイルをダウンロートする。
・直角平面座標→緯度経度変換(xy2geojsonシート)
-geojsonファイル名を入力
-直角座標系を選択
-X、Y列に入力して「変換」ボタンをオンするとgeojsonファイルが作成される。
・緯度経度座標→直角平面変換(latLng2geojsonシート)
-geojsonファイル名を入力
-直角座標系を選択
-緯度、経度列に入力して「変換」ボタンをオンするとgeojsonファイルが作成される。
【geojsonファイル】
・geojsonファイルはExcelがあるフォルダー内に出力される。
・Excel表の先頭行と最終行の座標値が等しい場合はPolygon、等しくない場合はLinestringとなる。
・geojsonファイルはUTF-8文字コード、改行コードはLF、BOM付きで出力される。
平面直角座標XY⇔緯度経度 変換Excelプログラム [VBA/VBS]
先日「Excelで写真のExif情報を読み取りKLM
ファイルを作成し、GoogleEarthに貼付」で作成したExcelから緯度・経度⇔直角平面座標XY変換の部分のみを抜き取り、緯度・経度を直角平面座標に直角平面座標を緯度・経度に変換するExcelを作成してみました。
【使用方法】
・ここからExcel xyLatlngTran.xlsmファイルをダウンロートする。
・平面直角座標→緯度経度変換(xy->latlngシート)
-直角座標系を選択
-X、Y列に入力して「変換」ボタンをオンすると、緯度、経度列に出力
・緯度経度座標→直角平面変換(latlng->xyシート)
-直角座標系を選択
-緯度、経度列に入力して「変換」ボタンをオンすると、X、Y列に出力
【使用方法】
・ここからExcel xyLatlngTran.xlsmファイルをダウンロートする。
・平面直角座標→緯度経度変換(xy->latlngシート)
-直角座標系を選択
-X、Y列に入力して「変換」ボタンをオンすると、緯度、経度列に出力
・緯度経度座標→直角平面変換(latlng->xyシート)
-直角座標系を選択
-緯度、経度列に入力して「変換」ボタンをオンすると、X、Y列に出力
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を起動する。
注意:
・本プログラムはエラー処理を一切していません!
【処理内容】
・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を起動する。
注意:
・本プログラムはエラー処理を一切していません!
写真から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の作製は下図を参照すれば簡単に実装できると思います。
写真から取得するデータ(exif data)
・サブ情報
- 焦点距離(FocalLength), 画像幅(PixelXDimension), 画像高さ(PixelYDimension)
・GPS情報
- 緯度(GPSLatitude), 経度(GPSLongitude), 高度(GPSAltitude)
カメラのカタログから
・CMOSイメージセンサー大きさ
計算方法
・写真のExif情報はPHPのexif_read_dataで簡単に取得できます。
・緯度・経度から平面直角座標XYへの変換は、国土地理院の「緯度、経度への換算」サイトの計算式をPHPで組めば簡単作成できます。VBSの場合はこちらで公開しています。
・worldの作製は下図を参照すれば簡単に実装できると思います。
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() ) {
直角平面座標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
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))){
そういえば、その昔数値計算の誤差で習ったような記憶が。。
【原因】
この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))){
そういえば、その昔数値計算の誤差で習ったような記憶が。。
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
【原因】
とりあえず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
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画像
作成文字列の入力行数は任意です。
試してみてください。
VBAスクリプト概要
URLDownloadToFileを使用してGoogle chart APIで"http://chart.apis.google.com/chart?chs=150x150&cht=qr&chl=文字列"から取り込んだQRコード画像データをファイルにダウンロード後、Excelセルに貼付しています。
サンプルExcel画像
作成文字列の入力行数は任意です。
スマホからQRCodeでデータ登録(instascan) [Webシステム]
外回りでスマホからデータを入力する必要がある場合が最近多くなってきているようである。スマホからの文字入力は大変なので、QRCodeでデータ登録ができれば便利ではないかと思い作成してみた。
使用したのはJavascriptのInstascan.jsでここを参照させていただきました。ここで公開していますので試してください。
QRCode読み取り画面
登録結果確認画面
使用したのはJavascriptのInstascan.jsでここを参照させていただきました。ここで公開していますので試してください。
QRCode読み取り画面
登録結果確認画面
前の10件 | -