ArcGIS Onlineに避難所データを追加する

LinkDataウェブサイトから、我孫子市避難所のテーブルデータ(テキスト)をダウンロードする。
http://linkdata.org/work/rdf1s1682i

ArcGISウェブサイトにサインインし、マップを選択する。
http://www.arcgis.com/home/index.html

マイマップ画面にて「追加」「ファイルからレイヤを追加」を選択する。

「ファイルからレイヤを追加」にて我孫子市避難場所データを選択し、「レイヤのインポート」を選択する。

CSVレイヤの追加」にて、使用しているフィーチャの特定を「緯度/経度」にし、
データファイルの緯度経度を場所フィールドに指定し、「レイヤの追加」を選択する。

これで避難所データをArcGIS Onlineに追加できる。

ArcGIS API for JavaScriptで地図アプリ作成

ArcGIS API for JavaScriptを用いることで、WebGISアプリを簡単に作成することができる。
このAPIは、教育機関による教育目的での利用、非営利目的での利用の場合、無償で利用できる。

まず、以下のようなコード(jsapi.html)を作成し、[C:\inetpub\wwwroot]に配置する。


jsapi.html



サンプル




ここにid="mapDiv"のdivを追加


スクリプトは以下の通り

dojo.require("esri.map");
var myMap;
function init() {
myMap = new esri.Map("mapDiv",{
basemap:"streets"
});
}
dojo.ready(init);
あとはブラウザでhttp://localhost/jsapi.htmlにアクセスする。
これだけで以下のようなアプリを起動できる。

ArcGIS API for JavaScriptdojoベースなので、dojo Toolkitを用いてリッチなUIを用いることも可能。

OpenLayersとOpenStreetMapを用いた地図アプリケーションの開発その1

下図のようなWebアプリケーションの開発手順を何回かに分けて記載する。

主な機能は下記
・地図を表示
・地図上に表示する地物のリストを表示
・リストのチェックボックスをチェックすると地図上の該当地物上にアイコン表示
・アイコンをクリックすると該当地物の情報をポップアップ表示

まずはms4w(MapServer for Windows)をダウンロードし、Cドライブ直下にインストールする。

続いてOpenLayersをダウンロードし下記に配置する。
C:\ms4w\Apache\htdocs\sample\OpenLayers-2.11

下記をアプリケーションのルートとし、必要なファイルを配置する。
C:\ms4w\Apache\htdocs\sample

index.htmlを作成し、必要なスクリプトを記載する。


C:\ms4w\Apache\htdocs\sample\index.html



サンプルマップ












map.jsを作成し、OpenStreetMapを表示するコードを記述する。


C:\ms4w\Apache\htdocs\sample\map.js

var map;
onload = function() {
var lon = 140.0357;
var lat = 35.87;
var zoom = 13;

var options = {
controls: [
new OpenLayers.Control.PanZoomBar(),
new OpenLayers.Control.Navigation()
]
}

map = new OpenLayers.Map('map', options);

// OpenStreetMapレイヤ
var osm = new OpenLayers.Layer.OSM();
map.addLayer(osm);

map.zoomToMaxExtent();

var lonLat = new OpenLayers.LonLat(lon, lat).transform(
new OpenLayers.Projection("EPSG:4326"),
new OpenLayers.Projection("EPSG:900913"));
map.setCenter(lonLat, zoom);
};

ウインドウスタイルを変更する


MFCアプリケーションのウインドウ属性を変更するには、PreCreateWindow関数でCREATESTRUCT構造体のstyle属性を設定する。


BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
if( !CFrameWnd::PreCreateWindow(cs) ) {
return FALSE;
}

// 最大化ボタンを無効化
cs.style &= ~WS_MAXIMIZEBOX;

// サイズ変更境界を無効化
cs.style &= ~WS_SIZEBOX;

return TRUE;
}

仮想デストラクタ


派生クラスを作成した場合、コンストラクタは基底クラス→派生クラスの順に呼ばれる。
一方デストラクタは、派生クラス→基底クラスの順に呼ばれる。

非仮想関数では、基底であっても派生であっても、インスタンスの型を見てどちらのクラスの関数を呼び出すかを決める(静的結合)。
一方仮想関数では、実行時にそのインスタンスが基底か派生かを調べ、どちらの関数を呼び出すか決める(動的結合)。

そのため基底クラスのデストラクタが仮想でない場合、基底クラスのポインタに派生クラスをnewしてdeleteした際に、基底クラスのデストラクタしか呼ばれず、派生クラスのデストラクタが呼ばれない。

メモリリーク対応


_CrtSetBreakAllocを用いると、指定したメモリ割り当て位置にブレークポイントを設定できる。
下記のようなログが出た場合、strcore.cpp(156)を呼び出している個所を特定する際に用いる。
ただし、毎回固定位置にメモリ割り当てされる場合にしか使えない。


Detected memory leaks!
Dumping objects ->
{9357} normal block at 0x04693B90, 171 bytes long.
Data: <20101201 224300> 32 30 31 30 31 32 30 31 20 20 32 32 34 33 30 30
・・・・
{1865} normal block at 0x04664618, 171 bytes long.
Data: <20101130 230000> 32 30 31 30 31 31 33 30 20 20 32 33 30 30 30 30
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {1658}
normal block at 0x0035DB30, 75 bytes long.
Data: < Y: : > B4 A6 B8 59 3A 00 00 00 3A 00 00 00 01 00 00 00
Object dump complete.

上のようなログが出た場合、{}に囲まれた値を指定して、
該当処理を行っているクラスのコンストラクタで_CrtSetBreakAllocを実行する。

_CrtSetBreakAlloc(1865);

エラー「ヒープが壊れていることが原因として考えられます。」


mallocで確保した領域を初期化せずにstrcatしていたため、確保した領域内のゴミの後ろに文字列が連結されていた。今まではmalloc後にstrcpyしていたが、そこをコメントアウトしたことで発生していた。
回避するには、mallocした後はstrcatではなくstrcpyするか、mallocした領域を初期化して用いる。


char* buf = (char*)malloc(128);

char tmp[32];
//sprintf(tmp, "%3d", data1 );
//strcpy(buf, tmp);

sprintf(tmp, "%3d", data2 );
strcat(buf, tmp);

・・・・

// ここで「ヒープが壊れていることが原因として考えられます。」エラーとなる
std::string str = "test";