123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599 |
- /*
- RaphaelLayer, a JavaScript library for overlaying Raphael objects onto Leaflet interactive maps. http://dynmeth.github.com/RaphaelLayer
- (c) 2012-2013, David Howell, Dynamic Methods Pty Ltd
- Version 0.1.3
- */
- (function() {
- var R, originalR;
- if (typeof exports != 'undefined') {
- R = exports;
- } else {
- R = {};
- originalR = window.R;
- R.noConflict = function() {
- window.R = originalR;
- return R;
- };
- window.R = R;
- }
- R.version = '0.1.3';
- R.Layer = L.Class.extend({
- includes: L.Mixin.Events,
-
- initialize: function(options) {
-
- },
- onAdd: function (map) {
- this._map = map;
- this._map._initRaphaelRoot();
- this._paper = this._map._paper;
- this._set = this._paper.set();
-
- map.on('viewreset', this.projectLatLngs, this);
- this.projectLatLngs();
- },
- onRemove: function(map) {
- map.off('viewreset', this.projectLatLngs, this);
- this._map = null;
- this._set.forEach(function(item) {
- item.remove();
- }, this);
- this._set.clear();
- },
- projectLatLngs: function() {
-
- },
- animate: function(attr, ms, easing, callback) {
- this._set.animate(attr, ms, easing, callback);
-
- return this;
- },
- hover: function(f_in, f_out, icontext, ocontext) {
- this._set.hover(f_in, f_out, icontext, ocontext);
- return this;
- },
- attr: function(name, value) {
- this._set.attr(name, value);
- return this;
- }
- });
- L.Map.include({
- _initRaphaelRoot: function () {
- if (!this._raphaelRoot) {
- this._raphaelRoot = this._panes.overlayPane;
- this._paper = Raphael(this._raphaelRoot);
- this.on('moveend', this._updateRaphaelViewport);
- this._updateRaphaelViewport();
- }
- },
- _updateRaphaelViewport: function () {
- var p = 0.02,
- size = this.getSize(),
- panePos = L.DomUtil.getPosition(this._mapPane),
- min = panePos.multiplyBy(-1)._subtract(size.multiplyBy(p)),
- max = min.add(size.multiplyBy(1 + p*2)),
- width = max.x - min.x,
- height = max.y - min.y,
- root = this._raphaelRoot,
- pane = this._panes.overlayPane;
- this._paper.setSize(width, height);
-
- L.DomUtil.setPosition(root, min);
- root.setAttribute('width', width);
- root.setAttribute('height', height);
-
- this._paper.setViewBox(min.x, min.y, width, height, false);
-
- }
- });
- R.Marker = R.Layer.extend({
- initialize: function(latlng, pathString, attr, options) {
- R.Layer.prototype.initialize.call(this, options);
- this._latlng = latlng;
- this._pathString = (typeof pathString == 'string' ? pathString : 'M16,3.5c-4.142,0-7.5,3.358-7.5,7.5c0,4.143,7.5,18.121,7.5,18.121S23.5,15.143,23.5,11C23.5,6.858,20.143,3.5,16,3.5z M16,14.584c-1.979,0-3.584-1.604-3.584-3.584S14.021,7.416,16,7.416S19.584,9.021,19.584,11S17.979,14.584,16,14.584z');
- this._attr = (typeof pathString == 'object' ? pathString : (attr ? attr : {'fill': '#000'}));
- },
- projectLatLngs: function() {
- if (this._path) this._path.remove();
- var p = this._map.latLngToLayerPoint(this._latlng);
- var r = Raphael.pathBBox(this._pathString);
-
- this._path = this._paper.path(this._pathString)
- .attr(this._attr)
- .translate(p.x - 1.05*r.width, p.y - 1.15*r.height)
- .toFront();
- this._set.push(this._path);
- }
- });
- R.Pulse = R.Layer.extend({
- initialize: function(latlng, radius, attr, pulseAttr, options) {
- R.Layer.prototype.initialize.call(this, options);
- this._latlng = latlng;
- this._radius = (typeof radius == 'number' ? radius : 6);
- this._attr = (typeof radius == 'object' ? radius : (typeof attr == 'object' ? attr : {'fill': '#30a3ec', 'stroke': '#30a3ec'}));
- this._pulseAttr = (typeof radius == 'object' ? attr : typeof pulseAttr == 'object' ? pulseAttr : {
- 'stroke-width': 3,
- 'stroke': this._attr.stroke
- });
- this._repeat = 3;
- },
- onRemove: function (map) {
- R.Layer.prototype.onRemove.call(this, map);
- if(this._marker) this._marker.remove();
- if(this._pulse) this._pulse.remove();
- },
- projectLatLngs: function() {
- if(this._marker) this._marker.remove();
- if(this._pulse) this._pulse.remove();
- var p = this._map.latLngToLayerPoint(this._latlng);
- this._marker = this._paper.circle(p.x, p.y, this._radius).attr(this._attr);
- this._pulse = this._paper.circle(p.x, p.y, this._radius).attr(this._pulseAttr);
- var anim = Raphael.animation({
- '0%': {transform: 's0.3', opacity: 1.0},
- '100%': {transform: 's3.0', opacity: 0.0, easing: '<'}
- }, 1000);
- this._pulse.animate(anim.repeat(this._repeat));
- }
- });
- R.Polyline = R.Layer.extend({
-
- initialize: function(latlngs, attr, options) {
- R.Layer.prototype.initialize.call(this, options);
- this._latlngs = latlngs;
- this._attr = attr || {'fill': '#000', 'stroke': '#000'};
- },
- projectLatLngs: function() {
- this._set.clear();
- if (this._path) this._path.remove();
-
- this._path = this._paper.path(this.getPathString())
- .attr(this._attr)
- .toBack();
- this._set.push(this._path);
- },
- getPathString: function() {
- for(var i=0, len=this._latlngs.length, str=''; i<len; i++) {
- var p = this._map.latLngToLayerPoint(this._latlngs[i]);
- str += (i ? 'L' : 'M') + p.x + ' ' + p.y;
- }
- return str;
- }
- });
- R.Polygon = R.Layer.extend({
-
- initialize: function(latlngs, attr, options) {
- R.Layer.prototype.initialize.call(this, options);
- if(latlngs.length == 1) {
- if(latlngs[0] instanceof Array) {
- latlngs = latlngs[0];
- }
- }
- this._latlngs = latlngs;
- this._attr = attr || {'fill': 'rgba(255, 0, 0, 0.5)', 'stroke': '#f00', 'stroke-width': 2};
- },
- projectLatLngs: function() {
- if (this._path) this._path.remove();
-
- this._path = this._paper.path(this.getPathString())
- .attr(this._attr)
- .toBack();
- this._set.push(this._path);
- },
- getPathString: function() {
- for(var i=0, len=this._latlngs.length, str=''; i<len; i++) {
- var p = this._map.latLngToLayerPoint(this._latlngs[i]);
- str += (i ? 'L' : 'M') + p.x + ' ' + p.y;
- }
- str += 'Z';
- return str;
- }
- });
- R.PolygonGlow = R.Layer.extend({
- initialize: function(latlngs, attr, options) {
- R.Layer.prototype.initialize.call(this, options);
- this._latlngs = latlngs;
- this._attr = attr || {'fill': 'rgba(255, 0, 0, 1)', 'stroke': '#f00', 'stroke-width': 3};
- },
- onRemove: function(map) {
- R.Layer.prototype.onRemove.call(this, map);
-
- if(this._path) this._path.remove();
- },
- projectLatLngs: function() {
- if (this._path) this._path.remove();
-
- this._path = this._paper.path(this.getPathString())
- .attr(this._attr)
- .toBack();
- var p = this._path;
- var fadeIn = function() {
- p.animate({
- 'fill-opacity': 0.25
- }, 1000, '<', fadeOut);
- };
- var fadeOut = function() {
- p.animate({
- 'fill-opacity': 1
- }, 1000, '<', fadeIn);
- };
- fadeOut();
- },
- getPathString: function() {
- for(var i=0, len=this._latlngs.length, str=''; i<len; i++) {
- var p = this._map.latLngToLayerPoint(this._latlngs[i]);
- str += (i ? 'L' : 'M') + p.x + ' ' + p.y;
- }
- str += 'Z';
- return str;
- }
- });
- R.Bezier = R.Layer.extend({
- initialize: function(latlngs, attr, options) {
- R.Layer.prototype.initialize.call(this, options);
- this._latlngs = latlngs;
- this._attr = attr;
- },
- projectLatLngs: function() {
- if(this._path) this._path.remove();
-
- var start = this._map.latLngToLayerPoint(this._latlngs[0]),
- end = this._map.latLngToLayerPoint(this._latlngs[1]),
- cp = this.getControlPoint(start, end);
- this._path = this._paper.path('M' + start.x + ' ' + start.y + 'Q' + cp.x + ' ' + cp.y + ' ' + end.x + ' ' + end.y)
- .attr(this._attr)
- .toBack();
- this._set.push(this._path);
- },
- getControlPoint: function(start, end) {
- var cp = { x: 0, y: 0 };
- cp.x = start.x + (end.x - [start.x]) / 2;
- cp.y = start.y + (end.y - [start.y]) / 2;
- var amp = 0;
- if (this.closeTo(start.x, end.x) && !this.closeTo(start.y, end.y)) {
- amp = (start.x - end.x) * 1 + 15 * (start.x >= end.x ? 1 : -1);
- cp.x = Math.max(start.x, end.x) + amp;
- } else {
- amp = (end.y - start.y) * 1.5 + 15 * (start.y < end.y ? 1 : -1);
- cp.y = Math.min(start.y, end.y) + amp;
- }
- return cp;
- },
- closeTo: function(a, b) {
- var t = 15;
- return (a - b > -t && a - b < t);
- }
- });
- R.BezierAnim = R.Layer.extend({
- initialize: function(latlngs, attr, cb, options) {
- R.Layer.prototype.initialize.call(this, options);
- this._latlngs = latlngs;
- this._attr = attr;
- this._cb = cb;
- },
- onRemove: function (map) {
- R.Layer.prototype.onRemove.call(this, map);
-
- if(this._path) this._path.remove();
- if(this._sub) this._sub.remove();
- },
- projectLatLngs: function() {
- if(this._path) this._path.remove();
- if(this._sub) this._sub.remove();
-
- var self = this,
- start = this._map.latLngToLayerPoint(this._latlngs[0]),
- end = this._map.latLngToLayerPoint(this._latlngs[1]),
- cp = this.getControlPoint(start, end),
- pathString="M"+start.x+" "+start.y+" L"+end.x+" "+end.y,
- line = this._paper.path(pathString).hide();
- this._paper.customAttributes.alongBezier = function(a) {
- var r = this.data('reverse');
- var len = this.data('pathLength');
- return {
- path: this.data('bezierPath').getSubpath(r ? (1-a)*len : 0, r ? len : a*len)
- };
- };
- var sub = this._sub = this._paper.path()
- .data('bezierPath', line)
- .data('pathLength', line.getTotalLength())
- .data('reverse', false)
- .attr({
- 'stroke': '#BE1E2D',
- 'alongBezier': 0,
- 'stroke-width': 2
- });
- sub.stop().animate({
- alongBezier: 1
- }, 2000, function() {
- //self._cb();
- sub.data('reverse', true);
- // sub.stop().animate({
- // 'alongBezier': 0
- // }, 500, function() { sub.remove(); });
- });
- },
- getControlPoint: function(start, end) {
- var cp = { x: 0, y: 0 };
- cp.x = start.x + (end.x - [start.x]) / 2;
- cp.y = start.y + (end.y - [start.y]) / 2;
- var amp = 0;
- if (this.closeTo(start.x, end.x) && !this.closeTo(start.y, end.y)) {
- amp = (start.x - end.x) * 1 + 15 * (start.x >= end.x ? 1 : -1);
- cp.x = Math.max(start.x, end.x) + amp;
- } else {
- amp = (end.y - start.y) * 1.5 + 15 * (start.y < end.y ? 1 : -1);
- cp.y = Math.min(start.y, end.y) + amp;
- }
- return cp;
- },
- closeTo: function(a, b) {
- var t = 15;
- return (a - b > -t && a - b < t);
- }
- });
- R.FeatureGroup = L.FeatureGroup.extend({
- initialize: function(layers, options) {
- L.FeatureGroup.prototype.initialize.call(this, layers, options);
- },
- animate: function(attr, ms, easing, callback) {
- this.eachLayer(function(layer) {
- layer.animate(attr, ms, easing, callback);
- });
- },
- onAdd: function(map) {
- L.FeatureGroup.prototype.onAdd.call(this,map);
- this._set = this._map._paper.set();
- for(i in this._layers) {
- this._set.push(this._layers[i]._set);
- }
- },
- hover: function(h_in, h_out, c_in, c_out) {
- this.eachLayer(function(layer) {
- layer.hover(h_in, h_out, c_in, c_out);
- });
- return this;
- },
- attr: function(name, value) {
- this.eachLayer(function(layer) {
- layer.attr(name, value);
- });
-
- return this;
- }
- });
- /*
- * Contains L.MultiPolyline and L.MultiPolygon layers.
- */
- (function () {
- function createMulti(Klass) {
- return R.FeatureGroup.extend({
- initialize: function (latlngs, options) {
- this._layers = {};
- this._options = options;
- this.setLatLngs(latlngs);
- },
- setLatLngs: function (latlngs) {
- var i = 0, len = latlngs.length;
- this.eachLayer(function (layer) {
- if (i < len) {
- layer.setLatLngs(latlngs[i++]);
- } else {
- this.removeLayer(layer);
- }
- }, this);
- while (i < len) {
- this.addLayer(new Klass(latlngs[i++], this._options));
- }
- return this;
- }
- });
- }
- R.MultiPolyline = createMulti(R.Polyline);
- R.MultiPolygon = createMulti(R.Polygon);
- }());
- R.GeoJSON = R.FeatureGroup.extend({
- initialize: function (geojson, options) {
- L.Util.setOptions(this, options);
- this._geojson = geojson;
- this._layers = {};
-
- if (geojson) {
- this.addGeoJSON(geojson);
- }
- },
- addGeoJSON: function (geojson) {
- var features = geojson.features,
- i, len;
- if (features) {
- for (i = 0, len = features.length; i < len; i++) {
- this.addGeoJSON(features[i]);
- }
- return;
- }
- var isFeature = (geojson.type === 'Feature'),
- geometry = isFeature ? geojson.geometry : geojson,
- layer = R.GeoJSON.geometryToLayer(geometry, this.options.pointToLayer);
- this.fire('featureparse', {
- layer: layer,
- properties: geojson.properties,
- geometryType: geometry.type,
- bbox: geojson.bbox,
- id: geojson.id,
- geometry: geojson.geometry
- });
- this.addLayer(layer);
- }
- });
- L.Util.extend(R.GeoJSON, {
- geometryToLayer: function (geometry, pointToLayer) {
- var coords = geometry.coordinates,
- layers = [],
- latlng, latlngs, i, len, layer;
- switch (geometry.type) {
- case 'Point':
- latlng = this.coordsToLatLng(coords);
- return pointToLayer ? pointToLayer(latlng) : new R.Marker(latlng);
- case 'MultiPoint':
- for (i = 0, len = coords.length; i < len; i++) {
- latlng = this.coordsToLatLng(coords[i]);
- layer = pointToLayer ? pointToLayer(latlng) : new R.Marker(latlng);
- layers.push(layer);
- }
- return new R.FeatureGroup(layers);
- case 'LineString':
- latlngs = this.coordsToLatLngs(coords);
- return new R.Polyline(latlngs);
- case 'Polygon':
- latlngs = this.coordsToLatLngs(coords, 1);
- return new R.Polygon(latlngs);
- case 'MultiLineString':
- latlngs = this.coordsToLatLngs(coords, 1);
- return new R.MultiPolyline(latlngs);
- case "MultiPolygon":
- latlngs = this.coordsToLatLngs(coords, 2);
- return new R.MultiPolygon(latlngs);
- case "GeometryCollection":
- for (i = 0, len = geometry.geometries.length; i < len; i++) {
- layer = this.geometryToLayer(geometry.geometries[i], pointToLayer);
- layers.push(layer);
- }
- return new R.FeatureGroup(layers);
- default:
- throw new Error('Invalid GeoJSON object.');
- }
- },
- coordsToLatLng: function (coords, reverse) { // (Array, Boolean) -> LatLng
- var lat = parseFloat(coords[reverse ? 0 : 1]),
- lng = parseFloat(coords[reverse ? 1 : 0]);
- return new L.LatLng(lat, lng, true);
- },
- coordsToLatLngs: function (coords, levelsDeep, reverse) { // (Array, Number, Boolean) -> Array
- var latlng,
- latlngs = [],
- i, len;
- for (i = 0, len = coords.length; i < len; i++) {
- latlng = levelsDeep ?
- this.coordsToLatLngs(coords[i], levelsDeep - 1, reverse) :
- this.coordsToLatLng(coords[i], reverse);
- latlngs.push(latlng);
- }
- return latlngs;
- }
- });
- }());
|