summaryrefslogtreecommitdiff
path: root/misc/openlayers/lib/OpenLayers/Geometry
diff options
context:
space:
mode:
Diffstat (limited to 'misc/openlayers/lib/OpenLayers/Geometry')
-rw-r--r--misc/openlayers/lib/OpenLayers/Geometry/Collection.js563
-rw-r--r--misc/openlayers/lib/OpenLayers/Geometry/Curve.js89
-rw-r--r--misc/openlayers/lib/OpenLayers/Geometry/LineString.js646
-rw-r--r--misc/openlayers/lib/OpenLayers/Geometry/LinearRing.js433
-rw-r--r--misc/openlayers/lib/OpenLayers/Geometry/MultiLineString.js258
-rw-r--r--misc/openlayers/lib/OpenLayers/Geometry/MultiPoint.js66
-rw-r--r--misc/openlayers/lib/OpenLayers/Geometry/MultiPolygon.js42
-rw-r--r--misc/openlayers/lib/OpenLayers/Geometry/Point.js283
-rw-r--r--misc/openlayers/lib/OpenLayers/Geometry/Polygon.js255
9 files changed, 0 insertions, 2635 deletions
diff --git a/misc/openlayers/lib/OpenLayers/Geometry/Collection.js b/misc/openlayers/lib/OpenLayers/Geometry/Collection.js
deleted file mode 100644
index f76cc85..0000000
--- a/misc/openlayers/lib/OpenLayers/Geometry/Collection.js
+++ /dev/null
@@ -1,563 +0,0 @@
-/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
- * full list of contributors). Published under the 2-clause BSD license.
- * See license.txt in the OpenLayers distribution or repository for the
- * full text of the license. */
-
-/**
- * @requires OpenLayers/Geometry.js
- */
-
-/**
- * Class: OpenLayers.Geometry.Collection
- * A Collection is exactly what it sounds like: A collection of different
- * Geometries. These are stored in the local parameter <components> (which
- * can be passed as a parameter to the constructor).
- *
- * As new geometries are added to the collection, they are NOT cloned.
- * When removing geometries, they need to be specified by reference (ie you
- * have to pass in the *exact* geometry to be removed).
- *
- * The <getArea> and <getLength> functions here merely iterate through
- * the components, summing their respective areas and lengths.
- *
- * Create a new instance with the <OpenLayers.Geometry.Collection> constructor.
- *
- * Inherits from:
- * - <OpenLayers.Geometry>
- */
-OpenLayers.Geometry.Collection = OpenLayers.Class(OpenLayers.Geometry, {
-
- /**
- * APIProperty: components
- * {Array(<OpenLayers.Geometry>)} The component parts of this geometry
- */
- components: null,
-
- /**
- * Property: componentTypes
- * {Array(String)} An array of class names representing the types of
- * components that the collection can include. A null value means the
- * component types are not restricted.
- */
- componentTypes: null,
-
- /**
- * Constructor: OpenLayers.Geometry.Collection
- * Creates a Geometry Collection -- a list of geoms.
- *
- * Parameters:
- * components - {Array(<OpenLayers.Geometry>)} Optional array of geometries
- *
- */
- initialize: function (components) {
- OpenLayers.Geometry.prototype.initialize.apply(this, arguments);
- this.components = [];
- if (components != null) {
- this.addComponents(components);
- }
- },
-
- /**
- * APIMethod: destroy
- * Destroy this geometry.
- */
- destroy: function () {
- this.components.length = 0;
- this.components = null;
- OpenLayers.Geometry.prototype.destroy.apply(this, arguments);
- },
-
- /**
- * APIMethod: clone
- * Clone this geometry.
- *
- * Returns:
- * {<OpenLayers.Geometry.Collection>} An exact clone of this collection
- */
- clone: function() {
- var geometry = eval("new " + this.CLASS_NAME + "()");
- for(var i=0, len=this.components.length; i<len; i++) {
- geometry.addComponent(this.components[i].clone());
- }
-
- // catch any randomly tagged-on properties
- OpenLayers.Util.applyDefaults(geometry, this);
-
- return geometry;
- },
-
- /**
- * Method: getComponentsString
- * Get a string representing the components for this collection
- *
- * Returns:
- * {String} A string representation of the components of this geometry
- */
- getComponentsString: function(){
- var strings = [];
- for(var i=0, len=this.components.length; i<len; i++) {
- strings.push(this.components[i].toShortString());
- }
- return strings.join(",");
- },
-
- /**
- * APIMethod: calculateBounds
- * Recalculate the bounds by iterating through the components and
- * calling calling extendBounds() on each item.
- */
- calculateBounds: function() {
- this.bounds = null;
- var bounds = new OpenLayers.Bounds();
- var components = this.components;
- if (components) {
- for (var i=0, len=components.length; i<len; i++) {
- bounds.extend(components[i].getBounds());
- }
- }
- // to preserve old behavior, we only set bounds if non-null
- // in the future, we could add bounds.isEmpty()
- if (bounds.left != null && bounds.bottom != null &&
- bounds.right != null && bounds.top != null) {
- this.setBounds(bounds);
- }
- },
-
- /**
- * APIMethod: addComponents
- * Add components to this geometry.
- *
- * Parameters:
- * components - {Array(<OpenLayers.Geometry>)} An array of geometries to add
- */
- addComponents: function(components){
- if(!(OpenLayers.Util.isArray(components))) {
- components = [components];
- }
- for(var i=0, len=components.length; i<len; i++) {
- this.addComponent(components[i]);
- }
- },
-
- /**
- * Method: addComponent
- * Add a new component (geometry) to the collection. If this.componentTypes
- * is set, then the component class name must be in the componentTypes array.
- *
- * The bounds cache is reset.
- *
- * Parameters:
- * component - {<OpenLayers.Geometry>} A geometry to add
- * index - {int} Optional index into the array to insert the component
- *
- * Returns:
- * {Boolean} The component geometry was successfully added
- */
- addComponent: function(component, index) {
- var added = false;
- if(component) {
- if(this.componentTypes == null ||
- (OpenLayers.Util.indexOf(this.componentTypes,
- component.CLASS_NAME) > -1)) {
-
- if(index != null && (index < this.components.length)) {
- var components1 = this.components.slice(0, index);
- var components2 = this.components.slice(index,
- this.components.length);
- components1.push(component);
- this.components = components1.concat(components2);
- } else {
- this.components.push(component);
- }
- component.parent = this;
- this.clearBounds();
- added = true;
- }
- }
- return added;
- },
-
- /**
- * APIMethod: removeComponents
- * Remove components from this geometry.
- *
- * Parameters:
- * components - {Array(<OpenLayers.Geometry>)} The components to be removed
- *
- * Returns:
- * {Boolean} A component was removed.
- */
- removeComponents: function(components) {
- var removed = false;
-
- if(!(OpenLayers.Util.isArray(components))) {
- components = [components];
- }
- for(var i=components.length-1; i>=0; --i) {
- removed = this.removeComponent(components[i]) || removed;
- }
- return removed;
- },
-
- /**
- * Method: removeComponent
- * Remove a component from this geometry.
- *
- * Parameters:
- * component - {<OpenLayers.Geometry>}
- *
- * Returns:
- * {Boolean} The component was removed.
- */
- removeComponent: function(component) {
-
- OpenLayers.Util.removeItem(this.components, component);
-
- // clearBounds() so that it gets recalculated on the next call
- // to this.getBounds();
- this.clearBounds();
- return true;
- },
-
- /**
- * APIMethod: getLength
- * Calculate the length of this geometry
- *
- * Returns:
- * {Float} The length of the geometry
- */
- getLength: function() {
- var length = 0.0;
- for (var i=0, len=this.components.length; i<len; i++) {
- length += this.components[i].getLength();
- }
- return length;
- },
-
- /**
- * APIMethod: getArea
- * Calculate the area of this geometry. Note how this function is overridden
- * in <OpenLayers.Geometry.Polygon>.
- *
- * Returns:
- * {Float} The area of the collection by summing its parts
- */
- getArea: function() {
- var area = 0.0;
- for (var i=0, len=this.components.length; i<len; i++) {
- area += this.components[i].getArea();
- }
- return area;
- },
-
- /**
- * APIMethod: getGeodesicArea
- * Calculate the approximate area of the polygon were it projected onto
- * the earth.
- *
- * Parameters:
- * projection - {<OpenLayers.Projection>} The spatial reference system
- * for the geometry coordinates. If not provided, Geographic/WGS84 is
- * assumed.
- *
- * Reference:
- * Robert. G. Chamberlain and William H. Duquette, "Some Algorithms for
- * Polygons on a Sphere", JPL Publication 07-03, Jet Propulsion
- * Laboratory, Pasadena, CA, June 2007 http://trs-new.jpl.nasa.gov/dspace/handle/2014/40409
- *
- * Returns:
- * {float} The approximate geodesic area of the geometry in square meters.
- */
- getGeodesicArea: function(projection) {
- var area = 0.0;
- for(var i=0, len=this.components.length; i<len; i++) {
- area += this.components[i].getGeodesicArea(projection);
- }
- return area;
- },
-
- /**
- * APIMethod: getCentroid
- *
- * Compute the centroid for this geometry collection.
- *
- * Parameters:
- * weighted - {Boolean} Perform the getCentroid computation recursively,
- * returning an area weighted average of all geometries in this collection.
- *
- * Returns:
- * {<OpenLayers.Geometry.Point>} The centroid of the collection
- */
- getCentroid: function(weighted) {
- if (!weighted) {
- return this.components.length && this.components[0].getCentroid();
- }
- var len = this.components.length;
- if (!len) {
- return false;
- }
-
- var areas = [];
- var centroids = [];
- var areaSum = 0;
- var minArea = Number.MAX_VALUE;
- var component;
- for (var i=0; i<len; ++i) {
- component = this.components[i];
- var area = component.getArea();
- var centroid = component.getCentroid(true);
- if (isNaN(area) || isNaN(centroid.x) || isNaN(centroid.y)) {
- continue;
- }
- areas.push(area);
- areaSum += area;
- minArea = (area < minArea && area > 0) ? area : minArea;
- centroids.push(centroid);
- }
- len = areas.length;
- if (areaSum === 0) {
- // all the components in this collection have 0 area
- // probably a collection of points -- weight all the points the same
- for (var i=0; i<len; ++i) {
- areas[i] = 1;
- }
- areaSum = areas.length;
- } else {
- // normalize all the areas where the smallest area will get
- // a value of 1
- for (var i=0; i<len; ++i) {
- areas[i] /= minArea;
- }
- areaSum /= minArea;
- }
-
- var xSum = 0, ySum = 0, centroid, area;
- for (var i=0; i<len; ++i) {
- centroid = centroids[i];
- area = areas[i];
- xSum += centroid.x * area;
- ySum += centroid.y * area;
- }
-
- return new OpenLayers.Geometry.Point(xSum/areaSum, ySum/areaSum);
- },
-
- /**
- * APIMethod: getGeodesicLength
- * Calculate the approximate length of the geometry were it projected onto
- * the earth.
- *
- * projection - {<OpenLayers.Projection>} The spatial reference system
- * for the geometry coordinates. If not provided, Geographic/WGS84 is
- * assumed.
- *
- * Returns:
- * {Float} The appoximate geodesic length of the geometry in meters.
- */
- getGeodesicLength: function(projection) {
- var length = 0.0;
- for(var i=0, len=this.components.length; i<len; i++) {
- length += this.components[i].getGeodesicLength(projection);
- }
- return length;
- },
-
- /**
- * APIMethod: move
- * Moves a geometry by the given displacement along positive x and y axes.
- * This modifies the position of the geometry and clears the cached
- * bounds.
- *
- * Parameters:
- * x - {Float} Distance to move geometry in positive x direction.
- * y - {Float} Distance to move geometry in positive y direction.
- */
- move: function(x, y) {
- for(var i=0, len=this.components.length; i<len; i++) {
- this.components[i].move(x, y);
- }
- },
-
- /**
- * APIMethod: rotate
- * Rotate a geometry around some origin
- *
- * Parameters:
- * angle - {Float} Rotation angle in degrees (measured counterclockwise
- * from the positive x-axis)
- * origin - {<OpenLayers.Geometry.Point>} Center point for the rotation
- */
- rotate: function(angle, origin) {
- for(var i=0, len=this.components.length; i<len; ++i) {
- this.components[i].rotate(angle, origin);
- }
- },
-
- /**
- * APIMethod: resize
- * Resize a geometry relative to some origin. Use this method to apply
- * a uniform scaling to a geometry.
- *
- * Parameters:
- * scale - {Float} Factor by which to scale the geometry. A scale of 2
- * doubles the size of the geometry in each dimension
- * (lines, for example, will be twice as long, and polygons
- * will have four times the area).
- * origin - {<OpenLayers.Geometry.Point>} Point of origin for resizing
- * ratio - {Float} Optional x:y ratio for resizing. Default ratio is 1.
- *
- * Returns:
- * {<OpenLayers.Geometry>} - The current geometry.
- */
- resize: function(scale, origin, ratio) {
- for(var i=0; i<this.components.length; ++i) {
- this.components[i].resize(scale, origin, ratio);
- }
- return this;
- },
-
- /**
- * APIMethod: distanceTo
- * Calculate the closest distance between two geometries (on the x-y plane).
- *
- * Parameters:
- * geometry - {<OpenLayers.Geometry>} The target geometry.
- * options - {Object} Optional properties for configuring the distance
- * calculation.
- *
- * Valid options:
- * details - {Boolean} Return details from the distance calculation.
- * Default is false.
- * edge - {Boolean} Calculate the distance from this geometry to the
- * nearest edge of the target geometry. Default is true. If true,
- * calling distanceTo from a geometry that is wholly contained within
- * the target will result in a non-zero distance. If false, whenever
- * geometries intersect, calling distanceTo will return 0. If false,
- * details cannot be returned.
- *
- * Returns:
- * {Number | Object} The distance between this geometry and the target.
- * If details is true, the return will be an object with distance,
- * x0, y0, x1, and y1 properties. The x0 and y0 properties represent
- * the coordinates of the closest point on this geometry. The x1 and y1
- * properties represent the coordinates of the closest point on the
- * target geometry.
- */
- distanceTo: function(geometry, options) {
- var edge = !(options && options.edge === false);
- var details = edge && options && options.details;
- var result, best, distance;
- var min = Number.POSITIVE_INFINITY;
- for(var i=0, len=this.components.length; i<len; ++i) {
- result = this.components[i].distanceTo(geometry, options);
- distance = details ? result.distance : result;
- if(distance < min) {
- min = distance;
- best = result;
- if(min == 0) {
- break;
- }
- }
- }
- return best;
- },
-
- /**
- * APIMethod: equals
- * Determine whether another geometry is equivalent to this one. Geometries
- * are considered equivalent if all components have the same coordinates.
- *
- * Parameters:
- * geometry - {<OpenLayers.Geometry>} The geometry to test.
- *
- * Returns:
- * {Boolean} The supplied geometry is equivalent to this geometry.
- */
- equals: function(geometry) {
- var equivalent = true;
- if(!geometry || !geometry.CLASS_NAME ||
- (this.CLASS_NAME != geometry.CLASS_NAME)) {
- equivalent = false;
- } else if(!(OpenLayers.Util.isArray(geometry.components)) ||
- (geometry.components.length != this.components.length)) {
- equivalent = false;
- } else {
- for(var i=0, len=this.components.length; i<len; ++i) {
- if(!this.components[i].equals(geometry.components[i])) {
- equivalent = false;
- break;
- }
- }
- }
- return equivalent;
- },
-
- /**
- * APIMethod: transform
- * Reproject the components geometry from source to dest.
- *
- * Parameters:
- * source - {<OpenLayers.Projection>}
- * dest - {<OpenLayers.Projection>}
- *
- * Returns:
- * {<OpenLayers.Geometry>}
- */
- transform: function(source, dest) {
- if (source && dest) {
- for (var i=0, len=this.components.length; i<len; i++) {
- var component = this.components[i];
- component.transform(source, dest);
- }
- this.bounds = null;
- }
- return this;
- },
-
- /**
- * APIMethod: intersects
- * Determine if the input geometry intersects this one.
- *
- * Parameters:
- * geometry - {<OpenLayers.Geometry>} Any type of geometry.
- *
- * Returns:
- * {Boolean} The input geometry intersects this one.
- */
- intersects: function(geometry) {
- var intersect = false;
- for(var i=0, len=this.components.length; i<len; ++ i) {
- intersect = geometry.intersects(this.components[i]);
- if(intersect) {
- break;
- }
- }
- return intersect;
- },
-
- /**
- * APIMethod: getVertices
- * Return a list of all points in this geometry.
- *
- * Parameters:
- * nodes - {Boolean} For lines, only return vertices that are
- * endpoints. If false, for lines, only vertices that are not
- * endpoints will be returned. If not provided, all vertices will
- * be returned.
- *
- * Returns:
- * {Array} A list of all vertices in the geometry.
- */
- getVertices: function(nodes) {
- var vertices = [];
- for(var i=0, len=this.components.length; i<len; ++i) {
- Array.prototype.push.apply(
- vertices, this.components[i].getVertices(nodes)
- );
- }
- return vertices;
- },
-
-
- CLASS_NAME: "OpenLayers.Geometry.Collection"
-});
diff --git a/misc/openlayers/lib/OpenLayers/Geometry/Curve.js b/misc/openlayers/lib/OpenLayers/Geometry/Curve.js
deleted file mode 100644
index e663e0b..0000000
--- a/misc/openlayers/lib/OpenLayers/Geometry/Curve.js
+++ /dev/null
@@ -1,89 +0,0 @@
-/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
- * full list of contributors). Published under the 2-clause BSD license.
- * See license.txt in the OpenLayers distribution or repository for the
- * full text of the license. */
-
-/**
- * @requires OpenLayers/Geometry/MultiPoint.js
- */
-
-/**
- * Class: OpenLayers.Geometry.Curve
- * A Curve is a MultiPoint, whose points are assumed to be connected. To
- * this end, we provide a "getLength()" function, which iterates through
- * the points, summing the distances between them.
- *
- * Inherits:
- * - <OpenLayers.Geometry.MultiPoint>
- */
-OpenLayers.Geometry.Curve = OpenLayers.Class(OpenLayers.Geometry.MultiPoint, {
-
- /**
- * Property: componentTypes
- * {Array(String)} An array of class names representing the types of
- * components that the collection can include. A null
- * value means the component types are not restricted.
- */
- componentTypes: ["OpenLayers.Geometry.Point"],
-
- /**
- * Constructor: OpenLayers.Geometry.Curve
- *
- * Parameters:
- * point - {Array(<OpenLayers.Geometry.Point>)}
- */
-
- /**
- * APIMethod: getLength
- *
- * Returns:
- * {Float} The length of the curve
- */
- getLength: function() {
- var length = 0.0;
- if ( this.components && (this.components.length > 1)) {
- for(var i=1, len=this.components.length; i<len; i++) {
- length += this.components[i-1].distanceTo(this.components[i]);
- }
- }
- return length;
- },
-
- /**
- * APIMethod: getGeodesicLength
- * Calculate the approximate length of the geometry were it projected onto
- * the earth.
- *
- * projection - {<OpenLayers.Projection>} The spatial reference system
- * for the geometry coordinates. If not provided, Geographic/WGS84 is
- * assumed.
- *
- * Returns:
- * {Float} The appoximate geodesic length of the geometry in meters.
- */
- getGeodesicLength: function(projection) {
- var geom = this; // so we can work with a clone if needed
- if(projection) {
- var gg = new OpenLayers.Projection("EPSG:4326");
- if(!gg.equals(projection)) {
- geom = this.clone().transform(projection, gg);
- }
- }
- var length = 0.0;
- if(geom.components && (geom.components.length > 1)) {
- var p1, p2;
- for(var i=1, len=geom.components.length; i<len; i++) {
- p1 = geom.components[i-1];
- p2 = geom.components[i];
- // this returns km and requires lon/lat properties
- length += OpenLayers.Util.distVincenty(
- {lon: p1.x, lat: p1.y}, {lon: p2.x, lat: p2.y}
- );
- }
- }
- // convert to m
- return length * 1000;
- },
-
- CLASS_NAME: "OpenLayers.Geometry.Curve"
-});
diff --git a/misc/openlayers/lib/OpenLayers/Geometry/LineString.js b/misc/openlayers/lib/OpenLayers/Geometry/LineString.js
deleted file mode 100644
index b7d7dac..0000000
--- a/misc/openlayers/lib/OpenLayers/Geometry/LineString.js
+++ /dev/null
@@ -1,646 +0,0 @@
-/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
- * full list of contributors). Published under the 2-clause BSD license.
- * See license.txt in the OpenLayers distribution or repository for the
- * full text of the license. */
-
-/**
- * @requires OpenLayers/Geometry/Curve.js
- */
-
-/**
- * Class: OpenLayers.Geometry.LineString
- * A LineString is a Curve which, once two points have been added to it, can
- * never be less than two points long.
- *
- * Inherits from:
- * - <OpenLayers.Geometry.Curve>
- */
-OpenLayers.Geometry.LineString = OpenLayers.Class(OpenLayers.Geometry.Curve, {
-
- /**
- * Constructor: OpenLayers.Geometry.LineString
- * Create a new LineString geometry
- *
- * Parameters:
- * points - {Array(<OpenLayers.Geometry.Point>)} An array of points used to
- * generate the linestring
- *
- */
-
- /**
- * APIMethod: removeComponent
- * Only allows removal of a point if there are three or more points in
- * the linestring. (otherwise the result would be just a single point)
- *
- * Parameters:
- * point - {<OpenLayers.Geometry.Point>} The point to be removed
- *
- * Returns:
- * {Boolean} The component was removed.
- */
- removeComponent: function(point) {
- var removed = this.components && (this.components.length > 2);
- if (removed) {
- OpenLayers.Geometry.Collection.prototype.removeComponent.apply(this,
- arguments);
- }
- return removed;
- },
-
- /**
- * APIMethod: intersects
- * Test for instersection between two geometries. This is a cheapo
- * implementation of the Bently-Ottmann algorigithm. It doesn't
- * really keep track of a sweep line data structure. It is closer
- * to the brute force method, except that segments are sorted and
- * potential intersections are only calculated when bounding boxes
- * intersect.
- *
- * Parameters:
- * geometry - {<OpenLayers.Geometry>}
- *
- * Returns:
- * {Boolean} The input geometry intersects this geometry.
- */
- intersects: function(geometry) {
- var intersect = false;
- var type = geometry.CLASS_NAME;
- if(type == "OpenLayers.Geometry.LineString" ||
- type == "OpenLayers.Geometry.LinearRing" ||
- type == "OpenLayers.Geometry.Point") {
- var segs1 = this.getSortedSegments();
- var segs2;
- if(type == "OpenLayers.Geometry.Point") {
- segs2 = [{
- x1: geometry.x, y1: geometry.y,
- x2: geometry.x, y2: geometry.y
- }];
- } else {
- segs2 = geometry.getSortedSegments();
- }
- var seg1, seg1x1, seg1x2, seg1y1, seg1y2,
- seg2, seg2y1, seg2y2;
- // sweep right
- outer: for(var i=0, len=segs1.length; i<len; ++i) {
- seg1 = segs1[i];
- seg1x1 = seg1.x1;
- seg1x2 = seg1.x2;
- seg1y1 = seg1.y1;
- seg1y2 = seg1.y2;
- inner: for(var j=0, jlen=segs2.length; j<jlen; ++j) {
- seg2 = segs2[j];
- if(seg2.x1 > seg1x2) {
- // seg1 still left of seg2
- break;
- }
- if(seg2.x2 < seg1x1) {
- // seg2 still left of seg1
- continue;
- }
- seg2y1 = seg2.y1;
- seg2y2 = seg2.y2;
- if(Math.min(seg2y1, seg2y2) > Math.max(seg1y1, seg1y2)) {
- // seg2 above seg1
- continue;
- }
- if(Math.max(seg2y1, seg2y2) < Math.min(seg1y1, seg1y2)) {
- // seg2 below seg1
- continue;
- }
- if(OpenLayers.Geometry.segmentsIntersect(seg1, seg2)) {
- intersect = true;
- break outer;
- }
- }
- }
- } else {
- intersect = geometry.intersects(this);
- }
- return intersect;
- },
-
- /**
- * Method: getSortedSegments
- *
- * Returns:
- * {Array} An array of segment objects. Segment objects have properties
- * x1, y1, x2, and y2. The start point is represented by x1 and y1.
- * The end point is represented by x2 and y2. Start and end are
- * ordered so that x1 < x2.
- */
- getSortedSegments: function() {
- var numSeg = this.components.length - 1;
- var segments = new Array(numSeg), point1, point2;
- for(var i=0; i<numSeg; ++i) {
- point1 = this.components[i];
- point2 = this.components[i + 1];
- if(point1.x < point2.x) {
- segments[i] = {
- x1: point1.x,
- y1: point1.y,
- x2: point2.x,
- y2: point2.y
- };
- } else {
- segments[i] = {
- x1: point2.x,
- y1: point2.y,
- x2: point1.x,
- y2: point1.y
- };
- }
- }
- // more efficient to define this somewhere static
- function byX1(seg1, seg2) {
- return seg1.x1 - seg2.x1;
- }
- return segments.sort(byX1);
- },
-
- /**
- * Method: splitWithSegment
- * Split this geometry with the given segment.
- *
- * Parameters:
- * seg - {Object} An object with x1, y1, x2, and y2 properties referencing
- * segment endpoint coordinates.
- * options - {Object} Properties of this object will be used to determine
- * how the split is conducted.
- *
- * Valid options:
- * edge - {Boolean} Allow splitting when only edges intersect. Default is
- * true. If false, a vertex on the source segment must be within the
- * tolerance distance of the intersection to be considered a split.
- * tolerance - {Number} If a non-null value is provided, intersections
- * within the tolerance distance of one of the source segment's
- * endpoints will be assumed to occur at the endpoint.
- *
- * Returns:
- * {Object} An object with *lines* and *points* properties. If the given
- * segment intersects this linestring, the lines array will reference
- * geometries that result from the split. The points array will contain
- * all intersection points. Intersection points are sorted along the
- * segment (in order from x1,y1 to x2,y2).
- */
- splitWithSegment: function(seg, options) {
- var edge = !(options && options.edge === false);
- var tolerance = options && options.tolerance;
- var lines = [];
- var verts = this.getVertices();
- var points = [];
- var intersections = [];
- var split = false;
- var vert1, vert2, point;
- var node, vertex, target;
- var interOptions = {point: true, tolerance: tolerance};
- var result = null;
- for(var i=0, stop=verts.length-2; i<=stop; ++i) {
- vert1 = verts[i];
- points.push(vert1.clone());
- vert2 = verts[i+1];
- target = {x1: vert1.x, y1: vert1.y, x2: vert2.x, y2: vert2.y};
- point = OpenLayers.Geometry.segmentsIntersect(
- seg, target, interOptions
- );
- if(point instanceof OpenLayers.Geometry.Point) {
- if((point.x === seg.x1 && point.y === seg.y1) ||
- (point.x === seg.x2 && point.y === seg.y2) ||
- point.equals(vert1) || point.equals(vert2)) {
- vertex = true;
- } else {
- vertex = false;
- }
- if(vertex || edge) {
- // push intersections different than the previous
- if(!point.equals(intersections[intersections.length-1])) {
- intersections.push(point.clone());
- }
- if(i === 0) {
- if(point.equals(vert1)) {
- continue;
- }
- }
- if(point.equals(vert2)) {
- continue;
- }
- split = true;
- if(!point.equals(vert1)) {
- points.push(point);
- }
- lines.push(new OpenLayers.Geometry.LineString(points));
- points = [point.clone()];
- }
- }
- }
- if(split) {
- points.push(vert2.clone());
- lines.push(new OpenLayers.Geometry.LineString(points));
- }
- if(intersections.length > 0) {
- // sort intersections along segment
- var xDir = seg.x1 < seg.x2 ? 1 : -1;
- var yDir = seg.y1 < seg.y2 ? 1 : -1;
- result = {
- lines: lines,
- points: intersections.sort(function(p1, p2) {
- return (xDir * p1.x - xDir * p2.x) || (yDir * p1.y - yDir * p2.y);
- })
- };
- }
- return result;
- },
-
- /**
- * Method: split
- * Use this geometry (the source) to attempt to split a target geometry.
- *
- * Parameters:
- * target - {<OpenLayers.Geometry>} The target geometry.
- * options - {Object} Properties of this object will be used to determine
- * how the split is conducted.
- *
- * Valid options:
- * mutual - {Boolean} Split the source geometry in addition to the target
- * geometry. Default is false.
- * edge - {Boolean} Allow splitting when only edges intersect. Default is
- * true. If false, a vertex on the source must be within the tolerance
- * distance of the intersection to be considered a split.
- * tolerance - {Number} If a non-null value is provided, intersections
- * within the tolerance distance of an existing vertex on the source
- * will be assumed to occur at the vertex.
- *
- * Returns:
- * {Array} A list of geometries (of this same type as the target) that
- * result from splitting the target with the source geometry. The
- * source and target geometry will remain unmodified. If no split
- * results, null will be returned. If mutual is true and a split
- * results, return will be an array of two arrays - the first will be
- * all geometries that result from splitting the source geometry and
- * the second will be all geometries that result from splitting the
- * target geometry.
- */
- split: function(target, options) {
- var results = null;
- var mutual = options && options.mutual;
- var sourceSplit, targetSplit, sourceParts, targetParts;
- if(target instanceof OpenLayers.Geometry.LineString) {
- var verts = this.getVertices();
- var vert1, vert2, seg, splits, lines, point;
- var points = [];
- sourceParts = [];
- for(var i=0, stop=verts.length-2; i<=stop; ++i) {
- vert1 = verts[i];
- vert2 = verts[i+1];
- seg = {
- x1: vert1.x, y1: vert1.y,
- x2: vert2.x, y2: vert2.y
- };
- targetParts = targetParts || [target];
- if(mutual) {
- points.push(vert1.clone());
- }
- for(var j=0; j<targetParts.length; ++j) {
- splits = targetParts[j].splitWithSegment(seg, options);
- if(splits) {
- // splice in new features
- lines = splits.lines;
- if(lines.length > 0) {
- lines.unshift(j, 1);
- Array.prototype.splice.apply(targetParts, lines);
- j += lines.length - 2;
- }
- if(mutual) {
- for(var k=0, len=splits.points.length; k<len; ++k) {
- point = splits.points[k];
- if(!point.equals(vert1)) {
- points.push(point);
- sourceParts.push(new OpenLayers.Geometry.LineString(points));
- if(point.equals(vert2)) {
- points = [];
- } else {
- points = [point.clone()];
- }
- }
- }
- }
- }
- }
- }
- if(mutual && sourceParts.length > 0 && points.length > 0) {
- points.push(vert2.clone());
- sourceParts.push(new OpenLayers.Geometry.LineString(points));
- }
- } else {
- results = target.splitWith(this, options);
- }
- if(targetParts && targetParts.length > 1) {
- targetSplit = true;
- } else {
- targetParts = [];
- }
- if(sourceParts && sourceParts.length > 1) {
- sourceSplit = true;
- } else {
- sourceParts = [];
- }
- if(targetSplit || sourceSplit) {
- if(mutual) {
- results = [sourceParts, targetParts];
- } else {
- results = targetParts;
- }
- }
- return results;
- },
-
- /**
- * Method: splitWith
- * Split this geometry (the target) with the given geometry (the source).
- *
- * Parameters:
- * geometry - {<OpenLayers.Geometry>} A geometry used to split this
- * geometry (the source).
- * options - {Object} Properties of this object will be used to determine
- * how the split is conducted.
- *
- * Valid options:
- * mutual - {Boolean} Split the source geometry in addition to the target
- * geometry. Default is false.
- * edge - {Boolean} Allow splitting when only edges intersect. Default is
- * true. If false, a vertex on the source must be within the tolerance
- * distance of the intersection to be considered a split.
- * tolerance - {Number} If a non-null value is provided, intersections
- * within the tolerance distance of an existing vertex on the source
- * will be assumed to occur at the vertex.
- *
- * Returns:
- * {Array} A list of geometries (of this same type as the target) that
- * result from splitting the target with the source geometry. The
- * source and target geometry will remain unmodified. If no split
- * results, null will be returned. If mutual is true and a split
- * results, return will be an array of two arrays - the first will be
- * all geometries that result from splitting the source geometry and
- * the second will be all geometries that result from splitting the
- * target geometry.
- */
- splitWith: function(geometry, options) {
- return geometry.split(this, options);
-
- },
-
- /**
- * APIMethod: getVertices
- * Return a list of all points in this geometry.
- *
- * Parameters:
- * nodes - {Boolean} For lines, only return vertices that are
- * endpoints. If false, for lines, only vertices that are not
- * endpoints will be returned. If not provided, all vertices will
- * be returned.
- *
- * Returns:
- * {Array} A list of all vertices in the geometry.
- */
- getVertices: function(nodes) {
- var vertices;
- if(nodes === true) {
- vertices = [
- this.components[0],
- this.components[this.components.length-1]
- ];
- } else if (nodes === false) {
- vertices = this.components.slice(1, this.components.length-1);
- } else {
- vertices = this.components.slice();
- }
- return vertices;
- },
-
- /**
- * APIMethod: distanceTo
- * Calculate the closest distance between two geometries (on the x-y plane).
- *
- * Parameters:
- * geometry - {<OpenLayers.Geometry>} The target geometry.
- * options - {Object} Optional properties for configuring the distance
- * calculation.
- *
- * Valid options:
- * details - {Boolean} Return details from the distance calculation.
- * Default is false.
- * edge - {Boolean} Calculate the distance from this geometry to the
- * nearest edge of the target geometry. Default is true. If true,
- * calling distanceTo from a geometry that is wholly contained within
- * the target will result in a non-zero distance. If false, whenever
- * geometries intersect, calling distanceTo will return 0. If false,
- * details cannot be returned.
- *
- * Returns:
- * {Number | Object} The distance between this geometry and the target.
- * If details is true, the return will be an object with distance,
- * x0, y0, x1, and x2 properties. The x0 and y0 properties represent
- * the coordinates of the closest point on this geometry. The x1 and y1
- * properties represent the coordinates of the closest point on the
- * target geometry.
- */
- distanceTo: function(geometry, options) {
- var edge = !(options && options.edge === false);
- var details = edge && options && options.details;
- var result, best = {};
- var min = Number.POSITIVE_INFINITY;
- if(geometry instanceof OpenLayers.Geometry.Point) {
- var segs = this.getSortedSegments();
- var x = geometry.x;
- var y = geometry.y;
- var seg;
- for(var i=0, len=segs.length; i<len; ++i) {
- seg = segs[i];
- result = OpenLayers.Geometry.distanceToSegment(geometry, seg);
- if(result.distance < min) {
- min = result.distance;
- best = result;
- if(min === 0) {
- break;
- }
- } else {
- // if distance increases and we cross y0 to the right of x0, no need to keep looking.
- if(seg.x2 > x && ((y > seg.y1 && y < seg.y2) || (y < seg.y1 && y > seg.y2))) {
- break;
- }
- }
- }
- if(details) {
- best = {
- distance: best.distance,
- x0: best.x, y0: best.y,
- x1: x, y1: y
- };
- } else {
- best = best.distance;
- }
- } else if(geometry instanceof OpenLayers.Geometry.LineString) {
- var segs0 = this.getSortedSegments();
- var segs1 = geometry.getSortedSegments();
- var seg0, seg1, intersection, x0, y0;
- var len1 = segs1.length;
- var interOptions = {point: true};
- outer: for(var i=0, len=segs0.length; i<len; ++i) {
- seg0 = segs0[i];
- x0 = seg0.x1;
- y0 = seg0.y1;
- for(var j=0; j<len1; ++j) {
- seg1 = segs1[j];
- intersection = OpenLayers.Geometry.segmentsIntersect(seg0, seg1, interOptions);
- if(intersection) {
- min = 0;
- best = {
- distance: 0,
- x0: intersection.x, y0: intersection.y,
- x1: intersection.x, y1: intersection.y
- };
- break outer;
- } else {
- result = OpenLayers.Geometry.distanceToSegment({x: x0, y: y0}, seg1);
- if(result.distance < min) {
- min = result.distance;
- best = {
- distance: min,
- x0: x0, y0: y0,
- x1: result.x, y1: result.y
- };
- }
- }
- }
- }
- if(!details) {
- best = best.distance;
- }
- if(min !== 0) {
- // check the final vertex in this line's sorted segments
- if(seg0) {
- result = geometry.distanceTo(
- new OpenLayers.Geometry.Point(seg0.x2, seg0.y2),
- options
- );
- var dist = details ? result.distance : result;
- if(dist < min) {
- if(details) {
- best = {
- distance: min,
- x0: result.x1, y0: result.y1,
- x1: result.x0, y1: result.y0
- };
- } else {
- best = dist;
- }
- }
- }
- }
- } else {
- best = geometry.distanceTo(this, options);
- // swap since target comes from this line
- if(details) {
- best = {
- distance: best.distance,
- x0: best.x1, y0: best.y1,
- x1: best.x0, y1: best.y0
- };
- }
- }
- return best;
- },
-
- /**
- * APIMethod: simplify
- * This function will return a simplified LineString.
- * Simplification is based on the Douglas-Peucker algorithm.
- *
- *
- * Parameters:
- * tolerance - {number} threshhold for simplification in map units
- *
- * Returns:
- * {OpenLayers.Geometry.LineString} the simplified LineString
- */
- simplify: function(tolerance){
- if (this && this !== null) {
- var points = this.getVertices();
- if (points.length < 3) {
- return this;
- }
-
- var compareNumbers = function(a, b){
- return (a-b);
- };
-
- /**
- * Private function doing the Douglas-Peucker reduction
- */
- var douglasPeuckerReduction = function(points, firstPoint, lastPoint, tolerance){
- var maxDistance = 0;
- var indexFarthest = 0;
-
- for (var index = firstPoint, distance; index < lastPoint; index++) {
- distance = perpendicularDistance(points[firstPoint], points[lastPoint], points[index]);
- if (distance > maxDistance) {
- maxDistance = distance;
- indexFarthest = index;
- }
- }
-
- if (maxDistance > tolerance && indexFarthest != firstPoint) {
- //Add the largest point that exceeds the tolerance
- pointIndexsToKeep.push(indexFarthest);
- douglasPeuckerReduction(points, firstPoint, indexFarthest, tolerance);
- douglasPeuckerReduction(points, indexFarthest, lastPoint, tolerance);
- }
- };
-
- /**
- * Private function calculating the perpendicular distance
- * TODO: check whether OpenLayers.Geometry.LineString::distanceTo() is faster or slower
- */
- var perpendicularDistance = function(point1, point2, point){
- //Area = |(1/2)(x1y2 + x2y3 + x3y1 - x2y1 - x3y2 - x1y3)| *Area of triangle
- //Base = v((x1-x2)²+(x1-x2)²) *Base of Triangle*
- //Area = .5*Base*H *Solve for height
- //Height = Area/.5/Base
-
- var area = Math.abs(0.5 * (point1.x * point2.y + point2.x * point.y + point.x * point1.y - point2.x * point1.y - point.x * point2.y - point1.x * point.y));
- var bottom = Math.sqrt(Math.pow(point1.x - point2.x, 2) + Math.pow(point1.y - point2.y, 2));
- var height = area / bottom * 2;
-
- return height;
- };
-
- var firstPoint = 0;
- var lastPoint = points.length - 1;
- var pointIndexsToKeep = [];
-
- //Add the first and last index to the keepers
- pointIndexsToKeep.push(firstPoint);
- pointIndexsToKeep.push(lastPoint);
-
- //The first and the last point cannot be the same
- while (points[firstPoint].equals(points[lastPoint])) {
- lastPoint--;
- //Addition: the first point not equal to first point in the LineString is kept as well
- pointIndexsToKeep.push(lastPoint);
- }
-
- douglasPeuckerReduction(points, firstPoint, lastPoint, tolerance);
- var returnPoints = [];
- pointIndexsToKeep.sort(compareNumbers);
- for (var index = 0; index < pointIndexsToKeep.length; index++) {
- returnPoints.push(points[pointIndexsToKeep[index]]);
- }
- return new OpenLayers.Geometry.LineString(returnPoints);
-
- }
- else {
- return this;
- }
- },
-
- CLASS_NAME: "OpenLayers.Geometry.LineString"
-});
diff --git a/misc/openlayers/lib/OpenLayers/Geometry/LinearRing.js b/misc/openlayers/lib/OpenLayers/Geometry/LinearRing.js
deleted file mode 100644
index b0a694c..0000000
--- a/misc/openlayers/lib/OpenLayers/Geometry/LinearRing.js
+++ /dev/null
@@ -1,433 +0,0 @@
-/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
- * full list of contributors). Published under the 2-clause BSD license.
- * See license.txt in the OpenLayers distribution or repository for the
- * full text of the license. */
-
-/**
- * @requires OpenLayers/Geometry/LineString.js
- */
-
-/**
- * Class: OpenLayers.Geometry.LinearRing
- *
- * A Linear Ring is a special LineString which is closed. It closes itself
- * automatically on every addPoint/removePoint by adding a copy of the first
- * point as the last point.
- *
- * Also, as it is the first in the line family to close itself, a getArea()
- * function is defined to calculate the enclosed area of the linearRing
- *
- * Inherits:
- * - <OpenLayers.Geometry.LineString>
- */
-OpenLayers.Geometry.LinearRing = OpenLayers.Class(
- OpenLayers.Geometry.LineString, {
-
- /**
- * Property: componentTypes
- * {Array(String)} An array of class names representing the types of
- * components that the collection can include. A null
- * value means the component types are not restricted.
- */
- componentTypes: ["OpenLayers.Geometry.Point"],
-
- /**
- * Constructor: OpenLayers.Geometry.LinearRing
- * Linear rings are constructed with an array of points. This array
- * can represent a closed or open ring. If the ring is open (the last
- * point does not equal the first point), the constructor will close
- * the ring. If the ring is already closed (the last point does equal
- * the first point), it will be left closed.
- *
- * Parameters:
- * points - {Array(<OpenLayers.Geometry.Point>)} points
- */
-
- /**
- * APIMethod: addComponent
- * Adds a point to geometry components. If the point is to be added to
- * the end of the components array and it is the same as the last point
- * already in that array, the duplicate point is not added. This has
- * the effect of closing the ring if it is not already closed, and
- * doing the right thing if it is already closed. This behavior can
- * be overridden by calling the method with a non-null index as the
- * second argument.
- *
- * Parameters:
- * point - {<OpenLayers.Geometry.Point>}
- * index - {Integer} Index into the array to insert the component
- *
- * Returns:
- * {Boolean} Was the Point successfully added?
- */
- addComponent: function(point, index) {
- var added = false;
-
- //remove last point
- var lastPoint = this.components.pop();
-
- // given an index, add the point
- // without an index only add non-duplicate points
- if(index != null || !point.equals(lastPoint)) {
- added = OpenLayers.Geometry.Collection.prototype.addComponent.apply(this,
- arguments);
- }
-
- //append copy of first point
- var firstPoint = this.components[0];
- OpenLayers.Geometry.Collection.prototype.addComponent.apply(this,
- [firstPoint]);
-
- return added;
- },
-
- /**
- * APIMethod: removeComponent
- * Removes a point from geometry components.
- *
- * Parameters:
- * point - {<OpenLayers.Geometry.Point>}
- *
- * Returns:
- * {Boolean} The component was removed.
- */
- removeComponent: function(point) {
- var removed = this.components && (this.components.length > 3);
- if (removed) {
- //remove last point
- this.components.pop();
-
- //remove our point
- OpenLayers.Geometry.Collection.prototype.removeComponent.apply(this,
- arguments);
- //append copy of first point
- var firstPoint = this.components[0];
- OpenLayers.Geometry.Collection.prototype.addComponent.apply(this,
- [firstPoint]);
- }
- return removed;
- },
-
- /**
- * APIMethod: move
- * Moves a geometry by the given displacement along positive x and y axes.
- * This modifies the position of the geometry and clears the cached
- * bounds.
- *
- * Parameters:
- * x - {Float} Distance to move geometry in positive x direction.
- * y - {Float} Distance to move geometry in positive y direction.
- */
- move: function(x, y) {
- for(var i = 0, len=this.components.length; i<len - 1; i++) {
- this.components[i].move(x, y);
- }
- },
-
- /**
- * APIMethod: rotate
- * Rotate a geometry around some origin
- *
- * Parameters:
- * angle - {Float} Rotation angle in degrees (measured counterclockwise
- * from the positive x-axis)
- * origin - {<OpenLayers.Geometry.Point>} Center point for the rotation
- */
- rotate: function(angle, origin) {
- for(var i=0, len=this.components.length; i<len - 1; ++i) {
- this.components[i].rotate(angle, origin);
- }
- },
-
- /**
- * APIMethod: resize
- * Resize a geometry relative to some origin. Use this method to apply
- * a uniform scaling to a geometry.
- *
- * Parameters:
- * scale - {Float} Factor by which to scale the geometry. A scale of 2
- * doubles the size of the geometry in each dimension
- * (lines, for example, will be twice as long, and polygons
- * will have four times the area).
- * origin - {<OpenLayers.Geometry.Point>} Point of origin for resizing
- * ratio - {Float} Optional x:y ratio for resizing. Default ratio is 1.
- *
- * Returns:
- * {<OpenLayers.Geometry>} - The current geometry.
- */
- resize: function(scale, origin, ratio) {
- for(var i=0, len=this.components.length; i<len - 1; ++i) {
- this.components[i].resize(scale, origin, ratio);
- }
- return this;
- },
-
- /**
- * APIMethod: transform
- * Reproject the components geometry from source to dest.
- *
- * Parameters:
- * source - {<OpenLayers.Projection>}
- * dest - {<OpenLayers.Projection>}
- *
- * Returns:
- * {<OpenLayers.Geometry>}
- */
- transform: function(source, dest) {
- if (source && dest) {
- for (var i=0, len=this.components.length; i<len - 1; i++) {
- var component = this.components[i];
- component.transform(source, dest);
- }
- this.bounds = null;
- }
- return this;
- },
-
- /**
- * APIMethod: getCentroid
- *
- * Returns:
- * {<OpenLayers.Geometry.Point>} The centroid of the collection
- */
- getCentroid: function() {
- if (this.components) {
- var len = this.components.length;
- if (len > 0 && len <= 2) {
- return this.components[0].clone();
- } else if (len > 2) {
- var sumX = 0.0;
- var sumY = 0.0;
- var x0 = this.components[0].x;
- var y0 = this.components[0].y;
- var area = -1 * this.getArea();
- if (area != 0) {
- for (var i = 0; i < len - 1; i++) {
- var b = this.components[i];
- var c = this.components[i+1];
- sumX += (b.x + c.x - 2 * x0) * ((b.x - x0) * (c.y - y0) - (c.x - x0) * (b.y - y0));
- sumY += (b.y + c.y - 2 * y0) * ((b.x - x0) * (c.y - y0) - (c.x - x0) * (b.y - y0));
- }
- var x = x0 + sumX / (6 * area);
- var y = y0 + sumY / (6 * area);
- } else {
- for (var i = 0; i < len - 1; i++) {
- sumX += this.components[i].x;
- sumY += this.components[i].y;
- }
- var x = sumX / (len - 1);
- var y = sumY / (len - 1);
- }
- return new OpenLayers.Geometry.Point(x, y);
- } else {
- return null;
- }
- }
- },
-
- /**
- * APIMethod: getArea
- * Note - The area is positive if the ring is oriented CW, otherwise
- * it will be negative.
- *
- * Returns:
- * {Float} The signed area for a ring.
- */
- getArea: function() {
- var area = 0.0;
- if ( this.components && (this.components.length > 2)) {
- var sum = 0.0;
- for (var i=0, len=this.components.length; i<len - 1; i++) {
- var b = this.components[i];
- var c = this.components[i+1];
- sum += (b.x + c.x) * (c.y - b.y);
- }
- area = - sum / 2.0;
- }
- return area;
- },
-
- /**
- * APIMethod: getGeodesicArea
- * Calculate the approximate area of the polygon were it projected onto
- * the earth. Note that this area will be positive if ring is oriented
- * clockwise, otherwise it will be negative.
- *
- * Parameters:
- * projection - {<OpenLayers.Projection>} The spatial reference system
- * for the geometry coordinates. If not provided, Geographic/WGS84 is
- * assumed.
- *
- * Reference:
- * Robert. G. Chamberlain and William H. Duquette, "Some Algorithms for
- * Polygons on a Sphere", JPL Publication 07-03, Jet Propulsion
- * Laboratory, Pasadena, CA, June 2007 http://trs-new.jpl.nasa.gov/dspace/handle/2014/40409
- *
- * Returns:
- * {float} The approximate signed geodesic area of the polygon in square
- * meters.
- */
- getGeodesicArea: function(projection) {
- var ring = this; // so we can work with a clone if needed
- if(projection) {
- var gg = new OpenLayers.Projection("EPSG:4326");
- if(!gg.equals(projection)) {
- ring = this.clone().transform(projection, gg);
- }
- }
- var area = 0.0;
- var len = ring.components && ring.components.length;
- if(len > 2) {
- var p1, p2;
- for(var i=0; i<len-1; i++) {
- p1 = ring.components[i];
- p2 = ring.components[i+1];
- area += OpenLayers.Util.rad(p2.x - p1.x) *
- (2 + Math.sin(OpenLayers.Util.rad(p1.y)) +
- Math.sin(OpenLayers.Util.rad(p2.y)));
- }
- area = area * 6378137.0 * 6378137.0 / 2.0;
- }
- return area;
- },
-
- /**
- * Method: containsPoint
- * Test if a point is inside a linear ring. For the case where a point
- * is coincident with a linear ring edge, returns 1. Otherwise,
- * returns boolean.
- *
- * Parameters:
- * point - {<OpenLayers.Geometry.Point>}
- *
- * Returns:
- * {Boolean | Number} The point is inside the linear ring. Returns 1 if
- * the point is coincident with an edge. Returns boolean otherwise.
- */
- containsPoint: function(point) {
- var approx = OpenLayers.Number.limitSigDigs;
- var digs = 14;
- var px = approx(point.x, digs);
- var py = approx(point.y, digs);
- function getX(y, x1, y1, x2, y2) {
- return (y - y2) * ((x2 - x1) / (y2 - y1)) + x2;
- }
- var numSeg = this.components.length - 1;
- var start, end, x1, y1, x2, y2, cx, cy;
- var crosses = 0;
- for(var i=0; i<numSeg; ++i) {
- start = this.components[i];
- x1 = approx(start.x, digs);
- y1 = approx(start.y, digs);
- end = this.components[i + 1];
- x2 = approx(end.x, digs);
- y2 = approx(end.y, digs);
-
- /**
- * The following conditions enforce five edge-crossing rules:
- * 1. points coincident with edges are considered contained;
- * 2. an upward edge includes its starting endpoint, and
- * excludes its final endpoint;
- * 3. a downward edge excludes its starting endpoint, and
- * includes its final endpoint;
- * 4. horizontal edges are excluded; and
- * 5. the edge-ray intersection point must be strictly right
- * of the point P.
- */
- if(y1 == y2) {
- // horizontal edge
- if(py == y1) {
- // point on horizontal line
- if(x1 <= x2 && (px >= x1 && px <= x2) || // right or vert
- x1 >= x2 && (px <= x1 && px >= x2)) { // left or vert
- // point on edge
- crosses = -1;
- break;
- }
- }
- // ignore other horizontal edges
- continue;
- }
- cx = approx(getX(py, x1, y1, x2, y2), digs);
- if(cx == px) {
- // point on line
- if(y1 < y2 && (py >= y1 && py <= y2) || // upward
- y1 > y2 && (py <= y1 && py >= y2)) { // downward
- // point on edge
- crosses = -1;
- break;
- }
- }
- if(cx <= px) {
- // no crossing to the right
- continue;
- }
- if(x1 != x2 && (cx < Math.min(x1, x2) || cx > Math.max(x1, x2))) {
- // no crossing
- continue;
- }
- if(y1 < y2 && (py >= y1 && py < y2) || // upward
- y1 > y2 && (py < y1 && py >= y2)) { // downward
- ++crosses;
- }
- }
- var contained = (crosses == -1) ?
- // on edge
- 1 :
- // even (out) or odd (in)
- !!(crosses & 1);
-
- return contained;
- },
-
- /**
- * APIMethod: intersects
- * Determine if the input geometry intersects this one.
- *
- * Parameters:
- * geometry - {<OpenLayers.Geometry>} Any type of geometry.
- *
- * Returns:
- * {Boolean} The input geometry intersects this one.
- */
- intersects: function(geometry) {
- var intersect = false;
- if(geometry.CLASS_NAME == "OpenLayers.Geometry.Point") {
- intersect = this.containsPoint(geometry);
- } else if(geometry.CLASS_NAME == "OpenLayers.Geometry.LineString") {
- intersect = geometry.intersects(this);
- } else if(geometry.CLASS_NAME == "OpenLayers.Geometry.LinearRing") {
- intersect = OpenLayers.Geometry.LineString.prototype.intersects.apply(
- this, [geometry]
- );
- } else {
- // check for component intersections
- for(var i=0, len=geometry.components.length; i<len; ++ i) {
- intersect = geometry.components[i].intersects(this);
- if(intersect) {
- break;
- }
- }
- }
- return intersect;
- },
-
- /**
- * APIMethod: getVertices
- * Return a list of all points in this geometry.
- *
- * Parameters:
- * nodes - {Boolean} For lines, only return vertices that are
- * endpoints. If false, for lines, only vertices that are not
- * endpoints will be returned. If not provided, all vertices will
- * be returned.
- *
- * Returns:
- * {Array} A list of all vertices in the geometry.
- */
- getVertices: function(nodes) {
- return (nodes === true) ? [] : this.components.slice(0, this.components.length-1);
- },
-
- CLASS_NAME: "OpenLayers.Geometry.LinearRing"
-});
diff --git a/misc/openlayers/lib/OpenLayers/Geometry/MultiLineString.js b/misc/openlayers/lib/OpenLayers/Geometry/MultiLineString.js
deleted file mode 100644
index 4e330b0..0000000
--- a/misc/openlayers/lib/OpenLayers/Geometry/MultiLineString.js
+++ /dev/null
@@ -1,258 +0,0 @@
-/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
- * full list of contributors). Published under the 2-clause BSD license.
- * See license.txt in the OpenLayers distribution or repository for the
- * full text of the license. */
-
-/**
- * @requires OpenLayers/Geometry/Collection.js
- * @requires OpenLayers/Geometry/LineString.js
- */
-
-/**
- * Class: OpenLayers.Geometry.MultiLineString
- * A MultiLineString is a geometry with multiple <OpenLayers.Geometry.LineString>
- * components.
- *
- * Inherits from:
- * - <OpenLayers.Geometry.Collection>
- * - <OpenLayers.Geometry>
- */
-OpenLayers.Geometry.MultiLineString = OpenLayers.Class(
- OpenLayers.Geometry.Collection, {
-
- /**
- * Property: componentTypes
- * {Array(String)} An array of class names representing the types of
- * components that the collection can include. A null value means the
- * component types are not restricted.
- */
- componentTypes: ["OpenLayers.Geometry.LineString"],
-
- /**
- * Constructor: OpenLayers.Geometry.MultiLineString
- * Constructor for a MultiLineString Geometry.
- *
- * Parameters:
- * components - {Array(<OpenLayers.Geometry.LineString>)}
- *
- */
-
- /**
- * Method: split
- * Use this geometry (the source) to attempt to split a target geometry.
- *
- * Parameters:
- * geometry - {<OpenLayers.Geometry>} The target geometry.
- * options - {Object} Properties of this object will be used to determine
- * how the split is conducted.
- *
- * Valid options:
- * mutual - {Boolean} Split the source geometry in addition to the target
- * geometry. Default is false.
- * edge - {Boolean} Allow splitting when only edges intersect. Default is
- * true. If false, a vertex on the source must be within the tolerance
- * distance of the intersection to be considered a split.
- * tolerance - {Number} If a non-null value is provided, intersections
- * within the tolerance distance of an existing vertex on the source
- * will be assumed to occur at the vertex.
- *
- * Returns:
- * {Array} A list of geometries (of this same type as the target) that
- * result from splitting the target with the source geometry. The
- * source and target geometry will remain unmodified. If no split
- * results, null will be returned. If mutual is true and a split
- * results, return will be an array of two arrays - the first will be
- * all geometries that result from splitting the source geometry and
- * the second will be all geometries that result from splitting the
- * target geometry.
- */
- split: function(geometry, options) {
- var results = null;
- var mutual = options && options.mutual;
- var splits, sourceLine, sourceLines, sourceSplit, targetSplit;
- var sourceParts = [];
- var targetParts = [geometry];
- for(var i=0, len=this.components.length; i<len; ++i) {
- sourceLine = this.components[i];
- sourceSplit = false;
- for(var j=0; j < targetParts.length; ++j) {
- splits = sourceLine.split(targetParts[j], options);
- if(splits) {
- if(mutual) {
- sourceLines = splits[0];
- for(var k=0, klen=sourceLines.length; k<klen; ++k) {
- if(k===0 && sourceParts.length) {
- sourceParts[sourceParts.length-1].addComponent(
- sourceLines[k]
- );
- } else {
- sourceParts.push(
- new OpenLayers.Geometry.MultiLineString([
- sourceLines[k]
- ])
- );
- }
- }
- sourceSplit = true;
- splits = splits[1];
- }
- if(splits.length) {
- // splice in new target parts
- splits.unshift(j, 1);
- Array.prototype.splice.apply(targetParts, splits);
- break;
- }
- }
- }
- if(!sourceSplit) {
- // source line was not hit
- if(sourceParts.length) {
- // add line to existing multi
- sourceParts[sourceParts.length-1].addComponent(
- sourceLine.clone()
- );
- } else {
- // create a fresh multi
- sourceParts = [
- new OpenLayers.Geometry.MultiLineString(
- sourceLine.clone()
- )
- ];
- }
- }
- }
- if(sourceParts && sourceParts.length > 1) {
- sourceSplit = true;
- } else {
- sourceParts = [];
- }
- if(targetParts && targetParts.length > 1) {
- targetSplit = true;
- } else {
- targetParts = [];
- }
- if(sourceSplit || targetSplit) {
- if(mutual) {
- results = [sourceParts, targetParts];
- } else {
- results = targetParts;
- }
- }
- return results;
- },
-
- /**
- * Method: splitWith
- * Split this geometry (the target) with the given geometry (the source).
- *
- * Parameters:
- * geometry - {<OpenLayers.Geometry>} A geometry used to split this
- * geometry (the source).
- * options - {Object} Properties of this object will be used to determine
- * how the split is conducted.
- *
- * Valid options:
- * mutual - {Boolean} Split the source geometry in addition to the target
- * geometry. Default is false.
- * edge - {Boolean} Allow splitting when only edges intersect. Default is
- * true. If false, a vertex on the source must be within the tolerance
- * distance of the intersection to be considered a split.
- * tolerance - {Number} If a non-null value is provided, intersections
- * within the tolerance distance of an existing vertex on the source
- * will be assumed to occur at the vertex.
- *
- * Returns:
- * {Array} A list of geometries (of this same type as the target) that
- * result from splitting the target with the source geometry. The
- * source and target geometry will remain unmodified. If no split
- * results, null will be returned. If mutual is true and a split
- * results, return will be an array of two arrays - the first will be
- * all geometries that result from splitting the source geometry and
- * the second will be all geometries that result from splitting the
- * target geometry.
- */
- splitWith: function(geometry, options) {
- var results = null;
- var mutual = options && options.mutual;
- var splits, targetLine, sourceLines, sourceSplit, targetSplit, sourceParts, targetParts;
- if(geometry instanceof OpenLayers.Geometry.LineString) {
- targetParts = [];
- sourceParts = [geometry];
- for(var i=0, len=this.components.length; i<len; ++i) {
- targetSplit = false;
- targetLine = this.components[i];
- for(var j=0; j<sourceParts.length; ++j) {
- splits = sourceParts[j].split(targetLine, options);
- if(splits) {
- if(mutual) {
- sourceLines = splits[0];
- if(sourceLines.length) {
- // splice in new source parts
- sourceLines.unshift(j, 1);
- Array.prototype.splice.apply(sourceParts, sourceLines);
- j += sourceLines.length - 2;
- }
- splits = splits[1];
- if(splits.length === 0) {
- splits = [targetLine.clone()];
- }
- }
- for(var k=0, klen=splits.length; k<klen; ++k) {
- if(k===0 && targetParts.length) {
- targetParts[targetParts.length-1].addComponent(
- splits[k]
- );
- } else {
- targetParts.push(
- new OpenLayers.Geometry.MultiLineString([
- splits[k]
- ])
- );
- }
- }
- targetSplit = true;
- }
- }
- if(!targetSplit) {
- // target component was not hit
- if(targetParts.length) {
- // add it to any existing multi-line
- targetParts[targetParts.length-1].addComponent(
- targetLine.clone()
- );
- } else {
- // or start with a fresh multi-line
- targetParts = [
- new OpenLayers.Geometry.MultiLineString([
- targetLine.clone()
- ])
- ];
- }
-
- }
- }
- } else {
- results = geometry.split(this);
- }
- if(sourceParts && sourceParts.length > 1) {
- sourceSplit = true;
- } else {
- sourceParts = [];
- }
- if(targetParts && targetParts.length > 1) {
- targetSplit = true;
- } else {
- targetParts = [];
- }
- if(sourceSplit || targetSplit) {
- if(mutual) {
- results = [sourceParts, targetParts];
- } else {
- results = targetParts;
- }
- }
- return results;
- },
-
- CLASS_NAME: "OpenLayers.Geometry.MultiLineString"
-});
diff --git a/misc/openlayers/lib/OpenLayers/Geometry/MultiPoint.js b/misc/openlayers/lib/OpenLayers/Geometry/MultiPoint.js
deleted file mode 100644
index ed8ff67..0000000
--- a/misc/openlayers/lib/OpenLayers/Geometry/MultiPoint.js
+++ /dev/null
@@ -1,66 +0,0 @@
-/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
- * full list of contributors). Published under the 2-clause BSD license.
- * See license.txt in the OpenLayers distribution or repository for the
- * full text of the license. */
-
-/**
- * @requires OpenLayers/Geometry/Collection.js
- * @requires OpenLayers/Geometry/Point.js
- */
-
-/**
- * Class: OpenLayers.Geometry.MultiPoint
- * MultiPoint is a collection of Points. Create a new instance with the
- * <OpenLayers.Geometry.MultiPoint> constructor.
- *
- * Inherits from:
- * - <OpenLayers.Geometry.Collection>
- * - <OpenLayers.Geometry>
- */
-OpenLayers.Geometry.MultiPoint = OpenLayers.Class(
- OpenLayers.Geometry.Collection, {
-
- /**
- * Property: componentTypes
- * {Array(String)} An array of class names representing the types of
- * components that the collection can include. A null value means the
- * component types are not restricted.
- */
- componentTypes: ["OpenLayers.Geometry.Point"],
-
- /**
- * Constructor: OpenLayers.Geometry.MultiPoint
- * Create a new MultiPoint Geometry
- *
- * Parameters:
- * components - {Array(<OpenLayers.Geometry.Point>)}
- *
- * Returns:
- * {<OpenLayers.Geometry.MultiPoint>}
- */
-
- /**
- * APIMethod: addPoint
- * Wrapper for <OpenLayers.Geometry.Collection.addComponent>
- *
- * Parameters:
- * point - {<OpenLayers.Geometry.Point>} Point to be added
- * index - {Integer} Optional index
- */
- addPoint: function(point, index) {
- this.addComponent(point, index);
- },
-
- /**
- * APIMethod: removePoint
- * Wrapper for <OpenLayers.Geometry.Collection.removeComponent>
- *
- * Parameters:
- * point - {<OpenLayers.Geometry.Point>} Point to be removed
- */
- removePoint: function(point){
- this.removeComponent(point);
- },
-
- CLASS_NAME: "OpenLayers.Geometry.MultiPoint"
-});
diff --git a/misc/openlayers/lib/OpenLayers/Geometry/MultiPolygon.js b/misc/openlayers/lib/OpenLayers/Geometry/MultiPolygon.js
deleted file mode 100644
index d1e59dc..0000000
--- a/misc/openlayers/lib/OpenLayers/Geometry/MultiPolygon.js
+++ /dev/null
@@ -1,42 +0,0 @@
-/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
- * full list of contributors). Published under the 2-clause BSD license.
- * See license.txt in the OpenLayers distribution or repository for the
- * full text of the license. */
-
-/**
- * @requires OpenLayers/Geometry/Collection.js
- * @requires OpenLayers/Geometry/Polygon.js
- */
-
-/**
- * Class: OpenLayers.Geometry.MultiPolygon
- * MultiPolygon is a geometry with multiple <OpenLayers.Geometry.Polygon>
- * components. Create a new instance with the <OpenLayers.Geometry.MultiPolygon>
- * constructor.
- *
- * Inherits from:
- * - <OpenLayers.Geometry.Collection>
- */
-OpenLayers.Geometry.MultiPolygon = OpenLayers.Class(
- OpenLayers.Geometry.Collection, {
-
- /**
- * Property: componentTypes
- * {Array(String)} An array of class names representing the types of
- * components that the collection can include. A null value means the
- * component types are not restricted.
- */
- componentTypes: ["OpenLayers.Geometry.Polygon"],
-
- /**
- * Constructor: OpenLayers.Geometry.MultiPolygon
- * Create a new MultiPolygon geometry
- *
- * Parameters:
- * components - {Array(<OpenLayers.Geometry.Polygon>)} An array of polygons
- * used to generate the MultiPolygon
- *
- */
-
- CLASS_NAME: "OpenLayers.Geometry.MultiPolygon"
-});
diff --git a/misc/openlayers/lib/OpenLayers/Geometry/Point.js b/misc/openlayers/lib/OpenLayers/Geometry/Point.js
deleted file mode 100644
index 456956f..0000000
--- a/misc/openlayers/lib/OpenLayers/Geometry/Point.js
+++ /dev/null
@@ -1,283 +0,0 @@
-/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
- * full list of contributors). Published under the 2-clause BSD license.
- * See license.txt in the OpenLayers distribution or repository for the
- * full text of the license. */
-
-/**
- * @requires OpenLayers/Geometry.js
- */
-
-/**
- * Class: OpenLayers.Geometry.Point
- * Point geometry class.
- *
- * Inherits from:
- * - <OpenLayers.Geometry>
- */
-OpenLayers.Geometry.Point = OpenLayers.Class(OpenLayers.Geometry, {
-
- /**
- * APIProperty: x
- * {float}
- */
- x: null,
-
- /**
- * APIProperty: y
- * {float}
- */
- y: null,
-
- /**
- * Constructor: OpenLayers.Geometry.Point
- * Construct a point geometry.
- *
- * Parameters:
- * x - {float}
- * y - {float}
- *
- */
- initialize: function(x, y) {
- OpenLayers.Geometry.prototype.initialize.apply(this, arguments);
-
- this.x = parseFloat(x);
- this.y = parseFloat(y);
- },
-
- /**
- * APIMethod: clone
- *
- * Returns:
- * {<OpenLayers.Geometry.Point>} An exact clone of this OpenLayers.Geometry.Point
- */
- clone: function(obj) {
- if (obj == null) {
- obj = new OpenLayers.Geometry.Point(this.x, this.y);
- }
-
- // catch any randomly tagged-on properties
- OpenLayers.Util.applyDefaults(obj, this);
-
- return obj;
- },
-
- /**
- * Method: calculateBounds
- * Create a new Bounds based on the lon/lat
- */
- calculateBounds: function () {
- this.bounds = new OpenLayers.Bounds(this.x, this.y,
- this.x, this.y);
- },
-
- /**
- * APIMethod: distanceTo
- * Calculate the closest distance between two geometries (on the x-y plane).
- *
- * Parameters:
- * geometry - {<OpenLayers.Geometry>} The target geometry.
- * options - {Object} Optional properties for configuring the distance
- * calculation.
- *
- * Valid options:
- * details - {Boolean} Return details from the distance calculation.
- * Default is false.
- * edge - {Boolean} Calculate the distance from this geometry to the
- * nearest edge of the target geometry. Default is true. If true,
- * calling distanceTo from a geometry that is wholly contained within
- * the target will result in a non-zero distance. If false, whenever
- * geometries intersect, calling distanceTo will return 0. If false,
- * details cannot be returned.
- *
- * Returns:
- * {Number | Object} The distance between this geometry and the target.
- * If details is true, the return will be an object with distance,
- * x0, y0, x1, and x2 properties. The x0 and y0 properties represent
- * the coordinates of the closest point on this geometry. The x1 and y1
- * properties represent the coordinates of the closest point on the
- * target geometry.
- */
- distanceTo: function(geometry, options) {
- var edge = !(options && options.edge === false);
- var details = edge && options && options.details;
- var distance, x0, y0, x1, y1, result;
- if(geometry instanceof OpenLayers.Geometry.Point) {
- x0 = this.x;
- y0 = this.y;
- x1 = geometry.x;
- y1 = geometry.y;
- distance = Math.sqrt(Math.pow(x0 - x1, 2) + Math.pow(y0 - y1, 2));
- result = !details ?
- distance : {x0: x0, y0: y0, x1: x1, y1: y1, distance: distance};
- } else {
- result = geometry.distanceTo(this, options);
- if(details) {
- // switch coord order since this geom is target
- result = {
- x0: result.x1, y0: result.y1,
- x1: result.x0, y1: result.y0,
- distance: result.distance
- };
- }
- }
- return result;
- },
-
- /**
- * APIMethod: equals
- * Determine whether another geometry is equivalent to this one. Geometries
- * are considered equivalent if all components have the same coordinates.
- *
- * Parameters:
- * geom - {<OpenLayers.Geometry.Point>} The geometry to test.
- *
- * Returns:
- * {Boolean} The supplied geometry is equivalent to this geometry.
- */
- equals: function(geom) {
- var equals = false;
- if (geom != null) {
- equals = ((this.x == geom.x && this.y == geom.y) ||
- (isNaN(this.x) && isNaN(this.y) && isNaN(geom.x) && isNaN(geom.y)));
- }
- return equals;
- },
-
- /**
- * Method: toShortString
- *
- * Returns:
- * {String} Shortened String representation of Point object.
- * (ex. <i>"5, 42"</i>)
- */
- toShortString: function() {
- return (this.x + ", " + this.y);
- },
-
- /**
- * APIMethod: move
- * Moves a geometry by the given displacement along positive x and y axes.
- * This modifies the position of the geometry and clears the cached
- * bounds.
- *
- * Parameters:
- * x - {Float} Distance to move geometry in positive x direction.
- * y - {Float} Distance to move geometry in positive y direction.
- */
- move: function(x, y) {
- this.x = this.x + x;
- this.y = this.y + y;
- this.clearBounds();
- },
-
- /**
- * APIMethod: rotate
- * Rotate a point around another.
- *
- * Parameters:
- * angle - {Float} Rotation angle in degrees (measured counterclockwise
- * from the positive x-axis)
- * origin - {<OpenLayers.Geometry.Point>} Center point for the rotation
- */
- rotate: function(angle, origin) {
- angle *= Math.PI / 180;
- var radius = this.distanceTo(origin);
- var theta = angle + Math.atan2(this.y - origin.y, this.x - origin.x);
- this.x = origin.x + (radius * Math.cos(theta));
- this.y = origin.y + (radius * Math.sin(theta));
- this.clearBounds();
- },
-
- /**
- * APIMethod: getCentroid
- *
- * Returns:
- * {<OpenLayers.Geometry.Point>} The centroid of the collection
- */
- getCentroid: function() {
- return new OpenLayers.Geometry.Point(this.x, this.y);
- },
-
- /**
- * APIMethod: resize
- * Resize a point relative to some origin. For points, this has the effect
- * of scaling a vector (from the origin to the point). This method is
- * more useful on geometry collection subclasses.
- *
- * Parameters:
- * scale - {Float} Ratio of the new distance from the origin to the old
- * distance from the origin. A scale of 2 doubles the
- * distance between the point and origin.
- * origin - {<OpenLayers.Geometry.Point>} Point of origin for resizing
- * ratio - {Float} Optional x:y ratio for resizing. Default ratio is 1.
- *
- * Returns:
- * {<OpenLayers.Geometry>} - The current geometry.
- */
- resize: function(scale, origin, ratio) {
- ratio = (ratio == undefined) ? 1 : ratio;
- this.x = origin.x + (scale * ratio * (this.x - origin.x));
- this.y = origin.y + (scale * (this.y - origin.y));
- this.clearBounds();
- return this;
- },
-
- /**
- * APIMethod: intersects
- * Determine if the input geometry intersects this one.
- *
- * Parameters:
- * geometry - {<OpenLayers.Geometry>} Any type of geometry.
- *
- * Returns:
- * {Boolean} The input geometry intersects this one.
- */
- intersects: function(geometry) {
- var intersect = false;
- if(geometry.CLASS_NAME == "OpenLayers.Geometry.Point") {
- intersect = this.equals(geometry);
- } else {
- intersect = geometry.intersects(this);
- }
- return intersect;
- },
-
- /**
- * APIMethod: transform
- * Translate the x,y properties of the point from source to dest.
- *
- * Parameters:
- * source - {<OpenLayers.Projection>}
- * dest - {<OpenLayers.Projection>}
- *
- * Returns:
- * {<OpenLayers.Geometry>}
- */
- transform: function(source, dest) {
- if ((source && dest)) {
- OpenLayers.Projection.transform(
- this, source, dest);
- this.bounds = null;
- }
- return this;
- },
-
- /**
- * APIMethod: getVertices
- * Return a list of all points in this geometry.
- *
- * Parameters:
- * nodes - {Boolean} For lines, only return vertices that are
- * endpoints. If false, for lines, only vertices that are not
- * endpoints will be returned. If not provided, all vertices will
- * be returned.
- *
- * Returns:
- * {Array} A list of all vertices in the geometry.
- */
- getVertices: function(nodes) {
- return [this];
- },
-
- CLASS_NAME: "OpenLayers.Geometry.Point"
-});
diff --git a/misc/openlayers/lib/OpenLayers/Geometry/Polygon.js b/misc/openlayers/lib/OpenLayers/Geometry/Polygon.js
deleted file mode 100644
index 6aaff1f..0000000
--- a/misc/openlayers/lib/OpenLayers/Geometry/Polygon.js
+++ /dev/null
@@ -1,255 +0,0 @@
-/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
- * full list of contributors). Published under the 2-clause BSD license.
- * See license.txt in the OpenLayers distribution or repository for the
- * full text of the license. */
-
-/**
- * @requires OpenLayers/Geometry/Collection.js
- * @requires OpenLayers/Geometry/LinearRing.js
- */
-
-/**
- * Class: OpenLayers.Geometry.Polygon
- * Polygon is a collection of Geometry.LinearRings.
- *
- * Inherits from:
- * - <OpenLayers.Geometry.Collection>
- * - <OpenLayers.Geometry>
- */
-OpenLayers.Geometry.Polygon = OpenLayers.Class(
- OpenLayers.Geometry.Collection, {
-
- /**
- * Property: componentTypes
- * {Array(String)} An array of class names representing the types of
- * components that the collection can include. A null value means the
- * component types are not restricted.
- */
- componentTypes: ["OpenLayers.Geometry.LinearRing"],
-
- /**
- * Constructor: OpenLayers.Geometry.Polygon
- * Constructor for a Polygon geometry.
- * The first ring (this.component[0])is the outer bounds of the polygon and
- * all subsequent rings (this.component[1-n]) are internal holes.
- *
- *
- * Parameters:
- * components - {Array(<OpenLayers.Geometry.LinearRing>)}
- */
-
- /**
- * APIMethod: getArea
- * Calculated by subtracting the areas of the internal holes from the
- * area of the outer hole.
- *
- * Returns:
- * {float} The area of the geometry
- */
- getArea: function() {
- var area = 0.0;
- if ( this.components && (this.components.length > 0)) {
- area += Math.abs(this.components[0].getArea());
- for (var i=1, len=this.components.length; i<len; i++) {
- area -= Math.abs(this.components[i].getArea());
- }
- }
- return area;
- },
-
- /**
- * APIMethod: getGeodesicArea
- * Calculate the approximate area of the polygon were it projected onto
- * the earth.
- *
- * Parameters:
- * projection - {<OpenLayers.Projection>} The spatial reference system
- * for the geometry coordinates. If not provided, Geographic/WGS84 is
- * assumed.
- *
- * Reference:
- * Robert. G. Chamberlain and William H. Duquette, "Some Algorithms for
- * Polygons on a Sphere", JPL Publication 07-03, Jet Propulsion
- * Laboratory, Pasadena, CA, June 2007 http://trs-new.jpl.nasa.gov/dspace/handle/2014/40409
- *
- * Returns:
- * {float} The approximate geodesic area of the polygon in square meters.
- */
- getGeodesicArea: function(projection) {
- var area = 0.0;
- if(this.components && (this.components.length > 0)) {
- area += Math.abs(this.components[0].getGeodesicArea(projection));
- for(var i=1, len=this.components.length; i<len; i++) {
- area -= Math.abs(this.components[i].getGeodesicArea(projection));
- }
- }
- return area;
- },
-
- /**
- * Method: containsPoint
- * Test if a point is inside a polygon. Points on a polygon edge are
- * considered inside.
- *
- * Parameters:
- * point - {<OpenLayers.Geometry.Point>}
- *
- * Returns:
- * {Boolean | Number} The point is inside the polygon. Returns 1 if the
- * point is on an edge. Returns boolean otherwise.
- */
- containsPoint: function(point) {
- var numRings = this.components.length;
- var contained = false;
- if(numRings > 0) {
- // check exterior ring - 1 means on edge, boolean otherwise
- contained = this.components[0].containsPoint(point);
- if(contained !== 1) {
- if(contained && numRings > 1) {
- // check interior rings
- var hole;
- for(var i=1; i<numRings; ++i) {
- hole = this.components[i].containsPoint(point);
- if(hole) {
- if(hole === 1) {
- // on edge
- contained = 1;
- } else {
- // in hole
- contained = false;
- }
- break;
- }
- }
- }
- }
- }
- return contained;
- },
-
- /**
- * APIMethod: intersects
- * Determine if the input geometry intersects this one.
- *
- * Parameters:
- * geometry - {<OpenLayers.Geometry>} Any type of geometry.
- *
- * Returns:
- * {Boolean} The input geometry intersects this one.
- */
- intersects: function(geometry) {
- var intersect = false;
- var i, len;
- if(geometry.CLASS_NAME == "OpenLayers.Geometry.Point") {
- intersect = this.containsPoint(geometry);
- } else if(geometry.CLASS_NAME == "OpenLayers.Geometry.LineString" ||
- geometry.CLASS_NAME == "OpenLayers.Geometry.LinearRing") {
- // check if rings/linestrings intersect
- for(i=0, len=this.components.length; i<len; ++i) {
- intersect = geometry.intersects(this.components[i]);
- if(intersect) {
- break;
- }
- }
- if(!intersect) {
- // check if this poly contains points of the ring/linestring
- for(i=0, len=geometry.components.length; i<len; ++i) {
- intersect = this.containsPoint(geometry.components[i]);
- if(intersect) {
- break;
- }
- }
- }
- } else {
- for(i=0, len=geometry.components.length; i<len; ++ i) {
- intersect = this.intersects(geometry.components[i]);
- if(intersect) {
- break;
- }
- }
- }
- // check case where this poly is wholly contained by another
- if(!intersect && geometry.CLASS_NAME == "OpenLayers.Geometry.Polygon") {
- // exterior ring points will be contained in the other geometry
- var ring = this.components[0];
- for(i=0, len=ring.components.length; i<len; ++i) {
- intersect = geometry.containsPoint(ring.components[i]);
- if(intersect) {
- break;
- }
- }
- }
- return intersect;
- },
-
- /**
- * APIMethod: distanceTo
- * Calculate the closest distance between two geometries (on the x-y plane).
- *
- * Parameters:
- * geometry - {<OpenLayers.Geometry>} The target geometry.
- * options - {Object} Optional properties for configuring the distance
- * calculation.
- *
- * Valid options:
- * details - {Boolean} Return details from the distance calculation.
- * Default is false.
- * edge - {Boolean} Calculate the distance from this geometry to the
- * nearest edge of the target geometry. Default is true. If true,
- * calling distanceTo from a geometry that is wholly contained within
- * the target will result in a non-zero distance. If false, whenever
- * geometries intersect, calling distanceTo will return 0. If false,
- * details cannot be returned.
- *
- * Returns:
- * {Number | Object} The distance between this geometry and the target.
- * If details is true, the return will be an object with distance,
- * x0, y0, x1, and y1 properties. The x0 and y0 properties represent
- * the coordinates of the closest point on this geometry. The x1 and y1
- * properties represent the coordinates of the closest point on the
- * target geometry.
- */
- distanceTo: function(geometry, options) {
- var edge = !(options && options.edge === false);
- var result;
- // this is the case where we might not be looking for distance to edge
- if(!edge && this.intersects(geometry)) {
- result = 0;
- } else {
- result = OpenLayers.Geometry.Collection.prototype.distanceTo.apply(
- this, [geometry, options]
- );
- }
- return result;
- },
-
- CLASS_NAME: "OpenLayers.Geometry.Polygon"
-});
-
-/**
- * APIMethod: createRegularPolygon
- * Create a regular polygon around a radius. Useful for creating circles
- * and the like.
- *
- * Parameters:
- * origin - {<OpenLayers.Geometry.Point>} center of polygon.
- * radius - {Float} distance to vertex, in map units.
- * sides - {Integer} Number of sides. 20 approximates a circle.
- * rotation - {Float} original angle of rotation, in degrees.
- */
-OpenLayers.Geometry.Polygon.createRegularPolygon = function(origin, radius, sides, rotation) {
- var angle = Math.PI * ((1/sides) - (1/2));
- if(rotation) {
- angle += (rotation / 180) * Math.PI;
- }
- var rotatedAngle, x, y;
- var points = [];
- for(var i=0; i<sides; ++i) {
- rotatedAngle = angle + (i * 2 * Math.PI / sides);
- x = origin.x + (radius * Math.cos(rotatedAngle));
- y = origin.y + (radius * Math.sin(rotatedAngle));
- points.push(new OpenLayers.Geometry.Point(x, y));
- }
- var ring = new OpenLayers.Geometry.LinearRing(points);
- return new OpenLayers.Geometry.Polygon([ring]);
-};