Home > プログラム

プログラム

RenderingHints.KEY_STROKE_CONTROL

車載動画に、現在地の地図を重ねて表示できるとかっこいいかも、と思って試しています。GPSのログは1秒ごとにしか記録されないので、そのまま描画すると昔のカーナビのようにカクカクしてしまいます。最近のナビやiPhoneのGoogleマップは補間してなめらかに動くので真似をしてみたのですが、1pxより細かく動かすと地図の形が崩れて困っていたのです。線の太さを中途半端な値にしてみてもダメでした。

で、RenderingHints.KEY_STROKE_CONTROLを変えてみて、解決しました。drawは線分の端点がぴったり画面のピクセルに収まるように補正していたのですね。確かに、(0, 0)-(10,0)の1px幅の黒い線分を描画したときに、灰色の2px幅の線が引かれると普通は嫌ですね。

↓サンプルアプリのスクリーンショットを2倍に拡大したものです。実寸表示しないと違いが分からないかも。

KEY_STROKE_CONTROL

右に行くほど、y座標が0.1pxずつ下がっていきます。一番下の文字列は

AffineTransform transform = new AffineTransform();
transform.translate(x, y);
g.fill(new TextLayout("L", g.getFont(), g.getFontRenderContext()).getOutline(transform));

のようにして描画しています。

  • drawは小数点以下を切り捨てているのに、drawStringは四捨五入している?
  • drawString、fillはKEY_STROKE_CONTROLの値に影響されない。(Strokeがこの値を見ている?)

のですね。

(追記)
http://java.sun.com/j2se/1.3/ja/docs/ja/guide/2d/new_features.html#SO
にSunの解説がありました。

このページを見て驚いたのが・・・全く関係ありませんが、QuadCurve2D、CubicCurve2Dで2次方程式と3次方程式を解けたのですね。

Map 6.2.1

2年以上地図表示ソフトを放置している間に数値地図2500(空間データ基盤)の公開が終わっていました。メンテを再開します。

今回のバージョンアップは、公開されなくなったデータを読み込まないようにして何とか動くようにしただけのものです。

変更点は、以下の通りです。

  • 数値地図2500(空間データ基盤)の公開が終わったため、読み込まないようにしました。
    • 手元にデータがあっても読み込めなくなりました。
    • 表示倍率がConst.Zoom.LOAD_KSJ_RAILWAY以上のとき、常に国土数値情報の鉄道、道路を描画するようにしました。(category.RailwayKSJMapCategory)
    • 背景画像の描画が変わったので、ビットマップキャッシュを再生成するようにしました。(map.Const)
    • 「読み込み」テキストボックスに市区町村名を入力して検索しても何もヒットしなくなりました。経度、緯度を入力すると移動できます。
  • 国土数値情報の行政界・海岸線のURLが変更されたのに対応しました。(map.Const)
  • 平成16年度、15年度の街区レベル位置参照情報がダウンロードできないときにステータスバーの表示がおかしくなる不具合を修正しました。(isj.ISJUtil)

スクリーンショット

 Map 6.2.1 zoom2
これは、国土数値情報の行政界・海岸線、鉄道データ、道路データ、標高・傾斜度3次メッシュデータを用いたものです。

Map 6.2.1 zoom3
これは、国土数値情報の行政界・海岸線、鉄道データ、道路データ、標高・傾斜度3次メッシュデータを用いたものです。

Map 6.2.1 zoom4
これは、国土数値情報の行政界・海岸線、鉄道データ、道路データ、標高・傾斜度3次メッシュデータ、街区レベル位置参照情報を用いたものです。

寂しい感じですね・・・。街区番号だけ分かっても仕方ない気もしますが、とりあえずそのまま残しています。

ダウンロード

http://sourceforge.jp/projects/zenjiro/downloads/43108/map-6.2.1.jar/

JOGLを試す

今更ながら、JOGL(Java bindings for OpenGL)を試してみました。Java 6がインストールされている環境では、下のリンクをクリックしてJava Web Startで開くとアプリが実行されるはずです。

http://itpro.nikkeibp.co.jp/article/COLUMN/20060811/245696/
のサンプルをほとんどそのまま使わせてもらいました。

robottest.png
スクリーンショット

gpx2exif.php

GPX形式のGPSログと写真の撮影時刻をマッチングして、写真のExifに撮影位置を書き込むPHPスクリプトを作ってみました。実行にはPEL: PHP Exif Libraryが必要です。(ここで再配布します。)ライセンスはGPLとします。

ダウンロード

インストール

  1. ダウンロードした2つのファイルを同じディレクトリに置く。
  2. pel-0.9.1.tar.gz を展開する。
    $ tar zxf pel-0.9.1.tar.gz

使い方

gpx2exif.php を実行します。コマンドライン引数にGPXファイル(複数可)と写真(複数可)を指定します。指定する順序は関係ありません。引数に指定した写真に撮影地点が書き込まれます。

$ ./gpx2exif.php *.gpx *.JPG
[DSC05715.JPG] EXIF: 2008/08/14 14:08:20, GPS: 2008/08/14 14:08:31, 34.454273224, 135.514221191
[DSC05733.JPG] EXIF: 2008/08/14 15:27:17, GPS: 2008/08/14 15:27:31, 34.454059601, 135.511215210
[DSC05734.JPG] EXIF: 2008/08/14 15:52:57, GPS: 2008/08/14 15:53:01, 34.454376221, 135.511260986
[DSC05751.JPG] EXIF: 2008/08/14 23:00:00, GPS: -

注意

Exifのメーカーノートが壊れるようなので、写真はバックアップすることをお勧めします。

動作環境

以下の環境で動作確認しました。

  • OS・・・Ubuntu 7.10
    • PHP 5.2.3-1ubuntu6.4
  • ロガー・・・GlobalSat DG-100
    • GPSBabel 1.3.5-beta20070807 でGPX形式に変換
  • カメラ・・・ソニー α100

言い訳など

  • 写真1枚ごとに、全ての記録ポイントとの時刻の差を求め、一番近かった場所をそのまま書き込んでいます。動作はかなり遅いです。
  • 東経、北緯決め打ちで処理しているので、海外で撮影した写真は処理できないかもしれません。

Google Chart APIの粗悪な模造品

PHPのPear::Image_Graphの練習がてら、Google Chart API風にグラフを生成するものを作ってみました。とても実用に堪えるものではありません。

Image_Graphは、

  • (うちのUbuntu 7.10 Desktopでは)線にアンチエイリアスがかからない
  • まともなドキュメントがない
  • ドキュメントどおりに動作しない

ので、あまり使う気がしません。

試しに、このブログの投稿数の変化をグラフ化してサイドバーに置いてみています。

a.png

Continue reading

g2l-0.2.1

g2l-0.2.0は、やはり土地利用3次メッシュの読み込み部分にバグがありました。

実行方法はg2l-0.2.0と同じで、国土数値情報から標高・傾斜度3次メッシュデータ(JPGIS準拠データ)土地利用3次メッシュデータ(JPGIS準拠データ)をダウンロードして展開し、以下のように、コマンドライン引数として渡します。ライセンスはGPLとしておきます。

$ java -jar g2l-0.2.1.jar G04-a-81_*.xml L03-a-97_*.xml > a.ldr

やっと自然な色になりました。

大阪湾周辺 [元画像]
(これは、国土数値情報の標高・傾斜3次メッシュデータ(G04-a- 81_5134.xml、G04-a-81_5135.xml、G04-a-81_5234.xml、G04-a-81_5235.xml、1981 年)、土地利用3次メッシュデータ(L03-a-97_5134.xml、L03-a-97_5135.xml、L03-a-97_5234.xml、 L03-a-97_5235.xml、1997年)を使用したものです。)

富士山周辺 [元画像]
(これは、国土数値情報の標高・傾斜3次メッシュデータ(G04-a- 81_5238.xml、G04-a-81_5239.xml、G04-a-81_5338.xml、G04-a-81_5339.xml、1981 年)、土地利用3次メッシュデータ(L03-a-97_5238.xml、L03-a-97_5239.xml、L03-a-97_5338.xml、 L03-a-97_5339.xml、1997年)を使用したものです。)

g2l-0.2.0

土地利用3次メッシュデータ(JPGIS準拠データ)も読み込んで、色をつけてみました。いろいろバグがあるようで、以前に旧フォーマットのものを読み込んだときとかなり違います。

標高・傾斜度3次メッシュデータ(JPGIS準拠データ)もダウンロードして、以下のように実行すれば、LDraw形式で保存できます。(コマンドライン引数は、どんな順序で指定してもOKです。)

$ java -jar g2l-0.2.0.jar G04-a-81_*.xml L03-a-97_*.xml > a.ldr

試しにレンダリングしてみました。

大阪湾周辺 [元画像]
(これは、国土数値情報の標高・傾斜3次メッシュデータ(G04-a-81_5134.xml、G04-a-81_5135.xml、G04-a-81_5234.xml、G04-a-81_5235.xml、1981年)、土地利用3次メッシュデータ(L03-a-97_5134.xml、L03-a-97_5135.xml、L03-a-97_5234.xml、L03-a-97_5235.xml、1997年)を使用したものです。)

g2l-0.1.0

国土数値情報の標高・傾斜度3次メッシュデータ(JPGIS準拠データ)をLDraw形式に変換してみました。全部1×1のブロックを使っているので、あまり広い範囲は扱えないでしょう。

データをダウンロードしてきて展開し、以下のように実行すれば、LDraw形式で保存できます。

$ java -jar g2l-0.1.0.jar G04-a-81_*.xml > a.ldr

L3PでPOV-Rayのソースコードに変換し、レンダリングしてみました。

$ l3p -f -b -ca30 -o a.ldr
$ povray +W1600 +H1200 +A0.1 a.pov

g2l-0.1.0 [元画像]
(これは、国土数値情報の標高・傾斜3次メッシュデータ(G04-a-81_5134.xml、G04-a-81_5135.xml、G04-a-81_5234.xml、G04-a-81_5235.xml、1981年)を使用したものです。)

土地利用3次メッシュで色をつけると、きれいかもしれませんね。

Flex Builderを試してみた

いつの間にかAdobeからFlex Builder Linux Public Alphaというものが出ていたので、試してみました。以前にFlex 2 SDKを試そうとしたときはコンパイルが遅すぎてすぐに諦めていましたが、まともに使えるレベルに進化していました。

試しに、以前GWTで作ったGPS-CS1K→ALPSLAB routeをそのまま移植してみました。GWT版と比べると、かなり高速に動作します。

http://zenjiro.dyndns.org/flex-gps/

ソースコード:GPS.mxmlGPS.as
ライセンスはGPLとでもしておきます。

感想は、

  • XMLでGUIを書くのは直感的で分かりやすい。
  • バインディングというのがとても便利。
  • ActionScriptは言語仕様がダメだと思う。(Javaに比べて。JavaScriptよりはましかと。)

という感じです。

Continue reading

ConvolveOpでぼかし

画像のぼかしがしたくなり、SunのJava 2D(TM) プログラマーズガイド - イメージングのサンプルプログラムを参考にテストプログラムを書いてみました。

端っこの処理がものすごくいい加減なのですが…。

元画像

元画像

処理後

処理後

ソースコード

final BufferedImage image = ImageIO.read(new File("a.jpg"));
final int blurSize = 40;
final float[] elements = new float[blurSize * blurSize];
Arrays.fill(elements, 1f / blurSize / blurSize);
final Kernel kernel = new Kernel(blurSize, blurSize, elements);
final ConvolveOp op = new ConvolveOp(kernel, ConvolveOp.EDGE_NO_OP, null);
final BufferedImage image2 = new BufferedImage(image.getWidth(), image.getHeight(), image.getType());
op.filter(image, image2);
ImageIO.write(image2, "JPEG", new File("b.jpg"));

ConvolveOpの2つ目の引数には端っこの処理方法が指定できるようなのですが、EDGE_NO_OPとEDGE_ZERO_FILLしか選べません。EDGE_ZERO_FILLを選ぶと、黒くなります。うーん…。

ConvolveOp.EDGE_ZERO_FILL

Home > プログラム

検索
フィード
メタ
カウンタ
  • 416,581 since June 1998.

Page Top