GPS・GISに関するツール達

~基本的にオープンソース~

森下功啓製作所 ONLINE

[2014-07-09] 利用価値のなくなったツールを削除しました。

目次:INDEX

ライブラリ・モジュール

GNSS汎用ライブラリ for PythonNEW
測地学クラス for C#
GPS汎用クラス for C#(NMEAパーサを含むクラス群)
GISライブラリ for C#
時刻関係の演算スクリプト Python版
時刻関係の演算スクリプト Ruby版
時刻関係の演算を行う C言語版
時刻関係の演算を行う C++版
NMEAパーサー Ruby版
天文学ライブラリ for C#


ツール

放送暦を基に衛星軌道を計算 with Python
k bit分解能で記録されたIF信号を処理しやすいデータに変換NEW
sdf形式のGPSログデータから、測位点における標高を数値標高モデル(DEM)から取得してcsvファイルに出力する
数値標高モデル(DEM)を処理してcsvにする
GEONETの異常観測点を調べる
RINEXファイルを結合する
RINEXファイルから、指定された時刻のデータを抽出する
RTKLIBがu-bloxのログから生成した放送暦(RINEX)を整理して、CSVファイルに出力する
RTKLIBを使って多数のRINEX観測データを一度に処理する
RTKLIBが出力した測位結果(*.posファイル)を処理して、統計処理 for 静止時 with Python
u-bloxのバイナリを含むログからNMEAセンテンスを抽出する
IGSの放送暦を自動でダウンロード
IGSの放送暦を整理してCSVファイルに出力する
経度・緯度・標高データを読み込んで、Google Earthで読み込めるkmlファイルを作出する
ECEF座標系などのx,y,zデータを読み込んで、緯度・経度・楕円体高へ変換したファイルを作出する
ECEF座標系の座標値から緯度・経度・楕円体高を計算する
NMEAセンテンスを処理して緯度・経度を整列させる
NMEAセンテンスを処理して、指定数分の一に間引く
NMEAフォーマットのログデータから未測位データを削除する
日付からGPS週番号と曜日を求める


スクリプトの実行方法など

Rubyスクリプトの実行方法(Macなら、標準で実行可能だと思います)★
Pythonスクリプトの実行方法
PowerShellスクリプトの実行方法
☆ ファイルサイズの観点から、圧縮形式にはZIPに加え7-zipも利用しています。 7zファイルの解凍ソフトはhttp://sevenzip.sourceforge.jp/で手に入ります。 ★

link to INDEX

GNSS汎用ライブラリ for Python

使用言語:Python 3.x
開発環境:Windows 7 (64 bit)

Pythonを用いてGNSS関係の計算を行う上で必要となるライブラリです。 様々な状況に応じて動的にエフェメリスを取り出す・・・なんて処理をC/C++で書きたくなかったのでライブラリ化しました。 GPSだけではなく、他の測位衛星のデータも処理できるようにモジュール構造とクラス構造を工夫したつもりです。 個人的にはこれを使ってしばらく試行錯誤してみます。


プログラムのダウンロード
リリース日 プログラムパッケージ 更新内容
2015-05-10 GitHubへのリンク 公開先をGitHubに移しました。
2014/2/28 pylib_20140228.7z 初公開です。
現時点でサポートしている内容を以下に示します。
  • WGS84測地系の定義
  • ECEF-BLH-ENU間の座標系変換
  • 距離の計算
  • NMEA抽出
  • RINEXファイルの処理
  • エフェメリスの処理
  • 衛星軌道の計算
  • 時刻の処理(うるう秒算出・UTC-GPS時刻系変換など)
GPS衛星の軌道計算では、単一のエフェメリスを用いて500日先まで計算できることを確認しています。 なお、RINEXファイル回りのモジュール構造に関してまだ未定の部分があり、クラス構造などが将来変更になる可能性は高いです。

サンプル:放送暦を基に衛星軌道を計算 with Python

基本的使い方

適当なフォルダに解凍し、環境変数PYTHONPATHを通してください。 その後、どこからでもimportできます。 各モジュールの利用方法はモジュールの最下部に記述しているセルフテスト部をご覧ください。


link to INDEX

測地学クラス for C#

使用言語:Visual C# 2010
開発環境:Windows7 (64 bit), .NET Framework 4

準拠楕円体の定義クラス及び重力加速度クラスを整備した、測地学クラスです。 準拠楕円体にはWGS84とGRS80を定義済みです。 重力加速度クラスにはデフォルトでGRS80用およびWGS84用を用意しています。 正規重力や楕円体高によって変わる重力加速度を計算することができます。 重力加速度を提供するGravityBaseクラスは準拠楕円体定義を受け取って動作するジェネリッククラスです。 従って、準拠楕円体さえ定義すれば、重力加速度の計算が簡単にできるようにしています。

コードはC#で開発しており、dllをインポートすればVisual Basicでの利用も可能です。


プログラムのダウンロード
リリース日 プログラムパッケージ 更新内容
2012/8/24 Geodesy_20120824.zip 以下の更新を行いました。
  • WGS84もGRS80でもなんでも表現可能なGlobalDatumクラスを新設(UIへの変更はなし。メンテ性が向上した。)
2012/7/23 Geodesy_20120723.zip 初公開です。
以前GNSSライブラリに含めていた準拠楕円体の定義をこちらに移し、かつGRS80を追加しました。 プロパティを呼び出すたびに計算していた内容はコンストラクタで予め計算したものを渡すように改めましたので、動作も高速化しています。 また、プロパティには重力項を追加しました。 ジオポテンシャルクラスに関しては作りかけです。

基本的使い方

緯度31.2°における正規重力値を取得するコード例を以下に示します。 GravityクラスはデフォルトではGRS80を利用していますので、この例ではGRS80楕円体での計算値になります。 現時点では近似式を用いたメソッドのみ実装していますが、実用上問題はないと思います。

var grav = new Gravity(); var g = grav.GetGravity(31.2);

*コードのHTML変換にはC#toHTMLを利用させて頂きました。


link to INDEX

GNSS汎用クラス for C#(NMEAパーサを含むクラス群)

使用言語:Visual C# 2010
開発環境:Windows7 (64 bit), .NET Framework 4

本クラスライブラリは、座標を表すBLH(緯度/経度/楕円体高)・XYZ座標系を処理する構造体,緯度・経度方向の長さを定義する構造体,領域を表現する構造体,NMEAフォーマットログデータを一括処理できるクラスを含んだGNSS向けのライブラリです。 NMEAのログを使用して何らかの計算を実行するプログラムに活用可能です。 距離の計算やBLHとXYZの相互変換に対応しています。 また、座標構造体は足し算引き算に対応しています。

コードはC#で開発しており、dllをインポートすればVisual Basicでの利用も可能です。

以下に本ソースコードが含む、クラス・構造体を示します。 割と力を入れたのはXYZ座標系とBLH座標系及びNMEAパーサークラスです。 座標系に関しては相互変換や距離を求めるメソッドなどを実装しており、手前味噌ながら上手くできていると思います。 NMEAパーサーは取得済みのログファイルを処理するには余り不自由しない程度には実装しています。 一行ずつ処理する機能は未実装ですが、現時点でも大した行数もなくNMEAログを扱えるようになるのでメリットは大きいと思います。

[注意]以下のクラスダイアグラムは2012/5/19リリースのクラス群に比べて古いものです。 若干の変更や機能拡張が行われていることに注意してください。

含んでいるクラス・構造体の一覧 座標系を定義する構造体

含んでいるクラス・構造体の一覧 及び 座標系を定義する構造体

長さや領域を定義する構造体・クラス

WGS-84の定数定義クラス と 長さや領域を定義する構造体・クラス

NMEパーサークラス NMEAクラスが包含している観測データ格納・処理用クラス

NMEパーサークラス と NMEAクラスが包含している観測データ格納・処理用クラス


プログラムのダウンロード

[注意] プロジェクトファイルをVisual Studioで開くと、初期状態では依存しているライブラリの参照設定のエラーが出ているかと思います。 その場合は、binフォルダ内にある該当dllファイルを参照するように設定しなおしてください。

リリース日 プログラムパッケージ 更新内容
2012/10/8 GNSS_20121008.zip 以下の更新を行いました。
  • 長方形領域定義RectangleFieldクラスに、中心座標と半径で定義するコンストラクタを追加
上記の追加したコンストラクタは、指定した半径の円が収まるような長方形を定義するコンストラクタです。
2012/8/24 GNSS_20120824.zip 以下の更新を行いました。
  • 長方形領域定義RectangleFieldクラスに、領域比較用メソッドIsContain(RectangleField)を追加
  • NMEAログを処理するNmeaReaderクラスに実装していたOpenWithDialog()を、ファイルを開けたかどうかの成否を返すように仕様を変更
  • NmeaReaderクラスに、任意の文字列がNMEAであるかをチェックするIsNmea(string)を実装
  • 測位情報を扱う、PositioningInfoおよびPositioningInfosクラスの名前空間をGNSS直下へ移す
  • PositioningInfoクラスへGetData(int index)を実装
  • Length構造体へToString()を実装
  • XYZ構造体をEcefへ改名
  • SDFという、マイナーなフォーマットのGPSログを処理するクラスを新設
  • RINEX・NMEA・SDF 名前空間を一つの名前空間TextDataへ移した
  • GPS・ガリレオ等の衛星の名前空間はSatellite名前空間へ引っ越し
  • GEONET名前空間はObservationNetwork空間へ引っ越し
2012/7/23 GNSS_20120723.zip 以下の更新を行いました。
  • GRS80への対応
  • 測地系の定義を測地学プロジェクトライブラリへ移築
  • 長方形領域定義RectangleFieldクラスに、領域を拡張するためのExtend(double pad)メソッドを追加
2012/7/6 CSLibTest_20120706.zip GNSSクラスライブラリはC#で作成していますが、これをVisual C++から利用したサンプルプロジェクトファイルです。 参照は図に示すようにソリューションエクスプローラーより追加してください。 プログラムを実行すると下の図のようになります。 VC++からdllを利用する方法についてはこちらのページも参考にして下さい。
参照の追加

実行結果
2012/7/3 GnssLib_20120703.zip 最新のライブラリとテストプロジェクトを同梱しました。 テストプロジェクトはテスト用静的クラスを利用して2点間の距離を計算・表示するコンソールアプリで、コマンドプロンプトから実行可能です。 実行すると下図の様に表示されます。 スペースの関係上縮小させています。 画像のみを別タブで開くと見やすいと思います。
テストプログラムの実行画面

以下更新内容です。
  • XYZ構造体へ文字列で初期化するコンストラクタを追加
  • XYZ構造体に実装していた地心距離rプロパティをNormへ改名
  • BLH構造体へ文字列で初期化するコンストラクタを追加
  • WGS84パラメータを表す静的クラスを、測地系間の変換に備えるために普通のクラスにして継承ができるように変更

テキストファイル処理時の利便性向上のために、BLHとXYZ構造体のコンストラクタ生成時に文字列を受け取れるように変更しました。 また、測地系間の座標変換が簡単になるように、WGS84クラスからstatic修飾子を取り去って普通のクラスとしました。 WGS84クラスはをWgs84に改名しています。 このWgs84クラスが返すパラメータはG873をデフォルトにしています。 普通のクラスにしたことによって継承ができるようになったため、デフォルトをG1150やG730へ変更することも容易になりました。 インターフェイスの実装も行ったため、将来的に他の測地系を実装するのも簡単になっています。 ただし、普通のクラスになってしまったためパラメータを利用する際はインスタンスの生成が必要となり、コード中では1行余計に食うようになっています。 増えた手間よりも利便性の向上が勝っていますのでご容赦ください。

2012/6/9 GNSS_20120609.zip GNSS_help_20120609.chm 最新のライブラリとその最新ヘルプファイルです。
以下更新内容です。
  • NMEAクラスのOpen()メソッドへエラー対策を追加
  • NMEAクラスにファイル名を保持させるように変更
  • RectangleFieldクラスにコピーコンストラクタを追加
  • BLH構造体に距離を求めるメソッドを3手法(実質は2つ)を追加
  • XYZ構造体の+と-の演算子の定義が間違っていたのを訂正
  • GnssTestクラスに距離を求めるアルゴリズムの比較用メソッドTwoBlhToDistanceTest()を追加

今回のアップデートはXYZ構造体の演算子定義ミスという致命的バグの修正を含んでいます。 たったの3要素しかないベクトルの足し算と引き算を間違えるとは…。 これにより距離の計算精度が出るようになりました。 また、短距離での距離計算ではベクトルの引き算でも精度十分でかつ高速動作可能ということが分かりました。

メモ:XYZ構造体に実装している地心距離rのプロパティですが、これは将来Normへ変更する予定です。
2012/6/1 GNSS_help_20120601.chm ライブラリの最新ヘルプファイルです。
2012/6/1 GNSS_20120601.zip GGAセンテンスの処理プログラムにバグがあったのを修正しました。 また、テスト用の静的クラスGnssTestクラスを追加しました。 なお、プロジェクト言語はC#ですがVisual Basic(VB)でもdllを参照して機能を呼び出すことができることを確認しました。 コードの変換は不要の様です。

[いつになるかもわからない更新予定]
1) 測地系評価メソッドの追加
2) C++で作成した衛星軌道演算・測位演算のラッパ―を実装
3) 測地系変換処理
2012/5/19 GNSSclass20120519.zip 作りためたGPS関係のクラスをGNSS名前空間上に移してプロジェクトとしてまとめました。 せっかくなので拡張に備えてGNSS名前空間内にQZSSなどの名前空間も用意しています(今んとこは空ですが)。
GNSS関連クラス群

利用するには、Visual Studioのソリューションに「既存のプロジェクトの追加」で追加して参照設定するか、 もしくはbinフォルダ内にあるGNSS.dllとGNSS.XMLファイルを参照設定に追加して下さい。 クラス内のメソッドや依存関係が以前リリースしたコードと若干異なっていることに注意が必要ですが、名前空間の整理もしたつもりなので便利になったと思います。 今後は、測地系のパラメータ比較用のメソッドを実装する予定です。
2011/12/1 GPSandGISclass.chm GPSクラスの説明書です。
Sandcastle Help File Builderを使用して、ヘルプファイルを出力してみました。 クラスのメンバを確認することが可能です。 html版はこちらです。

なお、3か月以内に公開予定のGISクラスについても同梱しています。 何かコメントがあればよろしくお願い致します。
2011/10/20 GPScs_v2.zip NMEAパーサを使ってu-bloxのバイナリを含んだログデータを処理しようとしたのですが、できませんでした。 そこで行頭がNMEAセンテンスである行のみを抽出したファイルを処理しようとしたのですが、これもデータ中に含まれていた不正文字によってエラーを起こしました。 今回の更新ではその辺のバグ対策(応急処置)を施しています。
なお、ライセンス文書も一緒にしておきました。
2011/9/22 GPS.cs 初公開です。

基本的使い方

本クラスを用いたサンプルコードを以下に示します。 この例ではNMEAのログファイルを読み出して緯度・経度・時刻を読み出し、それを基にDEMの標高データ系列を取得&保存しています。

本クラスを用いた処理の一例

本クラスを用いた処理の一例


link to INDEX

GISライブラリ for C#

使用言語:Visual C# 2010
開発環境:Windows7 (64 bit), .NET Framework 4

本ライブラリはGISに関するライブラリです。 数値標高モデル(DEM)を始めとするラスタ地図に関するクラスや、Google Earth用のKMLに関するクラスを内蔵しています。 DEMを画像にするなんて世に数多あるソフトウェアでできますが、自作のプログラムに組み込める便利なライブラリは見当たりませんでした。 という訳で、作ってみた次第です。

ラスタ地図クラスは任意の型の構造体やクラスや標準型(int, long, float, double)を格納できるマップクラスです。 任意の型用および比較が可能な型用さらに標準型用の3種類を用意しています。 例えば、深さ方向を持たせた構造体を使えば、3次元データを表現できます。 また、C#では構造体に関数を実装可能ですので日変化する地磁気等の表現が可能です。 データの取得方法は、緯度経度もしくはマップ内の整数アドレスで指定できます。

ラスタ地図クラスを利用するDEMクラス群も定義しています。 本クラス群には、DEMを管理するマネジメントクラスや読み込み用クラスが含まれます。 DEMのマネジメントクラスを用いれば、多数のDEMを結合して一枚の大きな地図を作ることが可能です。 以下に示している図はそうやって作った図です。 本クラスには、GPSで計測した緯度経度に沿った標高値を取得するとか、測位環境を地形から評価するとか、河川の支流領域を抽出するとか使い方は色々あると思います。 DEMの読み込みクラスが対応しているフォーマットは、国土地理院が発行しているGMLファイルのみとなっています(2012/6時点)。 ただし、同じフォーマットであればデータポイント数が違っていても、地域が日本でなくても処理可能です。 読み込みクラスは、簡単な構造ですので任意のフォーマットへ対応した新しいクラスを定義することは容易だと思います。 DEMの読み込み可能なファイル数はメモリ容量の制約を受けますが、少なくともファイル情報なら3400個以上,5 mメッシュデータフルで700個程度は読み込めることを確認済みです。 マルチコアマシンで動かせば素早い処理が可能です。 なお、本クラスは任意の構造体を格納したマップを作成する際のサンプルでもあります。 ご参考にされて下さい。

KMLに関するクラスには、点を表すPointクラスと面を表すPolygonクラスを同梱しています。 これらのクラスを利用してGoogle Earth上へデータを書きだすことが可能です。 例えば、GPSのログデータを点で表現するなどの応用が考えられます。

DEMを結合して作った画像
図 DEMを結合して作った画像
(国土地理院の10 mメッシュデータを用いています。)

保持しているDEMが一目でわかるという図
図 保持しているDEMが一目でわかる
DEMファイル保持状況をKMLファイルへ出力する機能も備えている。

傾斜マップ 傾斜45°以上にマスク
図 傾斜角マップと傾斜角に閾値を設定してマスクしたマップ

プログラムのダウンロード
リリース日 プログラムパッケージ 更新内容
2012/10/1 GIS_20121001.zip 以下の更新を行いました。
  • Mapクラスに格納できるオブジェクトをfloat型以外にも、任意の型(標準型・構造体・クラス)を格納できるようにジェネリック化
  • 同時に、比較可能な型を扱えるMapComparableクラス、および、標準型を格納できるMapScalarクラスも新設
  • これまでのMapと同等のクラスはDigitalElevationModel名前空間内にMapDemクラスとして確保
  • 以上の変更に伴い、MapLocalFeatureクラスをジェネリック化しましたが、このクラスは標準型しか受け付けません。
  • Mapに、任意の範囲で切り出すことができるCropMap()メソッドを追加
  • MapScalarクラスに、傾斜角を計算してMapオブジェクトとして返すGetSlopeMap()メソッドを追加
今回の更新により、任意の型をMapオブジェクトで扱えるようになりました。 これにより、例えば温度や風速などの値を格納した構造体を使ったMapオブジェクトが作れるようになります。 個人的には、GPSの測位環境等の計算結果の格納に使う予定です。 他には、DEMの傾斜角を予め計算させておくとか。

将来的には、Mapクラスには構造体の任意の成分のみを抽出してMapScalarクラスオブジェクトを介して画像保存できるようにする…というメソッドを実装する予定です。 また、任意の処理を実行できるようにラムダ式を渡せるようにします。 こうすることで、クラスにメソッド(Cでいう関数)を追加することなく任意の処理を実行できるようになる…ハズです。
2012/8/24 GIS_20120824.zip 以下の更新を行いました。
  • 地形評価用のTerrainInformationクラスにToString()を実装
  • TerrainInformationクラス内に定義しているFeature構造体のToString()で有効数字を小数点以下第2位までに変更
  • Feature構造体のToString()のバグも修正
  • テスト用の静的クラスGisTestにて、ReadNmeaToKmlPoint()へエラー対策を追加
  • DEMクラスにおいて、AddWithDialog()内でユーザがファイル選択をキャンセルした際にエラーとなっていたバグを修正
  • 上の問題と同じ問題がAdd()メソッドにもあったので、これを修正
  • MapクラスのメソッドToString()のコメントを訂正
2012/8/24 GIS_20120824.zip 以下の更新を行いました。
  • 地形評価用のTerrainInformationクラスにToString()を実装
  • TerrainInformationクラス内に定義しているFeature構造体のToString()で有効数字を小数点以下第2位までに変更
  • Feature構造体のToString()のバグも修正
  • テスト用の静的クラスGisTestにて、ReadNmeaToKmlPoint()へエラー対策を追加
  • DEMクラスにおいて、AddWithDialog()内でユーザがファイル選択をキャンセルした際にエラーとなっていたバグを修正
  • 上の問題と同じ問題がAdd()メソッドにもあったので、これを修正
  • MapクラスのメソッドToString()のコメントを訂正
2012/7/23 GIS_20120723.zip 以下更新内容です。
  • KML名前空間のPointクラスとPolygonクラスについて、KML情報を一つのファイルへ出力するためのバインド機能のバグを訂正(バインドのバインドでもOKとなった)
  • 〃、スタイルIDが上書きされる不具合を解消
  • 上記二つのクラスが継承しているBaseクラスにおいて、ConvertColorToKmlColor()メソッドをprotectedへ変更
  • Mapクラスのアドレス変換メソッド(マップ内アドレス構造体 Pos <=> 緯度・経度構造体 BLH)をpublicへ変更
  • 上のメソッドをメンバとするインターフェイスクラスをMapクラスが継承するように変更
  • コメント全般のメンテナンス
2012/6/9 GIS_20120609.7z GIS_help_20120609.chm 最新のライブラリとその最新ヘルプファイルです。
以下更新内容です。
  • KML名前空間にPointクラスを追加
  • KML名前空間のPolygonクラスを同空間内のBaseクラスを継承する形に改変
  • Mapクラスのコピーコンストラクタを新設
  • DEMクラスに保持している全てのDEMファイル情報をKMLとして出力するメソッドを追加
  • GisTestクラスへNMEAログファイルからKMLの点情報へ変換するReadNmeaToKmlPoint()を新設
  • GisTestクラスへDEMファイルを処理してファイル情報をKML形式のポリゴンで保存するSaveDemFileInfoAsKml2()を新設

今回のアップデートではKML名前空間内へのPointクラスの追加がメジャーアップデート内容となります。 Polygonクラス共々タイムスタンプやタイムスパンを設定できるように致しましたのでGoogle Earth上でアニメ表示が簡単になりました。 また、色も簡単に設定できるのでGPSの測位結果を表すのには十分な機能を持たせています。

2012/6/1 GIS_help_20120601.chm ライブラリの最新ヘルプファイルです。
2012/6/1 GIS_20120601.7z 開発を開始してからもうすぐ11カ月というところでようやくリリースと相成りました。 C#も使い始めて早1年と半年。 人に見せられるコードにようやくなったなぁという今日この頃です。

左のファイルはソースコード付きのプロジェクトファイルです。 使用の際はbinフォルダ内のdllをご自身のプロジェクトに追加するか、プロジェクトをソリューションへ追加して参照設定を行ってください。 参考のためにGisTestという静的クラスを設けています。 少し解説しておくと、DEMテキストファイル読み込みはReaderクラスが行い、それをある一つの系統だけ管理するのがManagerクラスで、Managerを束ねて多種のDEMファイル群を統括するのがDEMクラスです。

[いつになるかもわからない更新予定]
1) KMLクラスにプレイスマーククラスを追加
2) 地形評価クラスの一つとしてGNSS測位環境評価クラスも追加

基本的使い方

プロジェクトに含まれるサンプルコード(GisTest.cs)より、フォルダを指定して走査されたDEMファイルの一覧をKMLファイルへ出力するサンプルコードを抜粋し、以下に示します。 このサンプルでは、読み込んだファイル数が0でなければファイルへ出力させるという処理を行っています。

無論、DEMファイル読み込み後はBLH構造体を用いて位置座標を指定することでその地点の標高値を取得することができます。

DEM dem = new DEM(); dem.AddDirWithDialog(); if (dem.Count != 0) { dem.SaveDemInfo("DEMmaps"); }

*コードのHTML変換にはC#toHTMLを利用させて頂きました。


link to INDEX

時刻関係の演算スクリプト Python版

使用言語:Python, for Python-3.x
開発環境:Windows7 (32/64 bit), PyScripter 2.4.3 / PyScripter 2.4.6 x64

実験データを整理するために整備した時刻関係の演算メソッドを集めたモジュールです。
GPS週番号や通算日の計算に使用可能です。 リクエストがあればGPS時刻やGPS週秒の演算処理も追加したいと思います。


プログラムのダウンロード
リリース日 プログラムパッケージ 更新内容
2014/2/28 GNSS汎用ライブラリ for Python 時刻関係のモジュールを他のモジュールと同梱してアップしました。 以後はGNSS汎用ライブラリ for Pythonをご利用ください。

なお、本日までに時刻関係のモジュールの整理・GPS時刻等に関する処理の充実化を実施しています。
2013/9/8 timeKM_py_20130908.zip 関数にgetDatetimeFrom_yyyyMMdd()を追加し、数値形式の日付からPythonの時刻オブジェクトを得られる様にしました。 関数の命名規則が安定しないのは仕様です。。。orz ソロソロナントカシナイトネ。
2013/3/30 timeKM_20130330.7z 関数にGet_Delimited_hhmmss_From_hhmmss()とCompareTime()を追加し、一部の文字処理でエラーが出ていたのを修正しました。 加えて、reDateGroupedPatternがss.ssssにもマッチするように変更し小数点があってもOKとしました。 また、getTime()が時刻をμ秒単位まで認識するようにしました。
2012/2/21 timePy_ver2.zip 以前アップしたコードはPython3.2のエンジンに怒られたので、文字コードとエラー処理関係に変更を加えました。 また、時刻の含まれる文字列(フォーマット:[yyyy/MM/dd hh:mm:ss][yyyy-MM-dd hh:mm:ss])を解析して時刻オブジェクトを返す関数を追加しました。
2012/1/15 timePy_ver1.zip Rubyで作ったスクリプトを移植しました。 Ruby版よりもエラー対策が若干施されてることに加え、うるう年判定等の関数が追加されています。 また、より適用範囲の広いユリウス日演算関数も搭載しました。
初めてPythonで作ったスクリプトですので少し変なところがあるかもしれません。
[2012/2/21追記]Python2.6で動作確認済みです。

基本的使い方

インポートしてから使ってください。。

Pythonによる時刻演算スクリプトのセルフテストの様子
図 Pythonによる時刻演算スクリプトのセルフテストの様子

link to INDEX

時刻関係の演算スクリプト Ruby版

使用言語:ruby
開発環境:Windows7 (32bit), ActiveScriptRuby 1.8.7

実験データを整理するために整備した時刻関係の演算メソッドを集めたプログラムです。
最新バージョンにおいて、以下のメソッドを整備しています。


プログラムのダウンロード
リリース日 プログラムパッケージ 更新内容
2011/11/10 time_calcv8.zip 以下の5点について更新しました。

文字列の"MM/dd/yyyy"を文字列の"yyyy/MM/dd"に変換するメソッドMMDDYYYYstr2YYYYMMDDstr()を追加
文字列の"dd/MM/yyyy"を文字列の"yyyy/MM/dd"に変換するメソッドDDMMYYYYstr2YYYYMMDDstr()を追加
文字列の時刻"hh:mm.ss"から、数値のssssss[s]に変換するメソッドhhmmss_str2ssssss2()を追加
文字列もしくは数値で表されたssssssの時間を"hh:mm:ss"形式へ変換するメソッドssssss2hhmmss_str()を追加
$MONTH["Aug"]で8を得ることができるハッシュ$MONTHを定義

そろそろクラスにまとめた方が良いと思うのですが、作業用スクリプトをPythonに移そうと思っているのでその気が湧かない今日この頃です。
2011/9/10 time_calcv7.zip 文字列の"yyyy/mm/dd"を数値のddmmyyに変換するメソッドを追加しました。 最終更新2011/7/20版
2011/2/2 time_calcv6.rb 単体では初公開です。

関数名

説明

引数の型
引数の例

getGPSday_from_Julius(jd) 受け取ったユリウス日をGPS日に変換 文字列でも可
getGPSweek_from_Julius(jd) 受け取ったユリウス日をGPS週番号に変換 文字列でも可
getModifiedJD_from_Julius(jd) 受け取ったユリウス日を修正ユリウス日に変換 文字列でも可
yyyymmdd_to_Julius(date) 年・月・日が入った配列(要素3つ)から、1900.3-2100.2の間で使えるユリウス日を返す関数 文字列でも可
[["2011"]["1"]["21"]]
yyyymmdd_to_Julius2(date) yyyymmdd形式の年月日から、1900.3-2100.2の間で使えるユリウス日を返す関数 文字列でも可
strDate2day_of_week(date) スラッシュ(/)やドット(.)で区切られた文字列での日付を受け取り、GPSで云う曜日番号を返す関数 文字列
"2010.3.5"
strDate2ddd(date) スラッシュ(/)やドット(.)で区切られた文字列での日付を受け取り、その年の元旦から数えて何日目なのかを返す関数 文字列
"2010.3.5"
strDate2GPSweek(date) スラッシュ(/)やドット(.)で区切られた文字列での日付を受け取り、GPS週番号を返す関数 文字列
"2010.3.5"
yyyymmdd2day_of_week(_date) 日付yyyymmdd(文字列/数値)から、曜日を計算する 文字列でも可
hhmmss2ssssss(_time) 時刻hhmmssから、0時からの経過時間ssssss[s]を計算する 文字列でも可
ssssss2hhmmss(_time) 0時からの経過時間ssssss[s]から、時刻hhmmssを計算する 文字列でも可
hhmmss_str2ssssss(time) 文字列の時刻“hh:mm:ss”から、時刻ssssss[s]を計算する 文字列
"21:36:54"
UTC2JST_ssssss(_time) ssssss形式のUTC時間をssssss形式のJSTへ変換する 文字列でも可
yyyymmdd2ddmmyy(date) yyyymmdd形式の日付をNMEAのddmmyy形式へ変換する 文字列でも可
yyyymmdd2ddmmyy2(date) "yyyy/mm/dd"形式の日付をNMEAのddmmyy形式へ変換する 文字列
yyyymmdd2ExcelTime(date, ssssss) yyyymmdd形式の日付とssssss表現の時刻から、Excelで使用可能な時刻へ変換する 文字列でも可
図 最新版の搭載機能一覧

基本的使い方

クラスにはしていませんので、普通にrequire 'time_culcv6.rb'と宣言してソースヘッダでインクルードしてから使用して下さい。
関数の返値は基本的には数値となります。


link to INDEX

時刻関係の演算を行う C言語版

使用言語:VC++(ただし、C言語要素しかない)
開発環境:Windows7 (32bit), Visual C++ 2010 Express Edition

元々はマイコンでの時刻管理のために整備したプログラムですが、これにrubyで作った便利関数を一部移植したものです。


プログラムのダウンロード
リリース日 プログラムパッケージ 更新内容
2011/5/20 time_personal3.h 時刻の増減を行うIncrease_Clock()関数について、いままで引数を最大86,400(1日分の秒数)と制限してきましたが、この制限をなくしました。 今後はlong int型で指定できる20×108までOKです。 また、本関数の時刻減少時において、曜日の計算を間違えたり日付の繰り下げ条件のミスに起因するバグの修正も行いました。

今後の時刻管理用プログラム拡張開発はC++のクラス上で行います。 従ってC言語版の本プログラムはメンテナンスのみとなります。 ご了承下さい。
2010/11/16 time_personal2.h 時刻の初期化関数を改善及び、以下の関数を追加しています。
void Set_yyyy_mm_dd2(ST_TIME *TIME, unsigned long int date, long int TOW)
2010/10/10 time_personal.h 初公開。

関数

説明

void Time_init(ST_TIME *) 時刻管理構造体の初期化に使用します。 構造体変数を宣言後に必ず呼び出しておいてください。
void Set_yyyy_mm_dd(ST_TIME *, unsigned long int) 日付(yyyymmdd)を渡して、初期化します。
void Set_yyyy_mm_dd2(ST_TIME *, unsigned long int, long int) 第1引数に日付(yyyymmdd)を渡し、第2引数にTOWを渡して初期化します。
void Increase_Clock(ST_TIME *, long int) 第2引数に増減させたい時間(秒数)を渡して時刻を更新します。 日付等も自動的に更新されます。
int Date2GPSweek(ST_TIME *) 日付からGPS週番号を計算
int Date2ddd(ST_TIME *) 元旦から数えて何日目なのかを返す関数
double yyyymmdd_to_Julius(ST_TIME *) 1900.3-2100.2の間で使えるユリウス日を返す関数
char Week_culc(ST_TIME *) 曜日の計算を行う。 曜日は0~6で表され、0が日曜日である。
puts(WEEK_ARR[(int)Week_culc(ST_TIME *TIME)])の様に使うと、何曜日か文字で表示してくれる。
const char *WEEK_ARR[8] 曜日の文字列ポインタを返す。これは関数ではなく、曜日({"SUN","MON","TUE","WED","THU","FRI","SAT","N/A"})の文字列配列。
unsigned long int Count_to_Clock(unsigned long int) 通算時間ssssssから時刻hhmmssへ変換した数値を生成
unsigned long int Clock_to_Count(unsigned long int) 時刻hhssmmから通算時間ssssssへ変換した数値を生成
図 最新版の搭載機能一覧

基本的使い方

ST_TIME構造体型の変数を先ず宣言します。
次に、Set_yyyy_mm_dd(ST_TIME *TIME, unsigned long int date) を呼び出して変数をセットします。 ここで、引数の日付dateはyyyymmdd (例えば、20100422) と云うフォーマットである必要が有ります。

なお、次の関数によって時刻を更新することが可能です。
void Increase_Clock(ST_TIME *TIME, long int increase_time)
引数の時刻の増減については、1日の86400秒以下(-86400 <= x <= 86400 )である必要が有ります。 何度もこの関数を呼び出すことで日付を増減させることが出来ます。 一応、最近数年間を計算させましたが、日付のずれはありませんでした。
[2011/5/20 追記]増減の制限は無くなりました。


link to INDEX

時刻関係の演算を行う C++版

使用言語:C++
開発環境:Windows7

時刻ライブラリのC++版です。 C言語版に比べ、より使いやすくよりスタイリッシュにより高機能になっています(笑)。 DOW(day of year:年間の通算日)とGPS week(GPS週番号)が追加されています。


プログラムのダウンロード
リリース日 プログラムパッケージ 更新内容
2013/1/15 timePersonal_20130115.zip [更新内容]
1) 時刻情報フォーマット変更用のメソッドをstaticに変更
2) オブジェクト同士の引き算を定義し、時刻差[s]を返す様にした

開発環境:Windows7 (64bit), AtmelStudio 6.0(AVRマイコン用のコンパイラ)とArduino IDE(Arduinoという組み込みプラットフォームのコンパイラ)で動作確認済み。 VC++での動作は未確認です。
2013/1/9 time_personal_20130109.zip バグの修正・演算法の修正・機能増強など、大幅にライブラリを更新しました。 時刻系の変更やGPS時刻の取得が容易になっています。 また、一部のアクセッサの関数名が変更になっていますので詳しくはヘッダファイルをご覧になってください。 便利になったのに加えて、演算速度が向上しています。

[次回更新予告]
時刻情報フォーマット変更用のメソッドはstaticに変更
オブジェクト同士のプラスやマイナスも定義し、時刻差[s]を返す

開発環境:Windows7 (64bit), AtmelStudio 6.0(AVRマイコン用のコンパイラ)とArduino IDE(Arduinoという組み込みプラットフォームのコンパイラ)で動作確認済み。 VC++では動作確認を行っていませんが、組み込みのコンパイラで動いたので動くはずです。
2011/5/20 time_personal_r1.zip 初公開。 初めて作ったC++のクラスですので稚拙な点は目を瞑って下さい。
開発環境:Windows7 (32bit), Visual C++ 2010 Express Edition

使い方:
クラス宣言して普通に使ってください。初めの初期化だけはクラス生成時に自動的に行われます。 日付のセットはC言語版と同じメソッドを呼び出して行います。

リリース最新版の搭載機能

搭載されている機能は、以下の通りです。 Public宣言されているアクセッサとメソッドを利用できます。

#ifndef    HDR_time_personal
#define    HDR_time_personal                    //このファイルをインクルードしているかはこれが定義されているかでわかる。

namespace GPS
{
    class Time
    {
    // メンバ変数
    private:
        // static member
        static const int               _SUNDAY                  = 0;            // 便宜上の曜日定義。GPS時刻に合わせて、日曜日を0とする。
        static const int               _MONDAY                  = 1;
        static const int               _TUESDAY                 = 2;
        static const int               _WEDNESDAY               = 3;
        static const int               _THURSDAY                = 4;
        static const int               _FRIDAY                  = 5;
        static const int               _SATURDAY                = 6;
        static const int               _WEEK_ERROR              = 7;
        static const int               _DAY_A_WEEK              = 7;            // 1週間の日数
        static const long int          _TIME_COUNT_A_DAY        = 86400l;       // 一日の時間の長さ[s] 3600s * 24h = 86400s
        static const long int          _TIME_COUNT_A_WEEK       = 604800l;      // 1週間の時間[s], 24h * 7day (1week) = 604800 sec
        static const double            GPS_START_EPOCH_JD       = 2444244.5;    // ユリウス日表現によるGPSの開始エポック
        static const long int          GPS_START_EPOCH_MJD      = 44244l;       // 修正ユリウス日表現によるGPSの開始エポック
        static const unsigned long int GPS_START_EPOCH_DATE     = 19800106ul;   // GPS時刻の開始エポック(1980/1/6 sunday)
        // other
        long int            _inc;           // 一時的に記憶する、加算量
        unsigned long int   _clock;         // 時刻の数値化したもの。例:“020409”-> [20409](2時4分9秒)
        long int            count;          // 時刻の一日の通算値。例:CLOCK == 1235(0時12分35秒)-> [12 * 60 + 35]. 一日の時刻を秒で与える。
        unsigned long int   date;           // 日付の数値化したもの。例:2009年4月2日 -> 20090402
        long int            GPS_time;       // GPS時刻。
        long int            _GpsTow;        // Time of Week:GPS週秒。日曜日の午前0時を基準に、秒カウント。
        int                 GPS_week;       // GPS週番号(うるう秒分だけ、UTCの週変わりよりも早くカウントアップされます)
        int                 DOY;            // day of year:通日
        int                 week;           // 曜日。日曜日を0とし、土曜日を6とする。エラーがある場合は7となる。
        int                 year;           // 年
        int                 month;          // 月
        int                 day;            // 日
        bool                error;          // 演算エラー。1:error, 0:normal
        int                 timeSystem;     // 時刻系(デフォルトでは、GPST or UTC)
        bool                _countChangeFlag; // _clockの更新用に用いる
        bool                _clockUpdateReq;  // _clockの更新用に用いる
    public:
        static const int    GPST                                = 16;           // UTCを基準にしたうるう秒
        static const int    UTC                                 = 0;
        static const int    JST                                 = 32400;
    // アクセッサ
    private:
        void     setClock(unsigned long int a){ _clock = a; return; }
        void     setCount(long int a){ count = a;           return; }
        void     setDate(unsigned long int a){ date = a;    return; }
        void     setGpsTime(long int a){ GPS_time = a;      return; }
        void     setGpsTow(long int a){_GpsTow = a;         return; }
        void     setGpsWeek(int a){GPS_week = a;            return; }
        void     setDOY(int a){     DOY = a;                return; }
        void     setWeek(int a){    week = a;               return; }
        void     setYear(int a){    year = a;               return; }
        void     setMonth(int a){   month = a;              return; }
        void     setDay(int a){     day = a;                return; }
    public:
        long int getClock()
        {
            if(this->_countChangeFlag) (void)this->Update(); // 時刻全般を更新(フラグも処理される)
            if(this->_clockUpdateReq)                        // countの更新がなされていないといけないので、この処理は後
            {
                this->_clock = Count_to_Clock(this->count);  // hhmmssを更新
                this->_clockUpdateReq = false;
            }
            return this->_clock;
        }
        long int getCount(){            if(this->_countChangeFlag) (void)this->Update(); return this->count; }
        unsigned long int getDate(){    if(this->_countChangeFlag) (void)this->Update(); return this->date; }
        long int getGpsTime(){          if(this->_countChangeFlag) (void)this->Update(); return this->GPS_time; }
        long int getGpsTow(){           if(this->_countChangeFlag) (void)this->Update(); return this->_GpsTow; }
        int      getGpsWeek(){          if(this->_countChangeFlag) (void)this->Update(); return this->GPS_week; }
        int      getDOY(){              if(this->_countChangeFlag) (void)this->Update(); return this->DOY; }
        int      getWeek(){             if(this->_countChangeFlag) (void)this->Update(); return this->week; }
        int      getYear(){             if(this->_countChangeFlag) (void)this->Update(); return this->year; }
        int      getMonth(){            if(this->_countChangeFlag) (void)this->Update(); return this->month; }
        int      getDay(){              if(this->_countChangeFlag) (void)this->Update(); return this->day; }
        void     setError(bool a){  error = a;             return; }
        bool     getError(){                               return error; }
    // メソッド(メンバ関数とも言う)
    public:
        Time();                                                         // コンストラクタ, 時刻系はUTCとなる
        Time(unsigned long int date_p);                                 // コンストラクタ オーバーロード1, 時刻系はUTCとなる
        Time(unsigned long int date_p, unsigned long int GpsTow);       // コンストラクタ オーバーロード2, 時刻系はGPSTとなる
        Time(unsigned long int date_p, long int clock_p);               // コンストラクタ オーバーロード3, 時刻系はUTCとなる
        Time(const Time& obj);                                          // コピーコンストラクタ
        ~Time();                                                        // デスコンストラクタ
        void    Increase_Clock(long int);                               // 時刻を加減算する
        static unsigned long int Count_to_Clock(long int);              // 通算時間から時刻へ変換した数値を生成
        static unsigned long int Clock_to_Count(unsigned long int);     // 時刻から通算時間へ変換した数値を生成
        void    Set_yyyy_mm_dd(unsigned long int date_p);               // 時刻の初期化メソッド
        void    Set_yyyy_mm_dd(unsigned long int date_p, unsigned long int TOW_p);  // オーバーロードを利用している
        void    Set_yyyy_mm_dd(unsigned long int date_p, long int clock_p);         // オーバーロードを利用している
        void    Day_after(void);                                        // 一日日付を進める
        void    Day_before(void);                                       // 一日日付を戻す
        const char*     GetWeekName(void);                              // 曜日名を返す
        void            SetTimeSystem(int);                             // 時刻系をセットする
        const char*     GetTimeSystemName(void);                        // 時刻系名を返す
    private:
        char            Week_culc(Time *);                              // 曜日を計算する
        long int        yyyymmdd_to_ModifiedJulius(int y, int m, int d);// 修正ユリウス日を求める
        int             date2ddd(Time *);                               // 1年の内の通算日を求める
        int             Date2GPSweek(Time *);                           // GPS週番号を求める
        static long int Compare(const Time& l,const Time& r);           // 比較メソッド
        void            UpdateGpsTime(long int inc);                    // GPS時刻の更新用関数
        void            Update(void);                                   // 時刻の更新用関数
    // 演算子
    public:
        Time&    operator=(const Time& obj);
        long int operator-(const Time& r) {return Compare(*this, r);}   // -演算子オーバーロード
        bool     operator<=(const Time& r) const{return Compare(*this, r) <= 0;}
        bool     operator>=(const Time& r) const{return Compare(*this, r) >= 0;}
        bool     operator<(const Time& r) const{return Compare(*this, r)  <  0;}
        bool     operator>(const Time& r) const{return Compare(*this, r)  >  0;}
        bool     operator==(const Time& r) const{return Compare(*this, r) == 0;} 
        bool     operator!=(const Time& r) const{return Compare(*this, r) != 0;}
    };
}

#endif
図 解説が面倒なので掲載したヘッダファイル

基本的使い方

利用例はこちら


link to INDEX

NMEAパーサー Ruby版

使用言語:ruby
開発環境:Windows7 (32bit), ActiveScriptRuby 1.8.7

NMEAフォーマットで記録したGPS受信機のログかを解析するパーサーのRuby版です。 ログから緯度・経度を抜きだしたり、GSVセンテンスを処理することが可能です。

使い方は非常に簡単で、例えば以下の様にして呼び出します。 ここで、lineにはファイルから読みだしたログが1行分入っているものとします。
nmea = GetNMEAstruct(line)
nmeaには解析結果が入ったオブジェクトが格納されます。


プログラムのダウンロード
リリース日 プログラムパッケージ 更新内容
2011/7/3 NMEA_parser_by_Ruby_1.zip 単体では初公開。
A100受信機のログと本パーサーを利用したサンプルプログラムを同梱しています。
サンプルプログラムでは、緯度・経度・標高(楕円体高-ジオイド高)を出力します。


link to INDEX

天文学ライブラリ for C#

使用言語:C#
開発環境:Windows7 (64 bit)

天文学に関する.NETライブラリです。 これからちょっとずつ拡張していくつもりです。 日の出時刻の荒っぽい計算値が欲しい方はどうぞ。


プログラムのダウンロード
リリース日 プログラムパッケージ 更新内容
2013/2/2 Astronomy_20130130.zip 初公開。
現時点では、Sunクラスに日の出と日没の時刻を計算する静的メソッドのみを実装しています。




link to INDEX

放送暦を基に衛星軌道を計算 with Python

使用言語:Python, for Python-3.x
開発環境:Windows7 (64bit)

放送暦を基に衛星軌道を計算するPythonスクリプトです。 GNSS汎用ライブラリ for Pythonのサンプルを兼ねています。


プログラムのダウンロード
リリース日 プログラムパッケージ 更新内容
2014/2/28 satellite_position_20140228.7z 初公開です。
フォルダ内に存在しているRINEXフォーマットのGPS放送暦を全て読み取り、時間を変えながら繰り返し衛星座標を計算してファイルへ保存するスクリプトです。 詳細は同梱している「readme.txt」をご覧ください。

なお、現時点ではQZSとの差分を未整理なため、QZS用の放送歴も処理できるはずです。 ただし、QZSに対する計算においては時刻系や座標系に微小な誤差が生じることはご了承ください。

基本的使い方

コマンドの実行時に、スクリプトファイル名を指定する様にして下さい。 なお、コマンド冒頭の"python"は省略しないと動作しないかもしれません。


link to INDEX

k bit分解能で記録されたIF信号を処理しやすいデータに変換

使用言語:Python, for Python-3.x
開発環境:Windows7 (64bit)

k bitサンプリングのIFデータが隙間なく格納されているバイナリデータをk bitずつ切り出して0詰めした8 bitデータを保存するPythonスクリプトです。 ソフトウェアGPS用のデータ変換にお使いください。


プログラムのダウンロード
リリース日 プログラムパッケージ 更新内容
2014/2/22 IF2bin8.zip 初公開です。
一度メモリに展開してから処理を行っているため、巨大なデータの場合は処理できないかもしれません。
リクエスト or 個人的に処理限界の壁に当たったら、コード構造を書き換える予定です。

基本的使い方

コマンドの実行時に、スクリプト名に続いてバイナリファイルのパスを指定して下さい。 なお、コマンド冒頭の"python"は省略しないと動作しないかもしれません。

実行コマンド

コマンドを実行した様子


link to INDEX

sdf形式のGPSログデータから、測位点における標高を数値標高モデル(DEM)から取得してcsvファイルに出力する

使用言語:VC#
開発環境:Windows7 (32bit), Visual Studio 2010 Pro

ハンディGPS受信機で測位した結果はカシミール3Dを使えば簡単に地図上にプロットできます。 カシミールに取り込んだGPSのログは各種フォーマットでエクスポートできますが、本ソフトはその中のsdfフォーマットファイルを処理して数値標高マップから標高を拾い出して結合させてテキストファイルに書き出します。 用途としては、GPSの高度方向の測位結果評価などでしょうか? 個人的には気圧高度推定と組み合わせた経路推定アルゴリズムの検証用に使用しています。


プログラムのダウンロード
リリース日 プログラムパッケージ 更新内容
2011/12/20 sdf2DEMheight20111220.zip 初公開です。利用には.NET Framework 4が必要です。
まずはバイナリのみ公開します。

基本的使い方

まずは国土地理院からダウンロードできる基盤地図情報(標高・GML形式)を予めダウンロードして解凍して一つのフォルダにまとめておいて下さい。 起動後は下記の図に従って起動後にsdfファイルをドラッグアンドドロップするだけでOKです。

プログラムの起動
図1 プログラムの起動

DEMフォルダの選択
図2 DEMフォルダの選択

表示メッセージ
図3 表示メッセージ

起動したらドラッグアンドドロップしよう
図4 起動したらドラッグアンドドロップしよう

変換が完了すると出るメッセージ
図5 変換が完了すると出るメッセージ

ファイルが作出されている
図6 ファイルが作出されている

link to INDEX

数値標高モデル(DEM)を処理してcsvにする

使用言語:Ruby
開発環境:Windows7 (32bit), ActiveScriptRuby 1.8.7

国土地理院からダウンロードできる基盤地図情報(標高)を、Excelで確認するのに使用したスクリプトです。 DEMデータはXML形式になっていますが、これを簡易な方法で中身を確認する方法としてExcelで処理できるようにcsvファイルへ変換します。 地図データを取り込めるソフトには、 カシミール3DArcGISMANDARA がありますので、よほどのもの好きでないと必要ないかもしれません。 自作プログラム作成時のデータの確認等にご利用下さい。


プログラムのダウンロード
リリース日 プログラムパッケージ 更新内容
2011/7/10 DEM2csv.7z 初公開です。
=begin
--------------------------------------------------------------
国土地理院の標高地形データをExcel用にCSVにするプログラム

Excelで等高線を描くと行列を入れ替えても上下が入れ替わったままだけど、何とか表示できる
左上が座標0,0とされていることを確認した。

    開発者:K.Morishita Kumamoto-University
    開発履歴:2011/6/20  テストに成功
--------------------------------------------------------------
tab size: 4
--------------------------------------------------------------
=end

fname = ARGV[0]
txt = File.readlines(fname)
line = 0
line += 1 while txt[line].index("<gml:high>") == nil      # データサイズが書かれた行を探す
str = txt[line]                                           # データサイズの記入された文字列を取得
p str
str.sub!("<gml:high>","")                                 # 必要のない文字列を削除
str.sub!("</gml:high>","")
size = str.split(" ")
x = size[0].to_i + 1                                      # 格納されているのは最後のアドレスなので1を足すとサイズになる
y = size[1].to_i + 1
puts "sizeof(x,y) == #{x},#{y}"                           # 取得したサイズを出力

line += 1 while txt[line].index("<gml:tupleList>") == nil # 標高データの開始タグ位置を取得
line += 1                                                 # こっからデータが始まる
File.open("DEM2CSV_converted.csv", 'w') do |f|
    _x = 0
    _y = 0
    while txt.length > line do
        f.write  ",#{txt[line].chomp.split(",")[1].to_f}" # 標高データを取得&書き込み
        _x += 1
        if _x == x
            f.write "\n"
            _y += 1
            _x = 0
            break if _y == y
        end
        line += 1
    end
end


図1 tera termのログを解析するクラスのソースコード
ソースコードのhtml化にはhttp://kujirahand.com/tools/tougarasi/の唐辛子を利用しました。

コマンドの実行
図2 コマンドの実行方法

Excelで表示させたところ
図3 Excelで処理した様子
行と列を入れ替えて、等高線を描かせました。 南北が入れ替わっていますが地形がはっきりと分かりました。

基本的使い方

国土地理院からダウンロードしたファイル名を指定して実行するだけです。 国土地理院の基盤地図情報(デジタル地図)ダウンロードはこちらからどうぞ。


link to INDEX

GEONETの異常観測点を調べる

使用言語:Ruby
開発環境:Windows7 (32bit), ActiveScriptRuby 1.8.7

本スクリプトは、平成23年東北地方太平洋沖地震の後に停止したGEONETの電子基準点を抽出するために作成したスクリプトです。 GEONETのサイトからFTPダウンロードして得られるファイルの数は膨大です。 例えば、2011/3/11の観測データをダウンロードすると2,474個のファイルが含まれていました。 観測データはこの半分ですが、これらを手作業でチェックするのは現実的ではありません。


プログラムのダウンロード
リリース日 プログラムパッケージ 更新内容
2011/3/20 GEONETcheck.7z 初公開です。
本スクリプトの同梱ファイルには、CSV形式の国土地理院のGEONETサイトより入手した基準点コード一覧表を同梱しています。 最新のコード一覧を使用したい場合は、そのファイルを更新して下さい。 ファイルフォーマットを維持すれば問題有りません。

基本的使い方

先ず、ブラウザかFFFTPの様なソフトを用いて、国土地理院から電子基準点の観測データをダウンロードします。 全観測点のダウンロードは、データ量が半端ないので回線が細いと40分以上かかります。 ダウンロード後は適当なフォルダに解凍して下さい。 その後、サンプルと同じファイル構造へと変更して下図に有るようにスクリプトを実行すればOKです。

GEONETの基準点コード一覧表

GEONETの基準点コード一覧表

観測データと処理スクリプト

観測データと処理スクリプト

観測データのチェック実行

観測データのチェック実行

抽出された観測データの基準点住所を確認する

抽出された観測データの基準点住所を確認する

GEONETの基準点コード一覧表と突き合わせた結果

GEONETの基準点コード一覧表と突き合わせた結果

出力されるファイル

スクリプトを実行すると得られるファイルの中身
先ず、右下のファイルを生成して、次に真ん中のファイルを作ります。 Excelで開くなら、時刻の表示設定を“時刻”へ設定して下さい。


link to INDEX

RINEXファイルを結合する

使用言語:Python, for Python-3.x
開発環境:Windows 7 Pro x64, Python 3.2

国土地理院が発行している電子基準点のRINEXファイルは観測日から3日経たなければ1日分の結合したファイルがリリースされません。 短時間の処理ならばらばらにリリースされるRINEXファイルを用いても良いのですが、そうも言っていられないケースもあります。 しかし手動で結合というのはバカらしいですしプログラムに任せましょう、というコンセプトで本スクリプトを作りました。 3日も待てない方はどうぞお使いください。

ところで、“RINEX 結合”でググるとTEQCというフリーソフトがかかるのですが、私には使用法が十分には分かりませんでした。 それなら、プログラムが何をやっているのか管理できる自作ソフトの方がましかと思って作っています。 国土地理院のWEBサイトではTEQCを薦めてあるので、将来的には使い方をマスターしたい所ですが現時点では別に自作ソフトで構わないし。。。


プログラムのダウンロード
リリース日 プログラムパッケージ 更新内容
2012/2/7 RinexCombine.7z 初公開です。
開発にはPython Scripter Version 2.1.6.0 x64を使用しました。 ソースコードはPython 3.0以降に合わせて開発していますので、Python 3以降のプラットフォームで実行されてください。 なお、ソースコード中には日本語でコメントを多数入れています。 適当なテキストエディタで編集は可能ですが、保存時には文字コードがUTF-8になるよう気を付けて下さい。

基本的使い方

まずは結合させたいRINEXファイルを一つのフォルダに入れ、そこにここでリリースしているスクリプトをコピーして下さい。 その後、そのフォルダを作業フォルダにしたコマンドプロンプトを起動させてスクリプトファイル名を入力することで実行します。 プログラムが走り始めると、カレントディレクトリ中のファイルを全走査してRINEXファイルをとにかく結合します。 なお、実行にはpyscripterを利用しても構いません。

コマンドプロンプトを起動させる

スクリプトのあるフォルダをカレントディレクトリにしてコマンドプロンプトを立ち上げ(cdで移動してもOK)

スクリプトを指定すると実行される

スクリプトの実行画面

実行すると生成されるファイルが一つ

実行後にはcombined.txtというファイルが作出されています


link to INDEX

RINEXファイルから、指定された時刻のデータを抽出する

使用言語:Python, for Python-3.x
開発環境:Windows 7 Pro x64, Python 3.3, Python Scripter Version 2.5.3.0 x64
実行環境の構築:Pythonスクリプトの実行方法

時刻と時間幅を記載したファイルに基づき、指定された時間のRINEX観測データを抜き出します。 RINEXヘッダを保持した状態で(もちろん、時刻情報は更新します)保存します。 現時点での用途としては、静止中の観測データのみを切り出せるかなぁといったとことです。 ただし、この場合は時刻のリストを他の手段で作る必要があります。 私の場合だと、RINEXと同時にNMEAも保存しておいて、NMEAのVTGセンテンスから速度情報を得て時刻のリストを自動的に作っています。


プログラムのダウンロード
リリース日 プログラムパッケージ 更新内容
2012/3/30 RinexPicker_20130330.7z 初公開です。
サンプルデータも同梱しています。
ソースコードはPython 3.0以降に合わせて開発していますので、Python 3以降のプラットフォームで実行してください。 なお、ソースコード中には日本語でコメントを多数入れています。 適当なテキストエディタで編集は可能ですが、保存時には文字コードがUTF-8になるよう気を付けて下さい。

基本的使い方

まずは分割させたいRINEXファイルと時刻のリストを一つのフォルダに入れ、コマンドプロンプトからスクリプトを実行してください。 引数の指定方法はreadme.txt内に記述しています。 実行後、元の観測ファイル名に「picked_rinex_03d」(03dは3桁0詰めであることを表しています)を付加したファイルが生成されます。

コマンドプロンプトでの実行の様子

コマンドプロンプトでの実行の様子

コマンドプ実行の結果出力されるRINEXファイル

コマンドプ実行の結果出力されるRINEXファイル
ハイライトされているファイルが出力されたRINEXファイルで、csvファイルは時刻のリストファイルです。

時刻のリストをExcelで開いたところ

時刻のリストをExcelで開いたところ

時刻のリストはテキストエディタでも編集可能です

時刻のリストはテキストエディタでも編集可能です


link to INDEX

RTKLIBがu-bloxのログから生成した放送暦(RINEX)を整理して、CSVファイルに出力する

使用言語:ruby
開発環境:Windows7 (32bit), ActiveScriptRuby 1.8.7

u-blox受信機が出力したログファイルをRTKLIBで処理するとRINEX形式の放送暦が得られます。 このプログラムは、その放送暦のパラメータを整理して読みやすいCSV形式に変換するRubyスクリプトです。 実際に放送された放送暦と、IGSの提供する放送暦の比較を行いたい場合に有用かもしれません。
IGSの放送暦を整理してCSVファイルに出力する」を元に開発しています。

処理後のCSVファイルは、統計処理ソフトRでの処理がやり易いように、PRN番号を使用した層別ラベルを含んでいます。


プログラムのダウンロード
リリース日 プログラムパッケージ 更新内容
2011/1/26 RTKLIB_ephemeris2CSVver1.7z 初公開です。
同梱ファイルには、u-bloxのログを元に生成されたRINEX形式の放送暦を含めています。

基本的使い方

コマンドの実行時に、ファイル名を指定する様にして下さい。

実行コマンド

コマンドを実行した様子


link to INDEX

RTKLIBを使って多数のRINEX観測データを一度に処理する

使用言語:PowerShell
開発環境:Windows7 (64bit)
実行環境の構築:PowerShellスクリプトの実行方法

多数の観測データがある場合、GUIを操作しながら測位計算理するのは面倒です。 とある実験で移動と停止を繰り返しつつ観測データを収集したのですが、これを処理するのがメンドウだったのでスクリプトを書いてみた次第です。 測位演算はRTKLIBのrnx2rtkp.exeを繰り返し呼び出すことで実行しています。 一つのフォルダに観測データと航法データを集めておけば一度に多数のRINEXファイルを処理できます。 ググっても同系統のプログラムは簡単には見つかりませんでしたので有用だと思います。


プログラムのダウンロード
リリース日 プログラムパッケージ 更新内容
2013/1/2 forRtklib_20130102.7z 初公開です。
同梱ファイルには、観測データと航法データを含めています。

航法データの拡張子にはnまたはNが含まれているものとします。 また、観測データの拡張子にはoまたはOまたはobsが含まれているとします。 現時点では航法データは一つの場合にしか対応していません。 観測データはどれだけあってもOKです。

基本的使い方

コマンドの実行時に、ファイル名を指定する様にして下さい。

ファイルの配置

解凍したフォルダは、RTKLIBの実行ファイルの中に配置する

上記の部分を実行の度に変更する

上記の部分を実行の度に確認し、必要なら変更する

実行コマンド

コマンドを実行した様子(実行中)

実行すると、posファイルが作成されます

実行すると、posファイルが作成されます

操作の様子


link to INDEX

RTKLIBが出力した測位結果(*.posファイル)を処理して、統計処理 for 静止時 with Python

使用言語:Python, for Python-3.x
開発環境:Windows7 (64bit)
実行環境の構築:Pythonスクリプトの実行方法

RTKLIBが出力した測位演算結果ファイル(*.posファイル)を処理して、測位座標に関して統計処理を行うPythonスクリプトです。 多数の観測データがある場合、GUIを操作しながら統計処理するのは面倒です。 とある実験で移動と停止を繰り返しつつ観測データを収集したのですが、これを処理するのがメンドウだったのでスクリプトを書いてみた次第です。

用途別に、「RtklibPosProcessing.py」と「RtklibPosProcessingWithTimeList.py」という、2つのスクリプトを同梱しています。 「RtklibPosProcessing.py」はスクリプトのあるフォルダ内全ての測位結果(*.pos)が対象となり、 「RtklibPosProcessingWithTimeList.py」は一つの観測結果を、時刻を指定する形で統計処理します。 個人的には、「RtklibPosProcessing.py」をstatic解の解析に、 「RtklibPosProcessingWithTimeList.py」をKinematic解の解析に使用しています。


プログラムのダウンロード
リリース日 プログラムパッケージ 更新内容
2013/3/30 RtklibPosProcessing_20130330.7z 初公開です。

基本的使い方

コマンドプロンプトを立ち上げて、スクリプトファイル名を入力後にエンターキーで実行されます。 詳しくは配布ファイル内のreadmeや、下にある動画をご覧ください。

ファイル構成(ライブラリを除いています)

ファイル構成(これら以外に、ライブラリファイルが必要です)

コマンドの実行状況

コマンドの実行状況

スクリプト実行の結果、2つのファイルが出力される

スクリプト実行の結果、2つのファイルが出力される

RtklibPosProcessingWithTimeListの実行の様子

RtklibPosProcessingWithTimeListの実行の様子(こちらは引数が必要です)

RtklibPosProcessingWithTimeListの実行の結果出力されたlog.csv

RtklibPosProcessingWithTimeListの実行の結果出力されたlog.csv

RtklibPosProcessingWithTimeListの実行の結果出力されたlog lite.csv

RtklibPosProcessingWithTimeListの実行の結果出力されたlog lite.csv

操作の様子


link to INDEX

u-bloxのバイナリを含むログからNMEAセンテンスを抽出する

使用言語:Python, for Python-3.x
開発環境:Windows7 (64bit), Python3.2.2

u-blox受信機が出力したバイナリデータを含むログファイルからNMEAセンテンスを抽出するスクリプトです。 正規表現を使ったパターン合致によって抽出していますので途中にバイナリデータが入ったりしません。 NMEAそのものを抽出しても何に使えるか分かりませんが、整備したパーサには他の機能もあるので色々試してみてください。


プログラムのダウンロード
リリース日 プログラムパッケージ 更新内容
2013/4/28 NMEAextractionFromUbloxLog_20130428.zip RMCセンテンスに関する処理を増やしました。
RMC, GGA, VTG, ZDAを抽出します。
以下、その他の改良点です。
  • 南半球や西半球にも対応
  • ublox-6Tに対応
2012/3/28 NMEAextractionFromUbloxLog_20120328.zip 初公開です。 とりあえずGGA・VTG・ZDAを抽出するようにしました。
なお、Pythonで組んだGPS関係のライブラリも同梱しています。

基本的使い方

コマンドの実行時に、ファイル名を指定する様にして下さい。

実行コマンド

コマンドを実行した様子


link to INDEX

IGSの放送暦を自動でダウンロードする

使用言語:Ruby
開発環境:Windows 7 (64bit), ActiveScriptRuby 1.8.7

GPS衛星の軌道計算をする際にいちいちブラウザを使ってファイルをダウンロードしなくても済むようにスクリプトを作りました。 期間の指定により大量の放送暦を一度にダウンロードすることが出来ます。 熊本大学の回線では、1日分の放送暦当たり5秒程度でダウンロードできました。
なお、コードの開発そのものはWin7 x64で行っていますが、スクリプトですので他のマシンでも動作します。


プログラムのダウンロード
リリース日 プログラムパッケージ 更新内容
2012/10/6 IGS_ephemeris_downloader_for_WEB_release_20121006.zip コードを書ける位の人ならIGSに迷惑をかけてしまうこともないだろうと思い、1日分しかダウンロードできない機能限定版を公開することにしました。 これを基に、複数の日付にまたがってダウンロードするコードを書くのはそんなに難しくないと思います。
2011/4/4 no link プログラムの性質上、誰彼構わず配布して良いものか悩む所です。
下手にいじられるとIGSのサーバへ負担を掛けかねませんし。
という訳で、所望する方は所属と氏名を明かした上で私へメールを頂ければダウンロード用のアドレスをお教え致します。

IGSの放送暦をダウンロードした様子
IGSの放送暦をダウンロードした様子

link to INDEX

IGSの放送暦を整理してCSVファイルに出力する

使用言語:ruby
開発環境:Windows7 (32bit), ActiveScriptRuby 1.8.7

IGSがリリースしている放送暦のパラメータを整理して読みやすいCSV形式に変換するRubyスクリプトです。 コメントをかなり入れてますので、更に処理するパラメータを増やすことも容易だと思います。 ダウンロードファイルには、IGSの放送暦・Rubyによる処理プログラム・処理後CSVファイル・グラフ化しているxlsxファイルを同梱しました。 xlsxファイルを見て貰うと分かりますが、昇交点赤経のパラメータが意外な動きをしているのが分かります。 って、合ってますよね?

[2011/1/10 追記]ファイル容量制限に引っ掛かって定期的に削除されていたので同梱する放送暦・画像ファイルを減らしました。


プログラムのダウンロード
リリース日 プログラムパッケージ 更新内容
2011/1/26 IGS_ephemeris2CSVver4.7z 大きな変更点は次の2つです。
1) 今後の拡張を睨んで、ヘッダ行サイズが8行でなくとも処理できるようになりました。
2) GPS week, SV health, TOE(Time Of Epoch)のGPS時刻表現, TOT(Time Of Transmit)のGPS時刻表現を追加しました。
自己解凍形式はこちらです。
2010/12/18 IGS_ephemeris2CSVver3.zip 大きな変更点は次の2つです。
1) 引数で処理したいファイルを指定しても良い(引数が無ければ、フォルダ内の全放送暦を処理)
2) 放送時刻(TOTやTOMと言う奴です)とエポックをGPS時刻系で表現した項目も付加した
2010/12/11 IGS_ephemeris2CSVver2.zip 大きな変更点は次の2つです。
1)文字列の数値化の方法を改めました。
2)プログラムの実行時に処理したいファイルを指定する必要が無くなりました。 ソースコードと同じフォルダ内の全ての放送暦を一つのCSVファイルにまとめるようにしました。

正規表現を用いて、一気に文字列を浮動小数点型の配列として返す関数を追加しました。 これでさらに使いやすくなりました。
このプログラムはデフォルトでPRN, DATE, CLOCK, IODE, M0, TOE, OMEGA, omega, IODC, TOT, FITを抽出してCSV形式に直します。
2010/11/14 IGS_ephemeris2CSV.zip 初公開。
[2010/12/11追記]一部に文字の取りこぼしが有るらしく、有効数字が一桁少ないのを確認しました。 以後は最新版をお使い下さい。

基本的使い方

実行コマンド

コマンドを実行した様子

実行の結果

左:元のRINEXフォーマットファイル 右:処理後のCSVファイル


link to INDEX

経度・緯度・標高データを読み込んで、Google Earthで読み込めるkmlファイルを作出する

使用言語:ruby
開発環境:Windows7 (32bit), ActiveScriptRuby 1.8.7

以下の様に経度,緯度,標高の順に並んだデータを読み込んで、これをGoogle Earthで読み込めるようにkmlファイル化します。 ダウンロードファイルには、あるGPS衛星一日分のサンプルデータを添付しています。 MATLABを使わなくても軌道を確認出来て便利です。 ECEF座標系のx,y,zのデータであっても、割と簡単なソースコードの改造で同様の処理が行えるはずです。

**データフォーマット例**
173.398474103809,-49.5641186950898,20085089.7646485
-179.113828242437,-52.1760665266914,20117614.7985721
-170.594272392161,-53.6038773264183,20150831.0478571
-161.65496191649,-53.7147177897012,20184165.1599795
-153.071294391038,-52.506460875898,20217045.3987616
-145.481787881562,-50.1098409607123,20248911.3256447


プログラムのダウンロード
リリース日 プログラムパッケージ 更新内容
2010/7/11 blh2kml.zip 初公開。

実行中のスクリーンショット
スクリーンショット
Google Earthで読み込み
サンプルをGoogle Earthで読み込んだ所。透過処理の調整が必要です。

link to INDEX

ECEF座標系などのx,y,zデータを読み込んで、緯度・経度・楕円体高へ変換したファイルを作出する

使用言語:ruby
開発環境:Windows7 (32bit), ActiveScriptRuby 1.8.7

以下の様にx,y,zの順に並んだデータを読み込んで、これを緯度・経度・楕円体高に変換してログファイルに出力します。 このプログラムは、PRN2GPS衛星の3ヵ月分のサンプルデータを同梱しています。 計算で求めた衛星の位置をKMLファイル化するために使えます。

計算には地表付近では十分な精度を持つ近似式を利用していますので地表付近のデータなら大丈夫なのですが、衛星の位置になると誤差が無視できないと思います。 あくまでGoogle Earthで表示して衛星の動きを確認するという大雑把な把握に使う目的でお使用ください。

**データフォーマット例**
-17161519.32,14031432.89,14255041.22
-21751946.48,14187762.58,4204428.294
-22034958.15,12592697.41,-7009818.374
-19338810.66,7637797.372,-16290262.97
-16064923.38,-550937.301,-21115181.62
-14181466.87,-10019779.71,-20238205.18
-14074306.28,-17978999.7,-13967987.89


プログラムのダウンロード
リリース日 プログラムパッケージ 更新内容
2010/8/27 test_xyz2blh.zip 初公開。


実行コマンド


実行した様子


link to INDEX

ECEF座標系の座標値から緯度・経度・楕円体高を計算する

使用言語:VB2010
開発環境:Windows7 (32bit), Visual Basic 2010

ECEF座標系の座標値から緯度・経度・楕円体高を計算するGUIソフトです。 計算アルゴリズムは坂井さんの「GPSのための実用プログラミング」p.28の近似式を使っています。 電子基準点をその公開されているECEF座標とハンディGPS受信機を使って探し出すのに使ったことがあります。 書籍には近似精度は実用上十分とありましたが、確かに10cm以内の誤差しかないような気がします。 あ、ちなみに地球中心近くの座標を入力しても正常には計算してくれません。 あしからず。


プログラムのダウンロード
リリース日 プログラムパッケージ 更新内容
2010/7/11 coordinate_change.zip 初公開。1年前にVB2008で組んだものをVB2010で再ビルド。
実行は、coordinate_change\coordinate_change\obj\Debugにあるcoordinate_change.exeを使って下さい。

実行中のスクリーンショット
スクリーンショット

link to INDEX

NMEAセンテンスを処理して緯度・経度を整列させる

使用言語:ruby
開発環境:Windows7 (32bit), ActiveScriptRuby 1.8.7

NMEAフォーマットで記録したGPS受信機のログから、UTC時刻・緯度・経度だけを抽出するサンプルプログラムです。 緯度と経度はデフォルトだとddmm.mmmmのフォーマットになっていますが、これをdd.ddddddと度に単位を変換して出力します。 位置情報の取得にはGGAセンテンスを使用しました。

サンプルプログラムにはRuby初心者でも分かる様に出来る限りコメントを付けました。 また、機能拡張が簡単に出来るように書いていますので、NMEAセンテンスをいじるのにはかなり便利なツールだと思います。

サンプルデータにはへミスフェア(Hemisphere)社製のA100と云う受信機で記録したログとその処理結果を添付しています。
以下は処理例です。

073727.00,130.729382166667,32.813639
073728.00,130.7293825,32.8136386666667
073729.00,130.729383,32.8136386666667
073730.00,130.729383333333,32.8136385
073731.00,130.729383666667,32.8136383333333
073732.00,130.729384333333,32.8136383333333
073733.00,130.729384666667,32.8136381666667

[2011/1/10 追記]ファイル容量制限に引っ掛かって定期的に削除されていたので同梱する画像ファイルの品質を下げました。


プログラムのダウンロード
リリース日 プログラムパッケージ 更新内容
2010/9/11 getPosFromGGA.zip 初公開。


実行コマンド


link to INDEX

NMEAセンテンスを処理して、指定数分の一に間引く

使用言語:ruby
開発環境:Windows7 (32bit), ActiveScriptRuby 1.8.7

NMEAフォーマットで記録したGPS受信機のログを指定数分の一に間引くことでスリムにするプログラムです。 GGAセンテンスをトリガーにして動作するように書いていますが、コードをテキストエディタで変更すれば他のセンテンスでも上手く行きます。 デフォルトでは、トリガーがGGA,付随してZDAがあればそれも出力するようにしています。


プログラムのダウンロード
リリース日 プログラムパッケージ 更新内容
2011/9/9 NMEA_thinner_v1.zip 初公開。


実行コマンド


link to INDEX

NMEAフォーマットのログデータから未測位データを削除する

使用言語:VB2010
開発環境:Windows7 (32bit), Visual Basic 2010

GPS受信機から得られたNMEAフォーマットのログデータから未測位データを削除します。 カシミール3DにはNMEAログデータを読み込む機能がありますが(プラグインで対応)、未測位データがあると下図の様に律義に緯度経度0,0まで線を引いてくれます。 このうざい機能を避けるために、このプログラムは未測位データを削除します。 本ソフトはWindowsマシンで実行できるGUIソフトです。


プログラムのダウンロード
リリース日 プログラムパッケージ 更新内容
2010/7/11 nmeforkas.zip 初公開。2年前にVB2008で組んだものをVB2010で再ビルド。
実行は、nmeforkas\nmeforkas\obj\ReleaseにあるNMEA Convert for KASHMIR 3D.exeを使って下さい。

カシミール3Dでの飛び
未測位データを含むログデータをカシミール3Dに読み込ませたところ
実行中のスクリーンショット
スクリーンショット

link to INDEX

日付からGPS週番号と曜日を求める

使用言語:ruby
開発環境:Windows7 (32bit), ActiveScriptRuby 1.8.7

rubyというプログラミング言語を使った、年月日からGPS週番号と曜日を求めるプログラムです。 rubyを既にインストールしている環境であれば直ぐにでも使えます。 下図のスクリーンショットに有る様にコマンドを打って貰うと直ぐに計算結果が出力されます。

アルゴリズム的には、入力された日付から一度ユリウス日(JD)を求めて、GPS週番号の起点であるJD2,444,244.5を引いて、さらにそれを7で割るという単純なものです。 JDはある日を起点とした連続通算日です。 ちなみに、GPSの標準エポックは1980/1/6 Sunday 00:00:00.0です。 GPS週番号はGPS時刻系に基づいて計算する必要があります。 従って、うるう秒を考慮して日曜日の日付変更前後の日時は入れない方が無難でしょう。


プログラムのダウンロード
リリース日 プログラムパッケージ 更新内容
2010/6/8 yymmdd_to_Julius_v2.zip 一年の通算日も出力するように変更
2010/6/5 yymmdd_to_Julius.zip 初公開

日付を入れてGPS週番号と曜日を取得する
スクリーンショット
inserted by FC2 system