├── .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 |
2 |
3 |
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 |
--------------------------------------------------------------------------------