46885de00d
This commit adds a third parameter to the L.LatLon class for specifying altitude. This is in turn stored in the `.latitude` property for the LatLng instance. Latitude property will only be set if the latitude parameter is not undefined, this is done in order to ensure backwards compability. ```javascript var latlng = new L.LatLng(10, 20, 30); console.log(latlng.altitude); // prints '30' to the console ``` Similar functionality has been added to L.GeoJSON coordsToLatLng() and latLngToCoords() methods in order to handle import and export of 3D GeoJSON. ```javascript var geoJSON = { type: 'Feature' ,properties: {} ,geometry: { type: 'Point' ,coordinates: [20, 10, 30] } } var layer = new L.GeoJSON(); layer.addData(geoJSON); console.log(layer.getLayers()[0].getLatLng().altitude); ``` `NB` It is important to notice that no logic has been added in order to prevent latitude and longitude to change without appropirate change in altitude – this must be handled by the application.
238 lines
6.4 KiB
JavaScript
238 lines
6.4 KiB
JavaScript
describe("L.GeoJSON", function () {
|
|
describe("addData", function () {
|
|
var geoJSON = {
|
|
type: 'Feature',
|
|
properties: {},
|
|
geometry: {
|
|
type: 'Point',
|
|
coordinates: [20, 10, 5]
|
|
}
|
|
};
|
|
|
|
it("sets feature property on member layers", function () {
|
|
var layer = new L.GeoJSON();
|
|
layer.addData(geoJSON);
|
|
expect(layer.getLayers()[0].feature).to.eql(geoJSON);
|
|
});
|
|
|
|
it("normalizes a geometry to a Feature", function () {
|
|
var layer = new L.GeoJSON();
|
|
layer.addData(geoJSON.geometry);
|
|
expect(layer.getLayers()[0].feature).to.eql(geoJSON);
|
|
});
|
|
});
|
|
});
|
|
|
|
describe("L.Marker#toGeoJSON", function () {
|
|
it("returns a 2D Point object", function () {
|
|
var marker = new L.Marker([10, 20]);
|
|
expect(marker.toGeoJSON().geometry).to.eql({
|
|
type: 'Point',
|
|
coordinates: [20, 10]
|
|
});
|
|
});
|
|
|
|
it("returns a 3D Point object", function () {
|
|
var marker = new L.Marker([10, 20, 30]);
|
|
expect(marker.toGeoJSON().geometry).to.eql({
|
|
type: 'Point',
|
|
coordinates: [20, 10, 30]
|
|
});
|
|
});
|
|
});
|
|
|
|
describe("L.Circle#toGeoJSON", function () {
|
|
it("returns a 2D Point object", function () {
|
|
var circle = new L.Circle([10, 20], 100);
|
|
expect(circle.toGeoJSON().geometry).to.eql({
|
|
type: 'Point',
|
|
coordinates: [20, 10]
|
|
});
|
|
});
|
|
|
|
it("returns a 3D Point object", function () {
|
|
var circle = new L.Circle([10, 20, 30], 100);
|
|
expect(circle.toGeoJSON().geometry).to.eql({
|
|
type: 'Point',
|
|
coordinates: [20, 10, 30]
|
|
});
|
|
});
|
|
});
|
|
|
|
describe("L.CircleMarker#toGeoJSON", function () {
|
|
it("returns a 2D Point object", function () {
|
|
var marker = new L.CircleMarker([10, 20]);
|
|
expect(marker.toGeoJSON().geometry).to.eql({
|
|
type: 'Point',
|
|
coordinates: [20, 10]
|
|
});
|
|
});
|
|
|
|
it("returns a 3D Point object", function () {
|
|
var marker = new L.CircleMarker([10, 20, 30]);
|
|
expect(marker.toGeoJSON().geometry).to.eql({
|
|
type: 'Point',
|
|
coordinates: [20, 10, 30]
|
|
});
|
|
});
|
|
});
|
|
|
|
describe("L.Polyline#toGeoJSON", function () {
|
|
it("returns a 2D LineString object", function () {
|
|
var polyline = new L.Polyline([[10, 20], [2, 5]]);
|
|
expect(polyline.toGeoJSON().geometry).to.eql({
|
|
type: 'LineString',
|
|
coordinates: [[20, 10], [5, 2]]
|
|
});
|
|
});
|
|
|
|
it("returns a 3D LineString object", function () {
|
|
var polyline = new L.Polyline([[10, 20, 30], [2, 5, 10]]);
|
|
expect(polyline.toGeoJSON().geometry).to.eql({
|
|
type: 'LineString',
|
|
coordinates: [[20, 10, 30], [5, 2, 10]]
|
|
});
|
|
});
|
|
});
|
|
|
|
describe("L.MultiPolyline#toGeoJSON", function () {
|
|
it("returns a 2D MultiLineString object", function () {
|
|
var multiPolyline = new L.MultiPolyline([[[10, 20], [2, 5]], [[1, 2], [3, 4]]]);
|
|
expect(multiPolyline.toGeoJSON().geometry).to.eql({
|
|
type: 'MultiLineString',
|
|
coordinates: [
|
|
[[20, 10], [5, 2]],
|
|
[[2, 1], [4, 3]]
|
|
]
|
|
});
|
|
});
|
|
|
|
it("returns a 3D MultiLineString object", function () {
|
|
var multiPolyline = new L.MultiPolyline([[[10, 20, 30], [2, 5, 10]], [[1, 2, 3], [4, 5, 6]]]);
|
|
expect(multiPolyline.toGeoJSON().geometry).to.eql({
|
|
type: 'MultiLineString',
|
|
coordinates: [
|
|
[[20, 10, 30], [5, 2, 10]],
|
|
[[2, 1, 3], [5, 4, 6]]
|
|
]
|
|
});
|
|
});
|
|
});
|
|
|
|
describe("L.Polygon#toGeoJSON", function () {
|
|
it("returns a 2D Polygon object (no holes)", function () {
|
|
var polygon = new L.Polygon([[1, 2], [3, 4], [5, 6]]);
|
|
expect(polygon.toGeoJSON().geometry).to.eql({
|
|
type: 'Polygon',
|
|
coordinates: [[[2, 1], [4, 3], [6, 5], [2, 1]]]
|
|
});
|
|
});
|
|
|
|
it("returns a 3D Polygon object (no holes)", function () {
|
|
var polygon = new L.Polygon([[1, 2, 3], [4, 5, 6], [7, 8, 9]]);
|
|
expect(polygon.toGeoJSON().geometry).to.eql({
|
|
type: 'Polygon',
|
|
coordinates: [[[2, 1, 3], [5, 4, 6], [8, 7, 9], [2, 1, 3]]]
|
|
});
|
|
});
|
|
|
|
it("returns a 2D Polygon object (with holes)", function () {
|
|
var polygon = new L.Polygon([[[1, 2], [3, 4], [5, 6]], [[7, 8], [9, 10], [11, 12]]]);
|
|
expect(polygon.toGeoJSON().geometry).to.eql({
|
|
type: 'Polygon',
|
|
coordinates: [
|
|
[[2, 1], [4, 3], [6, 5], [2, 1]],
|
|
[[8, 7], [10, 9], [12, 11], [8, 7]]
|
|
]
|
|
});
|
|
});
|
|
|
|
it("returns a 3D Polygon object (with holes)", function () {
|
|
var polygon = new L.Polygon([[[1, 2, 3], [4, 5, 6], [7, 8, 9]], [[10, 11, 12], [13, 14, 15], [16, 17, 18]]]);
|
|
expect(polygon.toGeoJSON().geometry).to.eql({
|
|
type: 'Polygon',
|
|
coordinates: [
|
|
[[2, 1, 3], [5, 4, 6], [8, 7, 9], [2, 1, 3]],
|
|
[[11, 10, 12], [14, 13, 15], [17, 16, 18], [11, 10, 12]]
|
|
]
|
|
});
|
|
});
|
|
});
|
|
|
|
describe("L.MultiPolygon#toGeoJSON", function () {
|
|
it("returns a 2D MultiPolygon object", function () {
|
|
var multiPolygon = new L.MultiPolygon([[[1, 2], [3, 4], [5, 6]]]);
|
|
expect(multiPolygon.toGeoJSON().geometry).to.eql({
|
|
type: 'MultiPolygon',
|
|
coordinates: [
|
|
[[[2, 1], [4, 3], [6, 5], [2, 1]]]
|
|
]
|
|
});
|
|
});
|
|
|
|
it("returns a 3D MultiPolygon object", function () {
|
|
var multiPolygon = new L.MultiPolygon([[[1, 2, 3], [4, 5, 6], [7, 8, 9]]]);
|
|
expect(multiPolygon.toGeoJSON().geometry).to.eql({
|
|
type: 'MultiPolygon',
|
|
coordinates: [
|
|
[[[2, 1, 3], [5, 4, 6], [8, 7, 9], [2, 1, 3]]]
|
|
]
|
|
});
|
|
});
|
|
});
|
|
|
|
describe("L.LayerGroup#toGeoJSON", function () {
|
|
it("returns a 2D FeatureCollection object", function () {
|
|
var marker = new L.Marker([10, 20]),
|
|
polyline = new L.Polyline([[10, 20], [2, 5]]),
|
|
layerGroup = new L.LayerGroup([marker, polyline]);
|
|
expect(layerGroup.toGeoJSON()).to.eql({
|
|
type: 'FeatureCollection',
|
|
features: [marker.toGeoJSON(), polyline.toGeoJSON()]
|
|
});
|
|
});
|
|
|
|
it("returns a 3D FeatureCollection object", function () {
|
|
var marker = new L.Marker([10, 20, 30]),
|
|
polyline = new L.Polyline([[10, 20, 30], [2, 5, 10]]),
|
|
layerGroup = new L.LayerGroup([marker, polyline]);
|
|
expect(layerGroup.toGeoJSON()).to.eql({
|
|
type: 'FeatureCollection',
|
|
features: [marker.toGeoJSON(), polyline.toGeoJSON()]
|
|
});
|
|
});
|
|
|
|
it("ensures that every member is a Feature", function () {
|
|
var tileLayer = new L.TileLayer(),
|
|
layerGroup = new L.LayerGroup([tileLayer]);
|
|
|
|
tileLayer.toGeoJSON = function () {
|
|
return {
|
|
type: 'Point',
|
|
coordinates: [20, 10]
|
|
}
|
|
};
|
|
|
|
expect(layerGroup.toGeoJSON()).to.eql({
|
|
type: 'FeatureCollection',
|
|
features: [{
|
|
type: 'Feature',
|
|
properties: {},
|
|
geometry: {
|
|
type: 'Point',
|
|
coordinates: [20, 10]
|
|
}
|
|
}]
|
|
});
|
|
});
|
|
|
|
it("omits layers which do not implement toGeoJSON", function () {
|
|
var tileLayer = new L.TileLayer(),
|
|
layerGroup = new L.LayerGroup([tileLayer]);
|
|
expect(layerGroup.toGeoJSON()).to.eql({
|
|
type: 'FeatureCollection',
|
|
features: []
|
|
});
|
|
});
|
|
});
|