GPS(eTrex10J)を持って西新宿を歩いてみた

株式会社カーネルでは、GPS(eTrex10J)を使用した商圏等の計測を行うサービスを提供しています。

高層ビル街でのeTrext10Jの精度を計測するために西新宿を徒歩で計測してみました。

※GPS、GLONASS、みちびきを有効にしています。

clip_3

ASCII「みちびき衛星対応のGPSナビ『ガーミン eTrex』の実力を徹底検証」

カテゴリー: GPS

PHP(Windows)で独自の拡張DLLを作成

実行環境

Windows2008R2(64bit)
IIS
PHP5.4.31の非スレッドセーフ版(IIS を使う場合は、非スレッドセーフ版の PHPのほうが安定しているらしい)
環境構築の為にダウンロードしたファイルは(php-5.4.31-nts-Win32-VC9-x86.zip)

開発環境

PHP5.4.31のソース等が入手できなかったため5.4.33のそれをダウンロード

php-5.4のダウンロードサイト

「Download source code」よりphp-5.4.33-src.zipをダウンロード

「VC9 x86 Non Thread Safe」-「Zip」よりphp-5.4.33-nts-Win32-VC9-x86.zipをダウンロード

clip_1ii

php-5.4.33-nts-Win32-VC9-x86.zipをC:\phpに展開。
(C:\phpにはパスを通す)

php-5.4.33-src.zipをC:\php-srcに展開。

Cygwin

拡張dllのフレームワークの作成等にCygwinのコマンドを使用するのでC:\Cygwinにインストール

Cygwinのサイトよりsetup-x86.exeをダウンロードしてセットアップ実行

必用なモジュールが不明だったのでフルインストールを実行したが、texlive-collection-basic.shのインストールで止まってしまった。

フルインストールをやめてデフォルトインストールをしたが、これでも同様にインストールが完了しなかった。

一応、今回の必用なモジュールはインストールされたようなので、深くは追求しない。

VC

VisualStudio2008はあらかじめインストール済

※別途SDKはインストールしていない

拡張DLLのテンプレートを作成

Visual Studio 2008コマンドプロンプトを開いてカレントをC:\php-src\extに移動して以下のコマンドを実行
※php_test.dllを作成するためのプロジェクトワークスペースが作成される

php ext_skel_win32.php --extname=test

config.w32ファイルの編集

C:\php-src\ext\test\config.w32を以下に従って編集

// $Id$
// vim:ft=javascript

ARG_ENABLE("test", "enable test support", "no");

if (PHP_TEST != "no") {
	EXTENSION("test", "test.c");
}

configure


C:\php-srcをカレントにして以下のコマンドを実行

buildconf
configure

正しく実行されればC:\php-src/main/config.w32.hが作成される

C:\php-src\ext\test

プロジェクトの設定とコンパイル

VCでC:\php-src\ext\test\test.dspを開く。
(test.dspはVC6用のプロジェクトファイルなのでVC2008用に変換)

アクティブなプロジェクトをRelease_TSに設定

追加のライブラリプロジェクトにC:\php\devを追加

スクリーンショット 2014-09-22 17.19.25

プリコンパイルプロセッサからZTS=1を削除
(スレッドセーフの時は不要)

スクリーンショット 2014-09-22 16.57.57

参照するライブラリをphp5ts.libからphp5.libに変更
(スレッドセーフの時は不要)

clip_2

以上の設定完了後、コンパイルを実行するとC:\php-src\ext\php_text.sllが作成される

関数の追加

関数Procを追加(引数には数値と文字)

php_test.h

以下を追加

PHP_FUNCTION(Proc);

test.c

test_functions[]にProcを追加

const zend_function_entry test_functions[] = {
	PHP_FE(Proc,	NULL)
	PHP_FE_END	/* Must be the last line in test_functions[] */
};

引数で受けた数値と文字列より文字列に変換して返す関数の実態

PHP_FUNCTION(Proc)
{

	char *arg = NULL;
	int arg_len, len;
	long n;
	char *strg;
	

	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ls", &n, &arg, &arg_len) == FAILURE) {
		return;
	}

	len = spprintf(&strg, 0, "number=%d string=%s", n, arg);
	RETURN_STRINGL(strg, len, 0);
}

以上でリコンパイル

DLLの検証

php_test.dllを実行環境のD:\php\extにコピー

php.iniに以下を追加

extension=php_test.dll

関数の呼び出しをコーディング

$s=Proc(100, "tarum");
echo($s);

以上で正しく動作される

参考サイト


単純な PHP エクステンションの開発方法

カテゴリー: PHP

OpenLayersでGoogleMap上にGeoServerのWMSを表示

道路データ(数年前のデータで旧日本則地形)をGeoServerで配信してGoogleMap上に表示。
同様のことを電子国土でやった経験から簡単にできると思ったが、
意外にてこずり、時間がかかったのでメモ。

GeoServerの設定

特別な設定はしていない「Native SRS」、「Declared SRS」共に旧日本則地形を指定
※表示されない時はSRSを色々と変更したが、結局このまま。

clip_13

OpenLayersのコード

GoogleMap、OSMをOpenLayersで表示する時はmapの投影にEPSG:900913を使用する。
但し、以下のように投影を敢えて明記せずに使用することがある。
もちろん、これは正しく動作する。

var map = new OpenLayers.Map('id_div_map');
var gmap = new OpenLayers.Layer.Google("Google ROADMAP",{numZoomLevels: 20});
map.addLayer(gmap);

しかし、ここにwmsのレイヤーを追加しても正しく表示されない。
OpenLayers.Mapに正しく投影の情報や最大のExtentを明示的に指定する必要がある。

var map = new OpenLayers.Map('id_div_map', {
	maxExtent: new OpenLayers.Bounds(-20037508.34,-20037508.34,20037508.34,20037508.34),
	maxResolution: 156543.0399,
	numZoomLevels: "auto",
	units: 'm',
	projection: new OpenLayers.Projection("EPSG:4326"),
	displayProjection: new OpenLayers.Projection("EPSG:900913")
	});
var gmap = new OpenLayers.Layer.Google("Google ROADMAP",{numZoomLevels: 20});
map.addLayer(gmap);
var road = new OpenLayers.Layer.WMS("LOCAL_ROADS",
	"http://192.9.200.25/geoserver/road/wms?",
	{
		LAYERS: 'road:ROAD5439',
		format: 'image/png',
         	transparent: 'true',
         	isBaseLayer: 'false',
         	projection: 'EPSG:4301',
         	reproject: 'true',
		styles: ''
	});
map.addLayer(road);

※maxExtentに指定した値は(-180、-90)、(180、90)を座標変換した値
-20037508.34,-20037508.34,20037508.34,20037508.34

表示結果

clipll

OpenLayersで著作権等を表示

OpenLayersでMapQuest-OSMタイルを無償で使用するためには著作権表示が必要。

改めてOpenLayersにおける著作権表示について調査。

コントロールを空でOpenLayers.Map作成すると

var map = new OpenLayers.Map('map', {controls:[]});

拡大縮小等のコントロールは何も表示されない。

clipc

OpenLayers.Control.Attributionコントロールを追加すると

map.addControl(new OpenLayers.Control.Attribution());

勝手に著作権情報が表示される

Googleの場合

clipg

OSMの場合

clipo

MapQuest-OSMの場合

clipo2

OSMの著作権だけ表示されてMapQuestが要求する著作権表示になっていない!

オプションで明示的に指定

var mapQuestOption = {
attribution:'Tiles Courtesy of MapQuest'
};
var layer_osm_mapquest = new OpenLayers.Layer.OSM("MapQuest-OSM", mapQuestArray,mapQuestOption);

期待した結果になった

clipo3

OpenLayersでMapQuest-OSMタイル表示

OpenLayers.Layer.OSMで使用可能なタイルサーバーは以下に記載
TMS
MapQuestは比較的シンプルで見栄えがよい
「TMS」にはMapQuestはFREEと記載しているが改めて確認。

MapQuestのサイトには
「利用規約
マップクエストのオープンタイルは、以下の条件で無料で使用できます。
マップクエスト、OSMのタイルを使用する場合は、OpenStreetMapは、データのためのクレジットが与えられなければなりません-を参照して、この項の詳細は、OSMの法的FAQのを。
マップクエストオープンエアリアルタイルを使用している場合は、属性をお願いとして、「一部の礼儀はNASA / JPL-Caltechの、米国発農業、農業サービス庁 “。
」のタイル礼儀に置かないでくださいマップクエストを “あなたのページ上、またはマップの著作エリアのワードリンク」にマップクエスト ” を http://www.mapquest.com 。 以下は、サイトで使用できるコードスニペットは次のとおりです。

Tiles Courtesy of MapQuest

アプリケーションが(現在は毎秒4,000以上のタイルとして定義される)重い使用状況を取得する場合は、私達は私達に電子メールを送信することにより、お知らせくださいopen@mapquest.com 。 私たちが知っておくと余分なトラフィックに対応するように、使用目的の推定値を記載してください。
(例えば-プレスリリースや企業の発表)の発表があるだろう場合は、マップクエストでご連絡くださいopen@mapquest.com私たちは良いニュースとマップタイルの使用量の任意の期待のジャンプを知っているように。
これらのタイルの使用はご自身の責任である。
これらのタイルの使用法は、私たちに支配されている利用規約 。
OpenStreetMapのデータは下でライセンスされてオープン·データ·コモンズオープンデータベースライセンス(ODbLの)。」と記載されており、著作について記載すればフリーで使用可能。

clip_1

OPenLayersでVectorのPointにアイコン設定

OpenLayersにはMarkerがあり、ポイントをアイコンで表示する時に非常に便利に使える。
同様にVectorにもPointがあり、これにもアイコンが設定できそう。

とりあえずリンク

http://gis.stackexchange.com/questions/33141/change-icon-of-single-vector-feature-in-layer

http://www.codechewing.com/library/add-external-graphic-icon-to-geometry-point-openlayers/

http://www.codechewing.com/demo/add-icon-to-geometry-point-openlayers/

OpenLayersのクラスター表示

以下はリンク集、今後まとめる

http://openlayers.org/dev/examples/strategy-cluster-threshold.html
http://openflights.org/blog/2009/10/21/customized-openlayers-cluster-strategies/
http://openlayers.org/dev/examples/strategy-cluster-extended.html
http://openlayers.org/dev/examples/strategy-cluster.html
http://stackoverflow.com/questions/6641919/openlayers-nice-marker-clustering
http://openlayers.org/dev/examples/strategy-cluster.html