- added double-buffering for search layers

- added automatic zooming to search result
to location search
pull/1/head
Michael Peter Christen 13 years ago
parent 4d9b2dc487
commit 434af404c1

@ -6,22 +6,28 @@
<script type="text/javascript" src="http://openlayers.org/api/OpenLayers.js"></script> <script type="text/javascript" src="http://openlayers.org/api/OpenLayers.js"></script>
<script type="text/javascript" src="http://www.openstreetmap.org/openlayers/OpenStreetMap.js"></script> <script type="text/javascript" src="http://www.openstreetmap.org/openlayers/OpenStreetMap.js"></script>
<script type="text/javascript"> <script type="text/javascript">
function adaptHeight() { // possible values for dom: location,metatag,alltext,title,publisher,creator,subject
document.getElementById('map').style.height = (document.documentElement.clientHeight - 130) + "px";
}
window.onresize = adaptHeight;
</script>
<script type="text/javascript">
var map; var map;
var searchLayer_md = null; var searchLayer_md0 = null; // two layers each for double-buffering during search
var searchLayer_co = null; var searchLayer_md1 = null;
var searchLayer_co0 = null;
var searchLayer_co1 = null;
var path_mdsearch = 'yacysearch_location.rss?dom=alltext&query='; var path_mdsearch = 'yacysearch_location.rss?dom=alltext&query=';
var path_losearch = 'yacysearch_location.rss?dom=location&query='; var path_losearch = 'yacysearch_location.rss?dom=location&query=';
var marker_md = new OpenLayers.Icon("/env/grafics/marker_red.png", new OpenLayers.Size(11,16)); var marker_md = new OpenLayers.Icon("/env/grafics/marker_red.png", new OpenLayers.Size(11,16));
var marker_co = new OpenLayers.Icon("/env/grafics/star_yellow.png", new OpenLayers.Size(25,25)); var marker_co = new OpenLayers.Icon("/env/grafics/star_yellow.png", new OpenLayers.Size(25,25));
var bounds = new OpenLayers.Bounds(); var shallZoom = true; // flag if the map shall be zoomed to the search result
// possible values for dom: location,metatag,alltext,title,publisher,creator,subject var shallReload = false; // flag if the search shall be repeated upon next resize of the window
var poisfound = 0;
// automatically adapt height of map upon window resize
function adaptHeight() {
document.getElementById('map').style.height = (document.documentElement.clientHeight - 130) + "px";
}
window.onresize = adaptHeight;
// initialize the map layers
function init() { function init() {
map = new OpenLayers.Map('map', { map = new OpenLayers.Map('map', {
maxResolution:'auto', maxResolution:'auto',
@ -32,7 +38,6 @@
new OpenLayers.Control.LayerSwitcher(), new OpenLayers.Control.LayerSwitcher(),
new OpenLayers.Control.Attribution()] new OpenLayers.Control.Attribution()]
}); });
//layerMaplint = new OpenLayers.Layer.OSM.Maplint("Maplint"); //layerMaplint = new OpenLayers.Layer.OSM.Maplint("Maplint");
layerWMS = new OpenLayers.Layer.WMS( "OpenLayers WMS", "http://labs.metacarta.com/wms/vmap0", {layers: 'basic'} ); layerWMS = new OpenLayers.Layer.WMS( "OpenLayers WMS", "http://labs.metacarta.com/wms/vmap0", {layers: 'basic'} );
layerMapnik = new OpenLayers.Layer.OSM.Mapnik("Mapnik"); layerMapnik = new OpenLayers.Layer.OSM.Mapnik("Mapnik");
@ -49,45 +54,89 @@
new OpenLayers.Projection("EPSG:900913") // to Spherical Mercator Projection new OpenLayers.Projection("EPSG:900913") // to Spherical Mercator Projection
), 5 // Zoom level ), 5 // Zoom level
); );
map.events.register( "zoomend", map, zoomChanged );
map.events.register( "movestart", map, zoomChanged );
#(initsearch)#:: //#(initsearch)#::
var query = '#[query]#'.replace(' ', '+'); var query = '#[query]#'.replace(' ', '+');
searchLayer_co = new OpenLayers.Layer.GeoRSS('GeoRSS', path_losearch + query, {'icon':marker_co}); //#(/initsearch)#
map.addLayer(searchLayer_co);
searchLayer_md = new OpenLayers.Layer.GeoRSS('GeoRSS', path_mdsearch + query, {'icon':marker_md});
map.addLayer(searchLayer_md);
#(/initsearch)#
window.setInterval("refresh()", 1000); window.setInterval("refresh()", 1000);
} }
function zoomChanged () {
shallZoom = false; // no automatic zoom if user hs zoomed
}
// called if a search is submitted
function search() { function search() {
refreshsearch();
}
// refresh is called if the map is zoomed or paned to get a new search result for the viewport
function refreshsearch() {
var query = document.getElementById('query').value.replace(' ', '+'); var query = document.getElementById('query').value.replace(' ', '+');
if (searchLayer_md != null) searchLayer_md.destroy(); if (searchLayer_md0 != null) searchLayer_md0.destroy();
if (searchLayer_co != null) searchLayer_co.destroy(); if (searchLayer_co0 != null) searchLayer_co0.destroy();
var center = map.getCenter().transform(new OpenLayers.Projection("EPSG:900913"), new OpenLayers.Projection("EPSG:4326")); var center = map.getCenter().transform(new OpenLayers.Projection("EPSG:900913"), new OpenLayers.Projection("EPSG:4326"));
var extend = map.getExtent().transform(new OpenLayers.Projection("EPSG:900913"), new OpenLayers.Projection("EPSG:4326")); var extend = map.getExtent().transform(new OpenLayers.Projection("EPSG:900913"), new OpenLayers.Projection("EPSG:4326"));
var radius = Math.sqrt(extend.getWidth() * extend.getWidth() + extend.getHeight() * extend.getHeight()) / 2; var radius = Math.sqrt(extend.getWidth() * extend.getWidth() + extend.getHeight() * extend.getHeight()) / 2;
searchLayer_co = new OpenLayers.Layer.GeoRSS('GeoRSS', path_losearch + query + '&lon=' + center.lon + '&lat=' + center.lat + '&r=' + radius + '&z=' + map.getZoom(), {'icon':marker_co}); searchLayer_co0 = new OpenLayers.Layer.GeoRSS('Communities', path_losearch + query + '&lon=' + center.lon + '&lat=' + center.lat + '&r=' + radius + '&z=' + map.getZoom(), {'icon':marker_co});
map.addLayer(searchLayer_co); searchLayer_md0 = new OpenLayers.Layer.GeoRSS('Point Of Interest', path_mdsearch + query + '&lon=' + center.lon + '&lat=' + center.lat + '&r=' + radius + '&z=' + map.getZoom(), {'icon':marker_md});
searchLayer_md = new OpenLayers.Layer.GeoRSS('GeoRSS', path_mdsearch + query + '&lon=' + center.lon + '&lat=' + center.lat + '&r=' + radius + '&z=' + map.getZoom(), {'icon':marker_md}); map.addLayer(searchLayer_co0);
map.addLayer(searchLayer_md); map.addLayer(searchLayer_md0);
//document.getElementById('apilink').setAttribute('href', 'yacysearch_location.rss?query=' + query); //document.getElementById('apilink').setAttribute('href', 'yacysearch_location.rss?query=' + query);
poisfound = 0;
document.getElementById('resultline').innerHTML = "";
} }
function refresh() { function refresh() {
if (searchLayer_co == null || searchLayer_md == null) { // check double-buffer state
document.getElementById('resultline').innerHTML = ""; if (searchLayer_md0 != null && searchLayer_md0.markers.length > 0) {
} else { // switch the double-buffer
var cocount = searchLayer_co.markers.length; if (searchLayer_md1 != null) searchLayer_md1.destroy();
var mdcount = searchLayer_md.markers.length; if (searchLayer_co1 != null) searchLayer_co1.destroy();
document.getElementById('resultline').innerHTML = mdcount + " POIs found"; searchLayer_md1 = searchLayer_md0;
if (mdcount > 0) { searchLayer_co1 = searchLayer_co0;
var bounds = searchLayer_md.getDataExtent(); searchLayer_md0 = null;
searchLayer_co0 = null;
}
// check if we need to do something
if (searchLayer_co1 == null || searchLayer_md1 == null) {
return;
}
var cocount = searchLayer_co1.markers.length;
var mdcount = searchLayer_md1.markers.length;
if (mdcount + cocount <= poisfound) {
return;
}
// update map and result line
poisfound = mdcount + cocount;
document.getElementById('resultline').innerHTML = poisfound + " POIs found";
// check if any of the markers is visible on the screen.
// this is only necessary if shallZoom = false since this would set shallZoom = true
var bounds = searchLayer_md1.getDataExtent();
/*
if (!shallZoom) {
// check all markers
//if (!bounds.intersectsBounds(map.getExtent())) shallZoom = true;
var anyInScreen = false;
var mapbounds = map.getExtent();
//alert(searchLayer_md1.markers.length + " markers");
for (var marker in searchLayer_md1.markers) {
if (marker.lonlat != null && mapbounds.containsLonLat(marker.lonlat, {})) {anyInScreen = true; break;}
}
if (!anyInScreen) shallZoom = true;
}
*/
// zoom to layer bounds
if (shallZoom) {
if (bounds == null) {return;} //bounds = searchLayer_co1.getDataExtent();
map.panTo(bounds.getCenterLonLat()); map.panTo(bounds.getCenterLonLat());
map.zoomTo(map.getZoomForExtent(bounds)); map.zoomTo(map.getZoomForExtent(bounds));
//map.setCenter(bounds.getCenterLonLat(), map.getZoomForExtent(bounds));
}
} }
} }
</script> </script>

Loading…
Cancel
Save