Leaflet/src/layer/GeoJSON.js

137 lines
3.3 KiB
JavaScript
Raw Normal View History

L.GeoJSON = L.FeatureGroup.extend({
2011-12-09 22:51:31 +08:00
initialize: function (geojson, options) {
L.setOptions(this, options);
2012-02-15 19:17:25 +08:00
2011-06-10 19:26:16 +08:00
this._layers = {};
2011-12-08 23:53:17 +08:00
2011-06-10 19:26:16 +08:00
if (geojson) {
this.addData(geojson);
2011-06-10 19:26:16 +08:00
}
},
2011-12-08 23:53:17 +08:00
addData: function (geojson) {
2012-07-12 20:37:43 +08:00
var features = geojson instanceof Array ? geojson : geojson.features,
i, len;
2012-02-15 19:17:25 +08:00
if (features) {
for (i = 0, len = features.length; i < len; i++) {
this.addData(features[i]);
2011-06-10 19:26:16 +08:00
}
return this;
2011-06-10 19:26:16 +08:00
}
2011-12-08 23:53:17 +08:00
var options = this.options;
2011-12-08 23:53:17 +08:00
if (options.filter && !options.filter(geojson)) { return; }
2011-12-08 23:53:17 +08:00
var layer = L.GeoJSON.geometryToLayer(geojson, options.pointToLayer);
layer.feature = geojson;
this.resetStyle(layer);
if (options.onEachFeature) {
options.onEachFeature(geojson, layer);
}
return this.addLayer(layer);
},
resetStyle: function (layer) {
var style = this.options.style;
if (style) {
this._setLayerStyle(layer, style);
}
},
setStyle: function (style) {
this.eachLayer(function (layer) {
this._setLayerStyle(layer, style);
}, this);
},
_setLayerStyle: function (layer, style) {
if (typeof style === 'function') {
style = style(layer.feature);
}
if (layer.setStyle) {
layer.setStyle(style);
}
2011-06-10 19:26:16 +08:00
}
});
L.extend(L.GeoJSON, {
geometryToLayer: function (geojson, pointToLayer) {
var geometry = geojson.type === 'Feature' ? geojson.geometry : geojson,
coords = geometry.coordinates,
layers = [],
latlng, latlngs, i, len, layer;
2011-06-10 19:26:16 +08:00
switch (geometry.type) {
2011-12-08 23:53:17 +08:00
case 'Point':
latlng = this.coordsToLatLng(coords);
return pointToLayer ? pointToLayer(geojson, latlng) : new L.Marker(latlng);
2011-12-08 23:53:17 +08:00
case 'MultiPoint':
for (i = 0, len = coords.length; i < len; i++) {
latlng = this.coordsToLatLng(coords[i]);
layer = pointToLayer ? pointToLayer(geojson, latlng) : new L.Marker(latlng);
2011-12-08 23:53:17 +08:00
layers.push(layer);
}
return new L.FeatureGroup(layers);
case 'LineString':
latlngs = this.coordsToLatLngs(coords);
return new L.Polyline(latlngs);
case 'Polygon':
latlngs = this.coordsToLatLngs(coords, 1);
return new L.Polygon(latlngs);
case 'MultiLineString':
latlngs = this.coordsToLatLngs(coords, 1);
return new L.MultiPolyline(latlngs);
case "MultiPolygon":
latlngs = this.coordsToLatLngs(coords, 2);
return new L.MultiPolygon(latlngs);
case "GeometryCollection":
for (i = 0, len = geometry.geometries.length; i < len; i++) {
layer = this.geometryToLayer(geometry.geometries[i], pointToLayer);
2011-12-08 23:53:17 +08:00
layers.push(layer);
}
return new L.FeatureGroup(layers);
default:
throw new Error('Invalid GeoJSON object.');
2011-06-10 19:26:16 +08:00
}
},
2012-02-15 19:17:25 +08:00
coordsToLatLng: function (coords, reverse) { // (Array, Boolean) -> LatLng
var lat = parseFloat(coords[reverse ? 0 : 1]),
lng = parseFloat(coords[reverse ? 1 : 0]);
2012-02-15 19:17:25 +08:00
return new L.LatLng(lat, lng);
2011-06-10 19:26:16 +08:00
},
2012-02-15 19:17:25 +08:00
coordsToLatLngs: function (coords, levelsDeep, reverse) { // (Array, Number, Boolean) -> Array
var latlng,
latlngs = [],
i, len;
2011-12-08 23:53:17 +08:00
2012-02-15 19:17:25 +08:00
for (i = 0, len = coords.length; i < len; i++) {
2011-12-08 23:53:17 +08:00
latlng = levelsDeep ?
2012-11-08 00:46:59 +08:00
this.coordsToLatLngs(coords[i], levelsDeep - 1, reverse) :
this.coordsToLatLng(coords[i], reverse);
2011-06-10 19:26:16 +08:00
latlngs.push(latlng);
}
2012-02-15 19:17:25 +08:00
2011-06-10 19:26:16 +08:00
return latlngs;
}
2011-12-08 23:53:17 +08:00
});
2012-07-05 19:45:06 +08:00
L.geoJson = function (geojson, options) {
return new L.GeoJSON(geojson, options);
};