Permalink
Browse files

Point, linestring, and linearring coordinates as Float32Array

  • Loading branch information...
1 parent 278d320 commit fd0a5f3622ddb07768cc8722894c119fc0f115f6 @tschaub tschaub committed Jan 18, 2013
View
@@ -1,7 +1,22 @@
+goog.provide('ol.geom.Coordinate');
+goog.provide('ol.geom.CoordinateArray');
goog.provide('ol.geom.Geometry');
+
/**
* @interface
*/
ol.geom.Geometry = function() {};
+
+
+/**
+ * @typedef {Array.<number>}
+ */
+ol.geom.Coordinate;
+
+
+/**
+ * @typedef {Array.<ol.geom.Coordinate>}
+ */
+ol.geom.CoordinateArray;
View
@@ -0,0 +1,27 @@
+goog.provide('ol.geom.LinearRing');
+
+goog.require('goog.asserts');
+goog.require('goog.vec.Float32Array');
+goog.require('ol.geom.CoordinateArray');
+goog.require('ol.geom.LineString');
+
+
+
+/**
+ * @constructor
+ * @extends {ol.geom.LineString}
+ * @param {ol.geom.CoordinateArray} coordinates Coordinates array (e.g.
+ * [[x0, y0], [x1, y1], [x0, y0]]).
+ */
+ol.geom.LinearRing = function(coordinates) {
+
+ goog.base(this, coordinates);
+
+ /**
+ * We're intentionally not enforcing that rings be closed right now. This
+ * will allow proper rendering of data from tiled vector sources that leave
+ * open rings.
+ */
+
+};
+goog.inherits(ol.geom.LinearRing, ol.geom.LineString);
View
@@ -1,19 +1,38 @@
goog.provide('ol.geom.LineString');
+goog.require('goog.asserts');
+goog.require('goog.vec.Float32Array');
+goog.require('ol.geom.CoordinateArray');
goog.require('ol.geom.Geometry');
/**
* @constructor
* @implements {ol.geom.Geometry}
- * @param {Array} coordinates Coordinates array.
+ * @param {ol.geom.CoordinateArray} coordinates Coordinates array (e.g.
+ * [[x0, y0], [x1, y1]]).
*/
ol.geom.LineString = function(coordinates) {
+ // assume the same dimension for all coordinates
+ var dimension = coordinates[0].length,
+ count = coordinates.length,
+ length = count * dimension;
+
+ /**
+ * @type {Float32Array}
+ */
+ this.coordinates = new Float32Array(length);
+ for (var i = 0; i < count; ++i) {
+ goog.asserts.assert(coordinates[i].length === dimension);
+ this.coordinates.set(coordinates[i], i * dimension);
+ }
+
/**
- * @type {Array}
+ * @type {number}
*/
- this.coordinates = coordinates;
+ this.dimension = dimension;
+ goog.asserts.assert(this.dimension >= 2);
};
@@ -1,19 +1,39 @@
goog.provide('ol.geom.MultiLineString');
+goog.require('goog.asserts');
+goog.require('ol.geom.CoordinateArray');
goog.require('ol.geom.Geometry');
+goog.require('ol.geom.LineString');
/**
* @constructor
* @implements {ol.geom.Geometry}
- * @param {Array} coordinates Coordinates array.
+ * @param {Array.<ol.geom.CoordinateArray>} coordinates Coordinates array.
*/
ol.geom.MultiLineString = function(coordinates) {
+ var numParts = coordinates.length,
+ dimension;
+
+ /**
+ * @type {Array.<ol.geom.LineString>}
+ */
+ this.components = new Array(numParts);
+ for (var i = 0; i < numParts; ++i) {
+ this.components[i] = new ol.geom.LineString(coordinates[i]);
+ if (!goog.isDef(dimension)) {
+ dimension = this.components[i];
+ } else {
+ goog.asserts.assert(this.components[i].dimension === dimension);
+ }
+ }
+
/**
- * @type {Array}
+ * @type {number}
*/
- this.coordinates = coordinates;
+ this.dimension = dimension;
+ goog.asserts.assert(this.dimension >= 2);
};
View
@@ -1,19 +1,39 @@
goog.provide('ol.geom.MultiPoint');
+goog.require('goog.asserts');
+goog.require('ol.geom.CoordinateArray');
goog.require('ol.geom.Geometry');
+goog.require('ol.geom.Point');
/**
* @constructor
* @implements {ol.geom.Geometry}
- * @param {Array} coordinates Coordinates array.
+ * @param {ol.geom.CoordinateArray} coordinates Coordinates array.
*/
ol.geom.MultiPoint = function(coordinates) {
+ var numParts = coordinates.length,
+ dimension;
+
+ /**
+ * @type {Array.<ol.geom.Point>}
+ */
+ this.components = new Array(numParts);
+ for (var i = 0; i < numParts; ++i) {
+ this.components[i] = new ol.geom.Point(coordinates[i]);
+ if (!goog.isDef(dimension)) {
+ dimension = this.components[i].dimension;
+ } else {
+ goog.asserts.assert(this.components[i].dimension === dimension);
+ }
+ }
+
/**
- * @type {Array}
+ * @type {number}
*/
- this.coordinates = coordinates;
+ this.dimension = dimension;
+ goog.asserts.assert(this.dimension >= 2);
};
@@ -1,19 +1,40 @@
goog.provide('ol.geom.MultiPolygon');
+goog.require('goog.asserts');
+goog.require('ol.geom.CoordinateArray');
goog.require('ol.geom.Geometry');
+goog.require('ol.geom.Polygon');
/**
* @constructor
* @implements {ol.geom.Geometry}
- * @param {Array} coordinates Coordinates array.
+ * @param {Array.<Array.<ol.geom.CoordinateArray>>} coordinates Coordinates
+ * array.
*/
ol.geom.MultiPolygon = function(coordinates) {
+ var numParts = coordinates.length,
+ dimension;
+
+ /**
+ * @type {Array.<ol.geom.Polygon>}
+ */
+ this.components = new Array(numParts);
+ for (var i = 0; i < numParts; ++i) {
+ this.components[i] = new ol.geom.Polygon(coordinates[i]);
+ if (!goog.isDef(dimension)) {
+ dimension = this.components[i];
+ } else {
+ goog.asserts.assert(this.components[i].dimension === dimension);
+ }
+ }
+
/**
- * @type {Array}
+ * @type {number}
*/
- this.coordinates = coordinates;
+ this.dimension = dimension;
+ goog.asserts.assert(this.dimension >= 2);
};
View
@@ -1,19 +1,28 @@
goog.provide('ol.geom.Point');
+goog.require('goog.asserts');
+goog.require('goog.vec.Float32Array');
+goog.require('ol.geom.Coordinate');
goog.require('ol.geom.Geometry');
/**
* @constructor
* @implements {ol.geom.Geometry}
- * @param {Array} coordinates Coordinates array.
+ * @param {ol.geom.Coordinate} coordinates Coordinates array (e.g. [x, y]).
*/
ol.geom.Point = function(coordinates) {
/**
- * @type {Array}
+ * @type {Float32Array}
*/
- this.coordinates = coordinates;
+ this.coordinates = new Float32Array(coordinates);
+
+ /**
+ * @type {number}
+ */
+ this.dimension = coordinates.length;
+ goog.asserts.assert(this.dimension >= 2);
};
View
@@ -1,19 +1,41 @@
goog.provide('ol.geom.Polygon');
+goog.require('goog.asserts');
+goog.require('goog.vec.Float32Array');
+goog.require('ol.geom.CoordinateArray');
goog.require('ol.geom.Geometry');
+goog.require('ol.geom.LinearRing');
/**
* @constructor
* @implements {ol.geom.Geometry}
- * @param {Array} coordinates Coordinates array.
+ * @param {Array.<ol.geom.CoordinateArray>} coordinates Array of rings. First
+ * is outer, any remaining are inner.
*/
ol.geom.Polygon = function(coordinates) {
+ var numRings = coordinates.length,
+ dimension;
+
+ /**
+ * @type {Array.<ol.geom.LinearRing>}
+ */
+ this.rings = new Array(numRings);
+ for (var i = 0; i < numRings; ++i) {
+ this.rings[i] = new ol.geom.LinearRing(coordinates[i]);
+ if (!goog.isDef(dimension)) {
+ dimension = this.rings[i].dimension;
+ } else {
+ goog.asserts.assert(this.rings[i].dimension === dimension);
+ }
+ }
+
/**
- * @type {Array}
+ * @type {number}
*/
- this.coordinates = coordinates;
+ this.dimension = dimension;
+ goog.asserts.assert(this.dimension >= 2);
};
View
@@ -80,6 +80,10 @@
<script type="text/javascript" src="spec/ol/rectangle.test.js"></script>
<script type="text/javascript" src="spec/ol/resolutionconstraint.test.js"></script>
<script type="text/javascript" src="spec/ol/view2d.test.js"></script>
+ <script type="text/javascript" src="spec/ol/geom/linearring.test.js"></script>
+ <script type="text/javascript" src="spec/ol/geom/linestring.test.js"></script>
+ <script type="text/javascript" src="spec/ol/geom/point.test.js"></script>
+ <script type="text/javascript" src="spec/ol/geom/polygon.test.js"></script>
<script type="text/javascript" src="spec/ol/layer/layer.test.js"></script>
<script type="text/javascript" src="spec/ol/source/xyz.test.js"></script>
<script type="text/javascript" src="spec/ol/tilecoord.test.js"></script>
@@ -0,0 +1,49 @@
+describe('ol.geom.LinearRing', function() {
+
+ describe('constructor', function() {
+
+ it('creates a ring from an array', function() {
+ var ring = new ol.geom.LinearRing([[10, 20], [30, 40]]);
+ expect(ring).toBeA(ol.geom.LinearRing);
+ });
+
+ it('throws when given mismatched dimension', function() {
+ expect(function() {
+ var ring = new ol.geom.LinearRing([[10, 20], [30, 40, 50]]);
+ }).toThrow();
+ });
+
+ });
+
+ describe('coordinates', function() {
+
+ it('is a Float32Array', function() {
+ var ring = new ol.geom.LinearRing([[10, 20], [30, 40]]);
+ expect(ring.coordinates).toBeA(Float32Array);
+
+ expect(ring.coordinates.length).toBe(4);
+ expect(ring.coordinates[0]).toBe(10);
+ expect(ring.coordinates[1]).toBe(20);
+ expect(ring.coordinates[2]).toBe(30);
+ expect(ring.coordinates[3]).toBe(40);
+ });
+
+ });
+
+ describe('dimension', function() {
+
+ it('can be 2', function() {
+ var ring = new ol.geom.LinearRing([[10, 20], [30, 40]]);
+ expect(ring.dimension).toBe(2);
+ });
+
+ it('can be 3', function() {
+ var ring = new ol.geom.LinearRing([[10, 20, 30], [40, 50, 60]]);
+ expect(ring.dimension).toBe(3);
+ });
+
+ });
+
+
+});
+
Oops, something went wrong.

0 comments on commit fd0a5f3

Please sign in to comment.