forked from GNUsocial/gnu-social
first pass at Mapstraction plugin
This commit is contained in:
513
plugins/Mapstraction/js/mxn.openlayers.core.js
Normal file
513
plugins/Mapstraction/js/mxn.openlayers.core.js
Normal file
@@ -0,0 +1,513 @@
|
||||
mxn.register('openlayers', {
|
||||
|
||||
Mapstraction: {
|
||||
|
||||
init: function(element, api){
|
||||
var me = this;
|
||||
this.maps[api] = new OpenLayers.Map(
|
||||
element.id,
|
||||
{
|
||||
maxExtent: new OpenLayers.Bounds(-20037508.34,-20037508.34,20037508.34,20037508.34),
|
||||
maxResolution:156543,
|
||||
numZoomLevels:18,
|
||||
units:'meters',
|
||||
projection: "EPSG:41001"
|
||||
}
|
||||
);
|
||||
|
||||
this.layers['osmmapnik'] = new OpenLayers.Layer.TMS(
|
||||
'OSM Mapnik',
|
||||
[
|
||||
"http://a.tile.openstreetmap.org/",
|
||||
"http://b.tile.openstreetmap.org/",
|
||||
"http://c.tile.openstreetmap.org/"
|
||||
],
|
||||
{
|
||||
type:'png',
|
||||
getURL: function (bounds) {
|
||||
var res = this.map.getResolution();
|
||||
var x = Math.round ((bounds.left - this.maxExtent.left) / (res * this.tileSize.w));
|
||||
var y = Math.round ((this.maxExtent.top - bounds.top) / (res * this.tileSize.h));
|
||||
var z = this.map.getZoom();
|
||||
var limit = Math.pow(2, z);
|
||||
if (y < 0 || y >= limit) {
|
||||
return null;
|
||||
} else {
|
||||
x = ((x % limit) + limit) % limit;
|
||||
var path = z + "/" + x + "/" + y + "." + this.type;
|
||||
var url = this.url;
|
||||
if (url instanceof Array) {
|
||||
url = this.selectUrl(path, url);
|
||||
}
|
||||
return url + path;
|
||||
}
|
||||
},
|
||||
displayOutsideMaxExtent: true
|
||||
}
|
||||
);
|
||||
|
||||
this.layers['osm'] = new OpenLayers.Layer.TMS(
|
||||
'OSM',
|
||||
[
|
||||
"http://a.tah.openstreetmap.org/Tiles/tile.php/",
|
||||
"http://b.tah.openstreetmap.org/Tiles/tile.php/",
|
||||
"http://c.tah.openstreetmap.org/Tiles/tile.php/"
|
||||
],
|
||||
{
|
||||
type:'png',
|
||||
getURL: function (bounds) {
|
||||
var res = this.map.getResolution();
|
||||
var x = Math.round ((bounds.left - this.maxExtent.left) / (res * this.tileSize.w));
|
||||
var y = Math.round ((this.maxExtent.top - bounds.top) / (res * this.tileSize.h));
|
||||
var z = this.map.getZoom();
|
||||
var limit = Math.pow(2, z);
|
||||
if (y < 0 || y >= limit) {
|
||||
return null;
|
||||
} else {
|
||||
x = ((x % limit) + limit) % limit;
|
||||
var path = z + "/" + x + "/" + y + "." + this.type;
|
||||
var url = this.url;
|
||||
if (url instanceof Array) {
|
||||
url = this.selectUrl(path, url);
|
||||
}
|
||||
return url + path;
|
||||
}
|
||||
},
|
||||
displayOutsideMaxExtent: true
|
||||
}
|
||||
);
|
||||
|
||||
this.maps[api].addLayer(this.layers['osmmapnik']);
|
||||
this.maps[api].addLayer(this.layers['osm']);
|
||||
},
|
||||
|
||||
applyOptions: function(){
|
||||
// var map = this.maps[this.api];
|
||||
// var myOptions = [];
|
||||
// if (this.options.enableDragging) {
|
||||
// myOptions.draggable = true;
|
||||
// }
|
||||
// if (this.options.enableScrollWheelZoom){
|
||||
// myOptions.scrollwheel = true;
|
||||
// }
|
||||
// map.setOptions(myOptions);
|
||||
},
|
||||
|
||||
resizeTo: function(width, height){
|
||||
this.currentElement.style.width = width;
|
||||
this.currentElement.style.height = height;
|
||||
this.maps[this.api].updateSize();
|
||||
},
|
||||
|
||||
addControls: function( args ) {
|
||||
var map = this.maps[this.api];
|
||||
// FIXME: OpenLayers has a bug removing all the controls says crschmidt
|
||||
for (var i = map.controls.length; i>1; i--) {
|
||||
map.controls[i-1].deactivate();
|
||||
map.removeControl(map.controls[i-1]);
|
||||
}
|
||||
if ( args.zoom == 'large' ) {
|
||||
map.addControl(new OpenLayers.Control.PanZoomBar());
|
||||
}
|
||||
else if ( args.zoom == 'small' ) {
|
||||
map.addControl(new OpenLayers.Control.ZoomPanel());
|
||||
if ( args.pan) {
|
||||
map.addControl(new OpenLayers.Control.PanPanel());
|
||||
}
|
||||
}
|
||||
else {
|
||||
if ( args.pan){
|
||||
map.addControl(new OpenLayers.Control.PanPanel());
|
||||
}
|
||||
}
|
||||
if ( args.overview ) {
|
||||
map.addControl(new OpenLayers.Control.OverviewMap());
|
||||
}
|
||||
if ( args.map_type ) {
|
||||
map.addControl(new OpenLayers.Control.LayerSwitcher());
|
||||
}
|
||||
},
|
||||
|
||||
addSmallControls: function() {
|
||||
var map = this.maps[this.api];
|
||||
this.addControlsArgs.pan = false;
|
||||
this.addControlsArgs.scale = false;
|
||||
this.addControlsArgs.zoom = 'small';
|
||||
map.addControl(new OpenLayers.Control.ZoomBox());
|
||||
map.addControl(new OpenLayers.Control.LayerSwitcher({
|
||||
'ascending':false
|
||||
}));
|
||||
},
|
||||
|
||||
addLargeControls: function() {
|
||||
var map = this.maps[this.api];
|
||||
map.addControl(new OpenLayers.Control.PanZoomBar());
|
||||
this.addControlsArgs.pan = true;
|
||||
this.addControlsArgs.zoom = 'large';
|
||||
},
|
||||
|
||||
addMapTypeControls: function() {
|
||||
var map = this.maps[this.api];
|
||||
map.addControl( new OpenLayers.Control.LayerSwitcher({
|
||||
'ascending':false
|
||||
}) );
|
||||
this.addControlsArgs.map_type = true;
|
||||
},
|
||||
|
||||
setCenterAndZoom: function(point, zoom) {
|
||||
var map = this.maps[this.api];
|
||||
var pt = point.toProprietary(this.api);
|
||||
map.setCenter(point.toProprietary(this.api), zoom);
|
||||
},
|
||||
|
||||
addMarker: function(marker, old) {
|
||||
var map = this.maps[this.api];
|
||||
var pin = marker.toProprietary(this.api);
|
||||
if (!this.layers['markers']) {
|
||||
this.layers['markers'] = new OpenLayers.Layer.Markers('markers');
|
||||
map.addLayer(this.layers['markers']);
|
||||
}
|
||||
this.layers['markers'].addMarker(pin);
|
||||
|
||||
return pin;
|
||||
},
|
||||
|
||||
removeMarker: function(marker) {
|
||||
var map = this.maps[this.api];
|
||||
var pin = marker.toProprietary(this.api);
|
||||
this.layers['markers'].removeMarker(pin);
|
||||
pin.destroy();
|
||||
|
||||
},
|
||||
|
||||
removeAllMarkers: function() {
|
||||
var map = this.maps[this.api];
|
||||
|
||||
// TODO: Add provider code
|
||||
},
|
||||
|
||||
declutterMarkers: function(opts) {
|
||||
var map = this.maps[this.api];
|
||||
|
||||
// TODO: Add provider code
|
||||
},
|
||||
|
||||
addPolyline: function(polyline, old) {
|
||||
var map = this.maps[this.api];
|
||||
var pl = polyline.toProprietary(this.api);
|
||||
|
||||
if (!this.layers['polylines']) {
|
||||
this.layers['polylines'] = new OpenLayers.Layer.Vector('polylines');
|
||||
map.addLayer(this.layers['polylines']);
|
||||
}
|
||||
polyline.setChild(pl);
|
||||
this.layers['polylines'].addFeatures([pl]);
|
||||
return pl;
|
||||
},
|
||||
|
||||
removePolyline: function(polyline) {
|
||||
var map = this.maps[this.api];
|
||||
var pl = polyline.toProprietary(this.api);
|
||||
this.layers['polylines'].removeFeatures([pl]);
|
||||
},
|
||||
removeAllPolylines: function() {
|
||||
var olpolylines = [];
|
||||
for(var i = 0, length = this.polylines.length; i < length; i++){
|
||||
olpolylines.push(this.polylines[i].toProprietary(this.api));
|
||||
}
|
||||
if (this.layers['polylines']) this.layers['polylines'].removeFeatures(olpolylines);
|
||||
},
|
||||
|
||||
getCenter: function() {
|
||||
var map = this.maps[this.api];
|
||||
pt = map.getCenter();
|
||||
return new mxn.LatLonPoint(pt.lat, pt.lon);
|
||||
},
|
||||
|
||||
setCenter: function(point, options) {
|
||||
var map = this.maps[this.api];
|
||||
var pt = point.toProprietary(this.api);
|
||||
map.setCenter(pt);
|
||||
|
||||
},
|
||||
|
||||
setZoom: function(zoom) {
|
||||
var map = this.maps[this.api];
|
||||
map.zoomTo(zoom);
|
||||
},
|
||||
|
||||
getZoom: function() {
|
||||
var map = this.maps[this.api];
|
||||
return map.zoom;
|
||||
},
|
||||
|
||||
getZoomLevelForBoundingBox: function( bbox ) {
|
||||
var map = this.maps[this.api];
|
||||
// throw 'Not implemented';
|
||||
return zoom;
|
||||
},
|
||||
|
||||
setMapType: function(type) {
|
||||
var map = this.maps[this.api];
|
||||
throw 'Not implemented (setMapType)';
|
||||
|
||||
// switch(type) {
|
||||
// case mxn.Mapstraction.ROAD:
|
||||
// map.setMapTypeId(google.maps.MapTypeId.ROADMAP);
|
||||
// break;
|
||||
// case mxn.Mapstraction.SATELLITE:
|
||||
// map.setMapTypeId(google.maps.MapTypeId.SATELLITE);
|
||||
// break;
|
||||
// case mxn.Mapstraction.HYBRID:
|
||||
// map.setMapTypeId(google.maps.MapTypeId.HYBRID);
|
||||
// break;
|
||||
// default:
|
||||
// map.setMapTypeId(google.maps.MapTypeId.ROADMAP);
|
||||
// }
|
||||
},
|
||||
|
||||
getMapType: function() {
|
||||
var map = this.maps[this.api];
|
||||
// TODO: implement actual layer support
|
||||
return mxn.Mapstraction.ROAD;
|
||||
|
||||
// var type = map.getMapTypeId();
|
||||
// switch(type) {
|
||||
// case google.maps.MapTypeId.ROADMAP:
|
||||
// return mxn.Mapstraction.ROAD;
|
||||
// case google.maps.MapTypeId.SATELLITE:
|
||||
// return mxn.Mapstraction.SATELLITE;
|
||||
// case google.maps.MapTypeId.HYBRID:
|
||||
// return mxn.Mapstraction.HYBRID;
|
||||
// //case google.maps.MapTypeId.TERRAIN:
|
||||
// // return something;
|
||||
// default:
|
||||
// return null;
|
||||
// }
|
||||
},
|
||||
|
||||
getBounds: function () {
|
||||
var map = this.maps[this.api];
|
||||
var olbox = map.calculateBounds();
|
||||
return new mxn.BoundingBox(olbox.bottom, olbox.left, olbox.top, olbox.right);
|
||||
},
|
||||
|
||||
setBounds: function(bounds){
|
||||
var map = this.maps[this.api];
|
||||
var sw = bounds.getSouthWest();
|
||||
var ne = bounds.getNorthEast();
|
||||
|
||||
if(sw.lon > ne.lon) {
|
||||
sw.lon -= 360;
|
||||
}
|
||||
|
||||
var obounds = new OpenLayers.Bounds();
|
||||
|
||||
obounds.extend(new mxn.LatLonPoint(sw.lat,sw.lon).toProprietary(this.api));
|
||||
obounds.extend(new mxn.LatLonPoint(ne.lat,ne.lon).toProprietary(this.api));
|
||||
map.zoomToExtent(obounds);
|
||||
},
|
||||
|
||||
addImageOverlay: function(id, src, opacity, west, south, east, north, oContext) {
|
||||
var map = this.maps[this.api];
|
||||
|
||||
// TODO: Add provider code
|
||||
},
|
||||
|
||||
setImagePosition: function(id, oContext) {
|
||||
var map = this.maps[this.api];
|
||||
var topLeftPoint; var bottomRightPoint;
|
||||
|
||||
// TODO: Add provider code
|
||||
|
||||
//oContext.pixels.top = ...;
|
||||
//oContext.pixels.left = ...;
|
||||
//oContext.pixels.bottom = ...;
|
||||
//oContext.pixels.right = ...;
|
||||
},
|
||||
|
||||
addOverlay: function(url, autoCenterAndZoom) {
|
||||
var map = this.maps[this.api];
|
||||
|
||||
// TODO: Add provider code
|
||||
|
||||
},
|
||||
|
||||
addTileLayer: function(tile_url, opacity, copyright_text, min_zoom, max_zoom) {
|
||||
var map = this.maps[this.api];
|
||||
|
||||
// TODO: Add provider code
|
||||
},
|
||||
|
||||
toggleTileLayer: function(tile_url) {
|
||||
var map = this.maps[this.api];
|
||||
|
||||
// TODO: Add provider code
|
||||
},
|
||||
|
||||
getPixelRatio: function() {
|
||||
var map = this.maps[this.api];
|
||||
|
||||
// TODO: Add provider code
|
||||
},
|
||||
|
||||
mousePosition: function(element) {
|
||||
var map = this.maps[this.api];
|
||||
|
||||
// TODO: Add provider code
|
||||
}
|
||||
},
|
||||
|
||||
LatLonPoint: {
|
||||
|
||||
toProprietary: function() {
|
||||
var ollon = this.lon * 20037508.34 / 180;
|
||||
var ollat = Math.log(Math.tan((90 + this.lat) * Math.PI / 360)) / (Math.PI / 180);
|
||||
ollat = ollat * 20037508.34 / 180;
|
||||
return new OpenLayers.LonLat(ollon, ollat);
|
||||
},
|
||||
|
||||
fromProprietary: function(olPoint) {
|
||||
var lon = (olPoint.lon / 20037508.34) * 180;
|
||||
var lat = (olPoint.lat / 20037508.34) * 180;
|
||||
lat = 180/Math.PI * (2 * Math.atan(Math.exp(lat * Math.PI / 180)) - Math.PI / 2);
|
||||
this.lon = lon;
|
||||
this.lat = lat;
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
Marker: {
|
||||
|
||||
toProprietary: function() {
|
||||
var size, anchor, icon;
|
||||
if(this.iconSize) {
|
||||
size = new OpenLayers.Size(this.iconSize[0], this.iconSize[1]);
|
||||
}
|
||||
else {
|
||||
size = new OpenLayers.Size(21,25);
|
||||
}
|
||||
|
||||
if(this.iconAnchor) {
|
||||
anchor = new OpenLayers.Pixel(this.iconAnchor[0], this.iconAnchor[1]);
|
||||
}
|
||||
else {
|
||||
// FIXME: hard-coding the anchor point
|
||||
anchor = new OpenLayers.Pixel(-(size.w/2), -size.h);
|
||||
}
|
||||
|
||||
if(this.iconUrl) {
|
||||
icon = new OpenLayers.Icon(this.iconUrl, size, anchor);
|
||||
}
|
||||
else {
|
||||
icon = new OpenLayers.Icon('http://openlayers.org/dev/img/marker-gold.png', size, anchor);
|
||||
}
|
||||
var marker = new OpenLayers.Marker(this.location.toProprietary("openlayers"), icon);
|
||||
|
||||
if(this.infoBubble) {
|
||||
var popup = new OpenLayers.Popup(null,
|
||||
this.location.toProprietary("openlayers"),
|
||||
new OpenLayers.Size(100,100),
|
||||
this.infoBubble,
|
||||
true);
|
||||
popup.autoSize = true;
|
||||
var theMap = this.map;
|
||||
if(this.hover) {
|
||||
marker.events.register("mouseover", marker, function(event) {
|
||||
theMap.addPopup(popup);
|
||||
popup.show();
|
||||
});
|
||||
marker.events.register("mouseout", marker, function(event) {
|
||||
popup.hide();
|
||||
theMap.removePopup(popup);
|
||||
});
|
||||
}
|
||||
else {
|
||||
var shown = false;
|
||||
marker.events.register("mousedown", marker, function(event) {
|
||||
if (shown) {
|
||||
popup.hide();
|
||||
theMap.removePopup(popup);
|
||||
shown = false;
|
||||
} else {
|
||||
theMap.addPopup(popup);
|
||||
popup.show();
|
||||
shown = true;
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
if(this.hoverIconUrl) {
|
||||
// TODO
|
||||
}
|
||||
|
||||
if(this.infoDiv){
|
||||
// TODO
|
||||
}
|
||||
return marker;
|
||||
},
|
||||
|
||||
openBubble: function() {
|
||||
// TODO: Add provider code
|
||||
},
|
||||
|
||||
hide: function() {
|
||||
this.proprietary_marker.setOptions({visible:false});
|
||||
},
|
||||
|
||||
show: function() {
|
||||
this.proprietary_marker.setOptions({visible:true});
|
||||
},
|
||||
|
||||
update: function() {
|
||||
// TODO: Add provider code
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
Polyline: {
|
||||
|
||||
toProprietary: function() {
|
||||
var olpolyline;
|
||||
var olpoints = [];
|
||||
var ring;
|
||||
var style = {
|
||||
strokeColor: this.color || "#000000",
|
||||
strokeOpacity: this.opacity || 1,
|
||||
strokeWidth: this.width || 1,
|
||||
fillColor: this.fillColor || "#000000",
|
||||
fillOpacity: this.getAttribute('fillOpacity') || 0.2
|
||||
};
|
||||
|
||||
//TODO Handle closed attribute
|
||||
|
||||
for (var i = 0, length = this.points.length ; i< length; i++){
|
||||
olpoint = this.points[i].toProprietary("openlayers");
|
||||
olpoints.push(new OpenLayers.Geometry.Point(olpoint.lon, olpoint.lat));
|
||||
}
|
||||
|
||||
if (this.closed) {
|
||||
// a closed polygon
|
||||
ring = new OpenLayers.Geometry.LinearRing(olpoints);
|
||||
} else {
|
||||
// a line
|
||||
ring = new OpenLayers.Geometry.LineString(olpoints);
|
||||
}
|
||||
|
||||
olpolyline = new OpenLayers.Feature.Vector(ring, null, style);
|
||||
|
||||
return olpolyline;
|
||||
},
|
||||
|
||||
show: function() {
|
||||
throw 'Not implemented';
|
||||
},
|
||||
|
||||
hide: function() {
|
||||
throw 'Not implemented';
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
});
|
Reference in New Issue
Block a user