My app, made with openlayers, displays building data called from overpass api.
var data_url = "http://overpass-api.de/api/interpreter?data=(way[building](bbox);node(w););out body;"; //main working url
var building = new OpenLayers.Layer.Vector("Building", {
strategies: [new OpenLayers.Strategy.BBOX({ratio:0.75})],
protocol: new OpenLayers.Protocol.HTTP({
url: data_url, //<-- relative or absolute URL to your .osm file
format: new OpenLayers.Format.OSM()
}),
projection: new OpenLayers.Projection("EPSG:4326")
});
Now i need to render them according the builing tag (commercial, yes, school etc). As of now i am using the Openlayers.Style to define each class.
var stylemap = new OpenLayers.StyleMap({
"default": new OpenLayers.Style({
strokeColor: "white",
strokeWidth: 1
}, {
rules: [
new OpenLayers.Rule({
filter: new OpenLayers.Filter.Comparison({
type: OpenLayers.Filter.Comparison.EQUAL_TO,
property: "building",
value: "yes"
}),
symbolizer: {
fillColor: "olive"
}
})
]
})
})
The thing is i have made a sld file from the same data using Quantum GIS.
<?xml version="1.0" encoding="UTF-8"?>
<StyledLayerDescriptor xmlns="http://www.opengis.net/sld" xmlns:ogc="http://www.opengis.net/ogc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.1.0" xmlns:xlink="http://www.w3.org/1999/xlink" xsi:schemaLocation="http://www.opengis.net/sld http://schemas.opengis.net/sld/1.1.0/StyledLayerDescriptor.xsd" xmlns:se="http://www.opengis.net/se">
<NamedLayer>
<se:Name>interpreter polygons</se:Name>
<UserStyle>
<se:Name>interpreter polygons</se:Name>
<se:FeatureTypeStyle>
<se:Rule>
<se:Name>commercial</se:Name>
<se:Description>commercial</se:Description>
<ogc:Filter>
<ogc:PropertyIsEqualTo>
<ogc:PropertyName>building</ogc:PropertyName>
<ogc:Literal>commercial</ogc:Literal>
</ogc:PropertyIsEqualTo>
</ogc:Filter>
<se:PolygonSymbolizer>
<se:Fill>
<se:SvgParameter name="fill">#a6611a</se:SvgParameter>
</se:Fill>
<se:Stroke>
<se:SvgParameter name="stroke">#000000</se:SvgParameter>
<se:SvgParameter name="stroke-width">0.26</se:SvgParameter>
</se:Stroke>
</se:PolygonSymbolizer>
</se:Rule>
<se:Rule>
<se:Name>office</se:Name>
<se:Description>office</se:Description>
<ogc:Filter>
<ogc:PropertyIsEqualTo>
<ogc:PropertyName>building</ogc:PropertyName>
<ogc:Literal>office</ogc:Literal>
</ogc:PropertyIsEqualTo>
</ogc:Filter>
<se:PolygonSymbolizer>
<se:Fill>
<se:SvgParameter name="fill">#d3ae69</se:SvgParameter>
</se:Fill>
<se:Stroke>
<se:SvgParameter name="stroke">#000000</se:SvgParameter>
<se:SvgParameter name="stroke-width">0.26</se:SvgParameter>
</se:Stroke>
</se:PolygonSymbolizer>
</se:Rule>
<se:Rule>
<se:Name>school</se:Name>
<se:Description>school</se:Description>
<ogc:Filter>
<ogc:PropertyIsEqualTo>
<ogc:PropertyName>building</ogc:PropertyName>
<ogc:Literal>school</ogc:Literal>
</ogc:PropertyIsEqualTo>
</ogc:Filter>
<se:PolygonSymbolizer>
<se:Fill>
<se:SvgParameter name="fill">#ece0c5</se:SvgParameter>
</se:Fill>
<se:Stroke>
<se:SvgParameter name="stroke">#000000</se:SvgParameter>
<se:SvgParameter name="stroke-width">0.26</se:SvgParameter>
</se:Stroke>
</se:PolygonSymbolizer>
</se:Rule>
<se:Rule>
<se:Name>warehouse</se:Name>
<se:Description>warehouse</se:Description>
<ogc:Filter>
<ogc:PropertyIsEqualTo>
<ogc:PropertyName>building</ogc:PropertyName>
<ogc:Literal>warehouse</ogc:Literal>
</ogc:PropertyIsEqualTo>
</ogc:Filter>
<se:PolygonSymbolizer>
<se:Fill>
<se:SvgParameter name="fill">#c6e5e0</se:SvgParameter>
</se:Fill>
<se:Stroke>
<se:SvgParameter name="stroke">#000000</se:SvgParameter>
<se:SvgParameter name="stroke-width">0.26</se:SvgParameter>
</se:Stroke>
</se:PolygonSymbolizer>
</se:Rule>
<se:Rule>
<se:Name>yes</se:Name>
<se:Description>yes</se:Description>
<ogc:Filter>
<ogc:PropertyIsEqualTo>
<ogc:PropertyName>building</ogc:PropertyName>
<ogc:Literal>yes</ogc:Literal>
</ogc:PropertyIsEqualTo>
</ogc:Filter>
<se:PolygonSymbolizer>
<se:Fill>
<se:SvgParameter name="fill">#66beb1</se:SvgParameter>
</se:Fill>
<se:Stroke>
<se:SvgParameter name="stroke">#000000</se:SvgParameter>
<se:SvgParameter name="stroke-width">0.26</se:SvgParameter>
</se:Stroke>
</se:PolygonSymbolizer>
</se:Rule>
</se:FeatureTypeStyle>
</UserStyle>
</NamedLayer>
</StyledLayerDescriptor>
I want openlayers to read this sld file, parse and create a stylemap from it, and use the style in vector(building) layer.
P.S. I hve alread gone through the Openlayers Dev Example.
Edited: The full app
<html>
<head>
<title>WebDRI</title>
<link rel="stylesheet" href="http://openlayers.org/api/2.12/theme/default/style.css" type="text/css">
<!--link rel="stylesheet" href="../../openlayers/theme/default/style.css" type="text/css"-->
<!--link rel="stylesheet" href="osmparser.css" type="text/css"-->
<script src="http://openlayers.org/api/2.12/OpenLayers.js" type="text/javascript"></script>
<!--script src="../../openlayers-2.12/OpenLayers.js"></script-->
<script src="http://ecn.dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=6.2&mkt=en-us"></script> <!--This is required wrapper for the bing images-->
<script src="http://www.openstreetmap.org/openlayers/OpenStreetMap.js"></script>
<!--script src="../OpenStreetMap.js"></script-->
<style>
html, body, #map {margin: 0; width: *; height: 90%;}
</style>
<script type="text/javascript">
//OpenLayers.ProxyHost= "/cgi-bin/proxy.cgi?url=";
//map options
var map;
var centerX = 85.346778;//491213.721224323//-123.1684986291807;//9497800;
var centerY = 27.724879;//5456645.24607268//49.245339757767844;//3212000;
var center = new OpenLayers.LonLat(centerX, centerY);
var range = 0.0005;//10000000//.5;//10000;
var map_bound = [centerX-range,centerY-range,centerX+range,centerY+range];
var extent = new OpenLayers.Bounds(map_bound[0],map_bound[1],map_bound[2],map_bound[3]);
var zoom = 17;
var zoom_data_limit = 18; // vector data will load only in this level or above
//other options
var proj4326 = new OpenLayers.Projection("EPSG:4326");
var proj900913 = new OpenLayers.Projection("EPSG:900913");
var popup;
var field = ["name","amenity","building"];
function submit(){
alert(document.getElementById('name'));
}
function init(){
//map configuration
map = new OpenLayers.Map('map',{
//allOverlays:true,
maxExtent:extent,
controls:[new OpenLayers.Control.PanZoomBar(),
new OpenLayers.Control.MousePosition({
suffix:'',
emptyString:'',
displayProjection:new OpenLayers.Projection("EPSG:4326")
}),
new OpenLayers.Control.ScaleLine(),
new OpenLayers.Control.Scale(),
new OpenLayers.Control.Navigation(),
new OpenLayers.Control.LayerSwitcher(),
new OpenLayers.Control.Attribution()
],
projection:proj4326,
displayProjection:proj900913
});
bing = new OpenLayers.Layer.Bing({name: "Bing Aerial Layer",type: "Aerial",key: "AqTGBsziZHIJYYxgivLBf0hVdrAk9mWO5cQcb8Yux8sW5M8c8opEC2lZqKR1ZZXf",});
osm = new OpenLayers.Layer.OSM("OSM");
map.addLayer(osm);
map.addLayer(bing);
map.setCenter(center.transform(proj4326,proj900913));
//map.setCenter(center);
map.zoomTo(zoom);
var stylemap = new OpenLayers.StyleMap({
"default": new OpenLayers.Style({
strokeColor: "white",
strokeWidth: 1
}, {
rules: [
new OpenLayers.Rule({
filter: new OpenLayers.Filter.Comparison({
type: OpenLayers.Filter.Comparison.EQUAL_TO,
property: "building",
value: "yes"
}),
symbolizer: {
fillColor: "olive"
}
})
]
})
})
//OSM data layer
///api/0.6/map?bbox=left,bottom,right,top
var osm_url = "http://openstreetmap.org/api/0.6/map?bbox=";
//alert("/api/0.6/map?bbox=left,bottom,right,top"+extent.toString());
//var data_url = osm_url+extent.toString();
//alert(data_url);
//document.getElementById('title').innerHTML = data_url;
var data_url = "http://overpass-api.de/api/interpreter?data=(way[building](bbox);node(w););out body;"; //main working url
//var data_url = "Ktm valley 2013-01-01_10-47.osm";
//var data_url = "http://overpass-api.de/api/interpreter?data=%28way%5B%22building%22%3D%22yes%22%5D%28"+map_bound[1]+"%2C"+map_bound[0]+"%2C"+map_bound[3]+"%2C"+map_bound[2]+"%29%3B%3E%3B%29%3Bout%20body%3B%0A";//building=yes
var building = new OpenLayers.Layer.Vector("Building", {
strategies: [new OpenLayers.Strategy.BBOX({ratio:0.75})],
protocol: new OpenLayers.Protocol.HTTP({
url: data_url, //<-- relative or absolute URL to your .osm file
format: new OpenLayers.Format.OSM()
}),
projection: new OpenLayers.Projection("EPSG:4326"),
styleMap: stylemap
});
map.events.on({
"zoomend":function(e){
if(this.getZoom()>=zoom_data_limit){ //sufficiently zoomed in now load vertor data
if(!map.getLayersByName("Building")[0]){
if(map.baseLayer.name=="OSM"){
if(confirm("Do you want to change to Bing Satellite Image?")){
map.setBaseLayer(bing);
}
}
map.addLayer(building);
}
document.getElementById('instructionline').innerHTML = "Click on the Building to see details";
}
else{
if(map.getLayersByName("Building")[0]){
if(map.baseLayer.name=="Bing Aerial Layer"){
if(confirm("Do you want to change to OSM Layer?")){
map.setBaseLayer(osm);
}
}
map.removeLayer(building);
document.getElementById('instructionline').innerHTML = "Zoom in to View Data";
}
}
}
});
//this part shows the bounding boxes of the map
var boxes = new OpenLayers.Layer.Vector("Extent",{
projection: new OpenLayers.Projection("EPSG:900913")
});
boxes.addFeatures([new OpenLayers.Feature.Vector(
extent.transform(proj4326,proj900913).toGeometry()
)]);
//map.addLayers([boxes]);
//map.zoomToExtent(extent);
//map.zoomToExtent(extent.transform(proj4326,proj900913));
//controls
function onPopupClose(evt) {
selector.unselect(selectedfeature);
}
function onFeatureUnselect(feature){
if(feature.popup)
{ feature.popup.destroy(); //removes popup from previously selected feature on selecting new feature
}
}
function onFeatureSelect(feature) {
selectedfeature = feature;
var szHTML = "<div style='font-size:10'><h1>Road form</h1>"
+ "<div id='roadFormInPopup'></div>"
+ "</div>";
var text = "<div id='form'><ul>OSM id:"+selectedfeature.osm_id; //first line of popup
for (var i in field) { //lists all fieldibutes
key = field[i];
val = selectedfeature.attributes[field[i]];
if(val){
text += "<li>" + key + " : " + "<input type='text' id='" + key + "' value='" + val + "'></input></li>";
}
else{
text += "<li>" + key + " : " + "<input type='text' id='" + key + "' value='" + "Please select one from list" + "'></input></li>";
}
}
text +="<input id='save' type='button' value='Save' onClick='submit();'/></ul></div>";
var htmlCode = '<div id="div1">'+feature.osm_id+'<form target="_blank"><table><tr><td> Building </td><td> <select id="bldg"><option value="Old">Old</option><option value="New">New</option> </select></td></tr><tr><td> Stories </td><td> <select id="stry"><option value="Single">Single</option><option value="Multiple">Multiple</option></select></td> </tr></table><input type="button" value="Submit" onclick="loadXMLDOC('+feature.osm_id+')"/></form></div>';
popup = new OpenLayers.Popup.FramedCloud(
"chicken",
selectedfeature.geometry.getBounds().getCenterLonLat(),
null,
//htmlCode,
//szHTML,
text,
null,
true,
onPopupClose
);
popup.updateSize();
feature.popup = popup;
map.addPopup(feature.popup);
}
function onHover(feature) {
//alert(feature.CLASS_NAME);
}
/*var highlighter = new OpenLayers.Control.SelectFeature(building,{
hover:true,
highlightOnly:true,
eventListeners: {featurehighlighted: onHover}
});
map.addControl(highlighter);
highlighter.activate();
*/
var selector = new OpenLayers.Control.SelectFeature(building,{
onSelect: onFeatureSelect,
onUnselect: onFeatureUnselect
});
map.addControl(selector);
selector.activate();
}
</script>
WEB DRI Building Structure Data Collection App Zoom In to view data

