Move ol.Sphere#circle to ol.geom.Polygon.circular
Previously, ol.geom.Polygon was a transitive dependency of ol.proj (since ol.proj requires ol.sphere.NORMAL, and all spheres were capable of generating circular polygons). Instead, ol.proj should be lower-level. Since it deals only with coordinate arrays, it shouldn't depend on all of the geometry code. By adding a static `circular` function to `ol.geom.Polygon`, the dependency tree makes more sense. If you want to create a polygon that approximates a circle on a sphere, you require `ol.geom.Polygon` and `ol.Sphere` (or one of the constants). This makes room for geometries to have a `transform` method that takes projection-like arguments (meaning that `ol.geom.Geometry` will require `ol.proj`).
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
goog.require('ol.Feature');
|
goog.require('ol.Feature');
|
||||||
goog.require('ol.Map');
|
goog.require('ol.Map');
|
||||||
goog.require('ol.View2D');
|
goog.require('ol.View2D');
|
||||||
|
goog.require('ol.geom.Polygon');
|
||||||
goog.require('ol.layer.Tile');
|
goog.require('ol.layer.Tile');
|
||||||
goog.require('ol.layer.Vector');
|
goog.require('ol.layer.Vector');
|
||||||
goog.require('ol.source.TileWMS');
|
goog.require('ol.source.TileWMS');
|
||||||
@@ -38,7 +39,7 @@ var map = new ol.Map({
|
|||||||
var radius = 800000;
|
var radius = 800000;
|
||||||
for (var x = -180; x < 180; x += 30) {
|
for (var x = -180; x < 180; x += 30) {
|
||||||
for (var y = -90; y < 90; y += 30) {
|
for (var y = -90; y < 90; y += 30) {
|
||||||
var geometry = ol.sphere.WGS84.circle([x, y], radius, 64);
|
var circle = ol.geom.Polygon.circular(ol.sphere.WGS84, [x, y], radius, 64);
|
||||||
vectorSource.addFeature(new ol.Feature(geometry));
|
vectorSource.addFeature(new ol.Feature(circle));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ goog.require('ol.BrowserFeature');
|
|||||||
goog.require('ol.Coordinate');
|
goog.require('ol.Coordinate');
|
||||||
goog.require('ol.Object');
|
goog.require('ol.Object');
|
||||||
goog.require('ol.geom.Geometry');
|
goog.require('ol.geom.Geometry');
|
||||||
|
goog.require('ol.geom.Polygon');
|
||||||
goog.require('ol.proj');
|
goog.require('ol.proj');
|
||||||
goog.require('ol.sphere.WGS84');
|
goog.require('ol.sphere.WGS84');
|
||||||
|
|
||||||
@@ -186,7 +187,8 @@ ol.Geolocation.prototype.positionChange_ = function(position) {
|
|||||||
this.set(ol.GeolocationProperty.POSITION, projectedPosition);
|
this.set(ol.GeolocationProperty.POSITION, projectedPosition);
|
||||||
this.set(ol.GeolocationProperty.SPEED,
|
this.set(ol.GeolocationProperty.SPEED,
|
||||||
goog.isNull(coords.speed) ? undefined : coords.speed);
|
goog.isNull(coords.speed) ? undefined : coords.speed);
|
||||||
var geometry = ol.sphere.WGS84.circle(this.position_, coords.accuracy);
|
var geometry = ol.geom.Polygon.circular(
|
||||||
|
ol.sphere.WGS84, this.position_, coords.accuracy);
|
||||||
geometry.applyTransform(this.transform_);
|
geometry.applyTransform(this.transform_);
|
||||||
this.set(ol.GeolocationProperty.ACCURACY_GEOMETRY, geometry);
|
this.set(ol.GeolocationProperty.ACCURACY_GEOMETRY, geometry);
|
||||||
this.dispatchChangeEvent();
|
this.dispatchChangeEvent();
|
||||||
|
|||||||
@@ -314,3 +314,29 @@ ol.geom.Polygon.prototype.setFlatCoordinates =
|
|||||||
this.ends_ = ends;
|
this.ends_ = ends;
|
||||||
this.dispatchChangeEvent();
|
this.dispatchChangeEvent();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create an approximation of a circle on the surface of a sphere.
|
||||||
|
* @param {ol.Sphere} sphere The sphere.
|
||||||
|
* @param {ol.Coordinate} center Center.
|
||||||
|
* @param {number} radius Radius.
|
||||||
|
* @param {number=} opt_n Optional number of points. Default is `32`.
|
||||||
|
* @return {ol.geom.Polygon} Circle geometry.
|
||||||
|
* @todo api
|
||||||
|
*/
|
||||||
|
ol.geom.Polygon.circular = function(sphere, center, radius, opt_n) {
|
||||||
|
var n = goog.isDef(opt_n) ? opt_n : 32;
|
||||||
|
/** @type {Array.<number>} */
|
||||||
|
var flatCoordinates = [];
|
||||||
|
var i;
|
||||||
|
for (i = 0; i < n; ++i) {
|
||||||
|
goog.array.extend(
|
||||||
|
flatCoordinates, sphere.offset(center, radius, 2 * Math.PI * i / n));
|
||||||
|
}
|
||||||
|
flatCoordinates.push(flatCoordinates[0], flatCoordinates[1]);
|
||||||
|
var polygon = new ol.geom.Polygon(null);
|
||||||
|
polygon.setFlatCoordinates(
|
||||||
|
ol.geom.GeometryLayout.XY, flatCoordinates, [flatCoordinates.length]);
|
||||||
|
return polygon;
|
||||||
|
};
|
||||||
|
|||||||
@@ -12,7 +12,6 @@ goog.provide('ol.Sphere');
|
|||||||
|
|
||||||
goog.require('goog.array');
|
goog.require('goog.array');
|
||||||
goog.require('goog.math');
|
goog.require('goog.math');
|
||||||
goog.require('ol.geom.Polygon');
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -30,33 +29,6 @@ ol.Sphere = function(radius) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns an approximation to a circle centered on `center` with radius
|
|
||||||
* `radius` with `n` distinct points.
|
|
||||||
*
|
|
||||||
* @param {ol.Coordinate} center Center.
|
|
||||||
* @param {number} radius Radius.
|
|
||||||
* @param {number=} opt_n N.
|
|
||||||
* @return {ol.geom.Geometry} Circle geometry.
|
|
||||||
* @todo api
|
|
||||||
*/
|
|
||||||
ol.Sphere.prototype.circle = function(center, radius, opt_n) {
|
|
||||||
var n = goog.isDef(opt_n) ? opt_n : 32;
|
|
||||||
/** @type {Array.<number>} */
|
|
||||||
var flatCoordinates = [];
|
|
||||||
var i;
|
|
||||||
for (i = 0; i < n; ++i) {
|
|
||||||
goog.array.extend(
|
|
||||||
flatCoordinates, this.offset(center, radius, 2 * Math.PI * i / n));
|
|
||||||
}
|
|
||||||
flatCoordinates.push(flatCoordinates[0], flatCoordinates[1]);
|
|
||||||
var polygon = new ol.geom.Polygon(null);
|
|
||||||
polygon.setFlatCoordinates(
|
|
||||||
ol.geom.GeometryLayout.XY, flatCoordinates, [flatCoordinates.length]);
|
|
||||||
return polygon;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the distance from c1 to c2 using the spherical law of cosines.
|
* Returns the distance from c1 to c2 using the spherical law of cosines.
|
||||||
*
|
*
|
||||||
|
|||||||
Reference in New Issue
Block a user