diff --git a/src/ol/Graticule.js b/src/ol/Graticule.js index d1c1877c9d..34c7ab59cd 100644 --- a/src/ol/Graticule.js +++ b/src/ol/Graticule.js @@ -107,6 +107,11 @@ const INTERVALS = [ * Note that the default's `textAlign` configuration will not work well for * `latLabelPosition` configurations that position labels close to the left of * the viewport. + * @property {Array} [intervals] Intervals (in degrees) for the graticule. + * Example to limit graticules to 30 and 10 degrees intervals: + * ```js + * [30, 10] + * ``` */ @@ -319,6 +324,12 @@ class Graticule { this.parallelsLabels_ = []; } + /** + * @type {Array} + * @private + */ + this.intervals_ = options.intervals !== undefined ? options.intervals : INTERVALS; + this.setMap(options.map !== undefined ? options.map : null); } @@ -530,8 +541,8 @@ class Graticule { const p1 = []; /** @type {Array} **/ const p2 = []; - for (let i = 0, ii = INTERVALS.length; i < ii; ++i) { - const delta = INTERVALS[i] / 2; + for (let i = 0, ii = this.intervals_.length; i < ii; ++i) { + const delta = this.intervals_[i] / 2; p1[0] = centerLon - delta; p1[1] = centerLat - delta; p2[0] = centerLon + delta; @@ -542,7 +553,7 @@ class Graticule { if (dist <= target) { break; } - interval = INTERVALS[i]; + interval = this.intervals_[i]; } return interval; } diff --git a/test/spec/ol/graticule.test.js b/test/spec/ol/graticule.test.js index 075db560af..c8cda2c7b1 100644 --- a/test/spec/ol/graticule.test.js +++ b/test/spec/ol/graticule.test.js @@ -104,6 +104,38 @@ describe('ol.Graticule', function() { expect(graticule.latLabelPosition_).to.be(0.1); }); + it('can be configured with interval limits', function() { + graticule = new Graticule({ + map: new Map({}), + showLabels: true, + lonLabelFormatter: function(lon) { + return lon.toString(); + }, + latLabelFormatter: function(lat) { + return lat.toString(); + }, + intervals: [10] + }); + const extent = [-25614353.926475704, -7827151.696402049, + 25614353.926475704, 7827151.696402049]; + const projection = getProjection('EPSG:3857'); + const resolution = 4891.96981025128; + const squaredTolerance = resolution * resolution / 4.0; + graticule.updateProjectionInfo_(projection); + graticule.createGraticule_(extent, [0, 0], resolution, squaredTolerance); + + expect(graticule.meridiansLabels_[0].text).to.be('0'); + expect(graticule.parallelsLabels_[0].text).to.be('0'); + expect(graticule.meridiansLabels_[1].text).to.be('-10'); + expect(graticule.parallelsLabels_[1].text).to.be('-10'); + expect(graticule.meridiansLabels_[2].text).to.be('-20'); + expect(graticule.parallelsLabels_[2].text).to.be('-20'); + + expect(graticule.getMeridians().length).to.be(37); + expect(graticule.getParallels().length).to.be(11); + }); + + }); });