Leaflet/src/layer/GeoJSON.js

155 lines
3.8 KiB
JavaScript
Raw Normal View History

/*
* L.GeoJSON turns any GeoJSON data into a Leaflet layer.
*/
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) {
2013-01-21 08:13:43 +08:00
var features = L.Util.isArray(geojson) ? geojson : geojson.features,
i, len;
2013-01-21 09:06:52 +08:00
2012-02-15 19:17:25 +08:00
if (features) {
for (i = 0, len = features.length; i < len; i++) {
// Only add this if geometry or geometries are set and not null
2013-01-21 08:35:18 +08:00
if (features[i].features) {
2013-01-21 08:13:43 +08:00
this.addData(features[i].features);
} else if (features[i].geometries || features[i].geometry) {
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;
layer.defaultOptions = layer.options;
this.resetStyle(layer);
if (options.onEachFeature) {
options.onEachFeature(geojson, layer);
}
return this.addLayer(layer);
},
resetStyle: function (layer) {
var style = this.options.style;
if (style) {
// reset any custom styles
L.Util.extend(layer.options, layer.defaultOptions);
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':
2011-12-08 23:53:17 +08:00
latlngs = this.coordsToLatLngs(coords, 2);
return new L.MultiPolygon(latlngs);
case 'GeometryCollection':
2011-12-08 23:53:17 +08:00
for (i = 0, len = geometry.geometries.length; i < len; i++) {
layer = this.geometryToLayer({
geometry: geometry.geometries[i],
type: 'Feature',
properties: geojson.properties
}, 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);
};