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を追加
あとはブラウザでhttp://localhost/jsapi.htmlにアクセスする。
dojo.require("esri.map");
var myMap;
function init() {
myMap = new esri.Map("mapDiv",{
basemap:"streets"
});
}
dojo.ready(init);
これだけで以下のようなアプリを起動できる。
ArcGIS API for JavaScriptはdojoベースなので、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.jsvar 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;
}
メモリリーク対応
_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";