mirror of
https://github.com/yacy/yacy_search_server.git
synced 2024-09-19 00:01:41 +02:00
- added double-buffering for search layers
- added automatic zooming to search result to location search
This commit is contained in:
parent
4d9b2dc487
commit
434af404c1
|
@ -6,88 +6,137 @@
|
|||
<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">
|
||||
function adaptHeight() {
|
||||
document.getElementById('map').style.height = (document.documentElement.clientHeight - 130) + "px";
|
||||
}
|
||||
window.onresize = adaptHeight;
|
||||
</script>
|
||||
<script type="text/javascript">
|
||||
// possible values for dom: location,metatag,alltext,title,publisher,creator,subject
|
||||
|
||||
var map;
|
||||
var searchLayer_md = null;
|
||||
var searchLayer_co = null;
|
||||
var searchLayer_md0 = null; // two layers each for double-buffering during search
|
||||
var searchLayer_md1 = null;
|
||||
var searchLayer_co0 = null;
|
||||
var searchLayer_co1 = null;
|
||||
var path_mdsearch = 'yacysearch_location.rss?dom=alltext&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_co = new OpenLayers.Icon("/env/grafics/star_yellow.png", new OpenLayers.Size(25,25));
|
||||
var bounds = new OpenLayers.Bounds();
|
||||
// possible values for dom: location,metatag,alltext,title,publisher,creator,subject
|
||||
var shallZoom = true; // flag if the map shall be zoomed to the search result
|
||||
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() {
|
||||
map = new OpenLayers.Map('map', {
|
||||
maxResolution:'auto',
|
||||
controls:[
|
||||
new OpenLayers.Control.Navigation(),
|
||||
new OpenLayers.Control.PanZoomBar(),
|
||||
new OpenLayers.Control.ZoomBox(),
|
||||
new OpenLayers.Control.LayerSwitcher(),
|
||||
new OpenLayers.Control.Attribution()]
|
||||
});
|
||||
|
||||
//layerMaplint = new OpenLayers.Layer.OSM.Maplint("Maplint");
|
||||
layerWMS = new OpenLayers.Layer.WMS( "OpenLayers WMS", "http://labs.metacarta.com/wms/vmap0", {layers: 'basic'} );
|
||||
layerMapnik = new OpenLayers.Layer.OSM.Mapnik("Mapnik");
|
||||
layerCycleMap = new OpenLayers.Layer.OSM.CycleMap("CycleMap");
|
||||
map.addLayer(layerMapnik);
|
||||
map.addLayer(layerCycleMap);
|
||||
//map.addLayer(layerMaplint);
|
||||
map.addLayer(layerWMS);
|
||||
|
||||
map.addControl(new OpenLayers.Control.LayerSwitcher());
|
||||
map.setCenter(new OpenLayers.LonLat(9,48) // Center of the map
|
||||
map = new OpenLayers.Map('map', {
|
||||
maxResolution:'auto',
|
||||
controls:[
|
||||
new OpenLayers.Control.Navigation(),
|
||||
new OpenLayers.Control.PanZoomBar(),
|
||||
new OpenLayers.Control.ZoomBox(),
|
||||
new OpenLayers.Control.LayerSwitcher(),
|
||||
new OpenLayers.Control.Attribution()]
|
||||
});
|
||||
//layerMaplint = new OpenLayers.Layer.OSM.Maplint("Maplint");
|
||||
layerWMS = new OpenLayers.Layer.WMS( "OpenLayers WMS", "http://labs.metacarta.com/wms/vmap0", {layers: 'basic'} );
|
||||
layerMapnik = new OpenLayers.Layer.OSM.Mapnik("Mapnik");
|
||||
layerCycleMap = new OpenLayers.Layer.OSM.CycleMap("CycleMap");
|
||||
map.addLayer(layerMapnik);
|
||||
map.addLayer(layerCycleMap);
|
||||
//map.addLayer(layerMaplint);
|
||||
map.addLayer(layerWMS);
|
||||
|
||||
map.addControl(new OpenLayers.Control.LayerSwitcher());
|
||||
map.setCenter(new OpenLayers.LonLat(9,48) // Center of the map
|
||||
.transform(
|
||||
new OpenLayers.Projection("EPSG:4326"), // transform from WGS 1984
|
||||
new OpenLayers.Projection("EPSG:900913") // to Spherical Mercator Projection
|
||||
), 5 // Zoom level
|
||||
);
|
||||
map.events.register( "zoomend", map, zoomChanged );
|
||||
map.events.register( "movestart", map, zoomChanged );
|
||||
|
||||
//#(initsearch)#::
|
||||
var query = '#[query]#'.replace(' ', '+');
|
||||
//#(/initsearch)#
|
||||
|
||||
#(initsearch)#::
|
||||
var query = '#[query]#'.replace(' ', '+');
|
||||
searchLayer_co = new OpenLayers.Layer.GeoRSS('GeoRSS', path_losearch + query, {'icon':marker_co});
|
||||
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() {
|
||||
var query = document.getElementById('query').value.replace(' ', '+');
|
||||
if (searchLayer_md != null) searchLayer_md.destroy();
|
||||
if (searchLayer_co != null) searchLayer_co.destroy();
|
||||
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 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});
|
||||
map.addLayer(searchLayer_co);
|
||||
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_md);
|
||||
//document.getElementById('apilink').setAttribute('href', 'yacysearch_location.rss?query=' + query);
|
||||
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(' ', '+');
|
||||
if (searchLayer_md0 != null) searchLayer_md0.destroy();
|
||||
if (searchLayer_co0 != null) searchLayer_co0.destroy();
|
||||
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 radius = Math.sqrt(extend.getWidth() * extend.getWidth() + extend.getHeight() * extend.getHeight()) / 2;
|
||||
searchLayer_co0 = new OpenLayers.Layer.GeoRSS('Communities', path_losearch + query + '&lon=' + center.lon + '&lat=' + center.lat + '&r=' + radius + '&z=' + map.getZoom(), {'icon':marker_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});
|
||||
map.addLayer(searchLayer_co0);
|
||||
map.addLayer(searchLayer_md0);
|
||||
//document.getElementById('apilink').setAttribute('href', 'yacysearch_location.rss?query=' + query);
|
||||
poisfound = 0;
|
||||
document.getElementById('resultline').innerHTML = "";
|
||||
}
|
||||
|
||||
function refresh() {
|
||||
if (searchLayer_co == null || searchLayer_md == null) {
|
||||
document.getElementById('resultline').innerHTML = "";
|
||||
} else {
|
||||
var cocount = searchLayer_co.markers.length;
|
||||
var mdcount = searchLayer_md.markers.length;
|
||||
document.getElementById('resultline').innerHTML = mdcount + " POIs found";
|
||||
if (mdcount > 0) {
|
||||
var bounds = searchLayer_md.getDataExtent();
|
||||
map.panTo(bounds.getCenterLonLat());
|
||||
map.zoomTo(map.getZoomForExtent(bounds));
|
||||
//map.setCenter(bounds.getCenterLonLat(), map.getZoomForExtent(bounds));
|
||||
// check double-buffer state
|
||||
if (searchLayer_md0 != null && searchLayer_md0.markers.length > 0) {
|
||||
// switch the double-buffer
|
||||
if (searchLayer_md1 != null) searchLayer_md1.destroy();
|
||||
if (searchLayer_co1 != null) searchLayer_co1.destroy();
|
||||
searchLayer_md1 = searchLayer_md0;
|
||||
searchLayer_co1 = searchLayer_co0;
|
||||
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.zoomTo(map.getZoomForExtent(bounds));
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
|
Loading…
Reference in New Issue
Block a user