Fix multiple bugs after user testing

This commit is contained in:
Pieter Vander Vennet 2020-06-28 23:33:48 +02:00
parent bcdbf6a2dd
commit 9bd37d9cde
20 changed files with 1529 additions and 77 deletions

View file

@ -5,22 +5,17 @@ import {UIEventSource} from "./UI/UIEventSource";
export class Helpers { export class Helpers {
static SetupAutoSave(changes: Changes, millisTillChangesAreSaved : UIEventSource<number>, saveAfterXMillis : number) { static DoEvery(millis: number, f: (() => void)) {
window.setTimeout(
// This little function triggers the actual upload: function () {
// Either when more then three answers are selected, or when no new answer has been added for the last 20s f();
// @ts-ignore Helpers.DoEvery(millis, f);
window.decreaseTime = function () {
var time = millisTillChangesAreSaved.data;
if (time <= 0) {
if (changes.pendingChangesES.data > 0) {
changes.uploadAll(undefined);
}
} else {
millisTillChangesAreSaved.setData(time - 1000);
} }
window.setTimeout('decreaseTime()', 1000); , millis)
}; }
static SetupAutoSave(changes: Changes, millisTillChangesAreSaved: UIEventSource<number>, saveAfterXMillis: number) {
changes.pendingChangesES.addCallback(function () { changes.pendingChangesES.addCallback(function () {
@ -38,10 +33,20 @@ export class Helpers {
}); });
// @ts-ignore millisTillChangesAreSaved.addCallback((time) => {
window.decreaseTime(); // The timer keeps running... if (time <= 0 && changes.pendingChangesES.data > 0) {
} changes.uploadAll(undefined);
}
}
)
Helpers.DoEvery(
1000,
() => {
millisTillChangesAreSaved
.setData(millisTillChangesAreSaved.data - 1000)
});
}
/* /*
@ -50,7 +55,7 @@ export class Helpers {
* -> Asks the user not to close. The 'not to close' dialog should profide enough time to upload * -> 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 * -> WHen uploading is done, the window is closed anyway
*/ */
static LastEffortSave(changes : Changes){ static LastEffortSave(changes: Changes) {
window.addEventListener("beforeunload", function (e) { window.addEventListener("beforeunload", function (e) {
// Quickly save everyting! // Quickly save everyting!

View file

@ -29,8 +29,10 @@ export class LayerDefinition {
style: (tags: any) => any; 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<UserDetails>, selectedElement: UIEventSource<any>): asLayer(basemap: Basemap, allElements: ElementStorage, changes: Changes, userDetails: UIEventSource<UserDetails>, selectedElement: UIEventSource<any>):
@ -40,7 +42,7 @@ export class LayerDefinition {
this.name, this.name,
basemap, allElements, changes, basemap, allElements, changes,
this.overpassFilter, this.overpassFilter,
this.removeContainedElements, this.removeTouchingElements, this.maxAllowedOverlapPercentage,
this.style, this.style,
selectedElement); selectedElement);

View file

@ -1,10 +1,7 @@
import {LayerDefinition} from "../LayerDefinition"; import {LayerDefinition} from "../LayerDefinition";
import {Quests} from "../Quests"; import {TagMappingOptions} from "../UI/TagMapping";
import {FixedUiElement} from "../UI/FixedUiElement";
import {TagMapping, TagMappingOptions} from "../UI/TagMapping";
import L from "leaflet"; import L from "leaflet";
import {QuestionDefinition} from "../Logic/Question"; import {QuestionDefinition} from "../Logic/Question";
import {CommonTagMappings} from "./CommonTagMappings";
import {Tag} from "../Logic/TagsFilter"; import {Tag} from "../Logic/TagsFilter";
export class Bookcases extends LayerDefinition { export class Bookcases extends LayerDefinition {

View file

@ -24,7 +24,7 @@ export class Bos extends LayerDefinition {
new Tag("landuse", "forest"), new Tag("landuse", "forest"),
new Tag("fixme", "Toegevoegd met MapComplete, geometry nog uit te tekenen") new Tag("fixme", "Toegevoegd met MapComplete, geometry nog uit te tekenen")
]; ];
this.removeContainedElements = true; this.maxAllowedOverlapPercentage = 10;
this.minzoom = 14; this.minzoom = 14;
this.questions = [Quests.nameOf(this.name), Quests.accessNatureReserve, Quests.operator]; this.questions = [Quests.nameOf(this.name), Quests.accessNatureReserve, Quests.operator];

View file

@ -13,7 +13,7 @@ export class NatureReserves extends LayerDefinition {
this.icon = "./assets/tree_white_background.svg"; this.icon = "./assets/tree_white_background.svg";
this.overpassFilter = this.overpassFilter =
new Or([new Tag("leisure", "nature_reserve"), new Tag("boundary","protected_area")]); 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"), this.newElementTags = [new Tag("leisure", "nature_reserve"),
new Tag("fixme", "Toegevoegd met MapComplete, geometry nog uit te tekenen")] new Tag("fixme", "Toegevoegd met MapComplete, geometry nog uit te tekenen")]

View file

@ -15,7 +15,7 @@ export class Park extends LayerDefinition {
new Or([new Tag("leisure","park"), new Tag("landuse","village_green")]); new Or([new Tag("leisure","park"), new Tag("landuse","village_green")]);
this.newElementTags = [new Tag("leisure", "park"), this.newElementTags = [new Tag("leisure", "park"),
new Tag("fixme", "Toegevoegd met MapComplete, geometry nog uit te tekenen")]; new Tag("fixme", "Toegevoegd met MapComplete, geometry nog uit te tekenen")];
this.removeTouchingElements = true; this.maxAllowedOverlapPercentage = 25;
this.minzoom = 13; this.minzoom = 13;
this.questions = [Quests.nameOf("park")]; this.questions = [Quests.nameOf("park")];

View file

@ -13,7 +13,7 @@ export class Playground extends LayerDefinition {
this.icon = "./assets/tree_white_background.svg"; this.icon = "./assets/tree_white_background.svg";
this.overpassFilter = new Tag("leisure","playground"); this.overpassFilter = new Tag("leisure","playground");
this.newElementTags = [new Tag("leisure", "playground"), new Tag( "fixme", "Toegevoegd met MapComplete, geometry nog uit te tekenen")] 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.minzoom = 13;
this.questions = [Quests.nameOf(this.name)]; this.questions = [Quests.nameOf(this.name)];

View file

@ -3,7 +3,6 @@ import {Quests} from "../Quests";
import {FixedUiElement} from "../UI/FixedUiElement"; import {FixedUiElement} from "../UI/FixedUiElement";
import {TagMappingOptions} from "../UI/TagMapping"; import {TagMappingOptions} from "../UI/TagMapping";
import L from "leaflet"; import L from "leaflet";
import {CommonTagMappings} from "./CommonTagMappings";
import {Tag} from "../Logic/TagsFilter"; import {Tag} from "../Logic/TagsFilter";
export class Toilets extends LayerDefinition{ export class Toilets extends LayerDefinition{

View file

@ -1,7 +1,6 @@
import {Basemap} from "./Basemap"; import {Basemap} from "./Basemap";
import {TagsFilter, TagUtils} from "./TagsFilter"; import {TagsFilter, TagUtils} from "./TagsFilter";
import {UIEventSource} from "../UI/UIEventSource"; import {UIEventSource} from "../UI/UIEventSource";
import {UIElement} from "../UI/UIElement";
import {ElementStorage} from "./ElementStorage"; import {ElementStorage} from "./ElementStorage";
import {Changes} from "./Changes"; import {Changes} from "./Changes";
import L from "leaflet" import L from "leaflet"
@ -22,8 +21,7 @@ export class FilteredLayer {
public readonly filters: TagsFilter; public readonly filters: TagsFilter;
private readonly _map: Basemap; private readonly _map: Basemap;
private readonly _removeContainedElements; private readonly _maxAllowedOverlap: number;
private readonly _removeTouchingElements;
private readonly _style: (properties) => any; private readonly _style: (properties) => any;
@ -46,8 +44,7 @@ export class FilteredLayer {
map: Basemap, storage: ElementStorage, map: Basemap, storage: ElementStorage,
changes: Changes, changes: Changes,
filters: TagsFilter, filters: TagsFilter,
removeContainedElements: boolean, maxAllowedOverlap: number,
removeTouchingElements: boolean,
style: ((properties) => any), style: ((properties) => any),
selectedElement: UIEventSource<any>) { selectedElement: UIEventSource<any>) {
this._selectedElement = selectedElement; this._selectedElement = selectedElement;
@ -62,8 +59,7 @@ export class FilteredLayer {
this.filters = filters; this.filters = filters;
this._style = style; this._style = style;
this._storage = storage; this._storage = storage;
this._removeContainedElements = removeContainedElements; this._maxAllowedOverlap = maxAllowedOverlap;
this._removeTouchingElements = removeTouchingElements;
} }
@ -92,8 +88,8 @@ export class FilteredLayer {
const notShadowed = []; const notShadowed = [];
for (const feature of leftoverFeatures) { for (const feature of leftoverFeatures) {
if (this._removeContainedElements || this._removeTouchingElements) { if (this._maxAllowedOverlap !== undefined && this._maxAllowedOverlap >= 0) {
if (GeoOperations.featureIsContainedInAny(feature, selfFeatures, this._removeTouchingElements)) { if (GeoOperations.featureIsContainedInAny(feature, selfFeatures, this._maxAllowedOverlap)) {
// This feature is filtered away // This feature is filtered away
continue; continue;
} }

View file

@ -2,6 +2,7 @@ import {Basemap} from "./Basemap";
import {UIEventSource} from "../UI/UIEventSource"; import {UIEventSource} from "../UI/UIEventSource";
import {UIElement} from "../UI/UIElement"; import {UIElement} from "../UI/UIElement";
import L from "leaflet"; import L from "leaflet";
import {Helpers} from "../Helpers";
export class GeoLocationHandler extends UIElement { export class GeoLocationHandler extends UIElement {
@ -11,7 +12,7 @@ export class GeoLocationHandler extends UIElement {
}> = new UIEventSource<{ latlng: number, accuracy: number }>(undefined); }> = new UIEventSource<{ latlng: number, accuracy: number }>(undefined);
private _isActive: UIEventSource<boolean> = new UIEventSource<boolean>(false); private _isActive: UIEventSource<boolean> = new UIEventSource<boolean>(false);
private _permission: UIEventSource<string> = new UIEventSource<string>("");
private _map: Basemap; private _map: Basemap;
private _marker: any; private _marker: any;
@ -20,6 +21,7 @@ export class GeoLocationHandler extends UIElement {
this._map = map; this._map = map;
this.ListenTo(this.currentLocation); this.ListenTo(this.currentLocation);
this.ListenTo(this._isActive); this.ListenTo(this._isActive);
this.ListenTo(this._permission);
const self = this; const self = this;
@ -27,6 +29,7 @@ export class GeoLocationHandler extends UIElement {
function onAccuratePositionProgress(e) { function onAccuratePositionProgress(e) {
console.log(e.accuracy); console.log(e.accuracy);
console.log(e.latlng); console.log(e.latlng);
self.currentLocation.setData({latlng: e.latlng, accuracy: e.accuracy});
} }
function onAccuratePositionFound(e) { function onAccuratePositionFound(e) {
@ -62,8 +65,19 @@ export class GeoLocationHandler extends UIElement {
self._marker = newMarker; self._marker = newMarker;
}); });
navigator.permissions.query({ name: 'geolocation' }) navigator.permissions.query({name: 'geolocation'})
.then(function(){self.StartGeolocating()}); .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; const self = this;
if (self._permission.data === "denied") {
return "";
}
if (self.currentLocation.data !== undefined) { if (self.currentLocation.data !== undefined) {
self._map.map.flyTo(self.currentLocation.data.latlng, 18); self._map.map.flyTo(self.currentLocation.data.latlng, 18);
return;
} }
self._isActive.setData(true);
console.log("Searching location using GPS") console.log("Searching location using GPS")
self._map.map.findAccuratePosition({ self._map.map.findAccuratePosition({
maxWait: 15000, // defaults to 10000 maxWait: 10000, // defaults to 10000
desiredAccuracy: 30 // defaults to 20 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) { InnerUpdate(htmlElement: HTMLElement) {

View file

@ -1,8 +1,15 @@
import * as turf from 'turf'
export class GeoOperations { 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") { if (feature.geometry.type === "Point") {
const coor = feature.geometry.coordinates; const coor = feature.geometry.coordinates;
for (const shouldNotContainElement of shouldNotContain) { 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; const poly = feature;
let featureBBox = BBox.get(feature);
const featureSurface = GeoOperations.surfaceAreaInSqMeters(poly);
for (const shouldNotContainElement of shouldNotContain) { for (const shouldNotContainElement of shouldNotContain) {
let shouldNotContainBBox = BBox.get(shouldNotContainElement); const shouldNotContainBBox = BBox.get(shouldNotContainElement);
let featureBBox = BBox.get(feature); const overlaps = featureBBox.overlapsWith(shouldNotContainBBox)
if (!featureBBox.overlapsWith(shouldNotContainBBox)) { if (!overlaps) {
continue; continue;
} }
if (noTouching) { // Calculate the surface area of the intersection
if (GeoOperations.isPolygonTouching(poly, shouldNotContainElement)) { // If it is too big, refuse
return true; try {
}
} else { const intersection = turf.intersect(poly, shouldNotContainElement);
if (GeoOperations.isPolygonInside(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; 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; return false;
} }
/** /**
* Simple check: that every point of the polygon is inside the container * Simple check: that every point of the polygon is inside the container
* @param polygon * @param polygon
* @param container * @param container
*/ */
static isPolygonInside(polygon, container) { private static isPolygonInside(polygon, container) {
for (const coor of polygon.geometry.coordinates[0]) { for (const coor of polygon.geometry.coordinates[0]) {
if (!GeoOperations.inside(coor, container)) { if (!GeoOperations.inside(coor, container)) {
return false; return false;
@ -66,7 +90,7 @@ export class GeoOperations {
* @param polygon * @param polygon
* @param container * @param container
*/ */
static isPolygonTouching(polygon, container) { private static isPolygonTouching(polygon, container) {
for (const coor of polygon.geometry.coordinates[0]) { for (const coor of polygon.geometry.coordinates[0]) {
if (GeoOperations.inside(coor, container)) { if (GeoOperations.inside(coor, container)) {
return true; 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 // ray-casting algorithm based on
// http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html // 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.minLon = Math.min(this.minLon, coordinate[0]);
this.minLat = Math.min(this.minLat, coordinate[1]); 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) { public overlapsWith(other: BBox) {
this.check();
other.check();
if (this.maxLon < other.minLon) { if (this.maxLon < other.minLon) {
return false; return false;
} }
@ -155,13 +188,22 @@ class BBox {
static get(feature) { static get(feature) {
if (feature.bbox === undefined) { 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]); feature.bbox = new BBox(feature.geometry.coordinates[0]);
} else if (feature.geometry.type === "LineString") { } else if (feature.geometry.type === "LineString") {
feature.bbox = new BBox(feature.geometry.coordinates); feature.bbox = new BBox(feature.geometry.coordinates);
} else { } else if (feature.geometry.type === "Point") {
// Point // Point
feature.bbox = new BBox([feature.geometry.coordinates]); feature.bbox = new BBox([feature.geometry.coordinates]);
} else {
throw "Cannot calculate bbox, unknown type " + feature.geometry.type;
} }
} }

View file

@ -76,7 +76,14 @@ export class OsmConnection {
console.log(userInfo); console.log(userInfo);
data.name = userInfo.getAttribute('display_name'); data.name = userInfo.getAttribute('display_name');
data.csCount = userInfo.getElementsByTagName("changesets")[0].getAttribute("count"); 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]; const messages = userInfo.getElementsByTagName("messages")[0].getElementsByTagName("received")[0];
data.unreadMessages = parseInt(messages.getAttribute("unread")); data.unreadMessages = parseInt(messages.getAttribute("unread"));
data.totalMessages = parseInt(messages.getAttribute("count")); data.totalMessages = parseInt(messages.getAttribute("count"));

View file

@ -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 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: # Attributions:

View file

@ -80,7 +80,8 @@ export class FeatureInfoBox extends UIElement {
let questions = ""; let questions = "";
if (this._userDetails.data.loggedIn) { 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 = "<span>"+this._questions.HideOnEmpty(true).Render()+"</span>";
} }
return "<div class='featureinfobox'>" + return "<div class='featureinfobox'>" +

758
assets/osm-logo.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 150 KiB

View file

@ -24,10 +24,11 @@ img {
z-index: 999; /*Just below leaflets zoom*/ z-index: 999; /*Just below leaflets zoom*/
background-color: white; background-color: white;
border-radius: 5px; border-radius: 5px;
border: solid 2px rgba(0,0,0,0.2); border: solid 2px rgba(0, 0, 0, 0.2);
cursor: pointer; cursor: pointer;
width: 43px; width: 43px;
height:43px; height: 43px;
display: none; /*Hidden by default, only visible on mobile*/
} }
#geolocate-button img{ #geolocate-button img{
@ -189,10 +190,12 @@ img {
#messagesbox { #messagesbox {
display: none; display: none;
} }
}
#geolocate-button {
display: block;
}
@media only screen and (max-width: 600px) {
#messagesboxmobilewrapper { #messagesboxmobilewrapper {
position: absolute; position: absolute;
padding: 0; padding: 0;
@ -349,7 +352,7 @@ img {
.next-button { .next-button {
background-color: black; background-color: black;
opacity: 30%; opacity: 0.3;
width: 3.0em; width: 3.0em;
height: 100%; height: 100%;
padding-left: 0.5em; padding-left: 0.5em;

View file

@ -27,7 +27,7 @@ if (location.hostname === "localhost" || location.hostname === "127.0.0.1") {
dryRun = true; dryRun = true;
// If you have a testfile somewhere, enable this to spoof overpass // 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 // 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";
} }

607
package-lock.json generated
View file

@ -1039,6 +1039,14 @@
"resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz",
"integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==" "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": { "ajv": {
"version": "6.12.2", "version": "6.12.2",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz",
@ -1355,6 +1363,11 @@
"file-uri-to-path": "1.0.0" "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": { "bn.js": {
"version": "5.1.2", "version": "5.1.2",
"resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.2.tgz", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.2.tgz",
@ -1847,6 +1860,16 @@
"safe-buffer": "~5.1.1" "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": { "copy-descriptor": {
"version": "0.1.1", "version": "0.1.1",
"resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
@ -2440,6 +2463,11 @@
"readable-stream": "^2.0.2" "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": { "ecc-jsbn": {
"version": "0.1.2", "version": "0.1.2",
"resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", "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", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz",
"integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==" "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": { "geojson-numeric": {
"version": "0.2.1", "version": "0.2.1",
"resolved": "https://registry.npmjs.org/geojson-numeric/-/geojson-numeric-0.2.1.tgz", "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": { "get-caller-file": {
"version": "2.0.5", "version": "2.0.5",
"resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
@ -3271,6 +3317,15 @@
"resolve-from": "^3.0.0" "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": { "indexes-of": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz",
@ -3678,6 +3733,11 @@
"verror": "1.10.0" "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": { "kind-of": {
"version": "6.0.3", "version": "6.0.3",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
@ -3925,6 +3985,14 @@
"minimist": "^1.2.5" "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": { "ms": {
"version": "2.1.2", "version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
@ -5355,6 +5423,36 @@
"inherits": "^2.0.1" "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": { "safe-buffer": {
"version": "5.1.2", "version": "5.1.2",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "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": { "snapdragon": {
"version": "0.8.2", "version": "0.8.2",
"resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
@ -6108,11 +6220,501 @@
"safe-buffer": "^5.0.1" "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": { "tweetnacl": {
"version": "0.14.5", "version": "0.14.5",
"resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
"integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" "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": { "type-check": {
"version": "0.3.2", "version": "0.3.2",
"resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
@ -6188,6 +6790,11 @@
"tiny-inflate": "^1.0.0" "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": { "union-value": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz",

View file

@ -4,7 +4,7 @@
"description": "A small website to edit OSM easily", "description": "A small website to edit OSM easily",
"main": "index.js", "main": "index.js",
"scripts": { "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/*", "build": "parcel build --public-url ./ index.html land.html assets/*",
"test": "echo \"Error: no test specified\" && exit 1" "test": "echo \"Error: no test specified\" && exit 1"
}, },
@ -21,7 +21,8 @@
"leaflet": "^1.6.0", "leaflet": "^1.6.0",
"osm-auth": "^1.0.2", "osm-auth": "^1.0.2",
"osmtogeojson": "^3.0.0-beta.4", "osmtogeojson": "^3.0.0-beta.4",
"parcel": "^1.12.4" "parcel": "^1.12.4",
"turf": "^3.0.14"
}, },
"devDependencies": { "devDependencies": {
"typescript": "^3.9.3" "typescript": "^3.9.3"

View file

@ -131,3 +131,4 @@ L.Map.include({
}); });
} }
}); });
console.log("Find accurate position script loaded");