ol/geom/flat/orient export

This commit is contained in:
raiyni
2018-02-13 08:57:35 -06:00
parent 9fc09db89c
commit 6573b308b6
8 changed files with 40 additions and 41 deletions

View File

@@ -17,7 +17,7 @@ import MultiPolygon from '../geom/MultiPolygon.js';
import Point from '../geom/Point.js'; import Point from '../geom/Point.js';
import Polygon from '../geom/Polygon.js'; import Polygon from '../geom/Polygon.js';
import {deflateCoordinates} from '../geom/flat/deflate.js'; import {deflateCoordinates} from '../geom/flat/deflate.js';
import _ol_geom_flat_orient_ from '../geom/flat/orient.js'; import {linearRingIsClockwise} from '../geom/flat/orient.js';
import {assign, isEmpty} from '../obj.js'; import {assign, isEmpty} from '../obj.js';
import {get as getProjection} from '../proj.js'; import {get as getProjection} from '../proj.js';
@@ -134,7 +134,7 @@ function convertRings(rings, layout) {
flatRing.length = 0; flatRing.length = 0;
deflateCoordinates(flatRing, 0, rings[i], layout.length); deflateCoordinates(flatRing, 0, rings[i], layout.length);
// is this ring an outer ring? is it clockwise? // is this ring an outer ring? is it clockwise?
const clockwise = _ol_geom_flat_orient_.linearRingIsClockwise(flatRing, 0, const clockwise = linearRingIsClockwise(flatRing, 0,
flatRing.length, layout.length); flatRing.length, layout.length);
if (clockwise) { if (clockwise) {
outerRings.push([rings[i]]); outerRings.push([rings[i]]);

View File

@@ -16,7 +16,7 @@ import MultiPoint from '../geom/MultiPoint.js';
import MultiPolygon from '../geom/MultiPolygon.js'; import MultiPolygon from '../geom/MultiPolygon.js';
import Point from '../geom/Point.js'; import Point from '../geom/Point.js';
import Polygon from '../geom/Polygon.js'; import Polygon from '../geom/Polygon.js';
import _ol_geom_flat_orient_ from '../geom/flat/orient.js'; import {linearRingIsClockwise} from '../geom/flat/orient.js';
import Projection from '../proj/Projection.js'; import Projection from '../proj/Projection.js';
import Units from '../proj/Units.js'; import Units from '../proj/Units.js';
import RenderFeature from '../render/Feature.js'; import RenderFeature from '../render/Feature.js';
@@ -309,7 +309,7 @@ MVT.prototype.createFeature_ = function(pbf, rawFeature, opt_options) {
let prevEndIndex = 0; let prevEndIndex = 0;
for (let i = 0, ii = ends.length; i < ii; ++i) { for (let i = 0, ii = ends.length; i < ii; ++i) {
const end = ends[i]; const end = ends[i];
if (!_ol_geom_flat_orient_.linearRingIsClockwise(flatCoordinates, offset, end, 2)) { if (!linearRingIsClockwise(flatCoordinates, offset, end, 2)) {
endss.push(ends.slice(prevEndIndex, i)); endss.push(ends.slice(prevEndIndex, i));
prevEndIndex = i; prevEndIndex = i;
} }

View File

@@ -17,7 +17,7 @@ import {deflateMultiCoordinatesArray} from '../geom/flat/deflate.js';
import {inflateMultiCoordinatesArray} from '../geom/flat/inflate.js'; import {inflateMultiCoordinatesArray} from '../geom/flat/inflate.js';
import {getInteriorPointsOfMultiArray} from '../geom/flat/interiorpoint.js'; import {getInteriorPointsOfMultiArray} from '../geom/flat/interiorpoint.js';
import _ol_geom_flat_intersectsextent_ from '../geom/flat/intersectsextent.js'; import _ol_geom_flat_intersectsextent_ from '../geom/flat/intersectsextent.js';
import _ol_geom_flat_orient_ from '../geom/flat/orient.js'; import {linearRingsAreOriented, orientLinearRingsArray} from '../geom/flat/orient.js';
import {quantizeMultiArray} from '../geom/flat/simplify.js'; import {quantizeMultiArray} from '../geom/flat/simplify.js';
/** /**
@@ -183,7 +183,7 @@ MultiPolygon.prototype.getCoordinates = function(opt_right) {
let flatCoordinates; let flatCoordinates;
if (opt_right !== undefined) { if (opt_right !== undefined) {
flatCoordinates = this.getOrientedFlatCoordinates().slice(); flatCoordinates = this.getOrientedFlatCoordinates().slice();
_ol_geom_flat_orient_.orientLinearRingss( orientLinearRingsArray(
flatCoordinates, 0, this.endss_, this.stride, opt_right); flatCoordinates, 0, this.endss_, this.stride, opt_right);
} else { } else {
flatCoordinates = this.flatCoordinates; flatCoordinates = this.flatCoordinates;
@@ -238,13 +238,13 @@ MultiPolygon.prototype.getInteriorPoints = function() {
MultiPolygon.prototype.getOrientedFlatCoordinates = function() { MultiPolygon.prototype.getOrientedFlatCoordinates = function() {
if (this.orientedRevision_ != this.getRevision()) { if (this.orientedRevision_ != this.getRevision()) {
const flatCoordinates = this.flatCoordinates; const flatCoordinates = this.flatCoordinates;
if (_ol_geom_flat_orient_.linearRingssAreOriented( if (linearRingsAreOriented(
flatCoordinates, 0, this.endss_, this.stride)) { flatCoordinates, 0, this.endss_, this.stride)) {
this.orientedFlatCoordinates_ = flatCoordinates; this.orientedFlatCoordinates_ = flatCoordinates;
} else { } else {
this.orientedFlatCoordinates_ = flatCoordinates.slice(); this.orientedFlatCoordinates_ = flatCoordinates.slice();
this.orientedFlatCoordinates_.length = this.orientedFlatCoordinates_.length =
_ol_geom_flat_orient_.orientLinearRingss( orientLinearRingsArray(
this.orientedFlatCoordinates_, 0, this.endss_, this.stride); this.orientedFlatCoordinates_, 0, this.endss_, this.stride);
} }
this.orientedRevision_ = this.getRevision(); this.orientedRevision_ = this.getRevision();

View File

@@ -17,7 +17,7 @@ import {deflateCoordinatesArray} from '../geom/flat/deflate.js';
import {inflateCoordinatesArray} from '../geom/flat/inflate.js'; import {inflateCoordinatesArray} from '../geom/flat/inflate.js';
import {getInteriorPointOfArray} from '../geom/flat/interiorpoint.js'; import {getInteriorPointOfArray} from '../geom/flat/interiorpoint.js';
import _ol_geom_flat_intersectsextent_ from '../geom/flat/intersectsextent.js'; import _ol_geom_flat_intersectsextent_ from '../geom/flat/intersectsextent.js';
import _ol_geom_flat_orient_ from '../geom/flat/orient.js'; import {linearRingIsOriented, orientLinearRings} from '../geom/flat/orient.js';
import {quantizeArray} from '../geom/flat/simplify.js'; import {quantizeArray} from '../geom/flat/simplify.js';
import {modulo} from '../math.js'; import {modulo} from '../math.js';
@@ -173,7 +173,7 @@ Polygon.prototype.getCoordinates = function(opt_right) {
let flatCoordinates; let flatCoordinates;
if (opt_right !== undefined) { if (opt_right !== undefined) {
flatCoordinates = this.getOrientedFlatCoordinates().slice(); flatCoordinates = this.getOrientedFlatCoordinates().slice();
_ol_geom_flat_orient_.orientLinearRings( orientLinearRings(
flatCoordinates, 0, this.ends_, this.stride, opt_right); flatCoordinates, 0, this.ends_, this.stride, opt_right);
} else { } else {
flatCoordinates = this.flatCoordinates; flatCoordinates = this.flatCoordinates;
@@ -279,13 +279,13 @@ Polygon.prototype.getLinearRings = function() {
Polygon.prototype.getOrientedFlatCoordinates = function() { Polygon.prototype.getOrientedFlatCoordinates = function() {
if (this.orientedRevision_ != this.getRevision()) { if (this.orientedRevision_ != this.getRevision()) {
const flatCoordinates = this.flatCoordinates; const flatCoordinates = this.flatCoordinates;
if (_ol_geom_flat_orient_.linearRingsAreOriented( if (linearRingIsOriented(
flatCoordinates, 0, this.ends_, this.stride)) { flatCoordinates, 0, this.ends_, this.stride)) {
this.orientedFlatCoordinates_ = flatCoordinates; this.orientedFlatCoordinates_ = flatCoordinates;
} else { } else {
this.orientedFlatCoordinates_ = flatCoordinates.slice(); this.orientedFlatCoordinates_ = flatCoordinates.slice();
this.orientedFlatCoordinates_.length = this.orientedFlatCoordinates_.length =
_ol_geom_flat_orient_.orientLinearRings( orientLinearRings(
this.orientedFlatCoordinates_, 0, this.ends_, this.stride); this.orientedFlatCoordinates_, 0, this.ends_, this.stride);
} }
this.orientedRevision_ = this.getRevision(); this.orientedRevision_ = this.getRevision();

View File

@@ -2,7 +2,6 @@
* @module ol/geom/flat/orient * @module ol/geom/flat/orient
*/ */
import {coordinates as reverseCoordinates} from '../flat/reverse.js'; import {coordinates as reverseCoordinates} from '../flat/reverse.js';
const _ol_geom_flat_orient_ = {};
/** /**
@@ -12,7 +11,7 @@ const _ol_geom_flat_orient_ = {};
* @param {number} stride Stride. * @param {number} stride Stride.
* @return {boolean} Is clockwise. * @return {boolean} Is clockwise.
*/ */
_ol_geom_flat_orient_.linearRingIsClockwise = function(flatCoordinates, offset, end, stride) { export function linearRingIsClockwise(flatCoordinates, offset, end, stride) {
// http://tinyurl.com/clockwise-method // http://tinyurl.com/clockwise-method
// https://github.com/OSGeo/gdal/blob/trunk/gdal/ogr/ogrlinearring.cpp // https://github.com/OSGeo/gdal/blob/trunk/gdal/ogr/ogrlinearring.cpp
let edge = 0; let edge = 0;
@@ -26,7 +25,7 @@ _ol_geom_flat_orient_.linearRingIsClockwise = function(flatCoordinates, offset,
y1 = y2; y1 = y2;
} }
return edge > 0; return edge > 0;
}; }
/** /**
@@ -42,11 +41,11 @@ _ol_geom_flat_orient_.linearRingIsClockwise = function(flatCoordinates, offset,
* (counter-clockwise exterior ring and clockwise interior rings). * (counter-clockwise exterior ring and clockwise interior rings).
* @return {boolean} Rings are correctly oriented. * @return {boolean} Rings are correctly oriented.
*/ */
_ol_geom_flat_orient_.linearRingsAreOriented = function(flatCoordinates, offset, ends, stride, opt_right) { export function linearRingIsOriented(flatCoordinates, offset, ends, stride, opt_right) {
const right = opt_right !== undefined ? opt_right : false; const right = opt_right !== undefined ? opt_right : false;
for (let i = 0, ii = ends.length; i < ii; ++i) { for (let i = 0, ii = ends.length; i < ii; ++i) {
const end = ends[i]; const end = ends[i];
const isClockwise = _ol_geom_flat_orient_.linearRingIsClockwise( const isClockwise = linearRingIsClockwise(
flatCoordinates, offset, end, stride); flatCoordinates, offset, end, stride);
if (i === 0) { if (i === 0) {
if ((right && isClockwise) || (!right && !isClockwise)) { if ((right && isClockwise) || (!right && !isClockwise)) {
@@ -60,7 +59,7 @@ _ol_geom_flat_orient_.linearRingsAreOriented = function(flatCoordinates, offset,
offset = end; offset = end;
} }
return true; return true;
}; }
/** /**
@@ -76,15 +75,15 @@ _ol_geom_flat_orient_.linearRingsAreOriented = function(flatCoordinates, offset,
* (counter-clockwise exterior ring and clockwise interior rings). * (counter-clockwise exterior ring and clockwise interior rings).
* @return {boolean} Rings are correctly oriented. * @return {boolean} Rings are correctly oriented.
*/ */
_ol_geom_flat_orient_.linearRingssAreOriented = function(flatCoordinates, offset, endss, stride, opt_right) { export function linearRingsAreOriented(flatCoordinates, offset, endss, stride, opt_right) {
for (let i = 0, ii = endss.length; i < ii; ++i) { for (let i = 0, ii = endss.length; i < ii; ++i) {
if (!_ol_geom_flat_orient_.linearRingsAreOriented( if (!linearRingIsOriented(
flatCoordinates, offset, endss[i], stride, opt_right)) { flatCoordinates, offset, endss[i], stride, opt_right)) {
return false; return false;
} }
} }
return true; return true;
}; }
/** /**
@@ -100,11 +99,11 @@ _ol_geom_flat_orient_.linearRingssAreOriented = function(flatCoordinates, offset
* @param {boolean=} opt_right Follow the right-hand rule for orientation. * @param {boolean=} opt_right Follow the right-hand rule for orientation.
* @return {number} End. * @return {number} End.
*/ */
_ol_geom_flat_orient_.orientLinearRings = function(flatCoordinates, offset, ends, stride, opt_right) { export function orientLinearRings(flatCoordinates, offset, ends, stride, opt_right) {
const right = opt_right !== undefined ? opt_right : false; const right = opt_right !== undefined ? opt_right : false;
for (let i = 0, ii = ends.length; i < ii; ++i) { for (let i = 0, ii = ends.length; i < ii; ++i) {
const end = ends[i]; const end = ends[i];
const isClockwise = _ol_geom_flat_orient_.linearRingIsClockwise( const isClockwise = linearRingIsClockwise(
flatCoordinates, offset, end, stride); flatCoordinates, offset, end, stride);
const reverse = i === 0 ? const reverse = i === 0 ?
(right && isClockwise) || (!right && !isClockwise) : (right && isClockwise) || (!right && !isClockwise) :
@@ -115,7 +114,7 @@ _ol_geom_flat_orient_.orientLinearRings = function(flatCoordinates, offset, ends
offset = end; offset = end;
} }
return offset; return offset;
}; }
/** /**
@@ -131,11 +130,10 @@ _ol_geom_flat_orient_.orientLinearRings = function(flatCoordinates, offset, ends
* @param {boolean=} opt_right Follow the right-hand rule for orientation. * @param {boolean=} opt_right Follow the right-hand rule for orientation.
* @return {number} End. * @return {number} End.
*/ */
_ol_geom_flat_orient_.orientLinearRingss = function(flatCoordinates, offset, endss, stride, opt_right) { export function orientLinearRingsArray(flatCoordinates, offset, endss, stride, opt_right) {
for (let i = 0, ii = endss.length; i < ii; ++i) { for (let i = 0, ii = endss.length; i < ii; ++i) {
offset = _ol_geom_flat_orient_.orientLinearRings( offset = orientLinearRings(
flatCoordinates, offset, endss[i], stride, opt_right); flatCoordinates, offset, endss[i], stride, opt_right);
} }
return offset; return offset;
}; }
export default _ol_geom_flat_orient_;

View File

@@ -5,7 +5,7 @@ import {getUid, inherits} from '../../index.js';
import {equals} from '../../array.js'; import {equals} from '../../array.js';
import {asArray} from '../../color.js'; import {asArray} from '../../color.js';
import {intersects} from '../../extent.js'; import {intersects} from '../../extent.js';
import _ol_geom_flat_orient_ from '../../geom/flat/orient.js'; import {linearRingIsClockwise} from '../../geom/flat/orient.js';
import _ol_geom_flat_transform_ from '../../geom/flat/transform.js'; import _ol_geom_flat_transform_ from '../../geom/flat/transform.js';
import {lineStringIsClosed} from '../../geom/flat/topology.js'; import {lineStringIsClosed} from '../../geom/flat/topology.js';
import {isEmpty} from '../../obj.js'; import {isEmpty} from '../../obj.js';
@@ -252,7 +252,7 @@ WebGLLineStringReplay.prototype.drawCoordinates_ = function(flatCoordinates, off
if (closed) { if (closed) {
n = n || numVertices / 7; n = n || numVertices / 7;
sign = _ol_geom_flat_orient_.linearRingIsClockwise([p0[0], p0[1], p1[0], p1[1], p2[0], p2[1]], 0, 6, 2) sign = linearRingIsClockwise([p0[0], p0[1], p1[0], p1[1], p2[0], p2[1]], 0, 6, 2)
? 1 : -1; ? 1 : -1;
numVertices = this.addVertices_(p0, p1, p2, numVertices = this.addVertices_(p0, p1, p2,

View File

@@ -7,7 +7,7 @@ import {asArray} from '../../color.js';
import {intersects} from '../../extent.js'; import {intersects} from '../../extent.js';
import {isEmpty} from '../../obj.js'; import {isEmpty} from '../../obj.js';
import {linearRingContainsXY} from '../../geom/flat/contains.js'; import {linearRingContainsXY} from '../../geom/flat/contains.js';
import _ol_geom_flat_orient_ from '../../geom/flat/orient.js'; import {linearRingIsClockwise} from '../../geom/flat/orient.js';
import _ol_geom_flat_transform_ from '../../geom/flat/transform.js'; import _ol_geom_flat_transform_ from '../../geom/flat/transform.js';
import {fragment, vertex} from '../webgl/polygonreplay/defaultshader.js'; import {fragment, vertex} from '../webgl/polygonreplay/defaultshader.js';
import Locations from '../webgl/polygonreplay/defaultshader/Locations.js'; import Locations from '../webgl/polygonreplay/defaultshader/Locations.js';
@@ -140,7 +140,7 @@ WebGLPolygonReplay.prototype.drawCoordinates_ = function(
*/ */
WebGLPolygonReplay.prototype.processFlatCoordinates_ = function( WebGLPolygonReplay.prototype.processFlatCoordinates_ = function(
flatCoordinates, stride, list, rtree, clockwise) { flatCoordinates, stride, list, rtree, clockwise) {
const isClockwise = _ol_geom_flat_orient_.linearRingIsClockwise(flatCoordinates, const isClockwise = linearRingIsClockwise(flatCoordinates,
0, flatCoordinates.length, stride); 0, flatCoordinates.length, stride);
let i, ii; let i, ii;
let n = this.vertices.length / 2; let n = this.vertices.length / 2;
@@ -404,7 +404,7 @@ WebGLPolygonReplay.prototype.clipEars_ = function(list, rtree, simple, ccw) {
variableCriterion) { variableCriterion) {
//The diagonal is completely inside the polygon //The diagonal is completely inside the polygon
if (simple || p0.reflex === false || p2.reflex === false || if (simple || p0.reflex === false || p2.reflex === false ||
_ol_geom_flat_orient_.linearRingIsClockwise([s0.p0.x, s0.p0.y, p0.x, linearRingIsClockwise([s0.p0.x, s0.p0.y, p0.x,
p0.y, p1.x, p1.y, p2.x, p2.y, s3.p1.x, s3.p1.y], 0, 10, 2) === !ccw) { p0.y, p1.x, p1.y, p2.x, p2.y, s3.p1.x, s3.p1.y], 0, 10, 2) === !ccw) {
//The diagonal is persumably valid, we have an ear //The diagonal is persumably valid, we have an ear
this.indices[numIndices++] = p0.i; this.indices[numIndices++] = p0.i;
@@ -533,7 +533,7 @@ WebGLPolygonReplay.prototype.isClockwise_ = function(list) {
flatCoordinates[i++] = seg.p0.y; flatCoordinates[i++] = seg.p0.y;
seg = list.nextItem(); seg = list.nextItem();
} while (seg !== start); } while (seg !== start);
return _ol_geom_flat_orient_.linearRingIsClockwise(flatCoordinates, 0, length, 2); return linearRingIsClockwise(flatCoordinates, 0, length, 2);
}; };

View File

@@ -1,4 +1,5 @@
import _ol_geom_flat_orient_ from '../../../../../src/ol/geom/flat/orient.js'; import {linearRingIsClockwise, linearRingIsOriented,
linearRingsAreOriented, orientLinearRings, orientLinearRingsArray} from '../../../../../src/ol/geom/flat/orient.js';
describe('ol.geom.flat.orient', function() { describe('ol.geom.flat.orient', function() {
@@ -7,14 +8,14 @@ describe('ol.geom.flat.orient', function() {
it('identifies clockwise rings', function() { it('identifies clockwise rings', function() {
const flatCoordinates = [0, 1, 1, 4, 4, 3, 3, 0]; const flatCoordinates = [0, 1, 1, 4, 4, 3, 3, 0];
const isClockwise = _ol_geom_flat_orient_.linearRingIsClockwise( const isClockwise = linearRingIsClockwise(
flatCoordinates, 0, flatCoordinates.length, 2); flatCoordinates, 0, flatCoordinates.length, 2);
expect(isClockwise).to.be(true); expect(isClockwise).to.be(true);
}); });
it('identifies anti-clockwise rings', function() { it('identifies anti-clockwise rings', function() {
const flatCoordinates = [2, 2, 3, 2, 3, 3, 2, 3]; const flatCoordinates = [2, 2, 3, 2, 3, 3, 2, 3];
const isClockwise = _ol_geom_flat_orient_.linearRingIsClockwise( const isClockwise = linearRingIsClockwise(
flatCoordinates, 0, flatCoordinates.length, 2); flatCoordinates, 0, flatCoordinates.length, 2);
expect(isClockwise).to.be(false); expect(isClockwise).to.be(false);
}); });
@@ -22,7 +23,7 @@ describe('ol.geom.flat.orient', function() {
}); });
describe('ol.geom.flat.orient.linearRingsAreOriented()', function() { describe('ol.geom.flat.orient.linearRingsAreOriented()', function() {
const oriented = _ol_geom_flat_orient_.linearRingsAreOriented; const oriented = linearRingIsOriented;
const rightCoords = [ const rightCoords = [
-180, -90, 180, -90, 180, 90, -180, 90, -180, -90, -180, -90, 180, -90, 180, 90, -180, 90, -180, -90,
@@ -49,7 +50,7 @@ describe('ol.geom.flat.orient', function() {
}); });
describe('ol.geom.flat.orient.linearRingssAreOriented()', function() { describe('ol.geom.flat.orient.linearRingssAreOriented()', function() {
const oriented = _ol_geom_flat_orient_.linearRingssAreOriented; const oriented = linearRingsAreOriented;
const rightCoords = [ const rightCoords = [
-180, -90, 180, -90, 180, 90, -180, 90, -180, -90, -180, -90, 180, -90, 180, 90, -180, 90, -180, -90,
@@ -80,7 +81,7 @@ describe('ol.geom.flat.orient', function() {
}); });
describe('ol.geom.flat.orient.orientLinearRings()', function() { describe('ol.geom.flat.orient.orientLinearRings()', function() {
const orient = _ol_geom_flat_orient_.orientLinearRings; const orient = orientLinearRings;
const rightCoords = [ const rightCoords = [
-180, -90, 180, -90, 180, 90, -180, 90, -180, -90, -180, -90, 180, -90, 180, 90, -180, 90, -180, -90,
@@ -117,7 +118,7 @@ describe('ol.geom.flat.orient', function() {
}); });
describe('ol.geom.flat.orient.orientLinearRingss()', function() { describe('ol.geom.flat.orient.orientLinearRingss()', function() {
const orient = _ol_geom_flat_orient_.orientLinearRingss; const orient = orientLinearRingsArray;
const rightCoords = [ const rightCoords = [
-180, -90, 180, -90, 180, 90, -180, 90, -180, -90, -180, -90, 180, -90, 180, 90, -180, 90, -180, -90,