OpenLayersを利用したMapサイトを作るのは大変と思いますが、ここでは簡単な活用できる技を紹介します。
「WMSGetFeatureInfo機能を活用してPointからLineを作る。」
基本の環境は下記の仕様です。
Ver : OpenLayers 2.13.1 DB : Postgres Web : Apache 使用言語 : PHP + Javascript + Html
それからMapの初期化を行います。下記のコードを参考して下さい。
基本的にはOpenLayersのExampleコードは同じです。
var geographic = new OpenLayers.Projection("EPSG:4326");
var mercator = new OpenLayers.Projection("EPSG:900913");
var map, guidelayer;
var point_list = [],point_id_list=[],point_feature,line_feature;
var mapinit = function(){
OpenLayers.ProxyHost = "/cgi-bin/proxy.cgi?url=";
map = new OpenLayers.Map("itkoboz_map", {
projection: mercator
});
guideLayer = new OpenLayers.Layer.Vector("GuideEditLayer", {
displayInLayerSwitcher: false,
isBaseLayer: false
});
map.addLayer(guideLayer);
OpenLayers.ControlのWMSGetFeatureInfoを利用して新しいLineを追加します。
var selectControl = new OpenLayers.Control.WMSGetFeatureInfo({
url: "/geoserver/itkoboz/wms",
title: "Identify features by clicking",
maxFeatures: 50,
queryVisible: true,
infoFormat: "application/json",
eventListeners: {
getfeatureinfo: function(event){
var j = JSON.parse(event.text);
//console.log(j, j.features, event);
makeFeatureLine(j.features);
}
}
});
map.addControl(selectControl);
上のコードを見るとWMSGetFeatureInfoのgetfeatureinfoイベントでクッリクした所のデータを貰います。
function makeFeatureLine(features){
for(var f in features){
console.log(features[f].id, features[f]);
var id = features[f].id;
if(id.search('point.') != -1){
var x = features[f].geometry.coordinates[0];
var y = features[f].geometry.coordinates[1];
var pt = new OpenLayers.Geometry.Point(x,y);
pt.transform(geographic, mercator);
pt.calculateBounds();
var index = point_id_list.indexOf(id.split('.')[1]);
if(index !=-1){
point_list.splice(index, 1);
point_id_list.splice(index, 1);
}else{
point_list.push(pt);
point_id_list.push(id.split('.')[1]);
}
guideLayer.removeAllFeatures();
if(point_list.length>1){
line = new OpenLayers.Geometry.LineString(point_list);
line.calculateBounds();
var point = new OpenLayers.Geometry.MultiPoint(point_list);
point.calculateBounds();
point_feature = new OpenLayers.Feature.Vector(point);
line_feature = new OpenLayers.Feature.Vector(line);
guideLayer.addFeatures([point_feature, line_feature]);
} else if(point_list.length==1){
var wkt = "POINT("+ point_list[0].x + " " + point_list[0].y + ")";
var geometry = OpenLayers.Geometry.fromWKT(wkt);
geometry.calculateBounds();
point_feature = new OpenLayers.Feature.Vector(geometry);
guideLayer.addFeatures([point_feature]);
}
}
}
}
そのデータを元にFeatureデータを作ります。あるデータの中で「idがpointが入ってるデータ」をFeature化します。
transformはDBに保存したデータ形式が地図で使ってる形式が違うから変化するための仕業です。
コードによると、保存してあるPointデータを基にLineデータを作ります。同じPointを選択すると選択解除します。
上の説明を地図で見たら下の様になります。
初期化した地図の画面がこちらです。
そして「selelctControl.activate();」してから下記のデータを貰います。
最初にPointを選択した画面です。
二番目のPointを選択した画面です。
このデータはPointからPointまでのルートを作るためのコードですが、GoogleやYahooみたいに、
ルートをちゃんと計算してくれないですが、自分でPointを入力すればいいルートは作れると思います。











