Anatomography Map API サンプルコード - html + javascript - 画像をクリックしてPinを打つ

概要

画像上をクリックして、交差する三次元空間上の座標を取得し、その場所にPinを打つようにJSONを生成して再描画します。Pinは最大10件まで保持し、最新のPinは赤、それ以外は青で描画するようにします。

サンプルコード

空のhtmlファイルを作成し、テキストエディタで以下の内容をコピー&ペースト、保存して下さい。
<html>
<head>
<!-- load google hosted jquery library -->
<script src="http://ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script>
<script type="text/javascript">
$(function() {
  var bp3dApiBase = "http://lifesciencedb.jp/bp3d/API/";
  var pinAry = new Array();
  $("#drawbutton").click(function () {				// define draw button click event
    drawAnatomography();					// draw anatomography
  });
  $("#anatomography").click(function (e) {			// define anatomography image click event
    var areaOffset = $("#anatomography").offset();		// get image offset
    var offsetTop = Math.floor((e.pageY)-(areaOffset.top));	// calc y-coordinate of clicked point
    var offsetLeft = Math.floor((e.pageX)-(areaOffset.left));	// calc x-coordinate of clicked point
    var queryObj = getJsonObj();				// get query JSON object
    var pickObj = new Object();					// define pick object
    pickObj["MaxNumberOfPicks"] = 1;				// pick only nearest point
    pickObj["ScreenPosX"] = offsetLeft;				// set ScreenPosX as x-coordinate of clicked point
    pickObj["ScreenPosY"] = offsetTop;				// set ScreenPosY as y-coordinate of clicked point
    queryObj["Pick"] = pickObj;					// set "Pick" as pickObj
    $.ajax({
      type: "GET",
      url:bp3dApiBase + "pick?" + JSON.stringify(queryObj, null, ""),	// use pick method of Anatomography map API
      dataType:'jsonp',							// the result will be returned by jsonp
      timeout:5000,
      success: function(jsonObj) {
        if (jsonObj["Pin"][0] != undefined) {			// if valid point was returned
          jsonObj["Pin"][0]["PinColor"] = "FF0000";		// set pin color as red
          if (pinAry.length >= 10) {				// if number of pins is more than 10
            pinAry.shift();					// remove first pin
          }
          for (var i = 0; i < pinAry.length; i++) {		// for every old pins
            pinAry[i]["PinColor"] = "0000FF";			// set pin color as blue
          }
          pinAry.push(jsonObj["Pin"][0]);			// append returned pin
          drawAnatomography();					// draw anatomography
        }
      },
      error: function(XMLHttpRequest, textStatus, errorThrown) {
        alert(textStatus);
      }
    });
  });
  function getJsonObj () {					// this function returns query JSON object
    var queryObj = new Object();				// define object for query JSON
    queryObj["Part"] = new Array();				// define part as array
    var partsAry = $("#partslist").val().split(/\r\n|\r|\n/);	// get parts list from textarea and split by linefeed
    for (var i = 0; i < partsAry.length; i++) {			// for loop to deal each parts
      if (partsAry[i].length == 0) {				// in case of empty line
        continue;						// nothing to do
      }
      var partInfoAry = partsAry[i].split(",");			// split by comma to separate part id, color, opacity
      var partObj = new Object();				// define new part object
      partObj["PartID"] = partInfoAry[0];			// set PartID of part object
      partObj["PartColor"] = partInfoAry[1];			// set PartColor of part object as hexadecimal code
      partObj["PartOpacity"] = parseFloat(partInfoAry[2]);	// set PartOpacity of part object
      queryObj["Part"].push(partObj);				// add part object to json object
    }
    var cameraObj = new Object();				// define camera object
    cameraObj["CameraMode"] = $("#view").val();			// set CameraMode of camera object as set by user
    queryObj["Camera"] = cameraObj;				// add camera object to json object
    if (pinAry.length > 0) {					// if pin array have any element
      queryObj["Pin"] = pinAry;					// add pinAry as Pin object
    }
    return queryObj;
  }
  function drawAnatomography () {				// draw anatomography image with current setting and pins
    var queryObj = getJsonObj();				// get query JSON object
    var jsonString = JSON.stringify(queryObj, null, " ");	// convert JSON object to JSON string
    $("#json").val(jsonString);					// display JSON string in textarea
    $("#anatomography").attr('src', bp3dApiBase + "image?" + jsonString);	// update img src to show anatomography
  }
  drawAnatomography();
})
</script>
</head>
<body>
parts list<br />
<!-- text area of part id list for drawing -->
<textarea id="partslist" rows="10" cols="50" >FMA5018,AAAAAA,0.7</textarea><br />
<!-- drop down list for camera view selection -->
view : <select id="view"><option value="front" selected>front</option><option value="left">left</option><option value="back">back</option><option value="right">right</option></select>
<button id="drawbutton">draw</button><br />
query JSON<br />
<!-- text area for requested JSON string -->
<textarea id="json" rows="10" cols="50" ></textarea><br />
anatomography<br />
<!-- img tag to show anatomography -->
<img id="anatomography" src=''>
</body>
</html>
上記のファイルをウェブブラウザで開くと、下記のように表示されます。

画像上でマウスクリックをすると該当位置に赤いピンが打たれます。さらにクリックすることで最大10個のピンが表示されます。ピンを打つごとにJSON文字列が変更されている点を確認して下さい。

Pinのconfigurationを記述したときのJSON文字列は下記のようになっています。
{				JSONオブジェクトとして渡すため{で始めます
 "Part": [				パーツの定義をするために"Part"というキーに対する配列([で始まり)を定義します
  {				1番目のパーツをオブジェクトとして定義します(オブジェクトなので{で始まる)
   "PartID": "FMA5018",		1番目のパーツの"PartID"キーに対して"FMA5018"という値を設定します
   "PartColor": "AAAAAA",		"PartColor"キーに対して"AAAAAA"という値を設定します。キーが続くので,を記述します
   "PartOpacity": 0.7		"PartOpacity"キーに対して0.7を設定します。これ以上のキーは無いので,は不要です
  }				1番目のパーツ定義の終了(})
 ],				パーツ配列定義の終了(])と、次のカメラ定義があるため区切り文字(,)を記述します
 "Camera": {			カメラの定義をするために"Camera"というキーに対するオブジェクトを定義します
  "CameraMode": "front"		"CameraMode"というキーに対して"front"という値をセットします
 },				カメラの定義終了(})。引き続きPinの定義があるため区切り文字(,)を記述します
 "Pin": [				ピンの定義をするために"Pin"というキーに対する配列([で始まり)を定義します
  {				1番目のピンをオブジェクトとして定義します(オブジェクトなので{で始まる)
   "PinX": -3.40,			1番目のピンのX座標を指定
   "PinY": -177.18,			1番目のピンのY座標を指定
   "PinZ": 1564.58,			1番目のピンのZ座標を指定
   "PinArrowVectorX": 0.56,		1番目のピンの方向を示すベクトルのX要素を指定
   "PinArrowVectorY": 34.12,		1番目のピンの方向を示すベクトルのY要素を指定
   "PinArrowVectorZ": 0.63,		1番目のピンの方向を示すベクトルのZ要素を指定
   "PinUpVectorX": 0,		1番目のピンのアップベクトルのX要素を指定
   "PinUpVectorY": 0,		1番目のピンのアップベクトルのY要素を指定
   "PinUpVectorZ": 1,		1番目のピンのアップベクトルのZ要素を指定
   "PinCoordinateSystemName": "bp3d",	1番目のピンの座標系名称を指定
   "PinPartID": "FJ3200",		1番目のピンのパーツが示すIDを指定
   "PinColor": "0000FF"		1番目のピンの色を指定
  },				1番目のピンの定義終了(})、次のピンがあるため区切り文字(,)を記述
  {				2番目のピンをオブジェクトとして定義します(オブジェクトなので{で始まる)
   "PinX": -95.56,			2番目のピンのX座標を指定
   "PinY": -64.21,			2番目のピンのY座標を指定
   "PinZ": 926.26,			2番目のピンのZ座標を指定
   "PinArrowVectorX": -17.73,		2番目のピンの方向を示すベクトルのX要素を指定
   "PinArrowVectorY": 28.63,		2番目のピンの方向を示すベクトルのY要素を指定
   "PinArrowVectorZ": -5.54,		2番目のピンの方向を示すベクトルのZ要素を指定
   "PinUpVectorX": 0,		2番目のピンのアップベクトルのX要素を指定
   "PinUpVectorY": 0,		2番目のピンのアップベクトルのY要素を指定
   "PinUpVectorZ": 1,		2番目のピンのアップベクトルのZ要素を指定
   "PinCoordinateSystemName": "bp3d",	2番目のピンの座標系名称を指定
   "PinPartID": "FJ3152",		2番目のピンのパーツが示すIDを指定
   "PinColor": "FF0000"		2番目のピンの色を指定
  }				2番目のピンの定義終了(})
 ]				ピン定義配列の終了(])
}				JSONオブジェクトの終了(})

ここでピンの色以外の各configurationはプログラム中でpickメソッドを用いて取得した値を利用するためどのような数値を指定するかに関しては、分からなくても問題ありません。
また、上記のピンの値は一例ですので、画像上をクリックした位置によりこれらの値は異なります。