├── .eslintrc ├── .gitignore ├── .npmignore ├── CHANGES.md ├── FUNDING.yml ├── LICENSE ├── README.md ├── ShamosHoey.pdf ├── debug ├── build.js ├── index.html ├── src │ ├── App.vue │ ├── coords.js │ └── main.js └── webpack.config.js ├── dist ├── ShamosHoeyClass.esm.js └── ShamosHoeyClass.js ├── package.json ├── rollup.config.js ├── src ├── Event.js ├── EventQueue.js ├── Segment.js ├── ShamosHoey.js ├── Sweepline.js ├── compareEvents.js ├── compareSegments.js ├── debug.js ├── fillQueue.js ├── main.js ├── runCheck.js └── utils.js └── test ├── Event.spec.js ├── EventQueue.spec.js ├── Segment.spec.js ├── Sweepline.spec.js ├── benchmark.js ├── fillQueue.spec.js ├── fixtures ├── notSimple │ ├── MultiPolygonOverlappingSquares.geojson │ ├── lineFirstAndLastSegs.geojson │ ├── lineKinkAtBeginning.geojson │ ├── lineKinked.geojson │ ├── lineKinkedOnEnd.geojson │ ├── multilineKinked.geojson │ ├── overlappingSegments.geojson │ ├── overlappingSegmentsHorizontal.geojson │ ├── regression1.geojson │ ├── regression2.geojson │ └── switzerlandKinked.geojson └── simple │ ├── MultiLine2.geojson │ ├── australia.geojson │ ├── diamond.geojson │ ├── diamondMulti.geojson │ ├── line.geojson │ ├── multiLine.geojson │ └── switzerland.geojson └── test.spec.js /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "eslint-config-mourner", 3 | "globals": { 4 | "L": true 5 | }, 6 | "rules": { 7 | "space-before-function-paren": [ 2, "always" ], 8 | "semi": [ 2, "never" ], 9 | "prefer-arrow-callback": 0 10 | }, 11 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | dist/shamosHoey.js 2 | dist/shamosHoey.min.js 3 | dist/shamosHoey.esm.js 4 | .DS_Store 5 | node_modules/ 6 | npm-debug.log* 7 | yarn-debug.log* 8 | yarn-error.log* 9 | .nyc_output 10 | coverage 11 | package-lock.json -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | src/ 2 | debug/ 3 | test/ 4 | ShamosHoey.pdf -------------------------------------------------------------------------------- /CHANGES.md: -------------------------------------------------------------------------------- 1 | ### 1.1.0 2 | - Introduce support for class-based approach for repetitive checks against a primary geometry. 3 | - Fix bug with populating the even queue for `MultiPolygon` geometries 4 | - Add support for `FeatureCollection` 5 | -------------------------------------------------------------------------------- /FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: [rowanwins] 2 | custom: ["https://paypal.me/rowanwinsemius"] -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 Rowan Winsemius 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # shamos-hoey 2 | A fast module for checking if segment intersections exist using the Shamos-Hoey algorithm. 3 | Can be used for 4 | - detecting if a geometry has self-intersections, or 5 | - if multiple geometries have segments which intersect 6 | 7 | **Note:** This module only detects if an intersection does exist, not where, or how many. If you need to find the points of intersection I suggest using the [sweepline-intersections module](https://github.com/rowanwins/sweepline-intersections). 8 | ## Documentation 9 | 10 | ### Install 11 | ```` 12 | npm install shamos-hoey 13 | ```` 14 | 15 | ### Basic Use 16 | Valid inputs: Geojson `Feature` or `Geometry` including `Polygon`, `LineString`, `MultiPolygon`, `MultiLineString`, as well as `FeatureCollection`'s. 17 | 18 | Returns `true` if there are no intersections 19 | 20 | Returns `false` if there are intersections 21 | 22 | ````js 23 | const noIntersections = require('shamos-hoey') 24 | 25 | const box = {type: 'Polygon', coordinates: [[[0, 0], [1, 0], [1, 1], [0, 1], [0, 0]]]} 26 | noIntersections(box) 27 | // => true 28 | ```` 29 | 30 | ### Complex Use 31 | This library also provide a class-based approach which is helpful if you need to check multiple geometries against a single geometry. This allows you to save the state of the initial event queue with the primary geometry. 32 | 33 | ````js 34 | import ShamosHoeyClass from 'shamos-hoey/dist/ShamosHoeyClass' 35 | 36 | // create the base instance 37 | const sh = new ShamosHoeyClass() 38 | // populate the event queue with your primary geometry 39 | sh.addData(largeGeoJson) 40 | // clone the event queue in the original state so you can reuse it 41 | const origQueue = sh.cloneEventQueue() 42 | 43 | // now you can iterate through some other set of features saving 44 | // the overhead of having to populate the complete queue multiple times 45 | someOtherFeatureCollection.features.forEach(feature => { 46 | // add another feature to test against your original data 47 | sh.addData(feature, origQueue) 48 | // check if those two features intersect 49 | sh.noIntersections() 50 | }) 51 | ```` 52 | 53 | #### API 54 | `new ShamosHoeyClass()` - creates a new instance 55 | 56 | `.addData(geojson, existingQueue)` - add geojson to the event queue. The second argument for an `existingQueue` is optional, and takes a queue generated from `.cloneEventQueue()` 57 | 58 | `.cloneEventQueue()` - clones the state of the existing event queue that's been populated with geojson. Returns a queue that you can pass to the `addData` method 59 | 60 | `.noIntersections()` - Checks for segment intersections. Returns `true` if there are no segment intersections or `false` if there are intersections. 61 | 62 | 63 | 64 | ## Similar modules 65 | If you need to find the points of self-intersection I suggest using the [sweepline-intersections module](https://github.com/rowanwins/sweepline-intersections). The sweeline-intersections module is also smaller (4kb vs 12kb) and very fast for most use cases. It uses alot of the same logic although doesn't inlude a tree structure which makes up the major dependency for this library. 66 | 67 | 68 | ## Benchmarks 69 | Detecting an intersection in a polygon with roughly 700 vertices. Note that the other libraries report the intersection point/s. 70 | ```` 71 | // Has intersections 72 | // ShamosHoey x 4,132 ops/sec ±0.60% (95 runs sampled) 73 | // SweeplineIntersections x 2,124 ops/sec ±0.70% (92 runs sampled) 74 | // GPSI x 36.85 ops/sec ±1.06% (64 runs sampled) 75 | // - Fastest is ShamosHoey 76 | ```` 77 | For the class-based module vs the basic use on a very large geojson file (approx. 14,000 vertices) 78 | ```` 79 | // Class-based reuse vs Basic 80 | // ShamosHoey x 1,011 ops/sec ±8.12% (89 runs sampled) 81 | // ShamosHoeyClass x 2,066 ops/sec ±0.60% (93 runs sampled) 82 | // - Fastest is ShamosHoeyClass 83 | ```` 84 | 85 | 86 | ## Further Reading 87 | [Original Paper](https://github.com/rowanwins/shamos-hoey/blob/master/ShamosHoey.pdf) 88 | 89 | [Article on Geom algorithms website](http://geomalgorithms.com/a09-_intersect-3.html#Shamos-Hoey-Algorithm) 90 | -------------------------------------------------------------------------------- /ShamosHoey.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rowanwins/shamos-hoey/53f2901df46c5a95e1de79fcd9c41c2b80da4203/ShamosHoey.pdf -------------------------------------------------------------------------------- /debug/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | shamos-hoey debugger 6 | 7 | 8 |
9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /debug/src/App.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 50 | 51 | 58 | -------------------------------------------------------------------------------- /debug/src/coords.js: -------------------------------------------------------------------------------- 1 | 2 | import L from 'leaflet'; 3 | 4 | L.Coordinates = L.Control.extend({ 5 | options: { 6 | position: 'bottomright' 7 | }, 8 | 9 | onAdd (map) { 10 | this._container = L.DomUtil.create('div', 'leaflet-bar') 11 | this._container.style.background = '#ffffff' 12 | map.on('mousemove', this._onMouseMove, this) 13 | return this._container 14 | }, 15 | 16 | _onMouseMove (e) { 17 | this._container.innerHTML = ` 18 | ${e.latlng.lng.toFixed(0)} ${e.latlng.lat.toFixed(0)} ` 19 | } 20 | 21 | }) 22 | -------------------------------------------------------------------------------- /debug/src/main.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import App from './App.vue' 3 | 4 | new Vue({ 5 | el: '#app', 6 | render: h => h(App) 7 | }) 8 | -------------------------------------------------------------------------------- /debug/webpack.config.js: -------------------------------------------------------------------------------- 1 | const webpack = require('webpack') 2 | const VueLoaderPlugin = require('vue-loader/lib/plugin') 3 | 4 | module.exports = { 5 | entry: './debug/src/main.js', 6 | output: { 7 | path: __dirname, 8 | publicPath: '/debug/', 9 | filename: 'build.js' 10 | }, 11 | module: { 12 | rules: [ 13 | { 14 | test: /\.geojson$/, 15 | loader: 'json-loader' 16 | }, 17 | { 18 | test: /\.(png|jpg|gif)$/, 19 | use: [ 20 | { 21 | loader: 'file-loader', 22 | options: {}, 23 | }, 24 | ], 25 | }, 26 | { 27 | test: /\.css$/, 28 | use: [ 29 | 'vue-style-loader', 30 | 'css-loader' 31 | ] 32 | }, { 33 | test: /\.vue$/, 34 | loader: 'vue-loader' 35 | } 36 | ] 37 | }, 38 | plugins: [ 39 | new VueLoaderPlugin() 40 | ], 41 | devServer: { 42 | historyApiFallback: true, 43 | noInfo: true, 44 | overlay: true, 45 | openPage: 'debug/index.html' 46 | }, 47 | performance: { 48 | hints: false 49 | }, 50 | devtool: '#eval-source-map' 51 | } 52 | 53 | if (process.env.NODE_ENV === 'production') { 54 | module.exports.devtool = '#source-map' 55 | module.exports.plugins = (module.exports.plugins || []).concat([ 56 | new webpack.DefinePlugin({ 57 | 'process.env': { 58 | NODE_ENV: '"production"' 59 | } 60 | }) 61 | ]) 62 | } 63 | -------------------------------------------------------------------------------- /dist/ShamosHoeyClass.esm.js: -------------------------------------------------------------------------------- 1 | class t{constructor(t=[],e=function(t,e){return te?1:0}){if(this.data=t,this.length=this.data.length,this.compare=e,this.length>0)for(let t=(this.length>>1)-1;t>=0;t--)this._down(t)}push(t){this.data.push(t),this.length++,this._up(this.length-1)}pop(){if(0===this.length)return;const t=this.data[0];return this.length--,this.length>0&&(this.data[0]=this.data[this.length],this._down(0)),this.data.pop(),t}peek(){return this.data[0]}_up(t){const{data:e,compare:n}=this,r=e[t];for(;t>0;){const i=t-1>>1,o=e[i];if(n(r,o)>=0)break;e[t]=o,t=i}e[t]=r}_down(t){const{data:e,compare:n}=this,r=this.length>>1,i=e[t];for(;t=0)break;e[t]=o,t=r}e[t]=i}}function e(t,e){return t.x>e.x?1:t.xe.y?1:-1:1}class n{constructor(){return new t([],e)}}function r(t,e,n){return(t.x-n.x)*(e.y-n.y)-(e.x-n.x)*(t.y-n.y)}class i{constructor(t){this.x=t[0],this.y=t[1],this.otherEvent=null,this.isLeftEndpoint=null,this.segment=null}isOtherEndOfSegment(t){return this===t.otherEvent}isSamePoint(t){return this.x===t.x&&this.y===t.y}isBelow(t){return this.isLeftEndpoint?r(this,this.otherEvent,t)>0:r(this.otherEvent,t,this)>0}isAbove(t){return!this.isBelow(t)}}function o(t,n){const r="Feature"===t.type?t.geometry:t;let o=r.coordinates;"Polygon"!==r.type&&"MultiLineString"!==r.type||(o=[o]),"LineString"===r.type&&(o=[[o]]);for(let t=0;t0?(h.isLeftEndpoint=!0,l.isLeftEndpoint=!1):(l.isLeftEndpoint=!0,h.isLeftEndpoint=!1),n.push(l),n.push(h)}}class s{constructor(t,e){this.key=t,this.data=e,this.left=null,this.right=null}}function l(t,e,n){if(null===e)return e;let r,i,o;const l=new s;for(r=i=l;;){const s=n(t,e.key);if(s<0){if(null===e.left)break;if(n(t,e.left.key)<0&&(o=e.left,e.left=o.right,o.right=e,null===(e=o).left))break;i.left=e,i=e,e=e.left}else{if(!(s>0))break;if(null===e.right)break;if(n(t,e.right.key)>0&&(o=e.right,e.right=o.left,o.left=e,null===(e=o).right))break;r.right=e,r=e,e=e.right}}return r.right=e.left,i.left=e.right,e.left=l.right,e.right=l.left,e}function h(t,e,n,r,i){const o=new s(t,e);if(i._size++,null===n)return o.left=o.right=null,o;const h=r(t,(n=l(t,n,r)).key);return h<0?(o.left=n.left,o.right=n,n.left=null):h>=0&&(o.right=n.right,o.left=n,n.right=null),o}function u(t,e,n,r){let i;return null===e?null:0===n(t,(e=l(t,e,n)).key)?(null===e.left?i=e.right:(i=l(t,e.left,n)).right=e.right,r._size--,i):e}function f(t,e,n){let r,i;if(null===e)r=i=null;else{const o=n((e=l(t,e,n)).key,t);0===o?(r=e.left,i=e.right):o<0?(i=e.right,e.right=null,r=e):(r=e.left,e.left=null,i=e)}return{left:r,right:i}}class c{constructor(t=function(t,e){return t>e?1:t0&&(o.right=n.right,o.left=n,n.right=null),i._size++,o)}(t,e,this._root,this._comparator,this)}remove(t){this._root=u(t,this._root,this._comparator,this)}pop(){let t=this._root;if(t){for(;t.left;)t=t.left;return this._root=l(t.key,this._root,this._comparator),this._root=u(t.key,this._root,this._comparator,this),{key:t.key,data:t.data}}return null}findStatic(t){let e=this._root;const n=this._comparator;for(;e;){const r=n(t,e.key);if(0===r)return e;e=r<0?e.left:e.right}return null}find(t){return this._root&&(this._root=l(t,this._root,this._comparator),0!==this._comparator(t,this._root.key))?null:this._root}contains(t){let e=this._root;const n=this._comparator;for(;e;){const r=n(t,e.key);if(0===r)return!0;e=r<0?e.left:e.right}return!1}forEach(t,e){let n=this._root;const r=[];let i=!1;for(;!i;)null!==n?(r.push(n),n=n.left):0!==r.length?(n=r.pop(),t.call(e,n),n=n.right):i=!0;return this}range(t,e,n,r){const i=[],o=this._comparator;let s,l=this._root;for(;0!==i.length||l;)if(l)i.push(l),l=l.left;else{if((s=o((l=i.pop()).key,e))>0)break;if(o(l.key,t)>=0&&n.call(r,l))return this;l=l.right}return this}keys(){const t=[];return this.forEach(({key:e})=>t.push(e)),t}values(){const t=[];return this.forEach(({data:e})=>t.push(e)),t}min(){return this._root?this.minNode(this._root).key:null}max(){return this._root?this.maxNode(this._root).key:null}minNode(t=this._root){if(t)for(;t.left;)t=t.left;return t}maxNode(t=this._root){if(t)for(;t.right;)t=t.right;return t}at(t){let e=this._root,n=!1,r=0;const i=[];for(;!n;)if(e)i.push(e),e=e.left;else if(i.length>0){if(e=i.pop(),r===t)return e;r++,e=e.right}else n=!0;return null}next(t){let e=this._root,n=null;if(t.right){for(n=t.right;n.left;)n=n.left;return n}const r=this._comparator;for(;e;){const i=r(t.key,e.key);if(0===i)break;i<0?(n=e,e=e.left):e=e.right}return n}prev(t){let e=this._root,n=null;if(null!==t.left){for(n=t.left;n.right;)n=n.right;return n}const r=this._comparator;for(;e;){const i=r(t.key,e.key);if(0===i)break;i<0?e=e.left:(n=e,e=e.right)}return n}clear(){return this._root=null,this._size=0,this}toList(){return function(t){var e=t,n=[],r=!1;const i={next:null};let o=i;for(;!r;)e?(n.push(e),e=e.left):n.length>0?e=(e=o=o.next=n.pop()).right:r=!0;return o.next=null,i.next}(this._root)}load(t=[],e=[],n=!1){let r=t.length;const i=this._comparator;if(n&&function t(e,n,r,i,o){if(r>=i)return;const s=e[r+i>>1];let l=r-1;let h=i+1;for(;;){do{l++}while(o(e[l],s)<0);do{h--}while(o(e[h],s)>0);if(l>=h)break;let t=e[l];e[l]=e[h],e[h]=t,t=n[l],n[l]=n[h],n[h]=t}t(e,n,r,h,o);t(e,n,h+1,i,o)}(t,e,0,r-1,i),null===this._root)this._root=function t(e,n,r,i,o){const s=o-i;if(s>0){const l=i+Math.floor(s/2),h=n[l],u=r[l],f={key:h,data:u,parent:e};return f.left=t(f,n,r,i,l),f.right=t(f,n,r,l+1,o),f}return null}(this._root,t,e,0,r),this._size=r;else{const n=function(t,e,n=((t,e)=>t-e)){const r={};let i=r,o=t,s=e;for(;null!==o&&null!==s;)n(o.key,s.key)<0?(i.next=o,o=o.next):(i.next=s,s=s.next),i=i.next;null!==o?i.next=o:null!==s&&(i.next=s);return r.next}(this.toList(),function(t,e){const n={next:null};let r=n;for(let n=0;n0){const o=n+Math.floor(i/2),s=t(e,n,o),l=e.head;return l.left=s,e.head=e.head.next,l.right=t(e,o+1,r),l}return null}({head:n},0,r)}return this}isEmpty(){return null===this._root}get size(){return this._size}toString(t=(t=>t.key)){const e=[];return function t(e,n,r,i,o){if(e){i(`${n}${r?"└── ":"├── "}${o(e)}\n`);const s=n+(r?" ":"│ ");e.left&&t(e.left,s,!1,i,o),e.right&&t(e.right,s,!0,i,o)}}(this._root,"",!0,t=>e.push(t),t),e.join("")}update(t,e,n){const r=this._comparator;let{left:i,right:o}=f(t,this._root,r);this._size--,r(t,e)<0?o=h(e,n,o,r,this):i=h(e,n,i,r,this),this._root=function(t,e,n){return null===e?t:null===t?e:((e=l(t.key,e,n)).left=t,e)}(i,o,r)}split(t){return f(t,this._root,this._comparator)}}class a{constructor(t){this.leftSweepEvent=t,this.rightSweepEvent=t.otherEvent,this.segmentAbove=null,this.segmentBelow=null,t.segment=this,t.otherEvent.segment=this}}function g(t,n){return t===n?0:0!==r(t.leftSweepEvent,t.rightSweepEvent,n.leftSweepEvent)||0!==r(t.leftSweepEvent,t.rightSweepEvent,n.rightSweepEvent)?t.leftSweepEvent.isSamePoint(n.leftSweepEvent)?t.leftSweepEvent.isBelow(n.rightSweepEvent)?-1:1:t.leftSweepEvent.x===n.leftSweepEvent.x?t.leftSweepEvent.y=0&&g<=1&&p>=0&&p<=1}}export default class{constructor(){this._eventQueue=new n}addData(t,e){if(void 0!==e){const t=new n;for(let n=0;ne?1:0}){if(this.data=t,this.length=this.data.length,this.compare=e,this.length>0)for(let t=(this.length>>1)-1;t>=0;t--)this._down(t)}push(t){this.data.push(t),this.length++,this._up(this.length-1)}pop(){if(0===this.length)return;const t=this.data[0];return this.length--,this.length>0&&(this.data[0]=this.data[this.length],this._down(0)),this.data.pop(),t}peek(){return this.data[0]}_up(t){const{data:e,compare:n}=this,r=e[t];for(;t>0;){const i=t-1>>1,o=e[i];if(n(r,o)>=0)break;e[t]=o,t=i}e[t]=r}_down(t){const{data:e,compare:n}=this,r=this.length>>1,i=e[t];for(;t=0)break;e[t]=o,t=r}e[t]=i}}function e(t,e){return t.x>e.x?1:t.xe.y?1:-1:1}class n{constructor(){return new t([],e)}}function r(t,e,n){return(t.x-n.x)*(e.y-n.y)-(e.x-n.x)*(t.y-n.y)}class i{constructor(t){this.x=t[0],this.y=t[1],this.otherEvent=null,this.isLeftEndpoint=null,this.segment=null}isOtherEndOfSegment(t){return this===t.otherEvent}isSamePoint(t){return this.x===t.x&&this.y===t.y}isBelow(t){return this.isLeftEndpoint?r(this,this.otherEvent,t)>0:r(this.otherEvent,t,this)>0}isAbove(t){return!this.isBelow(t)}}function o(t,n){const r="Feature"===t.type?t.geometry:t;let o=r.coordinates;"Polygon"!==r.type&&"MultiLineString"!==r.type||(o=[o]),"LineString"===r.type&&(o=[[o]]);for(let t=0;t0?(h.isLeftEndpoint=!0,l.isLeftEndpoint=!1):(l.isLeftEndpoint=!0,h.isLeftEndpoint=!1),n.push(l),n.push(h)}}class s{constructor(t,e){this.key=t,this.data=e,this.left=null,this.right=null}}function l(t,e,n){if(null===e)return e;let r,i,o;const l=new s;for(r=i=l;;){const s=n(t,e.key);if(s<0){if(null===e.left)break;if(n(t,e.left.key)<0&&(o=e.left,e.left=o.right,o.right=e,null===(e=o).left))break;i.left=e,i=e,e=e.left}else{if(!(s>0))break;if(null===e.right)break;if(n(t,e.right.key)>0&&(o=e.right,e.right=o.left,o.left=e,null===(e=o).right))break;r.right=e,r=e,e=e.right}}return r.right=e.left,i.left=e.right,e.left=l.right,e.right=l.left,e}function h(t,e,n,r,i){const o=new s(t,e);if(i._size++,null===n)return o.left=o.right=null,o;const h=r(t,(n=l(t,n,r)).key);return h<0?(o.left=n.left,o.right=n,n.left=null):h>=0&&(o.right=n.right,o.left=n,n.right=null),o}function u(t,e,n,r){let i;return null===e?null:0===n(t,(e=l(t,e,n)).key)?(null===e.left?i=e.right:(i=l(t,e.left,n)).right=e.right,r._size--,i):e}function f(t,e,n){let r,i;if(null===e)r=i=null;else{const o=n((e=l(t,e,n)).key,t);0===o?(r=e.left,i=e.right):o<0?(i=e.right,e.right=null,r=e):(r=e.left,e.left=null,i=e)}return{left:r,right:i}}class c{constructor(t=function(t,e){return t>e?1:t0&&(o.right=n.right,o.left=n,n.right=null),i._size++,o)}(t,e,this._root,this._comparator,this)}remove(t){this._root=u(t,this._root,this._comparator,this)}pop(){let t=this._root;if(t){for(;t.left;)t=t.left;return this._root=l(t.key,this._root,this._comparator),this._root=u(t.key,this._root,this._comparator,this),{key:t.key,data:t.data}}return null}findStatic(t){let e=this._root;const n=this._comparator;for(;e;){const r=n(t,e.key);if(0===r)return e;e=r<0?e.left:e.right}return null}find(t){return this._root&&(this._root=l(t,this._root,this._comparator),0!==this._comparator(t,this._root.key))?null:this._root}contains(t){let e=this._root;const n=this._comparator;for(;e;){const r=n(t,e.key);if(0===r)return!0;e=r<0?e.left:e.right}return!1}forEach(t,e){let n=this._root;const r=[];let i=!1;for(;!i;)null!==n?(r.push(n),n=n.left):0!==r.length?(n=r.pop(),t.call(e,n),n=n.right):i=!0;return this}range(t,e,n,r){const i=[],o=this._comparator;let s,l=this._root;for(;0!==i.length||l;)if(l)i.push(l),l=l.left;else{if((s=o((l=i.pop()).key,e))>0)break;if(o(l.key,t)>=0&&n.call(r,l))return this;l=l.right}return this}keys(){const t=[];return this.forEach(({key:e})=>t.push(e)),t}values(){const t=[];return this.forEach(({data:e})=>t.push(e)),t}min(){return this._root?this.minNode(this._root).key:null}max(){return this._root?this.maxNode(this._root).key:null}minNode(t=this._root){if(t)for(;t.left;)t=t.left;return t}maxNode(t=this._root){if(t)for(;t.right;)t=t.right;return t}at(t){let e=this._root,n=!1,r=0;const i=[];for(;!n;)if(e)i.push(e),e=e.left;else if(i.length>0){if(e=i.pop(),r===t)return e;r++,e=e.right}else n=!0;return null}next(t){let e=this._root,n=null;if(t.right){for(n=t.right;n.left;)n=n.left;return n}const r=this._comparator;for(;e;){const i=r(t.key,e.key);if(0===i)break;i<0?(n=e,e=e.left):e=e.right}return n}prev(t){let e=this._root,n=null;if(null!==t.left){for(n=t.left;n.right;)n=n.right;return n}const r=this._comparator;for(;e;){const i=r(t.key,e.key);if(0===i)break;i<0?e=e.left:(n=e,e=e.right)}return n}clear(){return this._root=null,this._size=0,this}toList(){return function(t){var e=t,n=[],r=!1;const i={next:null};let o=i;for(;!r;)e?(n.push(e),e=e.left):n.length>0?e=(e=o=o.next=n.pop()).right:r=!0;return o.next=null,i.next}(this._root)}load(t=[],e=[],n=!1){let r=t.length;const i=this._comparator;if(n&&function t(e,n,r,i,o){if(r>=i)return;const s=e[r+i>>1];let l=r-1;let h=i+1;for(;;){do{l++}while(o(e[l],s)<0);do{h--}while(o(e[h],s)>0);if(l>=h)break;let t=e[l];e[l]=e[h],e[h]=t,t=n[l],n[l]=n[h],n[h]=t}t(e,n,r,h,o);t(e,n,h+1,i,o)}(t,e,0,r-1,i),null===this._root)this._root=function t(e,n,r,i,o){const s=o-i;if(s>0){const l=i+Math.floor(s/2),h=n[l],u=r[l],f={key:h,data:u,parent:e};return f.left=t(f,n,r,i,l),f.right=t(f,n,r,l+1,o),f}return null}(this._root,t,e,0,r),this._size=r;else{const n=function(t,e,n=((t,e)=>t-e)){const r={};let i=r,o=t,s=e;for(;null!==o&&null!==s;)n(o.key,s.key)<0?(i.next=o,o=o.next):(i.next=s,s=s.next),i=i.next;null!==o?i.next=o:null!==s&&(i.next=s);return r.next}(this.toList(),function(t,e){const n={next:null};let r=n;for(let n=0;n0){const o=n+Math.floor(i/2),s=t(e,n,o),l=e.head;return l.left=s,e.head=e.head.next,l.right=t(e,o+1,r),l}return null}({head:n},0,r)}return this}isEmpty(){return null===this._root}get size(){return this._size}toString(t=(t=>t.key)){const e=[];return function t(e,n,r,i,o){if(e){i(`${n}${r?"└── ":"├── "}${o(e)}\n`);const s=n+(r?" ":"│ ");e.left&&t(e.left,s,!1,i,o),e.right&&t(e.right,s,!0,i,o)}}(this._root,"",!0,t=>e.push(t),t),e.join("")}update(t,e,n){const r=this._comparator;let{left:i,right:o}=f(t,this._root,r);this._size--,r(t,e)<0?o=h(e,n,o,r,this):i=h(e,n,i,r,this),this._root=function(t,e,n){return null===e?t:null===t?e:((e=l(t.key,e,n)).left=t,e)}(i,o,r)}split(t){return f(t,this._root,this._comparator)}}class a{constructor(t){this.leftSweepEvent=t,this.rightSweepEvent=t.otherEvent,this.segmentAbove=null,this.segmentBelow=null,t.segment=this,t.otherEvent.segment=this}}function g(t,n){return t===n?0:0!==r(t.leftSweepEvent,t.rightSweepEvent,n.leftSweepEvent)||0!==r(t.leftSweepEvent,t.rightSweepEvent,n.rightSweepEvent)?t.leftSweepEvent.isSamePoint(n.leftSweepEvent)?t.leftSweepEvent.isBelow(n.rightSweepEvent)?-1:1:t.leftSweepEvent.x===n.leftSweepEvent.x?t.leftSweepEvent.y=0&&g<=1&&p>=0&&p<=1}}return class{constructor(){this._eventQueue=new n}addData(t,e){if(void 0!==e){const t=new n;for(let n=0;n ({ 6 | input, 7 | output: { 8 | name: 'shamosHoey', 9 | file, 10 | format, 11 | exports: 'default' 12 | }, 13 | plugins 14 | }) 15 | 16 | export default [ 17 | output('./src/main.js', './dist/shamosHoey.js', 'umd', [ 18 | strip({ 19 | functions: ['debugEventAndSegment', 'debugEventAndSegments'] 20 | }), 21 | resolve() 22 | ]), 23 | output('./src/main.js', './dist/shamosHoey.min.js', 'umd', [ 24 | strip({ 25 | functions: ['debugEventAndSegment', 'debugEventAndSegments'] 26 | }), 27 | resolve(), 28 | terser() 29 | ]), 30 | output('./src/main.js', './dist/shamosHoey.esm.js', 'esm', [ 31 | strip({ 32 | functions: ['debugEventAndSegment', 'debugEventAndSegments'] 33 | }), 34 | resolve() 35 | ]), 36 | output('./src/ShamosHoey.js', './dist/ShamosHoeyClass.js', 'umd', [ 37 | strip({ 38 | functions: ['debugEventAndSegment', 'debugEventAndSegments'] 39 | }), 40 | resolve(), 41 | terser() 42 | ]), 43 | output('./src/ShamosHoey.js', './dist/ShamosHoeyClass.esm.js', 'esm', [ 44 | strip({ 45 | functions: ['debugEventAndSegment', 'debugEventAndSegments'] 46 | }), 47 | resolve(), 48 | terser() 49 | ]) 50 | ] 51 | -------------------------------------------------------------------------------- /src/Event.js: -------------------------------------------------------------------------------- 1 | import {signedArea} from './utils' 2 | 3 | export default class Event { 4 | 5 | constructor (coords) { 6 | this.x = coords[0] 7 | this.y = coords[1] 8 | 9 | this.otherEvent = null 10 | this.isLeftEndpoint = null 11 | this.segment = null 12 | } 13 | 14 | isOtherEndOfSegment (eventToCheck) { 15 | return this === eventToCheck.otherEvent 16 | } 17 | 18 | isSamePoint (eventToCheck) { 19 | return this.x === eventToCheck.x && this.y === eventToCheck.y 20 | } 21 | 22 | isBelow (p) { 23 | return this.isLeftEndpoint ? 24 | signedArea(this, this.otherEvent, p) > 0 : 25 | signedArea(this.otherEvent, p, this) > 0 26 | } 27 | 28 | isAbove (p) { 29 | return !this.isBelow(p) 30 | } 31 | } 32 | 33 | -------------------------------------------------------------------------------- /src/EventQueue.js: -------------------------------------------------------------------------------- 1 | import TinyQueue from 'tinyqueue' 2 | import {checkWhichEventIsLeft} from './compareEvents' 3 | 4 | export default class EventQueue { 5 | 6 | constructor () { 7 | return new TinyQueue([], checkWhichEventIsLeft) 8 | } 9 | 10 | } 11 | -------------------------------------------------------------------------------- /src/Segment.js: -------------------------------------------------------------------------------- 1 | export default class Segment { 2 | 3 | constructor (event) { 4 | this.leftSweepEvent = event 5 | this.rightSweepEvent = event.otherEvent 6 | this.segmentAbove = null 7 | this.segmentBelow = null 8 | 9 | event.segment = this 10 | event.otherEvent.segment = this 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/ShamosHoey.js: -------------------------------------------------------------------------------- 1 | import EventQueue from './EventQueue' 2 | import fillEventQueue from './fillQueue' 3 | import runCheck from './runCheck' 4 | 5 | export default class ShamosHoey { 6 | 7 | constructor () { 8 | this._eventQueue = new EventQueue() 9 | } 10 | 11 | addData (geojson, alternateEventQueue) { 12 | if (alternateEventQueue !== undefined) { 13 | const newQueue = new EventQueue() 14 | for (let i = 0; i < alternateEventQueue.length; i++) { 15 | newQueue.push(alternateEventQueue.data[i]) 16 | } 17 | this._eventQueue = newQueue 18 | } 19 | fillEventQueue(geojson, this._eventQueue) 20 | } 21 | 22 | cloneEventQueue () { 23 | const newQueue = new EventQueue() 24 | for (let i = 0; i < this._eventQueue.length; i++) { 25 | newQueue.push(this._eventQueue.data[i]) 26 | } 27 | return newQueue 28 | } 29 | 30 | noIntersections () { 31 | return runCheck(this._eventQueue) 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/Sweepline.js: -------------------------------------------------------------------------------- 1 | import SplayTree from 'splaytree' 2 | import Segment from './Segment' 3 | import {compareSegments} from './compareSegments' 4 | 5 | export default class SweepLine { 6 | constructor () { 7 | this.tree = new SplayTree(compareSegments) 8 | } 9 | 10 | addSegment (event) { 11 | const seg = new Segment(event) 12 | const node = this.tree.insert(seg) 13 | const nextNode = this.tree.next(node) 14 | const prevNode = this.tree.prev(node) 15 | if (nextNode !== null) { 16 | seg.segmentAbove = nextNode.key 17 | seg.segmentAbove.segmentBelow = seg 18 | } 19 | if (prevNode !== null) { 20 | seg.segmentBelow = prevNode.key 21 | seg.segmentBelow.segmentAbove = seg 22 | } 23 | return node.key 24 | } 25 | 26 | findSegment (seg) { 27 | const node = this.tree.find(seg) 28 | if (node === null) return null 29 | return node.key 30 | } 31 | 32 | removeSegmentFromSweepline (seg) { 33 | const node = this.tree.find(seg) 34 | if (node === null) return 35 | const nextNode = this.tree.next(node) 36 | const prevNode = this.tree.prev(node) 37 | 38 | if (nextNode !== null) { 39 | const nextSeg = nextNode.key 40 | nextSeg.segmentBelow = seg.segmentBelow 41 | } 42 | if (prevNode !== null) { 43 | const prevSeg = prevNode.key 44 | prevSeg.segmentAbove = seg.segmentAbove 45 | } 46 | this.tree.remove(seg) 47 | } 48 | 49 | testIntersect (seg1, seg2) { 50 | if (seg1 === null || seg2 === null) return false 51 | 52 | if (seg1.rightSweepEvent.isSamePoint(seg2.leftSweepEvent) || 53 | seg1.rightSweepEvent.isSamePoint(seg2.rightSweepEvent) || 54 | seg1.leftSweepEvent.isSamePoint(seg2.leftSweepEvent) || 55 | seg1.leftSweepEvent.isSamePoint(seg2.rightSweepEvent)) return false 56 | 57 | const x1 = seg1.leftSweepEvent.x 58 | const y1 = seg1.leftSweepEvent.y 59 | const x2 = seg1.rightSweepEvent.x 60 | const y2 = seg1.rightSweepEvent.y 61 | const x3 = seg2.leftSweepEvent.x 62 | const y3 = seg2.leftSweepEvent.y 63 | const x4 = seg2.rightSweepEvent.x 64 | const y4 = seg2.rightSweepEvent.y 65 | 66 | const denom = ((y4 - y3) * (x2 - x1)) - ((x4 - x3) * (y2 - y1)) 67 | const numeA = ((x4 - x3) * (y1 - y3)) - ((y4 - y3) * (x1 - x3)) 68 | const numeB = ((x2 - x1) * (y1 - y3)) - ((y2 - y1) * (x1 - x3)) 69 | 70 | if (denom === 0) { 71 | if (numeA === 0 && numeB === 0) return false 72 | return false 73 | } 74 | 75 | const uA = numeA / denom 76 | const uB = numeB / denom 77 | 78 | if (uA >= 0 && uA <= 1 && uB >= 0 && uB <= 1) { 79 | return true 80 | } 81 | return false 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /src/compareEvents.js: -------------------------------------------------------------------------------- 1 | export function checkWhichEventIsLeft (e1, e2) { 2 | if (e1.x > e2.x) return 1 3 | if (e1.x < e2.x) return -1 4 | 5 | if (e1.y !== e2.y) return e1.y > e2.y ? 1 : -1 6 | return 1 7 | } 8 | -------------------------------------------------------------------------------- /src/compareSegments.js: -------------------------------------------------------------------------------- 1 | import {signedArea} from './utils' 2 | import {checkWhichEventIsLeft} from './compareEvents' 3 | 4 | export function compareSegments (seg1, seg2) { 5 | if (seg1 === seg2) return 0 6 | 7 | if (signedArea(seg1.leftSweepEvent, seg1.rightSweepEvent, seg2.leftSweepEvent) !== 0 || 8 | signedArea(seg1.leftSweepEvent, seg1.rightSweepEvent, seg2.rightSweepEvent) !== 0) { 9 | 10 | // If the segments share their left endpoints 11 | // use the right endpoint to sort 12 | if (seg1.leftSweepEvent.isSamePoint(seg2.leftSweepEvent)) return seg1.leftSweepEvent.isBelow(seg2.rightSweepEvent) ? -1 : 1 13 | 14 | // If the segments have different left endpoints 15 | // use the left endpoint to sort 16 | if (seg1.leftSweepEvent.x === seg2.leftSweepEvent.x) return seg1.leftSweepEvent.y < seg2.leftSweepEvent.y ? -1 : 1 17 | 18 | // If the line segment associated to e1 been inserted 19 | // into S after the line segment associated to e2 ? 20 | if (checkWhichEventIsLeft(seg1.leftSweepEvent, seg2.leftSweepEvent) === 1) return seg2.leftSweepEvent.isAbove(seg1.leftSweepEvent) ? -1 : 1 21 | 22 | // The line segment associated to e2 has been inserted 23 | // into S after the line segment associated to e1 24 | return seg1.leftSweepEvent.isBelow(seg2.leftSweepEvent) ? -1 : 1 25 | } 26 | 27 | return checkWhichEventIsLeft(seg1.leftSweepEvent, seg2.leftSweepEvent) === 1 ? 1 : -1 28 | 29 | } 30 | -------------------------------------------------------------------------------- /src/debug.js: -------------------------------------------------------------------------------- 1 | export function debugEventAndSegments (event, sweepline) { 2 | if (process.env.NODE_ENV !== 'development') return 3 | const map = window.map 4 | const eLayer = L.circleMarker([event.y, event.x]).addTo(map) 5 | 6 | const segs = sweepline.tree.keys() 7 | const lines = L.layerGroup([]).addTo(map) 8 | 9 | segs.forEach(function (seg) { 10 | L.polyline([ 11 | [seg.leftSweepEvent.y, seg.leftSweepEvent.x], 12 | [seg.rightSweepEvent.y, seg.rightSweepEvent.x] 13 | ], {color: 'grey'}).addTo(lines) 14 | 15 | }) 16 | 17 | const polyline = L.polyline([[event.y, event.x], [event.otherEvent.y, event.otherEvent.x]], {color: 'red'}).addTo(map) 18 | 19 | // debugger 20 | 21 | eLayer.remove() 22 | polyline.remove() 23 | lines.remove() 24 | } 25 | 26 | export function debugEventAndSegment (event, segment) { 27 | if (process.env.NODE_ENV !== 'development') return 28 | const map = window.map 29 | 30 | const eLayer = L.circleMarker([event.y, event.x]).addTo(map) 31 | 32 | const lines = L.layerGroup([]).addTo(map) 33 | 34 | const b = map.getBounds() 35 | L.polyline([ 36 | [b.getNorth(), event.x], 37 | [b.getSouth(), event.x] 38 | ], {color: 'grey', weight: 1}).addTo(lines); 39 | 40 | 41 | L.polyline([ 42 | [segment.leftSweepEvent.y, segment.leftSweepEvent.x], 43 | [segment.rightSweepEvent.y, segment.rightSweepEvent.x] 44 | ], {color: 'red'}).addTo(lines) 45 | 46 | if (segment.segmentAbove !== null) { 47 | L.polyline([ 48 | [segment.segmentAbove.leftSweepEvent.y, segment.segmentAbove.leftSweepEvent.x], 49 | [segment.segmentAbove.rightSweepEvent.y, segment.segmentAbove.rightSweepEvent.x] 50 | ], {color: 'green'}).addTo(lines) 51 | } 52 | 53 | if (segment.segmentBelow !== null) { 54 | L.polyline([ 55 | [segment.segmentBelow.leftSweepEvent.y, segment.segmentBelow.leftSweepEvent.x], 56 | [segment.segmentBelow.rightSweepEvent.y, segment.segmentBelow.rightSweepEvent.x] 57 | ], {color: 'purple'}).addTo(lines) 58 | } 59 | 60 | 61 | // debugger 62 | 63 | eLayer.remove() 64 | lines.clearLayers() 65 | } 66 | -------------------------------------------------------------------------------- /src/fillQueue.js: -------------------------------------------------------------------------------- 1 | import Event from './Event' 2 | import {checkWhichEventIsLeft} from './compareEvents' 3 | 4 | export default function fillEventQueue (geojson, eventQueue) { 5 | if (geojson.type === 'FeatureCollection') { 6 | const features = geojson.features 7 | for (let i = 0; i < features.length; i++) { 8 | processFeature(features[i], eventQueue) 9 | } 10 | } else { 11 | processFeature(geojson, eventQueue) 12 | } 13 | } 14 | 15 | function processFeature (featureOrGeometry, eventQueue) { 16 | const geom = featureOrGeometry.type === 'Feature' ? featureOrGeometry.geometry : featureOrGeometry 17 | 18 | let coords = geom.coordinates 19 | // standardise the input 20 | if (geom.type === 'Polygon' || geom.type === 'MultiLineString') coords = [coords] 21 | if (geom.type === 'LineString') coords = [[coords]] 22 | 23 | for (let i = 0; i < coords.length; i++) { 24 | for (let ii = 0; ii < coords[i].length; ii++) { 25 | for (let iii = 0; iii < coords[i][ii].length - 1; iii++) { 26 | const e1 = new Event(coords[i][ii][iii]) 27 | const e2 = new Event(coords[i][ii][iii + 1]) 28 | 29 | e1.otherEvent = e2 30 | e2.otherEvent = e1 31 | 32 | if (checkWhichEventIsLeft(e1, e2) > 0) { 33 | e2.isLeftEndpoint = true 34 | e1.isLeftEndpoint = false 35 | } else { 36 | e1.isLeftEndpoint = true 37 | e2.isLeftEndpoint = false 38 | } 39 | eventQueue.push(e1) 40 | eventQueue.push(e2) 41 | } 42 | } 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/main.js: -------------------------------------------------------------------------------- 1 | import EventQueue from './EventQueue' 2 | import runCheck from './runCheck' 3 | 4 | import fillEventQueue from './fillQueue' 5 | 6 | export default function noIntersections (geojson) { 7 | const eventQueue = new EventQueue() 8 | fillEventQueue(geojson, eventQueue) 9 | return runCheck(eventQueue) 10 | } 11 | -------------------------------------------------------------------------------- /src/runCheck.js: -------------------------------------------------------------------------------- 1 | import Sweepline from './Sweepline' 2 | // import {debugEventAndSegments, debugEventAndSegment} from './debug' 3 | 4 | export default function runCheck (eventQueue) { 5 | const sweepLine = new Sweepline() 6 | let currentSegment = null 7 | while (eventQueue.length) { 8 | const event = eventQueue.pop() 9 | // debugEventAndSegments(event, sweepLine) 10 | 11 | if (event.isLeftEndpoint) { 12 | currentSegment = sweepLine.addSegment(event) 13 | // debugEventAndSegment(event, currentSegment) 14 | if (sweepLine.testIntersect(currentSegment, currentSegment.segmentAbove)) return false 15 | if (sweepLine.testIntersect(currentSegment, currentSegment.segmentBelow)) return false 16 | } else { 17 | if (!event.segment) continue 18 | // debugEventAndSegment(event, currentSegment) 19 | if (sweepLine.testIntersect(event.segment.segmentAbove, event.segment.segmentBelow)) return false 20 | sweepLine.removeSegmentFromSweepline(event.segment) 21 | } 22 | } 23 | return true 24 | } 25 | -------------------------------------------------------------------------------- /src/utils.js: -------------------------------------------------------------------------------- 1 | export function signedArea (p0, p1, p2) { 2 | return (p0.x - p2.x) * (p1.y - p2.y) - (p1.x - p2.x) * (p0.y - p2.y) 3 | } 4 | -------------------------------------------------------------------------------- /test/Event.spec.js: -------------------------------------------------------------------------------- 1 | import test from 'ava'; 2 | import Event from '../src/Event' 3 | 4 | test('Event has correct properties', function (t) { 5 | const e1 = new Event([0, 1]) 6 | 7 | t.is(e1.x, 0) 8 | t.is(e1.y, 1) 9 | t.is(e1.otherEvent, null) 10 | }) 11 | 12 | 13 | test('Event can check against other segment point', function (t) { 14 | const e1 = new Event([0, 0]) 15 | const e2 = new Event([1, 0]) 16 | e1.otherEvent = e2 17 | e2.otherEvent = e1 18 | t.is(e1.isOtherEndOfSegment(e2), true) 19 | 20 | const e2a = new Event([1, 0]) 21 | const e3 = new Event([2, 0]) 22 | e2a.otherEvent = e3 23 | e3.otherEvent = e2a 24 | 25 | t.is(e2.isOtherEndOfSegment(e3), false) 26 | t.is(e3.isOtherEndOfSegment(e2a), true) 27 | }) 28 | 29 | test('Event can check against other event for duplicate points', function (t) { 30 | const e1 = new Event([0, 0]) 31 | const e2 = new Event([0, 0]) 32 | 33 | t.is(e1.isSamePoint(e2), true) 34 | }) 35 | -------------------------------------------------------------------------------- /test/EventQueue.spec.js: -------------------------------------------------------------------------------- 1 | import test from 'ava'; 2 | import EventQueue from '../src/EventQueue' 3 | import Event from '../src/Event' 4 | 5 | test('EventQueue is correctly sorted', function (t) { 6 | const eventQueue = new EventQueue() 7 | 8 | const e1 = new Event([0, 0]) 9 | const e2 = new Event([1, 0]) 10 | const e3 = new Event([-1, 0]) 11 | 12 | eventQueue.push(e1) 13 | eventQueue.push(e3) 14 | eventQueue.push(e2) 15 | 16 | const firstEvent = eventQueue.pop(); 17 | t.deepEqual([firstEvent.x, firstEvent.y], [-1, 0]) 18 | 19 | const secondEvent = eventQueue.pop(); 20 | t.deepEqual([secondEvent.x, secondEvent.y], [0, 0]) 21 | 22 | const thirdEvent = eventQueue.pop(); 23 | t.deepEqual([thirdEvent.x, thirdEvent.y], [1, 0]) 24 | }) 25 | -------------------------------------------------------------------------------- /test/Segment.spec.js: -------------------------------------------------------------------------------- 1 | import test from 'ava'; 2 | import Event from '../src/Event' 3 | import Segment from '../src/Segment' 4 | 5 | test('Segment has correct properties', function (t) { 6 | 7 | const e1 = new Event([-1, 0]) 8 | const e2 = new Event([0, 0]) 9 | 10 | e1.otherEvent = e2 11 | e2.otherEvent = e1 12 | e1.isLeftEndpoint = true; 13 | e2.isLeftEndpoint = false; 14 | const seg = new Segment(e1) 15 | 16 | t.is(seg.leftSweepEvent, e1) 17 | t.is(seg.rightSweepEvent, e2) 18 | }) 19 | -------------------------------------------------------------------------------- /test/Sweepline.spec.js: -------------------------------------------------------------------------------- 1 | import test from 'ava'; 2 | import Event from '../src/Event' 3 | import Sweepline from '../src/Sweepline' 4 | 5 | test('Sweepline has correct properties', function (t) { 6 | 7 | const e1 = new Event([-1, 0]) 8 | const e2 = new Event([0, 0]) 9 | 10 | e1.otherEvent = e2 11 | e2.otherEvent = e1 12 | e1.isLeftEndpoint = true; 13 | e2.isLeftEndpoint = false; 14 | 15 | const sl = new Sweepline() 16 | const seg = sl.addSegment(e1) 17 | const segOut = sl.findSegment(seg) 18 | t.is(seg, segOut) 19 | }) 20 | 21 | test('Sweepline can add an endpoint', function (t) { 22 | const e1 = new Event([-1, 0]) 23 | const e2 = new Event([0, 0]) 24 | 25 | e1.otherEvent = e2 26 | e2.otherEvent = e1 27 | e1.isLeftEndpoint = true; 28 | e2.isLeftEndpoint = false; 29 | 30 | const sl = new Sweepline() 31 | const midLine = sl.addSegment(e1) 32 | 33 | t.is(midLine.leftSweepEvent, e1) 34 | t.is(midLine.segmentAbove, null) 35 | t.is(midLine.segmentBelow, null) 36 | 37 | const e3 = new Event([0, 1]) 38 | const e4 = new Event([1, 1]) 39 | 40 | e3.otherEvent = e4 41 | e4.otherEvent = e3 42 | e3.isLeftEndpoint = true; 43 | e4.isLeftEndpoint = false; 44 | 45 | const topLine = sl.addSegment(e3) 46 | 47 | t.is(midLine.segmentAbove, topLine) 48 | t.is(midLine.segmentBelow, null) 49 | t.is(topLine.segmentAbove, null) 50 | t.is(topLine.segmentBelow, midLine) 51 | 52 | const e5 = new Event([0, -1]) 53 | const e6 = new Event([2, -1]) 54 | 55 | e5.otherEvent = e6 56 | e6.otherEvent = e5 57 | e5.isLeftEndpoint = true; 58 | e6.isLeftEndpoint = false; 59 | 60 | const bottomLine = sl.addSegment(e5) 61 | 62 | t.is(midLine.segmentBelow, bottomLine) 63 | t.is(midLine.segmentAbove, topLine) 64 | 65 | t.is(bottomLine.segmentAbove, midLine) 66 | t.is(bottomLine.segmentBelow, null) 67 | 68 | t.is(topLine.segmentAbove, null) 69 | t.is(topLine.segmentBelow, midLine) 70 | }) 71 | 72 | test('Sweepline can testIntersects', function (t) { 73 | const e1 = new Event([-1, 0]) 74 | const e2 = new Event([0, 0]) 75 | 76 | e1.otherEvent = e2 77 | e2.otherEvent = e1 78 | e1.isLeftEndpoint = true; 79 | e2.isLeftEndpoint = false; 80 | 81 | const sl = new Sweepline() 82 | const midLine = sl.addSegment(e1) 83 | 84 | const e3 = new Event([0, 1]) 85 | const e4 = new Event([1, 1]) 86 | 87 | e3.otherEvent = e4 88 | e4.otherEvent = e3 89 | e3.isLeftEndpoint = true; 90 | e4.isLeftEndpoint = false; 91 | 92 | const topLine = sl.addSegment(e3) 93 | t.is(sl.testIntersect(midLine, topLine), false) 94 | 95 | const e5 = new Event([-0.5, 0.5]) 96 | const e6 = new Event([-0.5, -1]) 97 | 98 | e5.otherEvent = e6 99 | e6.otherEvent = e5 100 | e5.isLeftEndpoint = true; 101 | e6.isLeftEndpoint = false; 102 | 103 | const crossLine = sl.addSegment(e5) 104 | t.is(sl.testIntersect(midLine, crossLine), true) 105 | t.is(sl.testIntersect(topLine, crossLine), false) 106 | 107 | const e7 = new Event([0, 0]) 108 | const e8 = new Event([0, -1]) 109 | 110 | e7.otherEvent = e8 111 | e8.otherEvent = e7 112 | e7.isLeftEndpoint = true; 113 | e8.isLeftEndpoint = false; 114 | 115 | const touchEndpointLine = sl.addSegment(e7) 116 | t.is(sl.testIntersect(midLine, touchEndpointLine), false) 117 | t.is(sl.testIntersect(topLine, touchEndpointLine), false) 118 | }) 119 | 120 | test('Sweepline is correctly sorted', function (t) { 121 | const e1 = new Event([-1, 0]) 122 | const e2 = new Event([0, 0]) 123 | 124 | e1.otherEvent = e2 125 | e2.otherEvent = e1 126 | e1.isLeftEndpoint = true; 127 | e2.isLeftEndpoint = false; 128 | 129 | const sl = new Sweepline() 130 | const midLine = sl.addSegment(e1) 131 | 132 | t.is(midLine.leftSweepEvent, e1) 133 | t.is(midLine.segmentAbove, null) 134 | t.is(midLine.segmentBelow, null) 135 | 136 | const e3 = new Event([-1, 0]) 137 | const e4 = new Event([0.5, 1]) 138 | 139 | e3.otherEvent = e4 140 | e4.otherEvent = e3 141 | e3.isLeftEndpoint = true; 142 | e4.isLeftEndpoint = false; 143 | 144 | const topLine = sl.addSegment(e3) 145 | 146 | t.is(midLine.segmentAbove, topLine) 147 | t.is(midLine.segmentBelow, null) 148 | t.is(topLine.segmentAbove, null) 149 | t.is(topLine.segmentBelow, midLine) 150 | 151 | const e5 = new Event([-1, 0]) 152 | const e6 = new Event([0.5, -1]) 153 | 154 | e5.otherEvent = e6 155 | e6.otherEvent = e5 156 | e5.isLeftEndpoint = true; 157 | e6.isLeftEndpoint = false; 158 | 159 | const bottomLine = sl.addSegment(e5) 160 | 161 | t.is(midLine.segmentBelow, bottomLine) 162 | t.is(midLine.segmentAbove, topLine) 163 | 164 | t.is(bottomLine.segmentAbove, midLine) 165 | t.is(bottomLine.segmentBelow, null) 166 | 167 | t.is(topLine.segmentAbove, null) 168 | t.is(topLine.segmentBelow, midLine) 169 | 170 | sl.removeSegmentFromSweepline(midLine) 171 | t.is(topLine.segmentAbove, null) 172 | t.is(topLine.segmentBelow, bottomLine) 173 | t.is(bottomLine.segmentAbove, topLine) 174 | }) 175 | 176 | test('Sweepline is correctly sorted again', function (t) { 177 | const e1 = new Event([-1, 0]) 178 | const e2 = new Event([0, 0]) 179 | 180 | e1.otherEvent = e2 181 | e2.otherEvent = e1 182 | e1.isLeftEndpoint = true; 183 | e2.isLeftEndpoint = false; 184 | 185 | const sl = new Sweepline() 186 | const midLine = sl.addSegment(e1) 187 | 188 | t.is(midLine.leftSweepEvent, e1) 189 | t.is(midLine.segmentAbove, null) 190 | t.is(midLine.segmentBelow, null) 191 | 192 | const e3 = new Event([-1.5, 1]) 193 | const e4 = new Event([0, 0]) 194 | 195 | e3.otherEvent = e4 196 | e4.otherEvent = e3 197 | e3.isLeftEndpoint = true; 198 | e4.isLeftEndpoint = false; 199 | 200 | const topLine = sl.addSegment(e3) 201 | 202 | t.is(midLine.segmentAbove, topLine) 203 | t.is(midLine.segmentBelow, null) 204 | t.is(topLine.segmentAbove, null) 205 | t.is(topLine.segmentBelow, midLine) 206 | 207 | const e5 = new Event([-1.5, -1]) 208 | const e6 = new Event([0, 0]) 209 | 210 | e5.otherEvent = e6 211 | e6.otherEvent = e5 212 | e5.isLeftEndpoint = true; 213 | e6.isLeftEndpoint = false; 214 | 215 | const bottomLine = sl.addSegment(e5) 216 | 217 | t.is(midLine.segmentBelow, bottomLine) 218 | t.is(midLine.segmentAbove, topLine) 219 | 220 | t.is(bottomLine.segmentAbove, midLine) 221 | t.is(bottomLine.segmentBelow, null) 222 | 223 | t.is(topLine.segmentAbove, null) 224 | t.is(topLine.segmentBelow, midLine) 225 | 226 | sl.removeSegmentFromSweepline(midLine) 227 | t.is(topLine.segmentAbove, null) 228 | t.is(topLine.segmentBelow, bottomLine) 229 | t.is(bottomLine.segmentAbove, topLine) 230 | }) 231 | -------------------------------------------------------------------------------- /test/benchmark.js: -------------------------------------------------------------------------------- 1 | const path = require('path') 2 | const Benchmark = require('benchmark') 3 | const shamosHoey = require('../dist/shamosHoey.js') 4 | const ShamosHoeyClass = require('../dist/ShamosHoeyClass.js') 5 | const loadJsonFile = require('load-json-file') 6 | const gpsi = require('geojson-polygon-self-intersections') 7 | const findIntersections = require('sweepline-intersections') 8 | const Polygon = require('polygon') 9 | 10 | const switzerland = loadJsonFile.sync(path.join(__dirname, 'fixtures', 'simple', 'switzerland.geojson')) 11 | const switzerlandKinked = loadJsonFile.sync(path.join(__dirname, 'fixtures', 'notSimple', 'switzerlandKinked.geojson')) 12 | 13 | const p = new Polygon(switzerland.geometry.coordinates[0].map(function (c) { 14 | return {x: c[0], y: c[1]} 15 | })) 16 | 17 | 18 | const options = { 19 | onStart () { console.log(this.name) }, 20 | onError (event) { console.log(event.target.error) }, 21 | onCycle (event) { console.log(String(event.target)) }, 22 | onComplete () { 23 | console.log(`- Fastest is ${this.filter('fastest').map('name')}`) 24 | } 25 | } 26 | 27 | // // No intersections 28 | // // ShamosHoey x 3,099 ops/sec ±2.68% (92 runs sampled) 29 | // // SweeplineIntersections x 2,187 ops/sec ±1.21% (91 runs sampled) 30 | // // GPSI x 38.61 ops/sec ±1.09% (52 runs sampled) 31 | // // Polygon x 56.93 ops/sec ±1.67% (59 runs sampled) 32 | // // - Fastest is ShamosHoey 33 | const suite = new Benchmark.Suite('No intersections', options) 34 | suite 35 | .add('ShamosHoey', function () { 36 | shamosHoey(switzerland) 37 | }) 38 | .add('SweeplineIntersections', function () { 39 | findIntersections(switzerland) 40 | }) 41 | .add('GPSI', function () { 42 | gpsi(switzerland) 43 | }) 44 | .add('Polygon', function () { 45 | p.selfIntersections() 46 | }) 47 | .run() 48 | 49 | // // Has intersections 50 | // // ShamosHoey x 4,132 ops/sec ±0.60% (95 runs sampled) 51 | // // SweeplineIntersections x 2,124 ops/sec ±0.70% (92 runs sampled) 52 | // // GPSI x 36.85 ops/sec ±1.06% (64 runs sampled) 53 | // // - Fastest is ShamosHoey 54 | const suite2 = new Benchmark.Suite('Has intersections', options) 55 | suite2 56 | .add('ShamosHoey', function () { 57 | shamosHoey(switzerlandKinked) 58 | }) 59 | .add('SweeplineIntersections', function () { 60 | findIntersections(switzerlandKinked) 61 | }) 62 | .add('GPSI', function () { 63 | gpsi(switzerlandKinked) 64 | }) 65 | .run() 66 | 67 | 68 | const australia = loadJsonFile.sync(path.join(__dirname, 'fixtures', 'simple', 'australia.geojson')) 69 | const australiaCloned = JSON.parse(JSON.stringify(australia)) 70 | 71 | const sh = new ShamosHoeyClass() 72 | sh.addData(australia) 73 | const origQueue = sh.cloneEventQueue() 74 | 75 | const dodgy = {"type":"Polygon","coordinates":[[[118.84943913151847,-16.811150329458684],[118.52591052174026,-25.59473015350593],[122.8387103407811,-19.032645861278503],[123.34733974263227,-18.80875748072417],[121.14147741540722,-22.68578078458678],[126.37907830576232,-20.116523799569723],[121.65114228714121,-23.93346177367237],[125.02959159727202,-23.195468067853863],[126.12641149130553,-22.81860040326713],[119.03219525103522,-25.485584412380504],[119.39800318455788,-25.55463205025944],[127.54387656677083,-29.487193083300923],[122.35031720351296,-27.649625725364988],[123.47301285370993,-28.795077412469848],[123.37987102485879,-30.003560003010495],[118.66405574641,-25.846652793131366],[118.76097413981067,-30.372226109940577],[118.02694166968074,-31.43736242005873],[116.8472348879804,-29.558467024203367],[111.62082428435907,-31.17697379791034],[112.2433255278665,-27.368512907131826],[112.8363095793594,-24.516827799461048],[115.41597087080129,-24.27528502296396],[117.59225089042211,-24.876965010101276],[116.50061468322228,-23.77268242323488],[117.61188910861284,-24.714720279502867],[117.87368057919106,-24.7592686401243],[113.61402112769021,-18.831257150514855],[115.83686195376836,-20.051656454371997],[118.17623805930867,-24.30567608574926],[118.84943913151847,-16.811150329458684]]]} 76 | australiaCloned.geometry.coordinates.push(dodgy.coordinates) 77 | 78 | // Class-based reuse vs recomputing 79 | // ShamosHoey x 1,011 ops/sec ±8.12% (89 runs sampled) 80 | // ShamosHoeyClass x 2,066 ops/sec ±0.60% (93 runs sampled) 81 | // - Fastest is ShamosHoeyClass 82 | const suite3 = new Benchmark.Suite('Larger poly - reuse', options) 83 | suite3 84 | .add('ShamosHoey', function () { 85 | shamosHoey(australiaCloned) 86 | }) 87 | .add('ShamosHoeyClass', function () { 88 | sh.addData(dodgy, origQueue) 89 | sh.isSimple() 90 | }) 91 | .run() 92 | 93 | -------------------------------------------------------------------------------- /test/fillQueue.spec.js: -------------------------------------------------------------------------------- 1 | import test from 'ava'; 2 | import fillEventQueue from '../src/fillQueue' 3 | import EventQueue from '../src/EventQueue' 4 | const loadJsonFile = require('load-json-file') 5 | const path = require('path') 6 | 7 | const diamond = loadJsonFile.sync(path.join(__dirname, 'fixtures', 'simple', 'diamond.geojson')) 8 | 9 | 10 | test('Event queue is filled correctly', function (t) { 11 | const eq = new EventQueue() 12 | 13 | fillEventQueue(diamond, eq) 14 | 15 | const firstEvent = eq.pop(); 16 | 17 | t.deepEqual([firstEvent.x, firstEvent.y], [-1, 0]) 18 | 19 | t.is(firstEvent.isLeftEndpoint, true) 20 | t.is(firstEvent.otherEvent.isLeftEndpoint, false) 21 | }) 22 | 23 | test('Event queue - input is not mutated', function (t) { 24 | const eq = new EventQueue() 25 | const clonedDiamond = JSON.parse(JSON.stringify(diamond)) 26 | 27 | fillEventQueue(diamond, eq) 28 | t.deepEqual(diamond, clonedDiamond) 29 | }) 30 | 31 | test('Event queue - length is correct', function (t) { 32 | const eq = new EventQueue() 33 | 34 | fillEventQueue(diamond, eq) 35 | t.is(eq.length, 8) 36 | }) 37 | -------------------------------------------------------------------------------- /test/fixtures/notSimple/MultiPolygonOverlappingSquares.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "type": "Feature", 3 | "properties": {}, 4 | "geometry": { 5 | "type": "MultiPolygon", 6 | "coordinates": [[ 7 | [ 8 | [ 9 | -3.841095, 10 | -4.724252 11 | ], 12 | [ 13 | 3.181915, 14 | -4.724252 15 | ], 16 | [ 17 | 3.181915, 18 | 3.036298 19 | ], 20 | [ 21 | -3.841095, 22 | 3.036298 23 | ], 24 | [ 25 | -3.841095, 26 | -4.724252 27 | ] 28 | ] 29 | ], 30 | [ 31 | [ 32 | [ 33 | 0.259552, 34 | 0.362546 35 | ], 36 | [ 37 | 7.67395, 38 | 0.362546 39 | ], 40 | [ 41 | 7.67395, 42 | 8.542998 43 | ], 44 | [ 45 | 0.259552, 46 | 8.542998 47 | ], 48 | [ 49 | 0.259552, 50 | 0.362546 51 | ] 52 | ] 53 | ]] 54 | } 55 | } -------------------------------------------------------------------------------- /test/fixtures/notSimple/lineFirstAndLastSegs.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "type": "Feature", 3 | "properties": {}, 4 | "geometry": { 5 | "type": "LineString", 6 | "coordinates": [ 7 | [ 8 | 37.731641, 9 | 10.256141 10 | ], 11 | [ 12 | 7.931798, 13 | 21.878067 14 | ], 15 | [ 16 | 6.644766, 17 | 15.190109 18 | ], 19 | [ 20 | 27.984331, 21 | 9.256647 22 | ], 23 | [ 24 | 37.662038, 25 | 5.289255 26 | ], 27 | [ 28 | 36.227134, 29 | 12.691253 30 | ] 31 | ] 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /test/fixtures/notSimple/lineKinkAtBeginning.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "type": "Feature", 3 | "properties": {}, 4 | "geometry": { 5 | "type": "LineString", 6 | "coordinates": [ 7 | [ 8 | 8.973669, 9 | 14.40409 10 | ], 11 | [ 12 | 7.931798, 13 | 21.878067 14 | ], 15 | [ 16 | 6.644766, 17 | 15.190109 18 | ], 19 | [ 20 | 27.984331, 21 | 9.256647 22 | ], 23 | [ 24 | 37.662038, 25 | 5.289255 26 | ], 27 | [ 28 | 36.227134, 29 | 12.691253 30 | ] 31 | ] 32 | } 33 | } -------------------------------------------------------------------------------- /test/fixtures/notSimple/lineKinked.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "type": "Feature", 3 | "properties": {}, 4 | "geometry": { 5 | "type": "LineString", 6 | "coordinates": [ 7 | [ 8 | 15.8203125, 9 | 33.137551192346145 10 | ], 11 | [ 12 | -11.953125, 13 | 3.162455530237848 14 | ], 15 | [ 16 | 26.3671875, 17 | -13.2399454992863 18 | ], 19 | [ 20 | -16.171875, 21 | 35.17380831799959 22 | ] 23 | ] 24 | } 25 | } -------------------------------------------------------------------------------- /test/fixtures/notSimple/lineKinkedOnEnd.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "type": "Feature", 3 | "properties": {}, 4 | "geometry": { 5 | "type": "LineString", 6 | "coordinates": [ 7 | [ 8 | -12.528025, 9 | 21.953236 10 | ], 11 | [ 12 | 6.644766, 13 | 15.190109 14 | ], 15 | [ 16 | 27.984331, 17 | 9.256647 18 | ], 19 | [ 20 | 37.662038, 21 | 5.289255 22 | ], 23 | [ 24 | 36.227134, 25 | 12.691253 26 | ], 27 | [ 28 | 29.523591, 29 | -1.537901 30 | ] 31 | ] 32 | } 33 | } -------------------------------------------------------------------------------- /test/fixtures/notSimple/multilineKinked.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "type": "Feature", 3 | "properties": {}, 4 | "geometry": { 5 | "type": "MultiLineString", 6 | "coordinates": [[ 7 | [ 8 | 15.8203125, 9 | 33.137551192346145 10 | ], 11 | [ 12 | -11.953125, 13 | 3.162455530237848 14 | ], 15 | [ 16 | 26.3671875, 17 | -13.2399454992863 18 | ], 19 | [ 20 | -16.171875, 21 | 35.17380831799959 22 | ] 23 | ]] 24 | } 25 | } -------------------------------------------------------------------------------- /test/fixtures/notSimple/overlappingSegments.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "type": "Feature", 3 | "properties": {}, 4 | "geometry": { 5 | "type": "Polygon", 6 | "coordinates": [ 7 | [ 8 | [ 9 | 0, 10 | 0 11 | ], 12 | [ 13 | 1, 14 | 0 15 | ], 16 | [ 17 | 1, 18 | 2 19 | ], 20 | [ 21 | 1, 22 | 1 23 | ], 24 | [ 25 | 0, 26 | 1 27 | ], 28 | [ 29 | 0, 30 | 0 31 | ] 32 | ] 33 | ] 34 | } 35 | } -------------------------------------------------------------------------------- /test/fixtures/notSimple/overlappingSegmentsHorizontal.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "type": "Feature", 3 | "properties": {}, 4 | "geometry": { 5 | "type": "Polygon", 6 | "coordinates": [ 7 | [ 8 | [ 9 | 0, 10 | 0 11 | ], 12 | [ 13 | 2, 14 | 0 15 | ], 16 | [ 17 | 1, 18 | 0 19 | ], 20 | [ 21 | 1, 22 | 1 23 | ], 24 | [ 25 | 0, 26 | 1 27 | ], 28 | [ 29 | 0, 30 | 0 31 | ] 32 | ] 33 | ] 34 | } 35 | } -------------------------------------------------------------------------------- /test/fixtures/notSimple/regression1.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "type": "Feature", 3 | "properties": {}, 4 | "geometry": { 5 | "type": "Polygon", 6 | "coordinates": [ 7 | [ 8 | [ 9 | 21.93714169311524, 10 | 49.99999999999999 11 | ], 12 | [ 13 | 21.93386869311524, 14 | 49.99999999999999 15 | ], 16 | [ 17 | 21.935276985168457, 18 | 49.9978502051677 19 | ], 20 | [ 21 | 21.934096813201904, 22 | 49.99871917789335 23 | ], 24 | [ 25 | 21.938889693115243, 26 | 49.997151 27 | ], 28 | [ 29 | 21.93714169311524, 30 | 49.99999999999999 31 | ] 32 | ] 33 | ] 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /test/fixtures/notSimple/regression2.geojson: -------------------------------------------------------------------------------- 1 | {"type":"Polygon","coordinates":[[[233,115],[190,186],[247,260],[430,304],[531,244],[510,170],[415,104],[553,196],[233,115]]]} -------------------------------------------------------------------------------- /test/fixtures/notSimple/switzerlandKinked.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "type": "Feature", 3 | "properties": { 4 | "ADMIN": "Switzerland", 5 | "ISO_A3": "CHE" 6 | }, 7 | "geometry": { 8 | "type": "Polygon", 9 | "coordinates": [ 10 | [ 11 | [ 12 | 8.61743737800009, 13 | 47.75731862400008 14 | ], 15 | [ 16 | 8.607618856000101, 17 | 47.76225372300013 18 | ], 19 | [ 20 | 8.604104858000142, 21 | 47.774397685000025 22 | ], 23 | [ 24 | 8.603174682000088, 25 | 47.78731679300003 26 | ], 27 | [ 28 | 8.601624390000069, 29 | 47.7946031700001 30 | ], 31 | [ 32 | 8.58312422700007, 33 | 47.800235901000036 34 | ], 35 | [ 36 | 8.558216187000085, 37 | 47.80116607700009 38 | ], 39 | [ 40 | 8.542299846000077, 41 | 47.79501658100011 42 | ], 43 | [ 44 | 8.55160160300008, 45 | 47.779255270000135 46 | ], 47 | [ 48 | 8.536512085000084, 49 | 47.77408762600004 50 | ], 51 | [ 52 | 8.482665242000053, 53 | 47.76685292600007 54 | ], 55 | [ 56 | 8.471503133000112, 57 | 47.76705963200004 58 | ], 59 | [ 60 | 8.463648315000086, 61 | 47.763907370000084 62 | ], 63 | [ 64 | 8.450109090000097, 65 | 47.750471497000035 66 | ], 67 | [ 68 | 8.445458211000044, 69 | 47.743185120000135 70 | ], 71 | [ 72 | 8.437913452000089, 73 | 47.723186341000115 74 | ], 75 | [ 76 | 8.427268107000117, 77 | 47.716468404000096 78 | ], 79 | [ 80 | 8.401946655000131, 81 | 47.707089132000135 82 | ], 83 | [ 84 | 8.392128133000142, 85 | 47.69951853500007 86 | ], 87 | [ 88 | 8.39099125100006, 89 | 47.69212880500007 90 | ], 91 | [ 92 | 8.395228719000102, 93 | 47.68481659000008 94 | ], 95 | [ 96 | 8.397709188000078, 97 | 47.676289979000074 98 | ], 99 | [ 100 | 8.39130131000013, 101 | 47.66546376500011 102 | ], 103 | [ 104 | 8.40701094500011, 105 | 47.66156219500007 106 | ], 107 | [ 108 | 8.411971883000149, 109 | 47.66104543000003 110 | ], 111 | [ 112 | 8.43760339400012, 113 | 47.64784210200014 114 | ], 115 | [ 116 | 8.458273966000121, 117 | 47.63988393200009 118 | ], 119 | [ 120 | 8.476050659000066, 121 | 47.640400696000114 122 | ], 123 | [ 124 | 8.490830119000066, 125 | 47.64556833900011 126 | ], 127 | [ 128 | 8.504679402000136, 129 | 47.65226043700005 130 | ], 131 | [ 132 | 8.519665568000107, 133 | 47.65735056600002 134 | ], 135 | [ 136 | 8.568241414000113, 137 | 47.66293162100004 138 | ], 139 | [ 140 | 8.582194051000101, 141 | 47.6613296510001 142 | ], 143 | [ 144 | 8.593588683000092, 145 | 47.658168560000036 146 | ], 147 | [ 148 | 8.598213745000066, 149 | 47.656885478000106 150 | ], 151 | [ 152 | 8.607308797000115, 153 | 47.65629119900004 154 | ], 155 | [ 156 | 8.601624390000069, 157 | 47.6325975550001 158 | ], 159 | [ 160 | 8.595113159000107, 161 | 47.634819641 162 | ], 163 | [ 164 | 8.594493042000039, 165 | 47.64096913700007 166 | ], 167 | [ 168 | 8.593562866000099, 169 | 47.642571106000105 170 | ], 171 | [ 172 | 8.589222046000117, 173 | 47.64246775400008 174 | ], 175 | [ 176 | 8.583951050000081, 177 | 47.64112416600011 178 | ], 179 | [ 180 | 8.580333699000107, 181 | 47.63900543200003 182 | ], 183 | [ 184 | 8.578059936000074, 185 | 47.63347605400014 186 | ], 187 | [ 188 | 8.579713583000114, 189 | 47.62892852900009 190 | ], 191 | [ 192 | 8.582090698000087, 193 | 47.625026957000046 194 | ], 195 | [ 196 | 8.582504110000087, 197 | 47.62159047500009 198 | ], 199 | [ 200 | 8.581263875000047, 201 | 47.614769186000046 202 | ], 203 | [ 204 | 8.581780639000101, 205 | 47.60766367700012 206 | ], 207 | [ 208 | 8.580643758000093, 209 | 47.600170594000076 210 | ], 211 | [ 212 | 8.576305366000042, 213 | 47.595023058000066 214 | ], 215 | [ 216 | 8.574132527000103, 217 | 47.59244496700009 218 | ], 219 | [ 220 | 8.560696655000072, 221 | 47.58939605700007 222 | ], 223 | [ 224 | 8.551719149000036, 225 | 47.59686332900009 226 | ], 227 | [ 228 | 8.54963789900006, 229 | 47.59859446200005 230 | ], 231 | [ 232 | 8.53775231900002, 233 | 47.61213368800014 234 | ], 235 | [ 236 | 8.522352742000038, 237 | 47.621900534000076 238 | ], 239 | [ 240 | 8.492380411000084, 241 | 47.619833476000025 242 | ], 243 | [ 244 | 8.46178796400008, 245 | 47.606139221 246 | ], 247 | [ 248 | 8.450109090000097, 249 | 47.58903432300005 250 | ], 251 | [ 252 | 8.448868856000075, 253 | 47.58428009100007 254 | ], 255 | [ 256 | 8.421100326000044, 257 | 47.581111870000115 258 | ], 259 | [ 260 | 8.41806970200011, 261 | 47.5807660940001 262 | ], 263 | [ 264 | 8.354094279000037, 265 | 47.58102447500008 266 | ], 267 | [ 268 | 8.316163777000014, 269 | 47.587845764000036 270 | ], 271 | [ 272 | 8.306345255000053, 273 | 47.592186585000036 274 | ], 275 | [ 276 | 8.299317260000038, 277 | 47.60182423900005 278 | ], 279 | [ 280 | 8.293942912000091, 281 | 47.61146189400006 282 | ], 283 | [ 284 | 8.288568562000108, 285 | 47.615802715000115 286 | ], 287 | [ 288 | 8.276993042000072, 289 | 47.61662953700005 290 | ], 291 | [ 292 | 8.251051473000132, 293 | 47.6220038860001 294 | ], 295 | [ 296 | 8.232964721000116, 297 | 47.6219522100001 298 | ], 299 | [ 300 | 8.17901452600006, 301 | 47.615802715000115 302 | ], 303 | [ 304 | 8.173846883000067, 305 | 47.613528951000035 306 | ], 307 | [ 308 | 8.168885946000103, 309 | 47.608645528000096 310 | ], 311 | [ 312 | 8.162064656000041, 313 | 47.60376210500007 314 | ], 315 | [ 316 | 8.14377119900007, 317 | 47.60006724100006 318 | ], 319 | [ 320 | 8.122067098000088, 321 | 47.592134908000105 322 | ], 323 | [ 324 | 8.113902221000075, 325 | 47.587845764000036 326 | ], 327 | [ 328 | 8.105427286000065, 329 | 47.58125701900005 330 | ], 331 | [ 332 | 8.10139652500007, 333 | 47.57619272900007 334 | ], 335 | [ 336 | 8.09695235100014, 337 | 47.57185190900009 338 | ], 339 | [ 340 | 8.08723718200011, 341 | 47.567381897000075 342 | ], 343 | [ 344 | 8.042278686000088, 345 | 47.56056060800012 346 | ], 347 | [ 348 | 7.91215743000015, 349 | 47.56056060800012 350 | ], 351 | [ 352 | 7.909470256000105, 353 | 47.56479807600007 354 | ], 355 | [ 356 | 7.907506551000097, 357 | 47.574177348000035 358 | ], 359 | [ 360 | 7.904302613000112, 361 | 47.58355662100007 362 | ], 363 | [ 364 | 7.898204794000066, 365 | 47.587845764000036 366 | ], 367 | [ 368 | 7.83371260600012, 369 | 47.590481263000044 370 | ], 371 | [ 372 | 7.819656616000117, 373 | 47.59533884700008 374 | ], 375 | [ 376 | 7.801466512000076, 377 | 47.57608937600014 378 | ], 379 | [ 380 | 7.78555017100004, 381 | 47.563196106000134 382 | ], 383 | [ 384 | 7.766739949000055, 385 | 47.55596140600008 386 | ], 387 | [ 388 | 7.727320447000125, 389 | 47.550422624000106 390 | ], 391 | [ 392 | 7.683437540000114, 393 | 47.5442566940001 394 | ], 395 | [ 396 | 7.661423380000116, 397 | 47.54624623600003 398 | ], 399 | [ 400 | 7.64690103500007, 401 | 47.55144523600006 402 | ], 403 | [ 404 | 7.609746948000094, 405 | 47.56474639900006 406 | ], 407 | [ 408 | 7.612337281000094, 409 | 47.56473104100013 410 | ], 411 | [ 412 | 7.635895223000091, 413 | 47.5645913700001 414 | ], 415 | [ 416 | 7.646540568000091, 417 | 47.5715418500001 418 | ], 419 | [ 420 | 7.65966638200004, 421 | 47.59657908200012 422 | ], 423 | [ 424 | 7.637032104000099, 425 | 47.594977112000066 426 | ], 427 | [ 428 | 7.586028488000125, 429 | 47.58461854400011 430 | ], 431 | [ 432 | 7.585482836000097, 433 | 47.584479135 434 | ], 435 | [ 436 | 7.550319051000116, 437 | 47.57549509700007 438 | ], 439 | [ 440 | 7.52634118600011, 441 | 47.56645172100011 442 | ], 443 | [ 444 | 7.520866596000104, 445 | 47.563416048000136 446 | ], 447 | [ 448 | 7.482726278000058, 449 | 47.54226715100006 450 | ], 451 | [ 452 | 7.485103394000106, 453 | 47.54159535700006 454 | ], 455 | [ 456 | 7.501743205000139, 457 | 47.532965394000115 458 | ], 459 | [ 460 | 7.505153850000056, 461 | 47.53301707000014 462 | ], 463 | [ 464 | 7.505463908000138, 465 | 47.52301768100003 466 | ], 467 | [ 468 | 7.501123087000082, 469 | 47.51730743400006 470 | ], 471 | [ 472 | 7.493061564000072, 473 | 47.51549875900008 474 | ], 475 | [ 476 | 7.482726278000058, 477 | 47.51699737600009 478 | ], 479 | [ 480 | 7.476938517000093, 481 | 47.51487864300012 482 | ], 483 | [ 484 | 7.475594930000028, 485 | 47.511726379000066 486 | ], 487 | [ 488 | 7.477765340000104, 489 | 47.50769561800007 490 | ], 491 | [ 492 | 7.484896688000049, 493 | 47.50090016700011 494 | ], 495 | [ 496 | 7.485776134000076, 497 | 47.49876751100004 498 | ], 499 | [ 500 | 7.485930217000146, 501 | 47.498393860000135 502 | ], 503 | [ 504 | 7.485826864000103, 505 | 47.49578420000012 506 | ], 507 | [ 508 | 7.484483276000049, 509 | 47.49294199700006 510 | ], 511 | [ 512 | 7.482726278000058, 513 | 47.491262512000105 514 | ], 515 | [ 516 | 7.467430053000101, 517 | 47.48190907800006 518 | ], 519 | [ 520 | 7.454510946000113, 521 | 47.483200989000096 522 | ], 523 | [ 524 | 7.445995797000137, 525 | 47.48688412900012 526 | ], 527 | [ 528 | 7.44148848500015, 529 | 47.48883372000003 530 | ], 531 | [ 532 | 7.425985555000068, 533 | 47.49250274700003 534 | ], 535 | [ 536 | 7.414306681000085, 537 | 47.490177307000096 538 | ], 539 | [ 540 | 7.414410034000099, 541 | 47.484027812000136 542 | ], 543 | [ 544 | 7.419474325000095, 545 | 47.477852478000045 546 | ], 547 | [ 548 | 7.422781616000094, 549 | 47.475423686000084 550 | ], 551 | [ 552 | 7.427639200000101, 553 | 47.47074696900012 554 | ], 555 | [ 556 | 7.429292847000056, 557 | 47.4651142380001 558 | ], 559 | [ 560 | 7.426088908000082, 561 | 47.45576080300006 562 | ], 563 | [ 564 | 7.420563120000111, 565 | 47.450857028000115 566 | ], 567 | [ 568 | 7.406348511000118, 569 | 47.438242493000075 570 | ], 571 | [ 572 | 7.388218887000107, 573 | 47.43328886000012 574 | ], 575 | [ 576 | 7.37854659000007, 577 | 47.430646058000036 578 | ], 579 | [ 580 | 7.336930048000085, 581 | 47.43185368000013 582 | ], 583 | [ 584 | 7.309093465000103, 585 | 47.43266143800008 586 | ], 587 | [ 588 | 7.28263513200011, 589 | 47.42888905900014 590 | ], 591 | [ 592 | 7.244807984000119, 593 | 47.41772694900001 594 | ], 595 | [ 596 | 7.2380900470001, 597 | 47.41679677300007 598 | ], 599 | [ 600 | 7.230338583000105, 601 | 47.41901886100007 602 | ], 603 | [ 604 | 7.226307820000102, 605 | 47.422636211000054 606 | ], 607 | [ 608 | 7.223517293000043, 609 | 47.426227723000125 610 | ], 611 | [ 612 | 7.219383179000118, 613 | 47.42847564700014 614 | ], 615 | [ 616 | 7.190030965000034, 617 | 47.43472849600005 618 | ], 619 | [ 620 | 7.168326863000061, 621 | 47.44356516500005 622 | ], 623 | [ 624 | 7.1626424560001, 625 | 47.45989491800006 626 | ], 627 | [ 628 | 7.180832560000056, 629 | 47.48826528000009 630 | ], 631 | [ 632 | 7.15365075700015, 633 | 47.48640492800007 634 | ], 635 | [ 636 | 7.142169389000088, 637 | 47.487650968000054 638 | ], 639 | [ 640 | 7.140318237000116, 641 | 47.487851868000064 642 | ], 643 | [ 644 | 7.127295776000096, 645 | 47.49294199700006 646 | ], 647 | [ 648 | 7.103731323000091, 649 | 47.49627512600006 650 | ], 651 | [ 652 | 7.053915242000073, 653 | 47.49038401300007 654 | ], 655 | [ 656 | 7.027973674000094, 657 | 47.49294199700006 658 | ], 659 | [ 660 | 7.018878621000056, 661 | 47.49767039000005 662 | ], 663 | [ 664 | 7.009783569000149, 665 | 47.49924652200008 666 | ], 667 | [ 668 | 7.000791870000114, 669 | 47.49767039000005 670 | ], 671 | [ 672 | 6.991903524000094, 673 | 47.49294199700006 674 | ], 675 | [ 676 | 6.973300008000138, 677 | 47.489092103000104 678 | ], 679 | [ 680 | 6.975780477000114, 681 | 47.47795583100009 682 | ], 683 | [ 684 | 6.986115763000043, 685 | 47.46413238500011 686 | ], 687 | [ 688 | 6.990973348000068, 689 | 47.45222096800009 690 | ], 691 | [ 692 | 6.983428589000113, 693 | 47.44379770900011 694 | ], 695 | [ 696 | 6.968545777000145, 697 | 47.43519358300006 698 | ], 699 | [ 700 | 6.952319376000048, 701 | 47.428837383000115 702 | ], 703 | [ 704 | 6.926067749000112, 705 | 47.42485829700004 706 | ], 707 | [ 708 | 6.924517456000103, 709 | 47.40599640000002 710 | ], 711 | [ 712 | 6.898782593000107, 713 | 47.39571279000003 714 | ], 715 | [ 716 | 6.884003133000078, 717 | 47.382586976000056 718 | ], 719 | [ 720 | 6.871600789000127, 721 | 47.3669548550001 722 | ], 723 | [ 724 | 6.866639852000077, 725 | 47.354164937000036 726 | ], 727 | [ 728 | 6.985598999000104, 729 | 47.362123108000105 730 | ], 731 | [ 732 | 7.003995809000088, 733 | 47.36814341300004 734 | ], 735 | [ 736 | 7.018878621000056, 737 | 47.3599010210001 738 | ], 739 | [ 740 | 7.033864787000113, 741 | 47.350650940000094 742 | ], 743 | [ 744 | 7.044303426000056, 745 | 47.340496521000034 746 | ], 747 | [ 748 | 7.036551961000043, 749 | 47.32951527900005 750 | ], 751 | [ 752 | 7.027146850000094, 753 | 47.32543284100004 754 | ], 755 | [ 756 | 7.016914917000094, 757 | 47.3235208130001 758 | ], 759 | [ 760 | 7.00647627800015, 761 | 47.319360860000074 762 | ], 763 | [ 764 | 6.991903524000094, 765 | 47.30595082700006 766 | ], 767 | [ 768 | 6.986529174000054, 769 | 47.30450388700007 770 | ], 771 | [ 772 | 6.97743412300008, 773 | 47.303728739000036 774 | ], 775 | [ 776 | 6.958623901000067, 777 | 47.29055125000005 778 | ], 779 | [ 780 | 6.952216024000023, 781 | 47.27003570500008 782 | ], 783 | [ 784 | 6.956246785000104, 785 | 47.24523101800014 786 | ], 787 | [ 788 | 6.88834395300006, 789 | 47.211305441000036 790 | ], 791 | [ 792 | 6.859301798000075, 793 | 47.1909190880001 794 | ], 795 | [ 796 | 6.840284871000108, 797 | 47.169525045000086 798 | ], 799 | [ 800 | 6.838076256000079, 801 | 47.16813159700007 802 | ], 803 | [ 804 | 6.774759155000112, 805 | 47.128183899000135 806 | ], 807 | [ 808 | 6.744786824000073, 809 | 47.121052551000105 810 | ], 811 | [ 812 | 6.746027059000113, 813 | 47.10394765300006 814 | ], 815 | [ 816 | 6.731661011000085, 817 | 47.098883363000084 818 | ], 819 | [ 820 | 6.727940307000097, 821 | 47.097126363000115 822 | ], 823 | [ 824 | 6.724219604000069, 825 | 47.09077016200007 826 | ], 827 | [ 828 | 6.699104858000055, 829 | 47.08462066700011 830 | ], 831 | [ 832 | 6.689699747000105, 833 | 47.07829030400009 834 | ], 835 | [ 836 | 6.676263875000132, 837 | 47.06239980100008 838 | ], 839 | [ 840 | 6.688252807000112, 841 | 47.04384796100004 842 | ], 843 | [ 844 | 6.665411824000103, 845 | 47.0212911990001 846 | ], 847 | [ 848 | 6.598697550000082, 849 | 46.986538798000055 850 | ], 851 | [ 852 | 6.491107218000138, 853 | 46.96338775700008 854 | ], 855 | [ 856 | 6.442634725000062, 857 | 46.944164124000054 858 | ], 859 | [ 860 | 6.427751913000122, 861 | 46.909075827 862 | ], 863 | [ 864 | 6.431886027000132, 865 | 46.900032451000044 866 | ], 867 | [ 868 | 6.445218546000064, 869 | 46.882617493000026 870 | ], 871 | [ 872 | 6.448422486000141, 873 | 46.871558737000015 874 | ], 875 | [ 876 | 6.4467688390001, 877 | 46.85770945300007 878 | ], 879 | [ 880 | 6.443117662000049, 881 | 46.8514551210001 882 | ], 883 | [ 884 | 6.441187785000068, 885 | 46.84814931300005 886 | ], 887 | [ 888 | 6.434263143000095, 889 | 46.83954518700011 890 | ], 891 | [ 892 | 6.418553507000127, 893 | 46.80701487200008 894 | ], 895 | [ 896 | 6.417106568000122, 897 | 46.802157288000075 898 | ], 899 | [ 900 | 6.419897095000096, 901 | 46.796524557000026 902 | ], 903 | [ 904 | 6.425168090000113, 905 | 46.79161529600009 906 | ], 907 | [ 908 | 6.432609497000044, 909 | 46.78598256500007 910 | ], 911 | [ 912 | 6.433022908000055, 913 | 46.76911021000009 914 | ], 915 | [ 916 | 6.429198853000116, 917 | 46.760816142000124 918 | ], 919 | [ 920 | 6.417933390000144, 921 | 46.75110097300009 922 | ], 923 | [ 924 | 6.407391398000101, 925 | 46.745700786000015 926 | ], 927 | [ 928 | 6.374215128000088, 929 | 46.73360850100005 930 | ], 931 | [ 932 | 6.347860148000109, 933 | 46.71317047200009 934 | ], 935 | [ 936 | 6.337938273000106, 937 | 46.70740855000011 938 | ], 939 | [ 940 | 6.266314738000062, 941 | 46.68035593700006 942 | ], 943 | [ 944 | 6.131852661000039, 945 | 46.59560658800004 946 | ], 947 | [ 948 | 6.118416789000065, 949 | 46.58346262600014 950 | ], 951 | [ 952 | 6.12151737500011, 953 | 46.57028513700007 954 | ], 955 | [ 956 | 6.145701945000099, 957 | 46.5516299440001 958 | ], 959 | [ 960 | 6.110355265000095, 961 | 46.52083079000002 962 | ], 963 | [ 964 | 6.075525349000117, 965 | 46.479592998000015 966 | ], 967 | [ 968 | 6.064156535000052, 969 | 46.47111806300012 970 | ], 971 | [ 972 | 6.060229126000081, 973 | 46.46502024400007 974 | ], 975 | [ 976 | 6.060229126000081, 977 | 46.45990427700008 978 | ], 979 | [ 980 | 6.062399536000072, 981 | 46.45520172200008 982 | ], 983 | [ 984 | 6.064776652000091, 985 | 46.451067607000056 986 | ], 987 | [ 988 | 6.065500122000088, 989 | 46.447992859000124 990 | ], 991 | [ 992 | 6.065500122000088, 993 | 46.44037058600006 994 | ], 995 | [ 996 | 6.06756717900015, 997 | 46.433600973000125 998 | ], 999 | [ 1000 | 6.065706827000071, 1001 | 46.42701222800014 1002 | ], 1003 | [ 1004 | 6.054234660000134, 1005 | 46.41941579200008 1006 | ], 1007 | [ 1008 | 6.059019361000082, 1009 | 46.4173832110001 1010 | ], 1011 | [ 1012 | 6.108184855000104, 1013 | 46.39649729400014 1014 | ], 1015 | [ 1016 | 6.12286096200009, 1017 | 46.38554189100006 1018 | ], 1019 | [ 1020 | 6.135056600000098, 1021 | 46.37040069600005 1022 | ], 1023 | [ 1024 | 6.136400187000078, 1025 | 46.359341940000036 1026 | ], 1027 | [ 1028 | 6.118607037000089, 1029 | 46.3317710850001 1030 | ], 1031 | [ 1032 | 6.104050740000076, 1033 | 46.30921580000012 1034 | ], 1035 | [ 1036 | 6.100743448000088, 1037 | 46.30141265900011 1038 | ], 1039 | [ 1040 | 6.093612101000133, 1041 | 46.27309397400012 1042 | ], 1043 | [ 1044 | 6.093095337000108, 1045 | 46.26229360000008 1046 | ], 1047 | [ 1048 | 6.094025513000133, 1049 | 46.253043518000055 1050 | ], 1051 | [ 1052 | 6.089684692000077, 1053 | 46.24637725900004 1054 | ], 1055 | [ 1056 | 6.067670532000079, 1057 | 46.24162302700006 1058 | ], 1059 | [ 1060 | 6.061882772000104, 1061 | 46.24115793900003 1062 | ], 1063 | [ 1064 | 6.055888305000082, 1065 | 46.241674704000076 1066 | ], 1067 | [ 1068 | 6.048033488000044, 1069 | 46.243431702000066 1070 | ], 1071 | [ 1072 | 6.04617313600005, 1073 | 46.24353505500008 1074 | ], 1075 | [ 1076 | 6.044519491000102, 1077 | 46.243431702000066 1078 | ], 1079 | [ 1080 | 6.042865844000062, 1081 | 46.243069967000054 1082 | ], 1083 | [ 1084 | 5.982921183000144, 1085 | 46.22270945200012 1086 | ], 1087 | [ 1088 | 5.958529907000127, 1089 | 46.2119607540001 1090 | ], 1091 | [ 1092 | 5.954809204000128, 1093 | 46.199920146000125 1094 | ], 1095 | [ 1096 | 5.965247843000071, 1097 | 46.186225891000106 1098 | ], 1099 | [ 1100 | 5.982921183000144, 1101 | 46.170826314000124 1102 | ], 1103 | [ 1104 | 5.979820597000128, 1105 | 46.16224802700009 1106 | ], 1107 | [ 1108 | 5.972172485000044, 1109 | 46.152171122000055 1110 | ], 1111 | [ 1112 | 5.958839966000113, 1113 | 46.13046702100007 1114 | ], 1115 | [ 1116 | 5.982921183000144, 1117 | 46.140440572000074 1118 | ], 1119 | [ 1120 | 6.028293090000091, 1121 | 46.14793365500009 1122 | ], 1123 | [ 1124 | 6.073871704000084, 1125 | 46.14917389000004 1126 | ], 1127 | [ 1128 | 6.107874796000118, 1129 | 46.13863189700007 1130 | ], 1131 | [ 1132 | 6.140327596000134, 1133 | 46.150207418000036 1134 | ], 1135 | [ 1136 | 6.191383911000088, 1137 | 46.1917035940001 1138 | ], 1139 | [ 1140 | 6.255359335000094, 1141 | 46.22110748400007 1142 | ], 1143 | [ 1144 | 6.281197550000115, 1145 | 46.24007273400014 1146 | ], 1147 | [ 1148 | 6.276029907000094, 1149 | 46.263120423 1150 | ], 1151 | [ 1152 | 6.269001912000078, 1153 | 46.265239156000064 1154 | ], 1155 | [ 1156 | 6.252258748000145, 1157 | 46.259916484000115 1158 | ], 1159 | [ 1160 | 6.241820109000116, 1161 | 46.263688864000045 1162 | ], 1163 | [ 1164 | 6.237582642000064, 1165 | 46.2679263310001 1166 | ], 1167 | [ 1168 | 6.227970825000057, 1169 | 46.28446278900009 1170 | ], 1171 | [ 1172 | 6.227454060000099, 1173 | 46.2884935510001 1174 | ], 1175 | [ 1176 | 6.21825565600011, 1177 | 46.30549509700012 1178 | ], 1179 | [ 1180 | 6.214121541000083, 1181 | 46.31546864900011 1182 | ], 1183 | [ 1184 | 6.219495890000133, 1185 | 46.32911122700003 1186 | ], 1187 | [ 1188 | 6.240579874000076, 1189 | 46.34895497700012 1190 | ], 1191 | [ 1192 | 6.269105265000121, 1193 | 46.3750257370001 1194 | ], 1195 | [ 1196 | 6.301558065000052, 1197 | 46.394481914000096 1198 | ], 1199 | [ 1200 | 6.332357218000112, 1201 | 46.40138071700008 1202 | ], 1203 | [ 1204 | 6.365223430000128, 1205 | 46.40244008400006 1206 | ], 1207 | [ 1208 | 6.397676229000069, 1209 | 46.4081761680001 1210 | ], 1211 | [ 1212 | 6.482942342000115, 1213 | 46.44858713800008 1214 | ], 1215 | [ 1216 | 6.547021118000117, 1217 | 46.457372132000074 1218 | ], 1219 | [ 1220 | 6.613683716000139, 1221 | 46.45589935400008 1222 | ], 1223 | [ 1224 | 6.762666870000118, 1225 | 46.42926015200004 1226 | ], 1227 | [ 1228 | 6.77771555400011, 1229 | 46.42410649300004 1230 | ], 1231 | [ 1232 | 6.777756388000114, 1233 | 46.42409250900005 1234 | ], 1235 | [ 1236 | 6.787058146000049, 1237 | 46.41417063500003 1238 | ], 1239 | [ 1240 | 6.78810673300012, 1241 | 46.40500797800007 1242 | ], 1243 | [ 1244 | 6.789228556000126, 1245 | 46.395205383000075 1246 | ], 1247 | [ 1248 | 6.782097209000114, 1249 | 46.37846222000013 1250 | ], 1251 | [ 1252 | 6.755742228000145, 1253 | 46.357068177000116 1254 | ], 1255 | [ 1256 | 6.750367879000095, 1257 | 46.34551849400009 1258 | ], 1259 | [ 1260 | 6.769488159000076, 1261 | 46.32267751100008 1262 | ], 1263 | [ 1264 | 6.804938192000094, 1265 | 46.2966067510001 1266 | ], 1267 | [ 1268 | 6.827675822000089, 1269 | 46.26947662400002 1270 | ], 1271 | [ 1272 | 6.792225789000071, 1273 | 46.22167592400004 1274 | ], 1275 | [ 1276 | 6.774862508000126, 1277 | 46.185864156 1278 | ], 1279 | [ 1280 | 6.765664103000034, 1281 | 46.1516026810001 1282 | ], 1283 | [ 1284 | 6.774345743000083, 1285 | 46.134807841000054 1286 | ], 1287 | [ 1288 | 6.853927449000111, 1289 | 46.12261220300013 1290 | ], 1291 | [ 1292 | 6.869223673000079, 1293 | 46.112328593000115 1294 | ], 1295 | [ 1296 | 6.868190144000096, 1297 | 46.10468048200005 1298 | ], 1299 | [ 1300 | 6.861162150000098, 1301 | 46.09703236900006 1302 | ], 1303 | [ 1304 | 6.853100627000089, 1305 | 46.09021108100012 1306 | ], 1307 | [ 1308 | 6.848553100000061, 1309 | 46.08504343700011 1310 | ], 1311 | [ 1312 | 6.851343628000109, 1313 | 46.086025290000094 1314 | ], 1315 | [ 1316 | 6.853100627000089, 1317 | 46.07610341400007 1318 | ], 1319 | [ 1320 | 6.853410685000085, 1321 | 46.065664775000045 1322 | ], 1323 | [ 1324 | 6.851963745000091, 1325 | 46.06468292200009 1326 | ], 1327 | [ 1328 | 6.852377156000102, 1329 | 46.056931458000065 1330 | ], 1331 | [ 1332 | 6.850310099000126, 1333 | 46.05274566700004 1334 | ], 1335 | [ 1336 | 6.850930216000108, 1337 | 46.04964508100011 1338 | ], 1339 | [ 1340 | 6.859715210000104, 1341 | 46.04499420200003 1342 | ], 1343 | [ 1344 | 6.869223673000079, 1345 | 46.044064026000086 1346 | ], 1347 | [ 1348 | 6.876871786000066, 1349 | 46.04809478800007 1350 | ], 1351 | [ 1352 | 6.884003133000078, 1353 | 46.053210755000066 1354 | ], 1355 | [ 1356 | 6.892374715000074, 1357 | 46.055587871000114 1358 | ], 1359 | [ 1360 | 6.91511234500004, 1361 | 46.048611553000114 1362 | ], 1363 | [ 1364 | 6.982808471000055, 1365 | 45.995384827000066 1366 | ], 1367 | [ 1368 | 6.987666056000052, 1369 | 45.99311106400003 1370 | ], 1371 | [ 1372 | 6.991283406000122, 1373 | 45.98246571900006 1374 | ], 1375 | [ 1376 | 7.002755575000066, 1377 | 45.961691793000085 1378 | ], 1379 | [ 1380 | 7.009783569000149, 1381 | 45.943398336000115 1382 | ], 1383 | [ 1384 | 7.015157918000114, 1385 | 45.93332143100008 1386 | ], 1387 | [ 1388 | 7.022082560000115, 1389 | 45.925259909 1390 | ], 1391 | [ 1392 | 7.066937703000093, 1393 | 45.89022328800007 1394 | ], 1395 | [ 1396 | 7.090192097000113, 1397 | 45.88050811800014 1398 | ], 1399 | [ 1400 | 7.120887899000138, 1401 | 45.876115621000054 1402 | ], 1403 | [ 1404 | 7.153547404000022, 1405 | 45.876529033000054 1406 | ], 1407 | [ 1408 | 7.183726440000044, 1409 | 45.88045644200011 1410 | ], 1411 | [ 1412 | 7.245428100000083, 1413 | 45.898129782000126 1414 | ], 1415 | [ 1416 | 7.273540079000043, 1417 | 45.91027374300003 1418 | ], 1419 | [ 1420 | 7.286665893000105, 1421 | 45.913426005000076 1422 | ], 1423 | [ 1424 | 7.361803426000108, 1425 | 45.90784495100007 1426 | ], 1427 | [ 1428 | 7.393842814000038, 1429 | 45.91569976800011 1430 | ], 1431 | [ 1432 | 7.452960652000087, 1433 | 45.94587880500009 1434 | ], 1435 | [ 1436 | 7.482726278000058, 1437 | 45.95487050400004 1438 | ], 1439 | [ 1440 | 7.503706909000073, 1441 | 45.956730855000046 1442 | ], 1443 | [ 1444 | 7.514662312000041, 1445 | 45.966704407000066 1446 | ], 1447 | [ 1448 | 7.524377482000091, 1449 | 45.97807322300005 1450 | ], 1451 | [ 1452 | 7.541120646000138, 1453 | 45.98411936500008 1454 | ], 1455 | [ 1456 | 7.643026571000121, 1457 | 45.96634267200005 1458 | ], 1459 | [ 1460 | 7.6587362060001, 1461 | 45.96003814700006 1462 | ], 1463 | [ 1464 | 7.673722371000054, 1465 | 45.950322978000116 1466 | ], 1467 | [ 1468 | 7.692532593000067, 1469 | 45.93120269800002 1470 | ], 1471 | [ 1472 | 7.693979533000061, 1473 | 45.92867055300013 1474 | ], 1475 | [ 1476 | 7.706278523, 1477 | 45.92572499700012 1478 | ], 1479 | [ 1480 | 7.714650105000089, 1481 | 45.92712026 1482 | ], 1483 | [ 1484 | 7.72219486500012, 1485 | 45.92960072800008 1486 | ], 1487 | [ 1488 | 7.732013387000109, 1489 | 45.930375875000095 1490 | ], 1491 | [ 1492 | 7.780072469000061, 1493 | 45.91812856100006 1494 | ], 1495 | [ 1496 | 7.807564331000037, 1497 | 45.91849029600007 1498 | ], 1499 | [ 1500 | 7.825444376000093, 1501 | 45.91466623900004 1502 | ], 1503 | [ 1504 | 7.831232137000143, 1505 | 45.91445953400006 1506 | ], 1507 | [ 1508 | 7.843737833000148, 1509 | 45.91921376600007 1510 | ], 1511 | [ 1512 | 7.846114949000111, 1513 | 45.92257273300007 1514 | ], 1515 | [ 1516 | 7.845288127000089, 1517 | 45.927792053000076 1518 | ], 1519 | [ 1520 | 7.848388712000116, 1521 | 45.93807566300009 1522 | ], 1523 | [ 1524 | 7.84962011600004, 1525 | 45.939712062000126 1526 | ], 1527 | [ 1528 | 7.870201292731366, 1529 | 45.94036963077022 1530 | ], 1531 | [ 1532 | 7.872917431422025, 1533 | 45.95938260160503 1534 | ], 1535 | [ 1536 | 7.8837819861848, 1537 | 45.97386867462197 1538 | ], 1539 | [ 1540 | 7.898204794000066, 1541 | 45.9819489540001 1542 | ], 1543 | [ 1544 | 7.969104858000037, 1545 | 45.99311106400003 1546 | ], 1547 | [ 1548 | 7.978716674000026, 1549 | 45.995178121000095 1550 | ], 1551 | [ 1552 | 7.985848022000084, 1553 | 45.99931223600004 1554 | ], 1555 | [ 1556 | 7.998353719000079, 1557 | 46.01062937500009 1558 | ], 1559 | [ 1560 | 7.999077189000076, 1561 | 46.012799784000094 1562 | ], 1563 | [ 1564 | 8.008792358000107, 1565 | 46.02768259700014 1566 | ], 1567 | [ 1568 | 8.010652710000102, 1569 | 46.02969797800009 1570 | ], 1571 | [ 1572 | 8.015923706000137, 1573 | 46.058171692000116 1574 | ], 1575 | [ 1576 | 8.016027059000066, 1577 | 46.06938547800007 1578 | ], 1579 | [ 1580 | 8.018197469000143, 1581 | 46.080857646000084 1582 | ], 1583 | [ 1584 | 8.025328817000087, 1585 | 46.09114125600007 1586 | ], 1587 | [ 1588 | 8.035354044000115, 1589 | 46.096515605000036 1590 | ], 1591 | [ 1592 | 8.056024617000048, 1593 | 46.098065898000044 1594 | ], 1595 | [ 1596 | 8.066876668000077, 1597 | 46.10059804300005 1598 | ], 1599 | [ 1600 | 8.110594930000076, 1601 | 46.12695302300011 1602 | ], 1603 | [ 1604 | 8.132299032000077, 1605 | 46.1593541470001 1606 | ], 1607 | [ 1608 | 8.129508504000114, 1609 | 46.19604441300007 1610 | ], 1611 | [ 1612 | 8.099949585000076, 1613 | 46.23562856100003 1614 | ], 1615 | [ 1616 | 8.076591837000109, 1617 | 46.24973622600007 1618 | ], 1619 | [ 1620 | 8.073077840000082, 1621 | 46.253611959000125 1622 | ], 1623 | [ 1624 | 8.07731530700002, 1625 | 46.26203521800011 1626 | ], 1627 | [ 1628 | 8.087340535000038, 1629 | 46.27180206300005 1630 | ], 1631 | [ 1632 | 8.106874227000048, 1633 | 46.28554799500009 1634 | ], 1635 | [ 1636 | 8.128474975000131, 1637 | 46.29247263600007 1638 | ], 1639 | [ 1640 | 8.171883178000115, 1641 | 46.299190573 1642 | ], 1643 | [ 1644 | 8.192553752000038, 1645 | 46.30916412400012 1646 | ], 1647 | [ 1648 | 8.241749715000111, 1649 | 46.35412262000003 1650 | ], 1651 | [ 1652 | 8.270068400000099, 1653 | 46.364044495000115 1654 | ], 1655 | [ 1656 | 8.28154056800011, 1657 | 46.37011647500006 1658 | ], 1659 | [ 1660 | 8.291462443000114, 1661 | 46.37835886600001 1662 | ], 1663 | [ 1664 | 8.297456909000033, 1665 | 46.387505596000096 1666 | ], 1667 | [ 1668 | 8.297043497000118, 1669 | 46.397634176000054 1670 | ], 1671 | [ 1672 | 8.290428914000131, 1673 | 46.40112233500008 1674 | ], 1675 | [ 1676 | 8.286604859000079, 1677 | 46.40535980300004 1678 | ], 1679 | [ 1680 | 8.294976441000074, 1681 | 46.418046366000084 1682 | ], 1683 | [ 1684 | 8.316267130000142, 1685 | 46.43365264900004 1686 | ], 1687 | [ 1688 | 8.343448934000037, 1689 | 46.44388458300011 1690 | ], 1691 | [ 1692 | 8.385906925000114, 1693 | 46.4502060180001 1694 | ], 1695 | [ 1696 | 8.399156128000072, 1697 | 46.452178650000064 1698 | ], 1699 | [ 1700 | 8.427888224000071, 1701 | 46.448690491000036 1702 | ], 1703 | [ 1704 | 8.441634155000116, 1705 | 46.434944560000076 1706 | ], 1707 | [ 1708 | 8.445768270000116, 1709 | 46.412361959000066 1710 | ], 1711 | [ 1712 | 8.446285034000084, 1713 | 46.382182923000045 1714 | ], 1715 | [ 1716 | 8.442874389000053, 1717 | 46.353373312000116 1718 | ], 1719 | [ 1720 | 8.426647990000049, 1721 | 46.30156768800006 1722 | ], 1723 | [ 1724 | 8.423237345000103, 1725 | 46.275832825000066 1726 | ], 1727 | [ 1728 | 8.427164754000074, 1729 | 46.25144154900002 1730 | ], 1731 | [ 1732 | 8.43812015800006, 1733 | 46.23537017800007 1734 | ], 1735 | [ 1736 | 8.456516968000045, 1737 | 46.2248281870001 1738 | ], 1739 | [ 1740 | 8.482665242000053, 1741 | 46.217541809000124 1742 | ], 1743 | [ 1744 | 8.510260457000072, 1745 | 46.20787831700008 1746 | ], 1747 | [ 1748 | 8.538682495000074, 1749 | 46.18762115500007 1750 | ], 1751 | [ 1752 | 8.601831095000136, 1753 | 46.122818909000074 1754 | ], 1755 | [ 1756 | 8.611546264000083, 1757 | 46.11935658800013 1758 | ], 1759 | [ 1760 | 8.630873250000121, 1761 | 46.11470570900008 1762 | ], 1763 | [ 1764 | 8.67748539200008, 1765 | 46.09579213500004 1766 | ], 1767 | [ 1768 | 8.695055379000081, 1769 | 46.095172018000056 1770 | ], 1771 | [ 1772 | 8.702186727000111, 1773 | 46.097962545000115 1774 | ], 1775 | [ 1776 | 8.717689656000118, 1777 | 46.10752268500002 1778 | ], 1779 | [ 1780 | 8.723890828000094, 1781 | 46.109538066000084 1782 | ], 1783 | [ 1784 | 8.728983368000115, 1785 | 46.10823310300009 1786 | ], 1787 | [ 1788 | 8.732159057000047, 1789 | 46.10741933200009 1790 | ], 1791 | [ 1792 | 8.739497111000048, 1793 | 46.098065898000044 1794 | ], 1795 | [ 1796 | 8.747145223000103, 1797 | 46.09444854800006 1798 | ], 1799 | [ 1800 | 8.763164917000068, 1801 | 46.09289825500005 1802 | ], 1803 | [ 1804 | 8.793860717000115, 1805 | 46.093415019000076 1806 | ], 1807 | [ 1808 | 8.8089502360001, 1809 | 46.08974599300009 1810 | ], 1811 | [ 1812 | 8.834375041000015, 1813 | 46.06638824500004 1814 | ], 1815 | [ 1816 | 8.819595581000101, 1817 | 46.04292714500008 1818 | ], 1819 | [ 1820 | 8.790966838000116, 1821 | 46.018690898000074 1822 | ], 1823 | [ 1824 | 8.773396850000069, 1825 | 45.99057891900014 1826 | ], 1827 | [ 1828 | 8.769572794000112, 1829 | 45.98577301000006 1830 | ], 1831 | [ 1832 | 8.767919149000079, 1833 | 45.983085836000015 1834 | ], 1835 | [ 1836 | 8.785075724000109, 1837 | 45.982310690000105 1838 | ], 1839 | [ 1840 | 8.800371948000077, 1841 | 45.97853831000009 1842 | ], 1843 | [ 1844 | 8.857732788000078, 1845 | 45.95709259100005 1846 | ], 1847 | [ 1848 | 8.86445072400008, 1849 | 45.95342356400005 1850 | ], 1851 | [ 1852 | 8.870961954000052, 1853 | 45.947067363000116 1854 | ], 1855 | [ 1856 | 8.88078047600004, 1857 | 45.93109934500009 1858 | ], 1859 | [ 1860 | 8.89814375800006, 1861 | 45.909550273000036 1862 | ], 1863 | [ 1864 | 8.906515340000112, 1865 | 45.896476135000086 1866 | ], 1867 | [ 1868 | 8.91209639400003, 1869 | 45.883401998000124 1870 | ], 1871 | [ 1872 | 8.9137500410001, 1873 | 45.866090393000036 1874 | ], 1875 | [ 1876 | 8.909719279000086, 1877 | 45.853688050000045 1878 | ], 1879 | [ 1880 | 8.903724812000064, 1881 | 45.84180247000012 1882 | ], 1883 | [ 1884 | 8.900004109000065, 1885 | 45.826402893000136 1886 | ], 1887 | [ 1888 | 8.93958825700011, 1889 | 45.83482615200003 1890 | ], 1891 | [ 1892 | 8.972351115, 1893 | 45.82464589500006 1894 | ], 1895 | [ 1896 | 9.002426798000073, 1897 | 45.820718486 1898 | ], 1899 | [ 1900 | 9.034362834000149, 1901 | 45.84810699500014 1902 | ], 1903 | [ 1904 | 9.05927087400002, 1905 | 45.88195505800013 1906 | ], 1907 | [ 1908 | 9.063094930000148, 1909 | 45.89895660400006 1910 | ], 1911 | [ 1912 | 9.051726115000065, 1913 | 45.91554473900007 1914 | ], 1915 | [ 1916 | 9.042321004000115, 1917 | 45.919730530000095 1918 | ], 1919 | [ 1920 | 9.0205135490001, 1921 | 45.92277944000003 1922 | ], 1923 | [ 1924 | 9.010798380000068, 1925 | 45.92665517200007 1926 | ], 1927 | [ 1928 | 9.001703329000094, 1929 | 45.93606028300013 1930 | ], 1931 | [ 1932 | 8.993435099000124, 1933 | 45.95425038700009 1934 | ], 1935 | [ 1936 | 8.982686401000109, 1937 | 45.96184682200004 1938 | ], 1939 | [ 1940 | 8.980515991000118, 1941 | 45.964378968000034 1942 | ], 1943 | [ 1944 | 8.979792521000121, 1945 | 45.96691111300004 1946 | ], 1947 | [ 1948 | 8.980515991000118, 1949 | 45.969494934000124 1950 | ], 1951 | [ 1952 | 8.982686401000109, 1953 | 45.9719754030001 1954 | ], 1955 | [ 1956 | 9.015552612000135, 1957 | 45.99311106400003 1958 | ], 1959 | [ 1960 | 8.997775919000105, 1961 | 46.02794097900011 1962 | ], 1963 | [ 1964 | 9.002116740000105, 1965 | 46.039309795000094 1966 | ], 1967 | [ 1968 | 9.027748250000059, 1969 | 46.05310740200014 1970 | ], 1971 | [ 1972 | 9.049659057000014, 1973 | 46.05791331000006 1974 | ], 1975 | [ 1976 | 9.059167521000091, 1977 | 46.061789043 1978 | ], 1979 | [ 1980 | 9.067125692000076, 1981 | 46.07114247700014 1982 | ], 1983 | [ 1984 | 9.07032963100005, 1985 | 46.083441467000085 1986 | ], 1987 | [ 1988 | 9.068159220000041, 1989 | 46.1059723920001 1990 | ], 1991 | [ 1992 | 9.072086629000097, 1993 | 46.1188915000001 1994 | ], 1995 | [ 1996 | 9.090586792000124, 1997 | 46.13816680900004 1998 | ], 1999 | [ 2000 | 9.163243856000065, 2001 | 46.17227325500002 2002 | ], 2003 | [ 2004 | 9.16378802500006, 2005 | 46.17298926700002 2006 | ], 2007 | [ 2008 | 9.171098673000103, 2009 | 46.182608541000036 2010 | ], 2011 | [ 2012 | 9.17574955200007, 2013 | 46.194132385000046 2014 | ], 2015 | [ 2016 | 9.181330607000092, 2017 | 46.20405426000005 2018 | ], 2019 | [ 2020 | 9.192182658000121, 2021 | 46.20963531500007 2022 | ], 2023 | [ 2024 | 9.2041715900001, 2025 | 46.21356272400004 2026 | ], 2027 | [ 2028 | 9.215747111000042, 2029 | 46.221055807000084 2030 | ], 2031 | [ 2032 | 9.224842163000119, 2033 | 46.23118438700004 2034 | ], 2035 | [ 2036 | 9.239724975000058, 2037 | 46.266996155000044 2038 | ], 2039 | [ 2040 | 9.2689738360001, 2041 | 46.30937083000006 2042 | ], 2043 | [ 2044 | 9.275175008000076, 2045 | 46.33138499000006 2046 | ], 2047 | [ 2048 | 9.273831420000107, 2049 | 46.344252421000135 2050 | ], 2051 | [ 2052 | 9.260395548000076, 2053 | 46.379728292000095 2054 | ], 2055 | [ 2056 | 9.260292195000147, 2057 | 46.39401682600007 2058 | ], 2059 | [ 2060 | 9.262876017000053, 2061 | 46.40662587500009 2062 | ], 2063 | [ 2064 | 9.26091231300012, 2065 | 46.41665110300002 2066 | ], 2067 | [ 2068 | 9.247579794000103, 2069 | 46.423033142000065 2070 | ], 2071 | [ 2072 | 9.237967977000068, 2073 | 46.436546530000015 2074 | ], 2075 | [ 2076 | 9.245822794000105, 2077 | 46.461041158000086 2078 | ], 2079 | [ 2080 | 9.263186076000125, 2081 | 46.48512237600002 2082 | ], 2083 | [ 2084 | 9.282306355000117, 2085 | 46.497369691000046 2086 | ], 2087 | [ 2088 | 9.330985555000069, 2089 | 46.501503805000084 2090 | ], 2091 | [ 2092 | 9.350829305000047, 2093 | 46.49786061600008 2094 | ], 2095 | [ 2096 | 9.35155277500013, 2097 | 46.48548411100012 2098 | ], 2099 | [ 2100 | 9.377080933000087, 2101 | 46.468689270000056 2102 | ], 2103 | [ 2104 | 9.384625691000025, 2105 | 46.46641550800004 2106 | ], 2107 | [ 2108 | 9.395477742000082, 2109 | 46.46941274000005 2110 | ], 2111 | [ 2112 | 9.400335327000107, 2113 | 46.475407207000075 2114 | ], 2115 | [ 2116 | 9.403849324000134, 2117 | 46.482512716000116 2118 | ], 2119 | [ 2120 | 9.41067061400011, 2121 | 46.488894756000036 2122 | ], 2123 | [ 2124 | 9.426793660000072, 2125 | 46.497111308000086 2126 | ], 2127 | [ 2128 | 9.434648478000014, 2129 | 46.49832570400011 2130 | ], 2131 | [ 2132 | 9.437852417000101, 2133 | 46.49204701800011 2134 | ], 2135 | [ 2136 | 9.443846883000106, 2137 | 46.396135559000044 2138 | ], 2139 | [ 2140 | 9.442399943000112, 2141 | 46.38089101200009 2142 | ], 2143 | [ 2144 | 9.444363648000149, 2145 | 46.37528411900007 2146 | ], 2147 | [ 2148 | 9.451598348000118, 2149 | 46.37037485800005 2150 | ], 2151 | [ 2152 | 9.47371586100013, 2153 | 46.361874085000125 2154 | ], 2155 | [ 2156 | 9.482604207000065, 2157 | 46.35680979400007 2158 | ], 2159 | [ 2160 | 9.502551310000058, 2161 | 46.32073964500006 2162 | ], 2163 | [ 2164 | 9.51526371300011, 2165 | 46.30859568300005 2166 | ], 2167 | [ 2168 | 9.536451050000068, 2169 | 46.29862213200005 2170 | ], 2171 | [ 2172 | 9.559705444000087, 2173 | 46.29273101800004 2174 | ], 2175 | [ 2176 | 9.674323771000047, 2177 | 46.2918008420001 2178 | ], 2179 | [ 2180 | 9.693133992000043, 2181 | 46.297071839000125 2182 | ], 2183 | [ 2184 | 9.708430217000114, 2185 | 46.31174794600011 2186 | ], 2187 | [ 2188 | 9.708843628000125, 2189 | 46.31962860100006 2190 | ], 2191 | [ 2192 | 9.707293335000088, 2193 | 46.33097157900005 2194 | ], 2195 | [ 2196 | 9.709257039000136, 2197 | 46.34239207000013 2198 | ], 2199 | [ 2200 | 9.72010909000008, 2201 | 46.350892843000054 2202 | ], 2203 | [ 2204 | 9.730857788000094, 2205 | 46.35071197500011 2206 | ], 2207 | [ 2208 | 9.755249064000026, 2209 | 46.340531718000136 2210 | ], 2211 | [ 2212 | 9.768064819000102, 2213 | 46.338619690000115 2214 | ], 2215 | [ 2216 | 9.78883874500005, 2217 | 46.34329640800007 2218 | ], 2219 | [ 2220 | 9.855397990000142, 2221 | 46.3669642130001 2222 | ], 2223 | [ 2224 | 9.899012899000098, 2225 | 46.37215769500003 2226 | ], 2227 | [ 2228 | 9.918443237000076, 2229 | 46.37115000400004 2230 | ], 2231 | [ 2232 | 9.939010457000052, 2233 | 46.36745514000006 2234 | ], 2235 | [ 2236 | 9.96402185100007, 2237 | 46.356086325000064 2238 | ], 2239 | [ 2240 | 9.970636434000141, 2241 | 46.33980824900004 2242 | ], 2243 | [ 2244 | 9.971049846000057, 2245 | 46.32001617500006 2246 | ], 2247 | [ 2248 | 9.977561076000114, 2249 | 46.29810536700009 2250 | ], 2251 | [ 2252 | 9.99223718200011, 2253 | 46.284359436000074 2254 | ], 2255 | [ 2256 | 10.031717977000142, 2257 | 46.26007151300007 2258 | ], 2259 | [ 2260 | 10.041846557000099, 2261 | 46.243069967000054 2262 | ], 2263 | [ 2264 | 10.04267338000011, 2265 | 46.220487366000015 2266 | ], 2267 | [ 2268 | 10.075746297000109, 2269 | 46.2200222780001 2270 | ], 2271 | [ 2272 | 10.11791426600007, 2273 | 46.231132711000015 2274 | ], 2275 | [ 2276 | 10.145819539000058, 2277 | 46.24332834900011 2278 | ], 2279 | [ 2280 | 10.15894535300012, 2281 | 46.26244862900012 2282 | ], 2283 | [ 2284 | 10.14612959800013, 2285 | 46.28027699800006 2286 | ], 2287 | [ 2288 | 10.104891805000136, 2289 | 46.30937083000006 2290 | ], 2291 | [ 2292 | 10.095796753000059, 2293 | 46.32053293900009 2294 | ], 2295 | [ 2296 | 10.091765991000074, 2297 | 46.3289561980001 2298 | ], 2299 | [ 2300 | 10.092386108000113, 2301 | 46.33810292600006 2302 | ], 2303 | [ 2304 | 10.097450398000092, 2305 | 46.35164215100005 2306 | ], 2307 | [ 2308 | 10.104995158000065, 2309 | 46.3613573210001 2310 | ], 2311 | [ 2312 | 10.125975789000051, 2313 | 46.374379782000034 2314 | ], 2315 | [ 2316 | 10.133210490000124, 2317 | 46.381097717000046 2318 | ], 2319 | [ 2320 | 10.14075524900008, 2321 | 46.40290517200009 2322 | ], 2323 | [ 2324 | 10.133417195000078, 2325 | 46.41401560500009 2326 | ], 2327 | [ 2328 | 10.11615726700009, 2329 | 46.418821514000115 2330 | ], 2331 | [ 2332 | 10.071405477000042, 2333 | 46.424815980000034 2334 | ], 2335 | [ 2336 | 10.04205326300007, 2337 | 46.43272247400009 2338 | ], 2339 | [ 2340 | 10.026343627000074, 2341 | 46.446261699000075 2342 | ], 2343 | [ 2344 | 10.04401696800008, 2345 | 46.46698394800009 2346 | ], 2347 | [ 2348 | 10.035335327000041, 2349 | 46.4710663860001 2350 | ], 2351 | [ 2352 | 10.03047774300012, 2353 | 46.476673279000124 2354 | ], 2355 | [ 2356 | 10.028100627000072, 2357 | 46.48393381800008 2358 | ], 2359 | [ 2360 | 10.026860392000117, 2361 | 46.493183900000105 2362 | ], 2363 | [ 2364 | 10.031201212000099, 2365 | 46.503829245000105 2366 | ], 2367 | [ 2368 | 10.03140791900006, 2369 | 46.52579172800006 2370 | ], 2371 | [ 2372 | 10.032751506000125, 2373 | 46.532974752000115 2374 | ], 2375 | [ 2376 | 10.041329793000074, 2377 | 46.541863098000135 2378 | ], 2379 | [ 2380 | 10.062930542000117, 2381 | 46.55674591100009 2382 | ], 2383 | [ 2384 | 10.07119877100007, 2385 | 46.56439402300006 2386 | ], 2387 | [ 2388 | 10.083497762000121, 2389 | 46.5970018510001 2390 | ], 2391 | [ 2392 | 10.087838582000103, 2393 | 46.60439158200012 2394 | ], 2395 | [ 2396 | 10.097450398000092, 2397 | 46.6080347700001 2398 | ], 2399 | [ 2400 | 10.192121623000048, 2401 | 46.62681915400012 2402 | ], 2403 | [ 2404 | 10.21785648600013, 2405 | 46.626974182000055 2406 | ], 2407 | [ 2408 | 10.233772827000053, 2409 | 46.61798248400004 2410 | ], 2411 | [ 2412 | 10.235736531000072, 2413 | 46.606691183000066 2414 | ], 2415 | [ 2416 | 10.230258830000082, 2417 | 46.58614980100006 2418 | ], 2419 | [ 2420 | 10.234703003000106, 2421 | 46.57529775000012 2422 | ], 2423 | [ 2424 | 10.27594079500011, 2425 | 46.56553090500006 2426 | ], 2427 | [ 2428 | 10.283795614000041, 2429 | 46.56072499600006 2430 | ], 2431 | [ 2432 | 10.28906660900006, 2433 | 46.55568654400008 2434 | ], 2435 | [ 2436 | 10.295371135000096, 2437 | 46.55108734100014 2438 | ], 2439 | [ 2440 | 10.306636597000136, 2441 | 46.54749582900007 2442 | ], 2443 | [ 2444 | 10.319452351000024, 2445 | 46.546048889000076 2446 | ], 2447 | [ 2448 | 10.354282267000087, 2449 | 46.5483226530001 2450 | ], 2451 | [ 2452 | 10.425905803000148, 2453 | 46.53532603000005 2454 | ], 2455 | [ 2456 | 10.443992554000147, 2457 | 46.5377289840001 2458 | ], 2459 | [ 2460 | 10.45183267900012, 2461 | 46.546701572000075 2462 | ], 2463 | [ 2464 | 10.457945190000146, 2465 | 46.553697001000046 2466 | ], 2467 | [ 2468 | 10.465903361000102, 2469 | 46.57847585100009 2470 | ], 2471 | [ 2472 | 10.466626831000013, 2473 | 46.604288229000105 2474 | ], 2475 | [ 2476 | 10.459082072000058, 2477 | 46.62356353800004 2478 | ], 2479 | [ 2480 | 10.438204793000097, 2481 | 46.635655823000036 2482 | ], 2483 | [ 2484 | 10.395623413000123, 2485 | 46.63880808500008 2486 | ], 2487 | [ 2488 | 10.377536662000097, 2489 | 46.653277486 2490 | ], 2491 | [ 2492 | 10.36916508000013, 2493 | 46.6723977660001 2494 | ], 2495 | [ 2496 | 10.373919312000112, 2497 | 46.681906230000095 2498 | ], 2499 | [ 2500 | 10.384771363000084, 2501 | 46.68901173900011 2502 | ], 2503 | [ 2504 | 10.394383179000073, 2505 | 46.70081980400002 2506 | ], 2507 | [ 2508 | 10.396553588000074, 2509 | 46.715004984000075 2510 | ], 2511 | [ 2512 | 10.395623413000123, 2513 | 46.72639963900008 2514 | ], 2515 | [ 2516 | 10.399654175000109, 2517 | 46.73554636700007 2518 | ], 2519 | [ 2520 | 10.41660404400011, 2521 | 46.743013611000094 2522 | ], 2523 | [ 2524 | 10.42869633, 2525 | 46.75564849900013 2526 | ], 2527 | [ 2528 | 10.426215861000031, 2529 | 46.76942026800006 2530 | ], 2531 | [ 2532 | 10.419084513000087, 2533 | 46.7839671830001 2534 | ], 2535 | [ 2536 | 10.417224162000082, 2537 | 46.798849997000076 2538 | ], 2539 | [ 2540 | 10.439031616000108, 2541 | 46.81688507100006 2542 | ], 2543 | [ 2544 | 10.444922730000116, 2545 | 46.823241272000075 2546 | ], 2547 | [ 2548 | 10.4485400800001, 2549 | 46.832232971000025 2550 | ], 2551 | [ 2552 | 10.453811076000136, 2553 | 46.86442738900007 2554 | ], 2555 | [ 2556 | 10.451433960000088, 2557 | 46.88576975600009 2558 | ], 2559 | [ 2560 | 10.46383630300005, 2561 | 46.919747009000105 2562 | ], 2563 | [ 2564 | 10.458461955000104, 2565 | 46.9366193650001 2566 | ], 2567 | [ 2568 | 10.449573608000094, 2569 | 46.943905742000084 2570 | ], 2571 | [ 2572 | 10.41557051600006, 2573 | 46.96240590500011 2574 | ], 2575 | [ 2576 | 10.39469323700007, 2577 | 46.98540191600006 2578 | ], 2579 | [ 2580 | 10.384357950000066, 2581 | 46.992998352000114 2582 | ], 2583 | [ 2584 | 10.384357950000066, 2585 | 46.99315338200006 2586 | ], 2587 | [ 2588 | 10.384254598000041, 2589 | 46.99315338200006 2590 | ], 2591 | [ 2592 | 10.37898360200009, 2593 | 46.99550465900009 2594 | ], 2595 | [ 2596 | 10.373402547000097, 2597 | 46.99625396700009 2598 | ], 2599 | [ 2600 | 10.367924846000108, 2601 | 46.99550465900009 2602 | ], 2603 | [ 2604 | 10.338882691000094, 2605 | 46.984110006000094 2606 | ], 2607 | [ 2608 | 10.313664592000066, 2609 | 46.9643179330001 2610 | ], 2611 | [ 2612 | 10.296197957000118, 2613 | 46.94137359700008 2614 | ], 2615 | [ 2616 | 10.295681193000064, 2617 | 46.92269256600011 2618 | ], 2619 | [ 2620 | 10.27077315200009, 2621 | 46.9218915810001 2622 | ], 2623 | [ 2624 | 10.251342814000111, 2625 | 46.92537974000004 2626 | ], 2627 | [ 2628 | 10.235116415000107, 2629 | 46.92331268400008 2630 | ], 2631 | [ 2632 | 10.219923543000078, 2633 | 46.90576853500011 2634 | ], 2635 | [ 2636 | 10.215169311000096, 2637 | 46.89310780900007 2638 | ], 2639 | [ 2640 | 10.214342488000057, 2641 | 46.88468455000009 2642 | ], 2643 | [ 2644 | 10.21165531400004, 2645 | 46.87703643800009 2646 | ], 2647 | [ 2648 | 10.201423381000069, 2649 | 46.86683034300003 2650 | ], 2651 | [ 2652 | 10.157808471000095, 2653 | 46.85161163400011 2654 | ], 2655 | [ 2656 | 10.131970255000084, 2657 | 46.84657318200004 2658 | ], 2659 | [ 2660 | 10.125187508000124, 2661 | 46.84675122900012 2662 | ], 2663 | [ 2664 | 10.111299683000084, 2665 | 46.84711578400007 2666 | ], 2667 | [ 2668 | 10.068098185000025, 2669 | 46.85662424800006 2670 | ], 2671 | [ 2672 | 10.045567260000098, 2673 | 46.865564271000096 2674 | ], 2675 | [ 2676 | 10.006913289000096, 2677 | 46.890756531000136 2678 | ], 2679 | [ 2680 | 9.899943075000039, 2681 | 46.91439849900007 2682 | ], 2683 | [ 2684 | 9.875138387000106, 2685 | 46.92742096000009 2686 | ], 2687 | [ 2688 | 9.86242598400014, 2689 | 46.93977162700014 2690 | ], 2691 | [ 2692 | 9.860772339000107, 2693 | 46.9491508990001 2694 | ], 2695 | [ 2696 | 9.86397627800008, 2697 | 46.95992543600002 2698 | ], 2699 | [ 2700 | 9.86645674600004, 2701 | 46.9833865360001 2702 | ], 2703 | [ 2704 | 9.870590861000068, 2705 | 46.99294667600009 2706 | ], 2707 | [ 2708 | 9.870590861000068, 2709 | 46.998837790000096 2710 | ], 2711 | [ 2712 | 9.866766805000026, 2713 | 47.00193837500004 2714 | ], 2715 | [ 2716 | 9.860565633000135, 2717 | 47.00160247800005 2718 | ], 2719 | [ 2720 | 9.856328165000093, 2721 | 47.004082947000114 2722 | ], 2723 | [ 2724 | 9.857981812000048, 2725 | 47.015477600000025 2726 | ], 2727 | [ 2728 | 9.669052775000097, 2729 | 47.05619862900008 2730 | ], 2731 | [ 2732 | 9.65230961100005, 2733 | 47.05792979000006 2734 | ], 2735 | [ 2736 | 9.599909709000116, 2737 | 47.053485616000046 2738 | ], 2739 | [ 2740 | 9.581202840000032, 2741 | 47.05687042300008 2742 | ], 2743 | [ 2744 | 9.560635620000141, 2745 | 47.052400412000054 2746 | ], 2747 | [ 2748 | 9.499554077000141, 2749 | 47.05935089100004 2750 | ], 2751 | [ 2752 | 9.477023153000118, 2753 | 47.063898417000075 2754 | ], 2755 | [ 2756 | 9.475886271000121, 2757 | 47.07322601400011 2758 | ], 2759 | [ 2760 | 9.487565145000104, 2761 | 47.08394887400004 2762 | ], 2763 | [ 2764 | 9.50286136800014, 2765 | 47.09469757200014 2766 | ], 2767 | [ 2768 | 9.512369832000047, 2769 | 47.108030091000074 2770 | ], 2771 | [ 2772 | 9.511853068000107, 2773 | 47.12937245700007 2774 | ], 2775 | [ 2776 | 9.503481486000112, 2777 | 47.145392151000124 2778 | ], 2779 | [ 2780 | 9.492629435000083, 2781 | 47.159809876000054 2782 | ], 2783 | [ 2784 | 9.484981323000085, 2785 | 47.17634633400013 2786 | ], 2787 | [ 2788 | 9.487358439000047, 2789 | 47.210013529000065 2790 | ], 2791 | [ 2792 | 9.504618368000138, 2793 | 47.243732402000035 2794 | ], 2795 | [ 2796 | 9.52115482500011, 2797 | 47.262801005000114 2798 | ], 2799 | [ 2800 | 9.553297567000072, 2801 | 47.2998530080001 2802 | ], 2803 | [ 2804 | 9.587404012000121, 2805 | 47.327809957000085 2806 | ], 2807 | [ 2808 | 9.591228068000078, 2809 | 47.33468292300006 2810 | ], 2811 | [ 2812 | 9.59639571100007, 2813 | 47.35230458600003 2814 | ], 2815 | [ 2816 | 9.601046590000124, 2817 | 47.36127044700007 2818 | ], 2819 | [ 2820 | 9.639803914000055, 2821 | 47.394524231000105 2822 | ], 2823 | [ 2824 | 9.649519084000104, 2825 | 47.40971710300005 2826 | ], 2827 | [ 2828 | 9.650345907000116, 2829 | 47.45209177700005 2830 | ], 2831 | [ 2832 | 9.621717163000142, 2833 | 47.46919667600011 2834 | ], 2835 | [ 2836 | 9.584510132000048, 2837 | 47.48072052100014 2838 | ], 2839 | [ 2840 | 9.554951212000105, 2841 | 47.51089955700013 2842 | ], 2843 | [ 2844 | 9.553058591000081, 2845 | 47.51689133800011 2846 | ], 2847 | [ 2848 | 9.547481674000068, 2849 | 47.53454710200006 2850 | ], 2851 | [ 2852 | 9.273211304000142, 2853 | 47.65009002700006 2854 | ], 2855 | [ 2856 | 9.234350627000083, 2857 | 47.65616200800011 2858 | ], 2859 | [ 2860 | 9.196936890000131, 2861 | 47.65613617000008 2862 | ], 2863 | [ 2864 | 9.183397664000069, 2865 | 47.670424704000084 2866 | ], 2867 | [ 2868 | 9.12810388100013, 2869 | 47.670424704000084 2870 | ], 2871 | [ 2872 | 9.016586141000118, 2873 | 47.678899639000065 2874 | ], 2875 | [ 2876 | 9.22645568847656, 2877 | 47.65475043477393 2878 | ], 2879 | [ 2880 | 8.981756225000055, 2881 | 47.66215647400011 2882 | ], 2883 | [ 2884 | 8.945376017000086, 2885 | 47.65430165600009 2886 | ], 2887 | [ 2888 | 8.906205281000041, 2889 | 47.65179534900011 2890 | ], 2891 | [ 2892 | 8.881710652000095, 2893 | 47.65613617000008 2894 | ], 2895 | [ 2896 | 8.8526684980001, 2897 | 47.67078643800008 2898 | ], 2899 | [ 2900 | 8.851935119000075, 2901 | 47.67128172300011 2902 | ], 2903 | [ 2904 | 8.837785685000142, 2905 | 47.680837504000095 2906 | ], 2907 | [ 2908 | 8.837682333000117, 2909 | 47.687787985000085 2910 | ], 2911 | [ 2912 | 8.856079142000112, 2913 | 47.690681864000084 2914 | ], 2915 | [ 2916 | 8.830240926000101, 2917 | 47.707192485000064 2918 | ], 2919 | [ 2920 | 8.797581420000114, 2921 | 47.720034079000044 2922 | ], 2923 | [ 2924 | 8.77070967600011, 2925 | 47.720860901000066 2926 | ], 2927 | [ 2928 | 8.761717977000075, 2929 | 47.70124969500006 2930 | ], 2931 | [ 2932 | 8.769882853000098, 2933 | 47.69507436100008 2934 | ], 2935 | [ 2936 | 8.71706954000004, 2937 | 47.69455759700011 2938 | ], 2939 | [ 2940 | 8.715105835000116, 2941 | 47.701068827000086 2942 | ], 2943 | [ 2944 | 8.712625366000054, 2945 | 47.708691101000085 2946 | ], 2947 | [ 2948 | 8.70466719500007, 2949 | 47.71533152300009 2950 | ], 2951 | [ 2952 | 8.700429728000131, 2953 | 47.723496399000084 2954 | ], 2955 | [ 2956 | 8.70373702000012, 2957 | 47.73003346800007 2958 | ], 2959 | [ 2960 | 8.71706954000004, 2961 | 47.743546855000034 2962 | ], 2963 | [ 2964 | 8.719756714000084, 2965 | 47.74731923400006 2966 | ], 2967 | [ 2968 | 8.71314213000008, 2969 | 47.757421977 2970 | ], 2971 | [ 2972 | 8.703323608000119, 2973 | 47.758713887000056 2974 | ], 2975 | [ 2976 | 8.692264852000108, 2977 | 47.75716359500004 2978 | ], 2979 | [ 2980 | 8.681929565000104, 2981 | 47.75873972600007 2982 | ], 2983 | [ 2984 | 8.674488159000077, 2985 | 47.766697897000114 2986 | ], 2987 | [ 2988 | 8.66663334200004, 2989 | 47.778273417000065 2990 | ], 2991 | [ 2992 | 8.657021525000118, 2993 | 47.78811777800004 2994 | ], 2995 | [ 2996 | 8.644102417000113, 2997 | 47.79101165800003 2998 | ], 2999 | [ 3000 | 8.635007365000149, 3001 | 47.78460378000008 3002 | ], 3003 | [ 3004 | 8.629839721000053, 3005 | 47.762796326000085 3006 | ], 3007 | [ 3008 | 8.61743737800009, 3009 | 47.75731862400008 3010 | ] 3011 | ] 3012 | ] 3013 | } 3014 | } -------------------------------------------------------------------------------- /test/fixtures/simple/MultiLine2.geojson: -------------------------------------------------------------------------------- 1 | {"type": "MultiLineString", "coordinates": [[[258.75,97.93749809265137],[266.25,96.68749809265137],[272.5,94.18749809265137],[281.25,91.68749809265137],[287.5,89.18749809265137],[301.25,87.93749809265137],[312.5,87.93749809265137],[322.5,87.93749809265137],[332.5,87.93749809265137],[341.25,87.93749809265137],[352.5,90.43749809265137],[362.5,90.43749809265137],[373.75,94.18749809265137],[388.75,95.43749809265137],[401.25,96.68749809265137],[411.25,100.43749809265137],[421.25,100.43749809265137],[443.75,109.18749809265137],[453.75,110.43749809265137],[462.5,111.68749809265137],[471.25,114.18749809265137],[478.75,114.18749809265137],[483.75,115.43749809265137],[491.25,116.68749809265137],[497.5,119.18749809265137],[501.25,119.18749809265137],[503.75,120.43749809265137],[507.5,120.43749809265137],[512.5,120.43749809265137],[516.25,121.68749809265137],[518.75,124.18749809265137],[523.75,125.43749809265137],[528.75,125.43749809265137],[536.25,129.18749809265137],[542.5,130.43749809265137],[547.5,134.18749809265137],[553.75,135.43749809265137],[558.75,135.43749809265137],[563.75,139.18749809265137],[567.5,140.43749809265137],[572.5,144.18749809265137],[576.25,145.43749809265137],[578.75,149.18749809265137],[582.5,150.43749809265137],[587.5,154.18749809265137],[591.25,156.68749809265137],[593.75,160.43749809265137],[598.75,165.43749809265137],[602.5,169.18749809265137],[607.5,171.68749809265137],[608.75,175.43749809265137],[612.5,179.18749809265137],[616.25,181.68749809265137],[617.5,185.43749809265137],[621.25,189.18749809265137],[622.5,190.43749809265137],[622.5,194.18749809265137],[623.75,195.43749809265137],[626.25,196.68749809265137],[626.25,199.18749809265137],[627.5,201.68749809265137],[627.5,205.43749809265137],[628.75,210.43749809265137],[628.75,210.43749809265137],[628.75,214.18749809265137],[627.5,216.68749809265137],[625,220.43749809265137],[621.25,225.43749809265137],[618.75,230.43749809265137],[616.25,235.43749809265137],[611.25,240.43749809265137],[607.5,245.43749809265137],[605,250.43749809265137],[601.25,255.43749809265137],[597.5,260.43749809265137],[595,264.18749809265137],[592.5,265.43749809265137],[591.25,266.68749809265137],[588.75,270.43749809265137],[586.25,271.68749809265137],[583.75,275.43749809265137],[582.5,275.43749809265137],[580,276.68749809265137],[578.75,280.43749809265137],[576.25,280.43749809265137],[572.5,284.18749809265137],[570,285.43749809265137],[568.75,285.43749809265137],[567.5,286.68749809265137],[566.25,289.18749809265137],[565,290.43749809265137],[563.75,290.43749809265137],[561.25,291.68749809265137],[560,294.18749809265137],[557.5,295.43749809265137],[556.25,295.43749809265137],[553.75,296.68749809265137],[551.25,299.18749809265137],[548.75,300.43749809265137],[545,300.43749809265137],[542.5,301.68749809265137],[538.75,304.18749809265137],[535,305.43749809265137],[531.25,305.43749809265137],[528.75,306.68749809265137],[525,309.18749809265137],[521.25,310.43749809265137],[518.75,311.68749809265137],[515,311.68749809265137],[511.25,311.68749809265137],[508.75,314.18749809265137],[506.25,314.18749809265137],[503.75,314.18749809265137],[501.25,314.18749809265137],[498.75,314.18749809265137],[496.25,314.18749809265137],[493.75,314.18749809265137],[492.5,314.18749809265137],[490,314.18749809265137],[488.75,314.18749809265137],[486.25,314.18749809265137],[485,314.18749809265137],[482.5,314.18749809265137],[480,314.18749809265137],[478.75,312.93749809265137],[476.25,312.93749809265137],[475,311.68749809265137],[472.5,310.43749809265137],[471.25,310.43749809265137],[470,309.18749809265137],[468.75,307.93749809265137],[467.5,306.68749809265137],[466.25,306.68749809265137],[465,305.43749809265137],[463.75,305.43749809265137],[461.25,304.18749809265137],[461.25,302.93749809265137],[460,301.68749809265137],[458.75,301.68749809265137],[457.5,300.43749809265137],[456.25,300.43749809265137],[455,299.18749809265137],[453.75,299.18749809265137],[452.5,297.93749809265137],[451.25,297.93749809265137],[450,296.68749809265137],[448.75,295.43749809265137],[447.5,295.43749809265137],[446.25,294.18749809265137],[445,294.18749809265137],[443.75,292.93749809265137],[442.5,292.93749809265137],[441.25,291.68749809265137],[438.75,290.43749809265137],[437.5,290.43749809265137],[436.25,290.43749809265137],[435,289.18749809265137],[433.75,287.93749809265137],[432.5,286.68749809265137],[430,285.43749809265137],[428.75,284.18749809265137],[427.5,282.93749809265137],[426.25,282.93749809265137],[425,281.68749809265137],[423.75,280.43749809265137],[423.75,279.18749809265137],[422.5,277.93749809265137],[421.25,276.68749809265137],[420,276.68749809265137],[418.75,275.43749809265137],[418.75,274.18749809265137],[417.5,272.93749809265137],[416.25,271.68749809265137],[415,271.68749809265137],[415,270.43749809265137],[413.75,270.43749809265137],[413.75,269.18749809265137],[412.5,269.18749809265137],[411.25,269.18749809265137],[411.25,267.93749809265137],[411.25,266.68749809265137],[411.25,265.43749809265137],[410,265.43749809265137],[410,264.18749809265137],[408.75,262.93749809265137],[408.75,261.68749809265137],[407.5,260.43749809265137],[407.5,256.68749809265137],[407.5,254.18749809265137],[406.25,249.18749809265137],[406.25,242.93749809265137],[406.25,237.93749809265137],[406.25,232.93749809265137],[406.25,226.68749809265137],[406.25,222.93749809265137],[406.25,219.18749809265137],[406.25,215.43749809265137],[406.25,212.93749809265137],[406.25,210.43749809265137],[406.25,207.93749809265137],[406.25,205.43749809265137],[407.5,202.93749809265137],[407.5,200.43749809265137],[407.5,199.18749809265137],[407.5,197.93749809265137],[408.75,196.68749809265137],[408.75,195.43749809265137],[408.75,194.18749809265137],[408.75,192.93749809265137],[411.25,192.93749809265137],[412.5,191.68749809265137],[413.75,191.68749809265137],[416.25,190.43749809265137],[417.5,190.43749809265137],[417.5,190.43749809265137]]]} -------------------------------------------------------------------------------- /test/fixtures/simple/diamond.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "type": "Feature", 3 | "properties": {}, 4 | "geometry": { 5 | "type": "Polygon", 6 | "coordinates": [ 7 | [ 8 | [ 9 | 0, 10 | 1 11 | ], 12 | [ 13 | -1, 14 | 0 15 | ], 16 | [ 17 | 0, 18 | -1 19 | ], 20 | [ 21 | 1, 22 | 0 23 | ], 24 | [ 25 | 0, 26 | 1 27 | ] 28 | ] 29 | ] 30 | } 31 | } -------------------------------------------------------------------------------- /test/fixtures/simple/diamondMulti.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "type": "Feature", 3 | "properties": {}, 4 | "geometry": { 5 | "type": "MultiPolygon", 6 | "coordinates": [[ 7 | [ 8 | [ 9 | 0, 10 | 1 11 | ], 12 | [ 13 | -1, 14 | 0 15 | ], 16 | [ 17 | 0, 18 | -1 19 | ], 20 | [ 21 | 1, 22 | 0 23 | ], 24 | [ 25 | 0, 26 | 1 27 | ] 28 | ] 29 | ]] 30 | } 31 | } -------------------------------------------------------------------------------- /test/fixtures/simple/line.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "type": "Feature", 3 | "properties": {}, 4 | "geometry": { 5 | "type": "LineString", 6 | "coordinates": [ 7 | [ 8 | 15.8203125, 9 | 33.137551192346145 10 | ], 11 | [ 12 | -11.953125, 13 | 3.162455530237848 14 | ], 15 | [ 16 | 26.3671875, 17 | -13.2399454992863 18 | ], 19 | [ 20 | 30.585937499999996, 21 | 7.710991655433217 22 | ] 23 | ] 24 | } 25 | } -------------------------------------------------------------------------------- /test/fixtures/simple/multiLine.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "type": "Feature", 3 | "properties": {}, 4 | "geometry": { 5 | "type": "MultiLineString", 6 | "coordinates": [[ 7 | [ 8 | 15.8203125, 9 | 33.137551192346145 10 | ], 11 | [ 12 | -11.953125, 13 | 3.162455530237848 14 | ], 15 | [ 16 | 26.3671875, 17 | -13.2399454992863 18 | ], 19 | [ 20 | 30.585937499999996, 21 | 7.710991655433217 22 | ] 23 | ]] 24 | } 25 | } -------------------------------------------------------------------------------- /test/fixtures/simple/switzerland.geojson: -------------------------------------------------------------------------------- 1 | { "type": "Feature", "properties": { "ADMIN": "Switzerland", "ISO_A3": "CHE" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 8.617437378000091, 47.757318624000078 ], [ 8.629839721000053, 47.762796326000085 ], [ 8.635007365000149, 47.784603780000083 ], [ 8.644102417000113, 47.791011658000031 ], [ 8.657021525000118, 47.788117778000043 ], [ 8.66663334200004, 47.778273417000065 ], [ 8.674488159000077, 47.766697897000114 ], [ 8.681929565000104, 47.758739726000073 ], [ 8.692264852000108, 47.757163595000037 ], [ 8.703323608000119, 47.758713887000056 ], [ 8.71314213000008, 47.757421977 ], [ 8.719756714000084, 47.747319234000059 ], [ 8.71706954000004, 47.743546855000034 ], [ 8.703737020000119, 47.730033468000073 ], [ 8.700429728000131, 47.723496399000084 ], [ 8.70466719500007, 47.715331523000089 ], [ 8.712625366000054, 47.708691101000085 ], [ 8.715105835000116, 47.701068827000086 ], [ 8.71706954000004, 47.694557597000113 ], [ 8.769882853000098, 47.695074361000081 ], [ 8.761717977000075, 47.701249695000058 ], [ 8.770709676000109, 47.720860901000066 ], [ 8.797581420000114, 47.720034079000044 ], [ 8.830240926000101, 47.707192485000064 ], [ 8.856079142000112, 47.690681864000084 ], [ 8.837682333000117, 47.687787985000085 ], [ 8.837785685000142, 47.680837504000095 ], [ 8.851935119000075, 47.671281723000106 ], [ 8.852668498000099, 47.670786438000079 ], [ 8.881710652000095, 47.656136170000082 ], [ 8.906205281000041, 47.65179534900011 ], [ 8.945376017000086, 47.654301656000086 ], [ 8.981756225000055, 47.662156474000113 ], [ 8.997672566000091, 47.673835348000097 ], [ 9.016586141000118, 47.678899639000065 ], [ 9.128103881000129, 47.670424704000084 ], [ 9.183397664000069, 47.670424704000084 ], [ 9.196936890000131, 47.656136170000082 ], [ 9.234350627000083, 47.656162008000109 ], [ 9.273211304000142, 47.650090027000061 ], [ 9.547481674000068, 47.534547102000062 ], [ 9.553058591000081, 47.516891338000107 ], [ 9.554951212000105, 47.51089955700013 ], [ 9.584510132000048, 47.480720521000137 ], [ 9.621717163000142, 47.469196676000109 ], [ 9.650345907000116, 47.452091777000049 ], [ 9.649519084000104, 47.409717103000048 ], [ 9.639803914000055, 47.394524231000105 ], [ 9.601046590000124, 47.361270447000066 ], [ 9.596395711000071, 47.352304586000031 ], [ 9.591228068000078, 47.334682923000059 ], [ 9.587404012000121, 47.327809957000085 ], [ 9.553297567000072, 47.299853008000099 ], [ 9.52115482500011, 47.262801005000114 ], [ 9.504618368000138, 47.243732402000035 ], [ 9.487358439000047, 47.210013529000065 ], [ 9.484981323000085, 47.176346334000129 ], [ 9.492629435000083, 47.159809876000054 ], [ 9.503481486000112, 47.145392151000124 ], [ 9.511853068000107, 47.129372457000073 ], [ 9.512369832000047, 47.108030091000074 ], [ 9.50286136800014, 47.094697572000143 ], [ 9.487565145000104, 47.083948874000043 ], [ 9.475886271000121, 47.073226014000113 ], [ 9.477023153000118, 47.063898417000075 ], [ 9.499554077000141, 47.059350891000037 ], [ 9.560635620000141, 47.052400412000054 ], [ 9.581202840000032, 47.056870423000078 ], [ 9.599909709000116, 47.053485616000046 ], [ 9.652309611000049, 47.05792979000006 ], [ 9.669052775000097, 47.056198629000079 ], [ 9.857981812000048, 47.015477600000025 ], [ 9.856328165000093, 47.004082947000114 ], [ 9.860565633000135, 47.001602478000052 ], [ 9.866766805000026, 47.001938375000037 ], [ 9.870590861000068, 46.998837790000096 ], [ 9.870590861000068, 46.992946676000088 ], [ 9.86645674600004, 46.983386536000097 ], [ 9.863976278000081, 46.95992543600002 ], [ 9.860772339000107, 46.949150899000102 ], [ 9.86242598400014, 46.939771627000141 ], [ 9.875138387000106, 46.927420960000092 ], [ 9.899943075000039, 46.914398499000072 ], [ 10.006913289000096, 46.890756531000136 ], [ 10.045567260000098, 46.865564271000096 ], [ 10.068098185000025, 46.85662424800006 ], [ 10.111299683000084, 46.847115784000067 ], [ 10.125187508000124, 46.84675122900012 ], [ 10.131970255000084, 46.846573182000043 ], [ 10.157808471000095, 46.851611634000108 ], [ 10.201423381000069, 46.866830343000032 ], [ 10.211655314000041, 46.87703643800009 ], [ 10.214342488000057, 46.884684550000088 ], [ 10.215169311000096, 46.893107809000071 ], [ 10.219923543000078, 46.905768535000107 ], [ 10.235116415000107, 46.923312684000081 ], [ 10.251342814000111, 46.925379740000039 ], [ 10.270773152000089, 46.921891581000096 ], [ 10.295681193000064, 46.922692566000109 ], [ 10.296197957000118, 46.94137359700008 ], [ 10.313664592000066, 46.964317933000103 ], [ 10.338882691000094, 46.984110006000094 ], [ 10.367924846000108, 46.99550465900009 ], [ 10.373402547000097, 46.996253967000087 ], [ 10.378983602000091, 46.99550465900009 ], [ 10.384254598000041, 46.99315338200006 ], [ 10.384357950000066, 46.99315338200006 ], [ 10.384357950000066, 46.992998352000114 ], [ 10.39469323700007, 46.985401916000058 ], [ 10.415570516000059, 46.962405905000111 ], [ 10.449573608000094, 46.943905742000084 ], [ 10.458461955000104, 46.936619365000098 ], [ 10.463836303000051, 46.919747009000105 ], [ 10.451433960000088, 46.885769756000087 ], [ 10.453811076000136, 46.86442738900007 ], [ 10.4485400800001, 46.832232971000025 ], [ 10.444922730000116, 46.823241272000075 ], [ 10.439031616000108, 46.816885071000058 ], [ 10.417224162000082, 46.798849997000076 ], [ 10.419084513000087, 46.783967183000101 ], [ 10.426215861000031, 46.769420268000061 ], [ 10.42869633, 46.755648499000131 ], [ 10.41660404400011, 46.743013611000094 ], [ 10.399654175000109, 46.735546367000069 ], [ 10.395623413000123, 46.726399639000078 ], [ 10.396553588000074, 46.715004984000075 ], [ 10.394383179000073, 46.70081980400002 ], [ 10.384771363000084, 46.689011739000108 ], [ 10.373919312000112, 46.681906230000095 ], [ 10.36916508000013, 46.672397766000103 ], [ 10.377536662000097, 46.653277486 ], [ 10.395623413000123, 46.638808085000079 ], [ 10.438204793000097, 46.635655823000036 ], [ 10.459082072000058, 46.623563538000042 ], [ 10.466626831000013, 46.604288229000105 ], [ 10.465903361000102, 46.578475851000093 ], [ 10.457945190000146, 46.553697001000046 ], [ 10.45183267900012, 46.546701572000075 ], [ 10.443992554000147, 46.537728984000097 ], [ 10.425905803000148, 46.53532603000005 ], [ 10.354282267000087, 46.548322653000099 ], [ 10.319452351000024, 46.546048889000076 ], [ 10.306636597000136, 46.54749582900007 ], [ 10.295371135000096, 46.551087341000141 ], [ 10.289066609000059, 46.555686544000082 ], [ 10.283795614000041, 46.560724996000062 ], [ 10.27594079500011, 46.56553090500006 ], [ 10.234703003000106, 46.575297750000118 ], [ 10.230258830000082, 46.586149801000062 ], [ 10.235736531000072, 46.606691183000066 ], [ 10.233772827000053, 46.617982484000038 ], [ 10.21785648600013, 46.626974182000055 ], [ 10.192121623000048, 46.626819154000117 ], [ 10.097450398000092, 46.608034770000103 ], [ 10.087838582000103, 46.604391582000119 ], [ 10.083497762000121, 46.597001851000101 ], [ 10.07119877100007, 46.564394023000062 ], [ 10.062930542000117, 46.556745911000093 ], [ 10.041329793000074, 46.541863098000135 ], [ 10.032751506000125, 46.532974752000115 ], [ 10.03140791900006, 46.525791728000058 ], [ 10.031201212000099, 46.503829245000105 ], [ 10.026860392000117, 46.493183900000105 ], [ 10.028100627000072, 46.483933818000082 ], [ 10.03047774300012, 46.476673279000124 ], [ 10.035335327000041, 46.471066386000103 ], [ 10.044016968000079, 46.466983948000092 ], [ 10.026343627000074, 46.446261699000075 ], [ 10.042053263000071, 46.432722474000087 ], [ 10.071405477000042, 46.424815980000034 ], [ 10.116157267000091, 46.418821514000115 ], [ 10.133417195000078, 46.414015605000088 ], [ 10.14075524900008, 46.402905172000089 ], [ 10.133210490000124, 46.381097717000046 ], [ 10.125975789000051, 46.374379782000034 ], [ 10.104995158000065, 46.361357321000099 ], [ 10.097450398000092, 46.35164215100005 ], [ 10.092386108000113, 46.338102926000062 ], [ 10.091765991000074, 46.3289561980001 ], [ 10.095796753000059, 46.320532939000088 ], [ 10.104891805000136, 46.309370830000063 ], [ 10.14612959800013, 46.280276998000062 ], [ 10.158945353000121, 46.262448629000119 ], [ 10.145819539000058, 46.243328349000109 ], [ 10.117914266000071, 46.231132711000015 ], [ 10.075746297000109, 46.220022278000101 ], [ 10.04267338000011, 46.220487366000015 ], [ 10.041846557000099, 46.243069967000054 ], [ 10.031717977000142, 46.260071513000071 ], [ 9.99223718200011, 46.284359436000074 ], [ 9.977561076000114, 46.29810536700009 ], [ 9.971049846000057, 46.320016175000063 ], [ 9.970636434000141, 46.339808249000043 ], [ 9.964021851000069, 46.356086325000064 ], [ 9.939010457000052, 46.367455140000061 ], [ 9.918443237000076, 46.371150004000043 ], [ 9.899012899000098, 46.372157695000027 ], [ 9.855397990000142, 46.366964213000102 ], [ 9.788838745000049, 46.343296408000072 ], [ 9.768064819000102, 46.338619690000115 ], [ 9.755249064000026, 46.340531718000136 ], [ 9.730857788000094, 46.35071197500011 ], [ 9.720109090000079, 46.350892843000054 ], [ 9.709257039000136, 46.34239207000013 ], [ 9.707293335000088, 46.33097157900005 ], [ 9.708843628000125, 46.319628601000062 ], [ 9.708430217000114, 46.311747946000111 ], [ 9.693133992000043, 46.297071839000125 ], [ 9.674323771000047, 46.2918008420001 ], [ 9.559705444000087, 46.29273101800004 ], [ 9.536451050000068, 46.298622132000048 ], [ 9.51526371300011, 46.30859568300005 ], [ 9.502551310000058, 46.32073964500006 ], [ 9.482604207000065, 46.356809794000071 ], [ 9.47371586100013, 46.361874085000125 ], [ 9.451598348000118, 46.370374858000048 ], [ 9.444363648000149, 46.375284119000071 ], [ 9.442399943000112, 46.380891012000092 ], [ 9.443846883000106, 46.396135559000044 ], [ 9.437852417000101, 46.492047018000108 ], [ 9.434648478000014, 46.498325704000109 ], [ 9.426793660000072, 46.497111308000086 ], [ 9.410670614000111, 46.488894756000036 ], [ 9.403849324000134, 46.482512716000116 ], [ 9.400335327000107, 46.475407207000075 ], [ 9.395477742000082, 46.469412740000053 ], [ 9.384625691000025, 46.46641550800004 ], [ 9.377080933000087, 46.468689270000056 ], [ 9.35155277500013, 46.485484111000119 ], [ 9.350829305000047, 46.497860616000082 ], [ 9.330985555000069, 46.501503805000084 ], [ 9.282306355000117, 46.497369691000046 ], [ 9.263186076000125, 46.485122376000021 ], [ 9.245822794000105, 46.461041158000086 ], [ 9.237967977000068, 46.436546530000015 ], [ 9.247579794000103, 46.423033142000065 ], [ 9.260912313000119, 46.416651103000021 ], [ 9.262876017000053, 46.406625875000088 ], [ 9.260292195000147, 46.394016826000069 ], [ 9.260395548000076, 46.379728292000095 ], [ 9.273831420000107, 46.344252421000135 ], [ 9.275175008000076, 46.33138499000006 ], [ 9.2689738360001, 46.309370830000063 ], [ 9.239724975000058, 46.266996155000044 ], [ 9.224842163000119, 46.231184387000042 ], [ 9.215747111000042, 46.221055807000084 ], [ 9.204171590000101, 46.213562724000042 ], [ 9.192182658000121, 46.209635315000071 ], [ 9.181330607000092, 46.204054260000049 ], [ 9.17574955200007, 46.194132385000046 ], [ 9.171098673000103, 46.182608541000036 ], [ 9.163788025000059, 46.17298926700002 ], [ 9.163243856000065, 46.172273255000022 ], [ 9.090586792000124, 46.13816680900004 ], [ 9.072086629000097, 46.118891500000103 ], [ 9.068159220000041, 46.105972392000098 ], [ 9.07032963100005, 46.083441467000085 ], [ 9.067125692000076, 46.071142477000137 ], [ 9.059167521000091, 46.061789043 ], [ 9.049659057000014, 46.05791331000006 ], [ 9.027748250000059, 46.053107402000137 ], [ 9.002116740000105, 46.039309795000094 ], [ 8.997775919000105, 46.027940979000107 ], [ 9.015552612000135, 45.993111064000033 ], [ 8.982686401000109, 45.971975403000101 ], [ 8.980515991000118, 45.969494934000124 ], [ 8.979792521000121, 45.966911113000037 ], [ 8.980515991000118, 45.964378968000034 ], [ 8.982686401000109, 45.961846822000041 ], [ 8.993435099000124, 45.954250387000087 ], [ 9.001703329000094, 45.936060283000131 ], [ 9.010798380000068, 45.926655172000068 ], [ 9.0205135490001, 45.922779440000028 ], [ 9.042321004000115, 45.919730530000095 ], [ 9.051726115000065, 45.915544739000069 ], [ 9.063094930000148, 45.898956604000062 ], [ 9.059270874000021, 45.881955058000131 ], [ 9.034362834000149, 45.848106995000137 ], [ 9.002426798000073, 45.820718486 ], [ 8.972351115, 45.82464589500006 ], [ 8.939588257000111, 45.834826152000034 ], [ 8.900004109000065, 45.826402893000136 ], [ 8.903724812000064, 45.841802470000118 ], [ 8.909719279000086, 45.853688050000045 ], [ 8.9137500410001, 45.866090393000036 ], [ 8.912096394000031, 45.883401998000124 ], [ 8.906515340000112, 45.896476135000086 ], [ 8.89814375800006, 45.909550273000036 ], [ 8.880780476000041, 45.931099345000092 ], [ 8.870961954000052, 45.947067363000116 ], [ 8.864450724000079, 45.953423564000047 ], [ 8.857732788000078, 45.957092591000048 ], [ 8.800371948000077, 45.97853831000009 ], [ 8.785075724000109, 45.982310690000105 ], [ 8.767919149000079, 45.983085836000015 ], [ 8.769572794000112, 45.985773010000059 ], [ 8.773396850000069, 45.990578919000143 ], [ 8.790966838000116, 46.018690898000074 ], [ 8.819595581000101, 46.042927145000078 ], [ 8.834375041000015, 46.066388245000041 ], [ 8.808950236000101, 46.089745993000093 ], [ 8.793860717000115, 46.093415019000076 ], [ 8.763164917000068, 46.092898255000051 ], [ 8.747145223000103, 46.094448548000059 ], [ 8.739497111000048, 46.098065898000044 ], [ 8.732159057000047, 46.107419332000092 ], [ 8.728983368000115, 46.108233103000089 ], [ 8.723890828000094, 46.109538066000084 ], [ 8.717689656000118, 46.107522685000021 ], [ 8.702186727000111, 46.097962545000115 ], [ 8.695055379000081, 46.095172018000056 ], [ 8.677485392000079, 46.095792135000039 ], [ 8.630873250000121, 46.114705709000077 ], [ 8.611546264000083, 46.11935658800013 ], [ 8.601831095000136, 46.122818909000074 ], [ 8.538682495000074, 46.187621155000073 ], [ 8.510260457000072, 46.20787831700008 ], [ 8.482665242000053, 46.217541809000124 ], [ 8.456516968000045, 46.224828187000099 ], [ 8.438120158000061, 46.235370178000068 ], [ 8.427164754000074, 46.25144154900002 ], [ 8.423237345000103, 46.275832825000066 ], [ 8.426647990000049, 46.301567688000063 ], [ 8.442874389000053, 46.353373312000116 ], [ 8.446285034000084, 46.382182923000045 ], [ 8.445768270000116, 46.412361959000066 ], [ 8.441634155000116, 46.434944560000076 ], [ 8.427888224000071, 46.448690491000036 ], [ 8.399156128000072, 46.452178650000064 ], [ 8.385906925000114, 46.450206018000102 ], [ 8.343448934000037, 46.443884583000113 ], [ 8.316267130000142, 46.433652649000038 ], [ 8.294976441000074, 46.418046366000084 ], [ 8.286604859000079, 46.405359803000039 ], [ 8.290428914000131, 46.401122335000082 ], [ 8.297043497000118, 46.397634176000054 ], [ 8.297456909000033, 46.387505596000096 ], [ 8.291462443000114, 46.378358866000013 ], [ 8.281540568000111, 46.37011647500006 ], [ 8.270068400000099, 46.364044495000115 ], [ 8.241749715000111, 46.354122620000027 ], [ 8.192553752000038, 46.30916412400012 ], [ 8.171883178000115, 46.299190573 ], [ 8.128474975000131, 46.29247263600007 ], [ 8.106874227000048, 46.285547995000087 ], [ 8.087340535000038, 46.271802063000052 ], [ 8.077315307000021, 46.262035218000108 ], [ 8.073077840000082, 46.253611959000125 ], [ 8.076591837000109, 46.249736226000067 ], [ 8.099949585000076, 46.235628561000027 ], [ 8.129508504000114, 46.196044413000067 ], [ 8.132299032000077, 46.159354147000101 ], [ 8.110594930000076, 46.126953023000112 ], [ 8.066876668000077, 46.100598043000048 ], [ 8.056024617000048, 46.098065898000044 ], [ 8.035354044000115, 46.096515605000036 ], [ 8.025328817000087, 46.091141256000071 ], [ 8.018197469000143, 46.080857646000084 ], [ 8.016027059000066, 46.069385478000072 ], [ 8.015923706000137, 46.058171692000116 ], [ 8.010652710000102, 46.029697978000087 ], [ 8.008792358000107, 46.027682597000137 ], [ 7.999077189000076, 46.012799784000094 ], [ 7.998353719000079, 46.010629375000093 ], [ 7.985848022000084, 45.999312236000037 ], [ 7.978716674000026, 45.995178121000095 ], [ 7.969104858000037, 45.993111064000033 ], [ 7.898204794000066, 45.981948954000103 ], [ 7.8837819861848, 45.973868674621968 ], [ 7.872917431422025, 45.959382601605029 ], [ 7.870201292731366, 45.940369630770221 ], [ 7.84962011600004, 45.939712062000126 ], [ 7.848388712000116, 45.938075663000092 ], [ 7.845288127000089, 45.927792053000076 ], [ 7.846114949000111, 45.922572733000067 ], [ 7.843737833000148, 45.91921376600007 ], [ 7.831232137000143, 45.914459534000059 ], [ 7.825444376000093, 45.914666239000042 ], [ 7.807564331000037, 45.918490296000073 ], [ 7.780072469000061, 45.91812856100006 ], [ 7.732013387000109, 45.930375875000095 ], [ 7.72219486500012, 45.929600728000082 ], [ 7.714650105000089, 45.92712026 ], [ 7.706278523, 45.925724997000117 ], [ 7.693979533000061, 45.928670553000131 ], [ 7.692532593000067, 45.931202698000021 ], [ 7.673722371000054, 45.950322978000116 ], [ 7.6587362060001, 45.960038147000063 ], [ 7.643026571000121, 45.966342672000053 ], [ 7.541120646000138, 45.984119365000083 ], [ 7.524377482000091, 45.978073223000052 ], [ 7.514662312000041, 45.966704407000066 ], [ 7.503706909000073, 45.956730855000046 ], [ 7.482726278000058, 45.954870504000041 ], [ 7.452960652000087, 45.945878805000092 ], [ 7.393842814000038, 45.91569976800011 ], [ 7.361803426000108, 45.907844951000072 ], [ 7.286665893000105, 45.913426005000076 ], [ 7.273540079000043, 45.910273743000033 ], [ 7.245428100000083, 45.898129782000126 ], [ 7.183726440000044, 45.88045644200011 ], [ 7.153547404000022, 45.876529033000054 ], [ 7.120887899000138, 45.876115621000054 ], [ 7.090192097000113, 45.880508118000137 ], [ 7.066937703000093, 45.890223288000072 ], [ 7.022082560000115, 45.925259909 ], [ 7.015157918000114, 45.933321431000081 ], [ 7.009783569000149, 45.943398336000115 ], [ 7.002755575000066, 45.961691793000085 ], [ 6.991283406000122, 45.982465719000061 ], [ 6.987666056000052, 45.993111064000033 ], [ 6.982808471000055, 45.995384827000066 ], [ 6.91511234500004, 46.048611553000114 ], [ 6.892374715000074, 46.055587871000114 ], [ 6.884003133000078, 46.053210755000066 ], [ 6.876871786000066, 46.048094788000071 ], [ 6.869223673000079, 46.044064026000086 ], [ 6.859715210000104, 46.044994202000026 ], [ 6.850930216000108, 46.049645081000108 ], [ 6.850310099000126, 46.052745667000039 ], [ 6.852377156000102, 46.056931458000065 ], [ 6.851963745000091, 46.064682922000088 ], [ 6.853410685000085, 46.065664775000045 ], [ 6.853100627000089, 46.076103414000073 ], [ 6.851343628000109, 46.086025290000094 ], [ 6.848553100000061, 46.08504343700011 ], [ 6.853100627000089, 46.09021108100012 ], [ 6.861162150000098, 46.097032369000061 ], [ 6.868190144000096, 46.104680482000049 ], [ 6.869223673000079, 46.112328593000115 ], [ 6.853927449000111, 46.122612203000131 ], [ 6.774345743000083, 46.134807841000054 ], [ 6.765664103000034, 46.151602681000099 ], [ 6.774862508000126, 46.185864156 ], [ 6.792225789000071, 46.221675924000039 ], [ 6.827675822000089, 46.269476624000021 ], [ 6.804938192000094, 46.296606751000098 ], [ 6.769488159000076, 46.32267751100008 ], [ 6.750367879000095, 46.345518494000089 ], [ 6.755742228000145, 46.357068177000116 ], [ 6.782097209000114, 46.378462220000131 ], [ 6.789228556000126, 46.395205383000075 ], [ 6.78810673300012, 46.405007978000071 ], [ 6.787058146000049, 46.414170635000033 ], [ 6.777756388000114, 46.424092509000047 ], [ 6.77771555400011, 46.424106493000039 ], [ 6.762666870000118, 46.42926015200004 ], [ 6.613683716000139, 46.455899354000081 ], [ 6.547021118000117, 46.457372132000074 ], [ 6.482942342000115, 46.448587138000079 ], [ 6.397676229000069, 46.408176168000097 ], [ 6.365223430000128, 46.402440084000062 ], [ 6.332357218000112, 46.40138071700008 ], [ 6.301558065000052, 46.394481914000096 ], [ 6.269105265000121, 46.375025737000101 ], [ 6.240579874000076, 46.348954977000119 ], [ 6.219495890000133, 46.329111227000027 ], [ 6.214121541000083, 46.31546864900011 ], [ 6.21825565600011, 46.305495097000119 ], [ 6.227454060000099, 46.288493551000101 ], [ 6.227970825000057, 46.284462789000088 ], [ 6.237582642000064, 46.267926331000098 ], [ 6.241820109000116, 46.263688864000045 ], [ 6.252258748000145, 46.259916484000115 ], [ 6.269001912000078, 46.265239156000064 ], [ 6.276029907000094, 46.263120423 ], [ 6.281197550000115, 46.240072734000137 ], [ 6.255359335000094, 46.221107484000072 ], [ 6.191383911000088, 46.191703594000103 ], [ 6.140327596000134, 46.150207418000036 ], [ 6.107874796000118, 46.138631897000067 ], [ 6.073871704000084, 46.149173890000043 ], [ 6.028293090000091, 46.147933655000088 ], [ 5.982921183000144, 46.140440572000074 ], [ 5.958839966000113, 46.130467021000072 ], [ 5.972172485000044, 46.152171122000055 ], [ 5.979820597000128, 46.162248027000089 ], [ 5.982921183000144, 46.170826314000124 ], [ 5.965247843000071, 46.186225891000106 ], [ 5.954809204000128, 46.199920146000125 ], [ 5.958529907000127, 46.211960754000103 ], [ 5.982921183000144, 46.222709452000117 ], [ 6.042865844000062, 46.243069967000054 ], [ 6.044519491000102, 46.243431702000066 ], [ 6.04617313600005, 46.243535055000081 ], [ 6.048033488000044, 46.243431702000066 ], [ 6.055888305000082, 46.241674704000076 ], [ 6.061882772000104, 46.241157939000033 ], [ 6.067670532000079, 46.24162302700006 ], [ 6.089684692000077, 46.246377259000042 ], [ 6.094025513000133, 46.253043518000055 ], [ 6.093095337000108, 46.262293600000078 ], [ 6.093612101000133, 46.273093974000119 ], [ 6.100743448000088, 46.301412659000107 ], [ 6.104050740000076, 46.309215800000118 ], [ 6.118607037000089, 46.331771085000099 ], [ 6.136400187000078, 46.359341940000036 ], [ 6.135056600000098, 46.370400696000047 ], [ 6.12286096200009, 46.385541891000059 ], [ 6.108184855000104, 46.396497294000142 ], [ 6.059019361000082, 46.4173832110001 ], [ 6.054234660000134, 46.419415792000081 ], [ 6.065706827000071, 46.427012228000137 ], [ 6.06756717900015, 46.433600973000125 ], [ 6.065500122000088, 46.440370586000057 ], [ 6.065500122000088, 46.447992859000124 ], [ 6.064776652000091, 46.451067607000056 ], [ 6.062399536000072, 46.455201722000083 ], [ 6.060229126000081, 46.459904277000078 ], [ 6.060229126000081, 46.465020244000073 ], [ 6.064156535000052, 46.471118063000119 ], [ 6.075525349000117, 46.479592998000015 ], [ 6.110355265000095, 46.520830790000019 ], [ 6.145701945000099, 46.551629944000098 ], [ 6.12151737500011, 46.57028513700007 ], [ 6.118416789000065, 46.583462626000141 ], [ 6.131852661000039, 46.595606588000038 ], [ 6.266314738000062, 46.680355937000058 ], [ 6.337938273000106, 46.70740855000011 ], [ 6.347860148000109, 46.713170472000087 ], [ 6.374215128000088, 46.733608501000049 ], [ 6.407391398000101, 46.745700786000015 ], [ 6.417933390000144, 46.751100973000092 ], [ 6.429198853000116, 46.760816142000124 ], [ 6.433022908000055, 46.769110210000093 ], [ 6.432609497000044, 46.785982565000069 ], [ 6.425168090000113, 46.791615296000089 ], [ 6.419897095000096, 46.796524557000026 ], [ 6.417106568000122, 46.802157288000075 ], [ 6.418553507000127, 46.807014872000082 ], [ 6.434263143000095, 46.839545187000112 ], [ 6.441187785000068, 46.84814931300005 ], [ 6.443117662000049, 46.8514551210001 ], [ 6.4467688390001, 46.857709453000069 ], [ 6.448422486000141, 46.871558737000015 ], [ 6.445218546000064, 46.882617493000026 ], [ 6.431886027000132, 46.900032451000044 ], [ 6.427751913000122, 46.909075827 ], [ 6.442634725000062, 46.944164124000054 ], [ 6.491107218000138, 46.963387757000078 ], [ 6.598697550000082, 46.986538798000055 ], [ 6.665411824000103, 47.021291199000103 ], [ 6.688252807000112, 47.04384796100004 ], [ 6.676263875000132, 47.062399801000083 ], [ 6.689699747000105, 47.078290304000092 ], [ 6.699104858000055, 47.08462066700011 ], [ 6.724219604000069, 47.090770162000069 ], [ 6.727940307000097, 47.097126363000115 ], [ 6.731661011000085, 47.098883363000084 ], [ 6.746027059000113, 47.103947653000063 ], [ 6.744786824000073, 47.121052551000105 ], [ 6.774759155000112, 47.128183899000135 ], [ 6.838076256000079, 47.16813159700007 ], [ 6.840284871000108, 47.169525045000086 ], [ 6.859301798000075, 47.190919088000101 ], [ 6.88834395300006, 47.211305441000036 ], [ 6.956246785000104, 47.24523101800014 ], [ 6.952216024000023, 47.270035705000083 ], [ 6.958623901000067, 47.29055125000005 ], [ 6.97743412300008, 47.303728739000036 ], [ 6.986529174000054, 47.304503887000067 ], [ 6.991903524000094, 47.305950827000061 ], [ 7.00647627800015, 47.319360860000074 ], [ 7.016914917000094, 47.323520813000101 ], [ 7.027146850000094, 47.325432841000037 ], [ 7.036551961000043, 47.329515279000049 ], [ 7.044303426000056, 47.340496521000034 ], [ 7.033864787000113, 47.350650940000094 ], [ 7.018878621000056, 47.359901021000098 ], [ 7.003995809000088, 47.368143413000041 ], [ 6.985598999000104, 47.362123108000105 ], [ 6.866639852000077, 47.354164937000036 ], [ 6.871600789000127, 47.366954855000102 ], [ 6.884003133000078, 47.382586976000056 ], [ 6.898782593000107, 47.395712790000033 ], [ 6.924517456000103, 47.405996400000021 ], [ 6.926067749000112, 47.424858297000043 ], [ 6.952319376000048, 47.428837383000115 ], [ 6.968545777000145, 47.435193583000057 ], [ 6.983428589000113, 47.443797709000108 ], [ 6.990973348000068, 47.452220968000091 ], [ 6.986115763000043, 47.464132385000113 ], [ 6.975780477000114, 47.477955831000088 ], [ 6.973300008000138, 47.489092103000104 ], [ 6.991903524000094, 47.492941997000059 ], [ 7.000791870000114, 47.497670390000053 ], [ 7.009783569000149, 47.499246522000078 ], [ 7.018878621000056, 47.497670390000053 ], [ 7.027973674000094, 47.492941997000059 ], [ 7.053915242000073, 47.490384013000067 ], [ 7.103731323000091, 47.496275126000057 ], [ 7.127295776000096, 47.492941997000059 ], [ 7.140318237000116, 47.487851868000064 ], [ 7.142169389000088, 47.487650968000054 ], [ 7.15365075700015, 47.48640492800007 ], [ 7.180832560000056, 47.488265280000093 ], [ 7.1626424560001, 47.45989491800006 ], [ 7.168326863000061, 47.443565165000052 ], [ 7.190030965000034, 47.434728496000048 ], [ 7.219383179000118, 47.428475647000141 ], [ 7.223517293000043, 47.426227723000125 ], [ 7.226307820000102, 47.422636211000054 ], [ 7.230338583000105, 47.419018861000069 ], [ 7.2380900470001, 47.416796773000073 ], [ 7.244807984000119, 47.417726949000013 ], [ 7.28263513200011, 47.428889059000142 ], [ 7.309093465000103, 47.432661438000082 ], [ 7.336930048000085, 47.431853680000131 ], [ 7.37854659000007, 47.430646058000036 ], [ 7.388218887000107, 47.433288860000118 ], [ 7.406348511000118, 47.438242493000075 ], [ 7.420563120000111, 47.450857028000115 ], [ 7.426088908000082, 47.455760803000061 ], [ 7.429292847000056, 47.465114238000098 ], [ 7.427639200000101, 47.470746969000118 ], [ 7.422781616000094, 47.475423686000084 ], [ 7.419474325000095, 47.477852478000045 ], [ 7.414410034000099, 47.484027812000136 ], [ 7.414306681000085, 47.490177307000096 ], [ 7.425985555000068, 47.492502747000032 ], [ 7.44148848500015, 47.488833720000031 ], [ 7.445995797000137, 47.486884129000117 ], [ 7.454510946000113, 47.483200989000096 ], [ 7.467430053000101, 47.481909078000058 ], [ 7.482726278000058, 47.491262512000105 ], [ 7.484483276000049, 47.492941997000059 ], [ 7.485826864000103, 47.495784200000116 ], [ 7.485930217000146, 47.498393860000135 ], [ 7.485776134000076, 47.49876751100004 ], [ 7.484896688000049, 47.500900167000111 ], [ 7.477765340000104, 47.507695618000071 ], [ 7.475594930000028, 47.511726379000066 ], [ 7.476938517000093, 47.514878643000117 ], [ 7.482726278000058, 47.516997376000091 ], [ 7.493061564000072, 47.515498759000081 ], [ 7.501123087000082, 47.51730743400006 ], [ 7.505463908000138, 47.523017681000027 ], [ 7.505153850000056, 47.533017070000142 ], [ 7.501743205000139, 47.532965394000115 ], [ 7.485103394000106, 47.541595357000062 ], [ 7.482726278000058, 47.542267151000061 ], [ 7.520866596000104, 47.563416048000136 ], [ 7.52634118600011, 47.566451721000107 ], [ 7.550319051000116, 47.575495097000072 ], [ 7.585482836000097, 47.584479135 ], [ 7.586028488000125, 47.584618544000108 ], [ 7.637032104000099, 47.594977112000066 ], [ 7.65966638200004, 47.596579082000119 ], [ 7.646540568000091, 47.571541850000102 ], [ 7.635895223000091, 47.564591370000102 ], [ 7.612337281000094, 47.56473104100013 ], [ 7.609746948000094, 47.564746399000057 ], [ 7.64690103500007, 47.551445236000063 ], [ 7.661423380000116, 47.54624623600003 ], [ 7.683437540000114, 47.544256694000097 ], [ 7.727320447000125, 47.550422624000106 ], [ 7.766739949000055, 47.55596140600008 ], [ 7.78555017100004, 47.563196106000134 ], [ 7.801466512000076, 47.576089376000141 ], [ 7.819656616000117, 47.595338847000079 ], [ 7.83371260600012, 47.590481263000044 ], [ 7.898204794000066, 47.587845764000036 ], [ 7.904302613000112, 47.583556621000071 ], [ 7.907506551000097, 47.574177348000035 ], [ 7.909470256000105, 47.564798076000073 ], [ 7.91215743000015, 47.560560608000117 ], [ 8.042278686000088, 47.560560608000117 ], [ 8.087237182000109, 47.567381897000075 ], [ 8.096952351000141, 47.571851909000088 ], [ 8.101396525000069, 47.57619272900007 ], [ 8.105427286000065, 47.581257019000049 ], [ 8.113902221000075, 47.587845764000036 ], [ 8.122067098000088, 47.592134908000105 ], [ 8.143771199000071, 47.600067241000062 ], [ 8.162064656000041, 47.603762105000072 ], [ 8.168885946000103, 47.608645528000096 ], [ 8.173846883000067, 47.613528951000035 ], [ 8.17901452600006, 47.615802715000115 ], [ 8.232964721000116, 47.621952210000103 ], [ 8.251051473000132, 47.622003886000101 ], [ 8.276993042000072, 47.616629537000051 ], [ 8.288568562000108, 47.615802715000115 ], [ 8.293942912000091, 47.611461894000058 ], [ 8.299317260000038, 47.601824239000052 ], [ 8.306345255000053, 47.592186585000036 ], [ 8.316163777000014, 47.587845764000036 ], [ 8.354094279000037, 47.581024475000078 ], [ 8.418069702000111, 47.580766094000097 ], [ 8.421100326000044, 47.581111870000115 ], [ 8.448868856000075, 47.584280091000068 ], [ 8.450109090000097, 47.58903432300005 ], [ 8.461787964000081, 47.606139221 ], [ 8.492380411000084, 47.619833476000025 ], [ 8.522352742000038, 47.621900534000076 ], [ 8.53775231900002, 47.612133688000142 ], [ 8.549637899000061, 47.598594462000051 ], [ 8.551719149000036, 47.596863329000087 ], [ 8.560696655000072, 47.589396057000073 ], [ 8.574132527000103, 47.592444967000091 ], [ 8.576305366000042, 47.595023058000066 ], [ 8.580643758000093, 47.600170594000076 ], [ 8.581780639000101, 47.607663677000119 ], [ 8.581263875000047, 47.614769186000046 ], [ 8.582504110000087, 47.62159047500009 ], [ 8.582090698000087, 47.625026957000046 ], [ 8.579713583000114, 47.628928529000092 ], [ 8.578059936000074, 47.633476054000141 ], [ 8.580333699000107, 47.639005432000033 ], [ 8.583951050000081, 47.641124166000111 ], [ 8.589222046000117, 47.64246775400008 ], [ 8.593562866000099, 47.642571106000105 ], [ 8.594493042000039, 47.64096913700007 ], [ 8.595113159000107, 47.634819641 ], [ 8.601624390000069, 47.632597555000103 ], [ 8.607308797000115, 47.656291199000037 ], [ 8.598213745000066, 47.656885478000106 ], [ 8.593588683000092, 47.658168560000036 ], [ 8.582194051000101, 47.661329651000102 ], [ 8.568241414000113, 47.662931621000041 ], [ 8.519665568000107, 47.657350566000019 ], [ 8.504679402000136, 47.652260437000052 ], [ 8.490830119000066, 47.645568339000107 ], [ 8.476050659000066, 47.640400696000114 ], [ 8.458273966000121, 47.639883932000089 ], [ 8.437603394000121, 47.647842102000141 ], [ 8.411971883000149, 47.66104543000003 ], [ 8.40701094500011, 47.661562195000073 ], [ 8.391301310000131, 47.665463765000112 ], [ 8.397709188000078, 47.676289979000074 ], [ 8.395228719000102, 47.684816590000082 ], [ 8.390991251000059, 47.692128805000067 ], [ 8.392128133000142, 47.699518535000067 ], [ 8.401946655000131, 47.707089132000135 ], [ 8.427268107000117, 47.716468404000096 ], [ 8.437913452000089, 47.723186341000115 ], [ 8.445458211000044, 47.743185120000135 ], [ 8.450109090000097, 47.750471497000035 ], [ 8.463648315000086, 47.763907370000084 ], [ 8.471503133000112, 47.767059632000041 ], [ 8.482665242000053, 47.76685292600007 ], [ 8.536512085000084, 47.774087626000039 ], [ 8.55160160300008, 47.779255270000135 ], [ 8.542299846000077, 47.795016581000112 ], [ 8.558216187000085, 47.80116607700009 ], [ 8.58312422700007, 47.800235901000036 ], [ 8.601624390000069, 47.794603170000101 ], [ 8.603174682000088, 47.787316793000031 ], [ 8.604104858000142, 47.774397685000025 ], [ 8.607618856000101, 47.762253723000129 ], [ 8.617437378000091, 47.757318624000078 ] ] ] } } -------------------------------------------------------------------------------- /test/test.spec.js: -------------------------------------------------------------------------------- 1 | import test from 'ava' 2 | import path from 'path' 3 | import glob from 'glob' 4 | 5 | import load from 'load-json-file' 6 | 7 | import noIntersections from '../src/main.js' 8 | 9 | const trueFixtures = glob.sync(path.join(__dirname, 'fixtures', 'simple', '*.geojson')) 10 | const falseFixtures = glob.sync(path.join(__dirname, 'fixtures', 'notSimple', '*.geojson')) 11 | 12 | test('simple fixtures', (t) => { 13 | trueFixtures.forEach((filepath) => { 14 | const name = path.parse(filepath).name; 15 | const geojson = load.sync(filepath); 16 | t.true(noIntersections(geojson), `[true] ${name}`); 17 | }); 18 | }) 19 | 20 | test('complex fixtures', (t) => { 21 | falseFixtures.forEach((filepath) => { 22 | const name = path.parse(filepath).name; 23 | const geojson = load.sync(filepath); 24 | t.false(noIntersections(geojson), `[false] ${name}`); 25 | }); 26 | }) 27 | 28 | test('input data is not modified', (t) => { 29 | const geojson = load.sync(path.join(__dirname, 'fixtures', 'notSimple', 'switzerlandKinked.geojson')); 30 | const clonedData = JSON.parse(JSON.stringify(geojson)) 31 | noIntersections(geojson) 32 | t.deepEqual(geojson, clonedData) 33 | }) 34 | --------------------------------------------------------------------------------