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 {
static SetupAutoSave(changes: Changes, millisTillChangesAreSaved : UIEventSource<number>, 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<number>, 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!

View file

@ -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<UserDetails>, selectedElement: UIEventSource<any>):
@ -40,7 +42,7 @@ export class LayerDefinition {
this.name,
basemap, allElements, changes,
this.overpassFilter,
this.removeContainedElements, this.removeTouchingElements,
this.maxAllowedOverlapPercentage,
this.style,
selectedElement);

View file

@ -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 {

View file

@ -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];

View file

@ -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")]

View file

@ -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")];

View file

@ -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)];

View file

@ -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{

View file

@ -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<any>) {
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;
}

View file

@ -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<boolean> = new UIEventSource<boolean>(false);
private _permission: UIEventSource<string> = new UIEventSource<string>("");
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) {

View file

@ -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;
}
}

View file

@ -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"));

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

View file

@ -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 = "<span>"+this._questions.HideOnEmpty(true).Render()+"</span>";
}
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*/
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;

View file

@ -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";
}

607
package-lock.json generated
View file

@ -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",

View file

@ -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"

View file

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