From 9bd37d9cdef6cf200859152f1c18289c62c1e6c7 Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Sun, 28 Jun 2020 23:33:48 +0200 Subject: [PATCH] Fix multiple bugs after user testing --- Helpers.ts | 45 +- LayerDefinition.ts | 8 +- Layers/Bookcases.ts | 5 +- Layers/Bos.ts | 2 +- Layers/NatureReserves.ts | 2 +- Layers/Park.ts | 2 +- Layers/Playground.ts | 2 +- Layers/Toilets.ts | 1 - Logic/FilteredLayer.ts | 14 +- Logic/GeoLocationHandler.ts | 43 +- Logic/GeoOperations.ts | 78 ++- Logic/OsmConnection.ts | 9 +- README.md | 6 + UI/FeatureInfoBox.ts | 3 +- assets/osm-logo.svg | 758 +++++++++++++++++++++++++++++ index.css | 13 +- index.ts | 2 +- package-lock.json | 607 +++++++++++++++++++++++ package.json | 5 +- vendor/Leaflet.AccuratePosition.js | 1 + 20 files changed, 1529 insertions(+), 77 deletions(-) create mode 100644 assets/osm-logo.svg diff --git a/Helpers.ts b/Helpers.ts index fd3f164..b079ad9 100644 --- a/Helpers.ts +++ b/Helpers.ts @@ -5,22 +5,17 @@ import {UIEventSource} from "./UI/UIEventSource"; export class Helpers { - static SetupAutoSave(changes: Changes, millisTillChangesAreSaved : UIEventSource, saveAfterXMillis : number) { - -// This little function triggers the actual upload: -// Either when more then three answers are selected, or when no new answer has been added for the last 20s -// @ts-ignore - window.decreaseTime = function () { - var time = millisTillChangesAreSaved.data; - if (time <= 0) { - if (changes.pendingChangesES.data > 0) { - changes.uploadAll(undefined); - } - } else { - millisTillChangesAreSaved.setData(time - 1000); + static DoEvery(millis: number, f: (() => void)) { + window.setTimeout( + function () { + f(); + Helpers.DoEvery(millis, f); } - window.setTimeout('decreaseTime()', 1000); - }; + , millis) + } + + + static SetupAutoSave(changes: Changes, millisTillChangesAreSaved: UIEventSource, saveAfterXMillis: number) { changes.pendingChangesES.addCallback(function () { @@ -38,19 +33,29 @@ export class Helpers { }); - // @ts-ignore - window.decreaseTime(); // The timer keeps running... + millisTillChangesAreSaved.addCallback((time) => { + if (time <= 0 && changes.pendingChangesES.data > 0) { + changes.uploadAll(undefined); + } + } + ) + + Helpers.DoEvery( + 1000, + () => { + millisTillChangesAreSaved + .setData(millisTillChangesAreSaved.data - 1000) + }); } - - + /* * Registers an action that: * -> Upload everything to OSM * -> Asks the user not to close. The 'not to close' dialog should profide enough time to upload * -> WHen uploading is done, the window is closed anyway */ - static LastEffortSave(changes : Changes){ + static LastEffortSave(changes: Changes) { window.addEventListener("beforeunload", function (e) { // Quickly save everyting! diff --git a/LayerDefinition.ts b/LayerDefinition.ts index 6f21be0..26b4421 100644 --- a/LayerDefinition.ts +++ b/LayerDefinition.ts @@ -29,8 +29,10 @@ export class LayerDefinition { style: (tags: any) => any; - removeContainedElements: boolean = false; - removeTouchingElements: boolean = false; + /** + * If an object of the next layer is contained for this many percent in this feature, it is eaten and not shown + */ + maxAllowedOverlapPercentage: number = undefined; asLayer(basemap: Basemap, allElements: ElementStorage, changes: Changes, userDetails: UIEventSource, selectedElement: UIEventSource): @@ -40,7 +42,7 @@ export class LayerDefinition { this.name, basemap, allElements, changes, this.overpassFilter, - this.removeContainedElements, this.removeTouchingElements, + this.maxAllowedOverlapPercentage, this.style, selectedElement); diff --git a/Layers/Bookcases.ts b/Layers/Bookcases.ts index f6463a1..726ad93 100644 --- a/Layers/Bookcases.ts +++ b/Layers/Bookcases.ts @@ -1,10 +1,7 @@ import {LayerDefinition} from "../LayerDefinition"; -import {Quests} from "../Quests"; -import {FixedUiElement} from "../UI/FixedUiElement"; -import {TagMapping, TagMappingOptions} from "../UI/TagMapping"; +import {TagMappingOptions} from "../UI/TagMapping"; import L from "leaflet"; import {QuestionDefinition} from "../Logic/Question"; -import {CommonTagMappings} from "./CommonTagMappings"; import {Tag} from "../Logic/TagsFilter"; export class Bookcases extends LayerDefinition { diff --git a/Layers/Bos.ts b/Layers/Bos.ts index cf8db1f..8edca1b 100644 --- a/Layers/Bos.ts +++ b/Layers/Bos.ts @@ -24,7 +24,7 @@ export class Bos extends LayerDefinition { new Tag("landuse", "forest"), new Tag("fixme", "Toegevoegd met MapComplete, geometry nog uit te tekenen") ]; - this.removeContainedElements = true; + this.maxAllowedOverlapPercentage = 10; this.minzoom = 14; this.questions = [Quests.nameOf(this.name), Quests.accessNatureReserve, Quests.operator]; diff --git a/Layers/NatureReserves.ts b/Layers/NatureReserves.ts index b010e68..d42df9e 100644 --- a/Layers/NatureReserves.ts +++ b/Layers/NatureReserves.ts @@ -13,7 +13,7 @@ export class NatureReserves extends LayerDefinition { this.icon = "./assets/tree_white_background.svg"; this.overpassFilter = new Or([new Tag("leisure", "nature_reserve"), new Tag("boundary","protected_area")]); - this.removeTouchingElements = true; + this.maxAllowedOverlapPercentage = 10; this.newElementTags = [new Tag("leisure", "nature_reserve"), new Tag("fixme", "Toegevoegd met MapComplete, geometry nog uit te tekenen")] diff --git a/Layers/Park.ts b/Layers/Park.ts index 7263961..cde7d82 100644 --- a/Layers/Park.ts +++ b/Layers/Park.ts @@ -15,7 +15,7 @@ export class Park extends LayerDefinition { new Or([new Tag("leisure","park"), new Tag("landuse","village_green")]); this.newElementTags = [new Tag("leisure", "park"), new Tag("fixme", "Toegevoegd met MapComplete, geometry nog uit te tekenen")]; - this.removeTouchingElements = true; + this.maxAllowedOverlapPercentage = 25; this.minzoom = 13; this.questions = [Quests.nameOf("park")]; diff --git a/Layers/Playground.ts b/Layers/Playground.ts index 438f460..62cd950 100644 --- a/Layers/Playground.ts +++ b/Layers/Playground.ts @@ -13,7 +13,7 @@ export class Playground extends LayerDefinition { this.icon = "./assets/tree_white_background.svg"; this.overpassFilter = new Tag("leisure","playground"); this.newElementTags = [new Tag("leisure", "playground"), new Tag( "fixme", "Toegevoegd met MapComplete, geometry nog uit te tekenen")] - this.removeContainedElements = true; + this.maxAllowedOverlapPercentage = 0; this.minzoom = 13; this.questions = [Quests.nameOf(this.name)]; diff --git a/Layers/Toilets.ts b/Layers/Toilets.ts index 9c07abb..fdf2b64 100644 --- a/Layers/Toilets.ts +++ b/Layers/Toilets.ts @@ -3,7 +3,6 @@ import {Quests} from "../Quests"; import {FixedUiElement} from "../UI/FixedUiElement"; import {TagMappingOptions} from "../UI/TagMapping"; import L from "leaflet"; -import {CommonTagMappings} from "./CommonTagMappings"; import {Tag} from "../Logic/TagsFilter"; export class Toilets extends LayerDefinition{ diff --git a/Logic/FilteredLayer.ts b/Logic/FilteredLayer.ts index e627028..aa825d9 100644 --- a/Logic/FilteredLayer.ts +++ b/Logic/FilteredLayer.ts @@ -1,7 +1,6 @@ import {Basemap} from "./Basemap"; import {TagsFilter, TagUtils} from "./TagsFilter"; import {UIEventSource} from "../UI/UIEventSource"; -import {UIElement} from "../UI/UIElement"; import {ElementStorage} from "./ElementStorage"; import {Changes} from "./Changes"; import L from "leaflet" @@ -22,8 +21,7 @@ export class FilteredLayer { public readonly filters: TagsFilter; private readonly _map: Basemap; - private readonly _removeContainedElements; - private readonly _removeTouchingElements; + private readonly _maxAllowedOverlap: number; private readonly _style: (properties) => any; @@ -46,8 +44,7 @@ export class FilteredLayer { map: Basemap, storage: ElementStorage, changes: Changes, filters: TagsFilter, - removeContainedElements: boolean, - removeTouchingElements: boolean, + maxAllowedOverlap: number, style: ((properties) => any), selectedElement: UIEventSource) { this._selectedElement = selectedElement; @@ -62,8 +59,7 @@ export class FilteredLayer { this.filters = filters; this._style = style; this._storage = storage; - this._removeContainedElements = removeContainedElements; - this._removeTouchingElements = removeTouchingElements; + this._maxAllowedOverlap = maxAllowedOverlap; } @@ -92,8 +88,8 @@ export class FilteredLayer { const notShadowed = []; for (const feature of leftoverFeatures) { - if (this._removeContainedElements || this._removeTouchingElements) { - if (GeoOperations.featureIsContainedInAny(feature, selfFeatures, this._removeTouchingElements)) { + if (this._maxAllowedOverlap !== undefined && this._maxAllowedOverlap >= 0) { + if (GeoOperations.featureIsContainedInAny(feature, selfFeatures, this._maxAllowedOverlap)) { // This feature is filtered away continue; } diff --git a/Logic/GeoLocationHandler.ts b/Logic/GeoLocationHandler.ts index da5052b..408a920 100644 --- a/Logic/GeoLocationHandler.ts +++ b/Logic/GeoLocationHandler.ts @@ -2,6 +2,7 @@ import {Basemap} from "./Basemap"; import {UIEventSource} from "../UI/UIEventSource"; import {UIElement} from "../UI/UIElement"; import L from "leaflet"; +import {Helpers} from "../Helpers"; export class GeoLocationHandler extends UIElement { @@ -11,7 +12,7 @@ export class GeoLocationHandler extends UIElement { }> = new UIEventSource<{ latlng: number, accuracy: number }>(undefined); private _isActive: UIEventSource = new UIEventSource(false); - + private _permission: UIEventSource = new UIEventSource(""); private _map: Basemap; private _marker: any; @@ -20,6 +21,7 @@ export class GeoLocationHandler extends UIElement { this._map = map; this.ListenTo(this.currentLocation); this.ListenTo(this._isActive); + this.ListenTo(this._permission); const self = this; @@ -27,6 +29,7 @@ export class GeoLocationHandler extends UIElement { function onAccuratePositionProgress(e) { console.log(e.accuracy); console.log(e.latlng); + self.currentLocation.setData({latlng: e.latlng, accuracy: e.accuracy}); } function onAccuratePositionFound(e) { @@ -62,8 +65,19 @@ export class GeoLocationHandler extends UIElement { self._marker = newMarker; }); - navigator.permissions.query({ name: 'geolocation' }) - .then(function(){self.StartGeolocating()}); + navigator.permissions.query({name: 'geolocation'}) + .then(function (status) { + console.log("Geolocation is already", status) + if (status.state === "granted") { + self.StartGeolocating(); + } + self._permission.setData(status.state); + status.onchange = function () { + self._permission.setData(status.state); + } + }); + + this.HideOnEmpty(true); } @@ -79,20 +93,33 @@ export class GeoLocationHandler extends UIElement { } - private StartGeolocating(){ + private StartGeolocating() { const self = this; + + if (self._permission.data === "denied") { + return ""; + } if (self.currentLocation.data !== undefined) { self._map.map.flyTo(self.currentLocation.data.latlng, 18); - return; } - self._isActive.setData(true); console.log("Searching location using GPS") self._map.map.findAccuratePosition({ - maxWait: 15000, // defaults to 10000 - desiredAccuracy: 30 // defaults to 20 + maxWait: 10000, // defaults to 10000 + desiredAccuracy: 50 // defaults to 20 }); + + + if (!self._isActive.data) { + self._isActive.setData(true); + Helpers.DoEvery(60000, () => { + self._map.map.findAccuratePosition({ + maxWait: 10000, // defaults to 10000 + desiredAccuracy: 50 // defaults to 20 + }); + }) + } } InnerUpdate(htmlElement: HTMLElement) { diff --git a/Logic/GeoOperations.ts b/Logic/GeoOperations.ts index 6049b10..bf1d362 100644 --- a/Logic/GeoOperations.ts +++ b/Logic/GeoOperations.ts @@ -1,8 +1,15 @@ +import * as turf from 'turf' + export class GeoOperations { + static surfaceAreaInSqMeters(feature: any) { + return turf.area(feature); + } - static featureIsContainedInAny(feature: any, shouldNotContain: any[], noTouching: boolean = false): boolean { - + static featureIsContainedInAny(feature: any, + shouldNotContain: any[], + maxOverlapPercentage: number): boolean { + // Returns 'false' if no problematic intersection is found if (feature.geometry.type === "Point") { const coor = feature.geometry.coordinates; for (const shouldNotContainElement of shouldNotContain) { @@ -21,38 +28,55 @@ export class GeoOperations { } - if (feature.geometry.type === "Polygon") { + if (feature.geometry.type === "Polygon" || feature.geometry.type === "MultiPolygon") { const poly = feature; + let featureBBox = BBox.get(feature); + const featureSurface = GeoOperations.surfaceAreaInSqMeters(poly); for (const shouldNotContainElement of shouldNotContain) { - let shouldNotContainBBox = BBox.get(shouldNotContainElement); - let featureBBox = BBox.get(feature); - if (!featureBBox.overlapsWith(shouldNotContainBBox)) { + const shouldNotContainBBox = BBox.get(shouldNotContainElement); + const overlaps = featureBBox.overlapsWith(shouldNotContainBBox) + if (!overlaps) { continue; } - if (noTouching) { - if (GeoOperations.isPolygonTouching(poly, shouldNotContainElement)) { - return true; - } - } else { - if (GeoOperations.isPolygonInside(poly, shouldNotContainElement)) { + // Calculate the surface area of the intersection + // If it is too big, refuse + try { + + const intersection = turf.intersect(poly, shouldNotContainElement); + if (intersection == null) { + continue; + } + const intersectionSize = turf.area(intersection); + const ratio = intersectionSize / featureSurface; + console.log("Intersection ratio", ratio, "intersection:", intersectionSize, "featuresize:", featureSurface, "targetRatio", maxOverlapPercentage / 100); + + if (ratio * 100 >= maxOverlapPercentage) { + console.log("Refused", poly.id, " due to ", shouldNotContainElement.id, "intersection ratio is ", ratio, "which is bigger then the target ratio of ", (maxOverlapPercentage / 100)) return true; } + } catch (exception) { + console.log("EXCEPTION CAUGHT WHILE INTERSECTING: ", exception); + // We assume that this failed due to an intersection + return true; } + } + return false; // No problematic intersections found } return false; } + /** * Simple check: that every point of the polygon is inside the container * @param polygon * @param container */ - static isPolygonInside(polygon, container) { + private static isPolygonInside(polygon, container) { for (const coor of polygon.geometry.coordinates[0]) { if (!GeoOperations.inside(coor, container)) { return false; @@ -66,7 +90,7 @@ export class GeoOperations { * @param polygon * @param container */ - static isPolygonTouching(polygon, container) { + private static isPolygonTouching(polygon, container) { for (const coor of polygon.geometry.coordinates[0]) { if (GeoOperations.inside(coor, container)) { return true; @@ -76,7 +100,7 @@ export class GeoOperations { } - static inside(pointCoordinate, feature): boolean { + private static inside(pointCoordinate, feature): boolean { // ray-casting algorithm based on // http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html @@ -134,10 +158,19 @@ class BBox { this.minLon = Math.min(this.minLon, coordinate[0]); this.minLat = Math.min(this.minLat, coordinate[1]); } + this.check(); + } + + private check() { + if (isNaN(this.maxLon) || isNaN(this.maxLat) || isNaN(this.minLon) || isNaN(this.minLat)) { + console.log(this); + throw "BBOX has NAN"; + } } public overlapsWith(other: BBox) { - + this.check(); + other.check(); if (this.maxLon < other.minLon) { return false; } @@ -155,13 +188,22 @@ class BBox { static get(feature) { if (feature.bbox === undefined) { - if (feature.geometry.type === "Polygon") { + + if (feature.geometry.type === "MultiPolygon") { + let coordinates = []; + for (const coorlist of feature.geometry.coordinates) { + coordinates = coordinates.concat(coorlist[0]); + } + feature.bbox = new BBox(coordinates); + } else if (feature.geometry.type === "Polygon") { feature.bbox = new BBox(feature.geometry.coordinates[0]); } else if (feature.geometry.type === "LineString") { feature.bbox = new BBox(feature.geometry.coordinates); - } else { + } else if (feature.geometry.type === "Point") { // Point feature.bbox = new BBox([feature.geometry.coordinates]); + } else { + throw "Cannot calculate bbox, unknown type " + feature.geometry.type; } } diff --git a/Logic/OsmConnection.ts b/Logic/OsmConnection.ts index 078f4f4..d076713 100644 --- a/Logic/OsmConnection.ts +++ b/Logic/OsmConnection.ts @@ -76,7 +76,14 @@ export class OsmConnection { console.log(userInfo); data.name = userInfo.getAttribute('display_name'); data.csCount = userInfo.getElementsByTagName("changesets")[0].getAttribute("count"); - data.img = userInfo.getElementsByTagName("img")[0].getAttribute("href"); + + data.img = undefined; + const imgEl = userInfo.getElementsByTagName("img"); + if (imgEl !== undefined && imgEl[0] !== undefined) { + data.img = imgEl[0].getAttribute("href"); + } + data.img = data.img ?? "./assets/osm-logo.svg"; + const messages = userInfo.getElementsByTagName("messages")[0].getElementsByTagName("received")[0]; data.unreadMessages = parseInt(messages.getAttribute("unread")); data.totalMessages = parseInt(messages.getAttribute("count")); diff --git a/README.md b/README.md index 59de3a0..cb98d20 100644 --- a/README.md +++ b/README.md @@ -59,7 +59,13 @@ Images are uplaoded to imgur, as their API was way easier to handle. The URL is The idea is that one in a while, the images are transfered to wikipedia +# Privacy +Privacy is important, we try to leak as little information as possible. +All major personal information is handled by OSM. +Geolocation is available on mobile only throught hte device's GPS location (so no geolocation is sent of to google) + +TODO: erase cookies of third party websites and API's # Attributions: diff --git a/UI/FeatureInfoBox.ts b/UI/FeatureInfoBox.ts index 4444fa7..527c7d0 100644 --- a/UI/FeatureInfoBox.ts +++ b/UI/FeatureInfoBox.ts @@ -80,7 +80,8 @@ export class FeatureInfoBox extends UIElement { let questions = ""; if (this._userDetails.data.loggedIn) { - questions = this._questions.HideOnEmpty(true).Render(); + // Questions is embedded in a span, because it'll hide the parent when the questions dissappear + questions = ""+this._questions.HideOnEmpty(true).Render()+""; } return "
" + diff --git a/assets/osm-logo.svg b/assets/osm-logo.svg new file mode 100644 index 0000000..cc5e0d4 --- /dev/null +++ b/assets/osm-logo.svg @@ -0,0 +1,758 @@ + + + + OpenStreetMap logo 2011 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + OpenStreetMap logo 2011 + + + Ken Vermette + + + + April 2011 + + + OpenStreetMap.org + + + Replacement logo for OpenStreetMap Foundation + + + OSM openstreetmap logo + + + http://wiki.openstreetmap.org/wiki/File:Public-images-osm_logo.svg + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 010110010011010110010011 + 010110010011010110010011 + + + \ No newline at end of file diff --git a/index.css b/index.css index 077d9f8..f1498a2 100644 --- a/index.css +++ b/index.css @@ -24,10 +24,11 @@ img { z-index: 999; /*Just below leaflets zoom*/ background-color: white; border-radius: 5px; - border: solid 2px rgba(0,0,0,0.2); + border: solid 2px rgba(0, 0, 0, 0.2); cursor: pointer; width: 43px; - height:43px; + height: 43px; + display: none; /*Hidden by default, only visible on mobile*/ } #geolocate-button img{ @@ -189,10 +190,12 @@ img { #messagesbox { display: none; } -} + + #geolocate-button { + display: block; + } -@media only screen and (max-width: 600px) { #messagesboxmobilewrapper { position: absolute; padding: 0; @@ -349,7 +352,7 @@ img { .next-button { background-color: black; - opacity: 30%; + opacity: 0.3; width: 3.0em; height: 100%; padding-left: 0.5em; diff --git a/index.ts b/index.ts index 0c4e46a..86c6379 100644 --- a/index.ts +++ b/index.ts @@ -27,7 +27,7 @@ if (location.hostname === "localhost" || location.hostname === "127.0.0.1") { dryRun = true; // If you have a testfile somewhere, enable this to spoof overpass // This should be hosted independantly, e.g. with `cd assets; webfsd -p 8080` + a CORS plugin to disable cors rules - // Overpass.testUrl = "http://127.0.0.1:8080/test.json"; + Overpass.testUrl = "http://127.0.0.1:8080/test.json"; } diff --git a/package-lock.json b/package-lock.json index 70cc7ac..4b57a62 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1039,6 +1039,14 @@ "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==" }, + "affine-hull": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/affine-hull/-/affine-hull-1.0.0.tgz", + "integrity": "sha1-dj/x040GPOt+Jy8X7k17vK+QXF0=", + "requires": { + "robust-orientation": "^1.1.3" + } + }, "ajv": { "version": "6.12.2", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", @@ -1355,6 +1363,11 @@ "file-uri-to-path": "1.0.0" } }, + "bit-twiddle": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bit-twiddle/-/bit-twiddle-1.0.2.tgz", + "integrity": "sha1-DGwfq+KyPRcXPZpht7cJPrnhdp4=" + }, "bn.js": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.2.tgz", @@ -1847,6 +1860,16 @@ "safe-buffer": "~5.1.1" } }, + "convex-hull": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/convex-hull/-/convex-hull-1.0.3.tgz", + "integrity": "sha1-IKOqbOh/St6i/30XlxyfwcZ+H/8=", + "requires": { + "affine-hull": "^1.0.0", + "incremental-convex-hull": "^1.0.1", + "monotone-convex-hull-2d": "^1.0.1" + } + }, "copy-descriptor": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", @@ -2440,6 +2463,11 @@ "readable-stream": "^2.0.2" } }, + "earcut": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/earcut/-/earcut-2.2.2.tgz", + "integrity": "sha512-eZoZPPJcUHnfRZ0PjLvx2qBordSiO8ofC3vt+qACLM95u+4DovnbYNpQtJh0DNsWj8RnxrQytD4WA8gj5cRIaQ==" + }, "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -2890,6 +2918,19 @@ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==" }, + "geojson-area": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/geojson-area/-/geojson-area-0.2.1.tgz", + "integrity": "sha1-JTewmC24YwnyHSxCikJXx6YoLMY=", + "requires": { + "wgs84": "0.0.0" + } + }, + "geojson-normalize": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/geojson-normalize/-/geojson-normalize-0.0.0.tgz", + "integrity": "sha1-Lbw2eM0bMbgXnodr2nDNEg3eNcA=" + }, "geojson-numeric": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/geojson-numeric/-/geojson-numeric-0.2.1.tgz", @@ -2922,6 +2963,11 @@ } } }, + "geojson-random": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/geojson-random/-/geojson-random-0.2.2.tgz", + "integrity": "sha1-q0g48SatxeFvj5TmVd74IPkRnbw=" + }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -3271,6 +3317,15 @@ "resolve-from": "^3.0.0" } }, + "incremental-convex-hull": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/incremental-convex-hull/-/incremental-convex-hull-1.0.1.tgz", + "integrity": "sha1-UUKMFMudmmFEv+abKFH7N3M0vh4=", + "requires": { + "robust-orientation": "^1.1.2", + "simplicial-complex": "^1.0.0" + } + }, "indexes-of": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", @@ -3678,6 +3733,11 @@ "verror": "1.10.0" } }, + "jsts": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/jsts/-/jsts-1.1.2.tgz", + "integrity": "sha1-0gXSzIOTCB2eSErjYoIRBpXtwjA=" + }, "kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -3925,6 +3985,14 @@ "minimist": "^1.2.5" } }, + "monotone-convex-hull-2d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/monotone-convex-hull-2d/-/monotone-convex-hull-2d-1.0.1.tgz", + "integrity": "sha1-R/Xa6t88Sv03dkuqGqh4ekDu4Iw=", + "requires": { + "robust-orientation": "^1.1.3" + } + }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -5355,6 +5423,36 @@ "inherits": "^2.0.1" } }, + "robust-orientation": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/robust-orientation/-/robust-orientation-1.1.3.tgz", + "integrity": "sha1-2v9bANO+TmByLw6cAVbvln8cIEk=", + "requires": { + "robust-scale": "^1.0.2", + "robust-subtract": "^1.0.0", + "robust-sum": "^1.0.0", + "two-product": "^1.0.2" + } + }, + "robust-scale": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/robust-scale/-/robust-scale-1.0.2.tgz", + "integrity": "sha1-d1Ey7QlULQKOWLLMecBikLz3jDI=", + "requires": { + "two-product": "^1.0.2", + "two-sum": "^1.0.0" + } + }, + "robust-subtract": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/robust-subtract/-/robust-subtract-1.0.0.tgz", + "integrity": "sha1-4LFk4e2LpOOl3aRaEgODSNvtPpo=" + }, + "robust-sum": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/robust-sum/-/robust-sum-1.0.0.tgz", + "integrity": "sha1-FmRuUlKStNJdgnV6KGlV4Lv6U9k=" + }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -5549,6 +5647,20 @@ } } }, + "simplicial-complex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/simplicial-complex/-/simplicial-complex-1.0.0.tgz", + "integrity": "sha1-bDOk7Wn81Nkbe8rdOzC2NoPq4kE=", + "requires": { + "bit-twiddle": "^1.0.0", + "union-find": "^1.0.0" + } + }, + "simplify-js": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/simplify-js/-/simplify-js-1.2.4.tgz", + "integrity": "sha512-vITfSlwt7h/oyrU42R83mtzFpwYk3+mkH9bOHqq/Qw6n8rtR7aE3NZQ5fbcyCUVVmuMJR6ynsAhOfK2qoah8Jg==" + }, "snapdragon": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", @@ -6108,11 +6220,501 @@ "safe-buffer": "^5.0.1" } }, + "turf": { + "version": "3.0.14", + "resolved": "https://registry.npmjs.org/turf/-/turf-3.0.14.tgz", + "integrity": "sha1-6y9KgKLVg7jGSGvHtccZBGaGbCc=", + "requires": { + "turf-along": "^3.0.12", + "turf-area": "^3.0.12", + "turf-bbox": "^3.0.12", + "turf-bbox-polygon": "^3.0.12", + "turf-bearing": "^3.0.12", + "turf-bezier": "^3.0.12", + "turf-buffer": "^3.0.12", + "turf-center": "^3.0.12", + "turf-centroid": "^3.0.12", + "turf-circle": "^3.0.12", + "turf-collect": "^3.0.12", + "turf-combine": "^3.0.12", + "turf-concave": "^3.0.12", + "turf-convex": "^3.0.12", + "turf-destination": "^3.0.12", + "turf-difference": "^3.0.12", + "turf-distance": "^3.0.12", + "turf-envelope": "^3.0.12", + "turf-explode": "^3.0.12", + "turf-flip": "^3.0.12", + "turf-helpers": "^3.0.12", + "turf-hex-grid": "^3.0.12", + "turf-inside": "^3.0.12", + "turf-intersect": "^3.0.12", + "turf-isolines": "^3.0.12", + "turf-kinks": "^3.0.12", + "turf-line-distance": "^3.0.12", + "turf-line-slice": "^3.0.12", + "turf-meta": "^3.0.12", + "turf-midpoint": "^3.0.12", + "turf-nearest": "^3.0.12", + "turf-planepoint": "^3.0.12", + "turf-point-grid": "^3.0.12", + "turf-point-on-line": "^3.0.12", + "turf-point-on-surface": "^3.0.12", + "turf-random": "^3.0.12", + "turf-sample": "^3.0.12", + "turf-simplify": "^3.0.12", + "turf-square": "^3.0.12", + "turf-square-grid": "^3.0.12", + "turf-tag": "^3.0.12", + "turf-tesselate": "^3.0.12", + "turf-tin": "^3.0.12", + "turf-triangle-grid": "^3.0.12", + "turf-union": "^3.0.12", + "turf-within": "^3.0.12" + } + }, + "turf-along": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/turf-along/-/turf-along-3.0.12.tgz", + "integrity": "sha1-5iK956S9E4wJZH1LFKoOpwBIXeY=", + "requires": { + "turf-bearing": "^3.0.12", + "turf-destination": "^3.0.12", + "turf-distance": "^3.0.12", + "turf-helpers": "^3.0.12" + } + }, + "turf-area": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/turf-area/-/turf-area-3.0.12.tgz", + "integrity": "sha1-m35Gnvn7VY/RR7sMIUgjJjvb8Tw=", + "requires": { + "geojson-area": "^0.2.1" + } + }, + "turf-bbox": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/turf-bbox/-/turf-bbox-3.0.12.tgz", + "integrity": "sha1-P6BhF8hEOGDsgKxg/V0vEyC/sb4=", + "requires": { + "turf-meta": "^3.0.12" + } + }, + "turf-bbox-polygon": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/turf-bbox-polygon/-/turf-bbox-polygon-3.0.12.tgz", + "integrity": "sha1-Mw3AuzgyLWFUXflmzmyA9oWs9PI=", + "requires": { + "turf-helpers": "^3.0.12" + } + }, + "turf-bearing": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/turf-bearing/-/turf-bearing-3.0.12.tgz", + "integrity": "sha1-ZfYJ3YUOc2THdxqm3th7DhkX/SA=", + "requires": { + "turf-invariant": "^3.0.12" + } + }, + "turf-bezier": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/turf-bezier/-/turf-bezier-3.0.12.tgz", + "integrity": "sha1-EC791KY7Jl7pyMFydjGSCzb03QI=", + "requires": { + "turf-helpers": "^3.0.12" + } + }, + "turf-buffer": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/turf-buffer/-/turf-buffer-3.0.12.tgz", + "integrity": "sha1-IIQP58aqZ7JL4cq3/8xagv1r2XE=", + "requires": { + "geojson-normalize": "0.0.0", + "jsts": "1.1.2", + "turf-combine": "^3.0.12", + "turf-helpers": "^3.0.12" + } + }, + "turf-center": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/turf-center/-/turf-center-3.0.12.tgz", + "integrity": "sha1-Rd1sFym7hnKR4+AC6cdQb4xEAZY=", + "requires": { + "turf-bbox": "^3.0.12", + "turf-helpers": "^3.0.12" + } + }, + "turf-centroid": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/turf-centroid/-/turf-centroid-3.0.12.tgz", + "integrity": "sha1-6u4NaYIEtX/DOZS7G8hnuNopP48=", + "requires": { + "turf-helpers": "^3.0.12", + "turf-meta": "^3.0.12" + } + }, + "turf-circle": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/turf-circle/-/turf-circle-3.0.12.tgz", + "integrity": "sha1-FAshy0lQ8tPLxw0t8BKTaGf1iTA=", + "requires": { + "turf-destination": "^3.0.12", + "turf-helpers": "^3.0.12" + } + }, + "turf-collect": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/turf-collect/-/turf-collect-3.0.12.tgz", + "integrity": "sha1-bphtGnB9oxnMg+cjjQvN8Zqjx/I=", + "requires": { + "turf-inside": "^3.0.12" + } + }, + "turf-combine": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/turf-combine/-/turf-combine-3.0.12.tgz", + "integrity": "sha1-FnB0bw/c4NHqiqain/5UONRGz3M=", + "requires": { + "turf-meta": "^3.0.12" + } + }, + "turf-concave": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/turf-concave/-/turf-concave-3.0.12.tgz", + "integrity": "sha1-/KtgVpZbCoMZ9s2AJgEJXy/TqOs=", + "requires": { + "turf-distance": "^3.0.12", + "turf-meta": "^3.0.12", + "turf-tin": "^3.0.12", + "turf-union": "^3.0.12" + } + }, + "turf-convex": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/turf-convex/-/turf-convex-3.0.12.tgz", + "integrity": "sha1-qI3cPiLRy2WHlqnIXTraO9Pso1c=", + "requires": { + "convex-hull": "^1.0.3", + "turf-helpers": "^3.0.12", + "turf-meta": "^3.0.12" + } + }, + "turf-destination": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/turf-destination/-/turf-destination-3.0.12.tgz", + "integrity": "sha1-fdb7+X6G+DGibIPvLVovjR2KbeI=", + "requires": { + "turf-helpers": "^3.0.12", + "turf-invariant": "^3.0.12" + } + }, + "turf-difference": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/turf-difference/-/turf-difference-3.0.12.tgz", + "integrity": "sha1-nD0NdjBCEAW4slt/Bo7Z77S8bqc=", + "requires": { + "jsts": "1.1.2", + "turf-helpers": "^3.0.12" + } + }, + "turf-distance": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/turf-distance/-/turf-distance-3.0.12.tgz", + "integrity": "sha1-+5e4cF+s2ZOxReAUtBhiYQ7spEk=", + "requires": { + "turf-helpers": "^3.0.12", + "turf-invariant": "^3.0.12" + } + }, + "turf-envelope": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/turf-envelope/-/turf-envelope-3.0.12.tgz", + "integrity": "sha1-lpIdJ4zIxmRpLjIOJUO5FAgNeGs=", + "requires": { + "turf-bbox": "^3.0.12", + "turf-bbox-polygon": "^3.0.12" + } + }, + "turf-explode": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/turf-explode/-/turf-explode-3.0.12.tgz", + "integrity": "sha1-xa4owoTNAGxWUR7H1AjEilQU7P4=", + "requires": { + "turf-helpers": "^3.0.12", + "turf-meta": "^3.0.12" + } + }, + "turf-flip": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/turf-flip/-/turf-flip-3.0.12.tgz", + "integrity": "sha1-3rhoF3uf87sxDF1BqqxhqRVqPLs=", + "requires": { + "turf-meta": "^3.0.12" + } + }, + "turf-grid": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/turf-grid/-/turf-grid-1.0.1.tgz", + "integrity": "sha1-uQSrxWS5ObYnpmrBXrFuBTgpuA8=", + "requires": { + "turf-point": "^2.0.0" + } + }, + "turf-helpers": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/turf-helpers/-/turf-helpers-3.0.12.tgz", + "integrity": "sha1-3UJy50s618lu7LeuXFf+jspUS3s=" + }, + "turf-hex-grid": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/turf-hex-grid/-/turf-hex-grid-3.0.12.tgz", + "integrity": "sha1-BpjvZpAguzHY6cwgVtCr/K/ITo8=", + "requires": { + "turf-distance": "^3.0.12", + "turf-helpers": "^3.0.12" + } + }, + "turf-inside": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/turf-inside/-/turf-inside-3.0.12.tgz", + "integrity": "sha1-m6QPpu7WO+x+fYiqZCdiLE3wcGY=", + "requires": { + "turf-invariant": "^3.0.12" + } + }, + "turf-intersect": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/turf-intersect/-/turf-intersect-3.0.12.tgz", + "integrity": "sha1-wNf7MFhDoZJ1ZwBXo50mixeDDYM=", + "requires": { + "jsts": "1.1.2" + } + }, + "turf-invariant": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/turf-invariant/-/turf-invariant-3.0.12.tgz", + "integrity": "sha1-O5UlOVOZHr2WLdNdT2cEwofejr4=" + }, + "turf-isolines": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/turf-isolines/-/turf-isolines-3.0.12.tgz", + "integrity": "sha1-ALIz3+LuvU7LR6lPySPG7OyJx6s=", + "requires": { + "turf-bbox": "^3.0.12", + "turf-grid": "1.0.1", + "turf-helpers": "^3.0.12", + "turf-inside": "^3.0.12", + "turf-planepoint": "^3.0.12", + "turf-square": "^3.0.12", + "turf-tin": "^3.0.12" + } + }, + "turf-kinks": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/turf-kinks/-/turf-kinks-3.0.12.tgz", + "integrity": "sha1-6cmo26VyTZjyNQ/FveugaewzN1U=", + "requires": { + "turf-helpers": "^3.0.12" + } + }, + "turf-line-distance": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/turf-line-distance/-/turf-line-distance-3.0.12.tgz", + "integrity": "sha1-cQj1smkH97jC3Rs5l4Zt06YOj18=", + "requires": { + "turf-distance": "^3.0.12", + "turf-helpers": "^3.0.12" + } + }, + "turf-line-slice": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/turf-line-slice/-/turf-line-slice-3.0.12.tgz", + "integrity": "sha1-9fGszJKtrmnqGsCynwdSmijd6RY=", + "requires": { + "turf-bearing": "^3.0.12", + "turf-destination": "^3.0.12", + "turf-distance": "^3.0.12", + "turf-helpers": "^3.0.12", + "turf-point-on-line": "^3.0.12" + } + }, + "turf-meta": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/turf-meta/-/turf-meta-3.0.12.tgz", + "integrity": "sha1-CqmhyvgrKloI1U4IMLW1o/oOijg=" + }, + "turf-midpoint": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/turf-midpoint/-/turf-midpoint-3.0.12.tgz", + "integrity": "sha1-sSdlroms3uhVb9XibJxfoEGgLL4=", + "requires": { + "turf-bearing": "^3.0.12", + "turf-destination": "^3.0.12", + "turf-distance": "^3.0.12", + "turf-invariant": "^3.0.12" + } + }, + "turf-nearest": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/turf-nearest/-/turf-nearest-3.0.12.tgz", + "integrity": "sha1-cAIH9EQ/BQlvhs0kb5KfFw369G0=", + "requires": { + "turf-distance": "^3.0.12" + } + }, + "turf-planepoint": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/turf-planepoint/-/turf-planepoint-3.0.12.tgz", + "integrity": "sha1-LDeuDxf8sw22448NWe5sDdbKqa8=" + }, + "turf-point": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/turf-point/-/turf-point-2.0.1.tgz", + "integrity": "sha1-otzDCi0g9Ez1xicd97riwOIUYGk=", + "requires": { + "minimist": "^1.1.0" + } + }, + "turf-point-grid": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/turf-point-grid/-/turf-point-grid-3.0.12.tgz", + "integrity": "sha1-1gSXi+ELyeUzBq4CzvcJhDHbSXE=", + "requires": { + "turf-distance": "^3.0.12", + "turf-helpers": "^3.0.12" + } + }, + "turf-point-on-line": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/turf-point-on-line/-/turf-point-on-line-3.0.12.tgz", + "integrity": "sha1-HYZjNU5wNy2xhj5iU+kEDEcSew8=", + "requires": { + "turf-bearing": "^3.0.12", + "turf-destination": "^3.0.12", + "turf-distance": "^3.0.12", + "turf-helpers": "^3.0.12" + } + }, + "turf-point-on-surface": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/turf-point-on-surface/-/turf-point-on-surface-3.0.12.tgz", + "integrity": "sha1-m+UFtrC6eOmFZQAd47OkJnEVJAo=", + "requires": { + "turf-center": "^3.0.12", + "turf-distance": "^3.0.12", + "turf-explode": "^3.0.12", + "turf-helpers": "^3.0.12", + "turf-inside": "^3.0.12" + } + }, + "turf-random": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/turf-random/-/turf-random-3.0.12.tgz", + "integrity": "sha1-NNuxQcPx6urhQk/Wxeq6H2+5seg=", + "requires": { + "geojson-random": "^0.2.2" + } + }, + "turf-sample": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/turf-sample/-/turf-sample-3.0.12.tgz", + "integrity": "sha1-eUn4YgYSBH4TFMHO2H6ZwUJGPNI=", + "requires": { + "turf-helpers": "^3.0.12" + } + }, + "turf-simplify": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/turf-simplify/-/turf-simplify-3.0.12.tgz", + "integrity": "sha1-heRDyLRqordSY4lETHOB2qKtGec=", + "requires": { + "simplify-js": "^1.2.1" + } + }, + "turf-square": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/turf-square/-/turf-square-3.0.12.tgz", + "integrity": "sha1-Gjix4PsF/+D8qkMYji83lCpRW2Q=", + "requires": { + "turf-distance": "^3.0.12", + "turf-helpers": "^3.0.12" + } + }, + "turf-square-grid": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/turf-square-grid/-/turf-square-grid-3.0.12.tgz", + "integrity": "sha1-PB2ArBRVbGgTtHi9oBJRLtS5Psg=", + "requires": { + "turf-distance": "^3.0.12", + "turf-helpers": "^3.0.12" + } + }, + "turf-tag": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/turf-tag/-/turf-tag-3.0.12.tgz", + "integrity": "sha1-IoT/8Oih6Son1Kx/10cbPEjd0ag=", + "requires": { + "turf-inside": "^3.0.12" + } + }, + "turf-tesselate": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/turf-tesselate/-/turf-tesselate-3.0.12.tgz", + "integrity": "sha1-QUdLe1s4ILzyc/tx4YlNjDzUDTU=", + "requires": { + "earcut": "^2.0.0", + "turf-helpers": "^3.0.12" + } + }, + "turf-tin": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/turf-tin/-/turf-tin-3.0.12.tgz", + "integrity": "sha1-tlNGRHY6zhyd8kHJWNI4SFUlc4U=", + "requires": { + "turf-helpers": "^3.0.12" + } + }, + "turf-triangle-grid": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/turf-triangle-grid/-/turf-triangle-grid-3.0.12.tgz", + "integrity": "sha1-gGR+V9r+CTRoeaKaGKDmKUrPEVk=", + "requires": { + "turf-distance": "^3.0.12", + "turf-helpers": "^3.0.12" + } + }, + "turf-union": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/turf-union/-/turf-union-3.0.12.tgz", + "integrity": "sha1-3+0OVUC4woVeSZTBRiHjpgyCnI4=", + "requires": { + "jsts": "1.1.2" + } + }, + "turf-within": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/turf-within/-/turf-within-3.0.12.tgz", + "integrity": "sha1-937q83cjhWG3+xM4526dEph0H5Q=", + "requires": { + "turf-helpers": "^3.0.12", + "turf-inside": "^3.0.12" + } + }, "tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" }, + "two-product": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/two-product/-/two-product-1.0.2.tgz", + "integrity": "sha1-Z9ldSyV6kh4stL16+VEfkIhSLqo=" + }, + "two-sum": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/two-sum/-/two-sum-1.0.0.tgz", + "integrity": "sha1-MdPzIjnk9zHsqd+RVeKyl/AIq2Q=" + }, "type-check": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", @@ -6188,6 +6790,11 @@ "tiny-inflate": "^1.0.0" } }, + "union-find": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/union-find/-/union-find-1.0.2.tgz", + "integrity": "sha1-KSusQV5q06iVNdI3AQ20pTYoTlg=" + }, "union-value": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", diff --git a/package.json b/package.json index 4e45f28..619c0bb 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "description": "A small website to edit OSM easily", "main": "index.js", "scripts": { - "start": "parcel index.html land.html test.html assets/test.json assets/* UI/* Logic/*", + "start": "parcel index.html land.html test.html assets/test.json assets/* UI/* Logic/* vendor/*", "build": "parcel build --public-url ./ index.html land.html assets/*", "test": "echo \"Error: no test specified\" && exit 1" }, @@ -21,7 +21,8 @@ "leaflet": "^1.6.0", "osm-auth": "^1.0.2", "osmtogeojson": "^3.0.0-beta.4", - "parcel": "^1.12.4" + "parcel": "^1.12.4", + "turf": "^3.0.14" }, "devDependencies": { "typescript": "^3.9.3" diff --git a/vendor/Leaflet.AccuratePosition.js b/vendor/Leaflet.AccuratePosition.js index e09af51..ae14051 100644 --- a/vendor/Leaflet.AccuratePosition.js +++ b/vendor/Leaflet.AccuratePosition.js @@ -131,3 +131,4 @@ L.Map.include({ }); } }); +console.log("Find accurate position script loaded"); \ No newline at end of file