Fix bug in bounds calculation for negative lats/lons

This commit is contained in:
pietervdvn 2021-09-27 15:38:12 +02:00
parent 215aebce19
commit 38037014b0
6 changed files with 65 additions and 51 deletions

View file

@ -41,6 +41,7 @@ import ShowTileInfo from "./UI/ShowDataLayer/ShowTileInfo";
import {Tiles} from "./Models/TileRange";
import {TileHierarchyAggregator} from "./UI/ShowDataLayer/PerTileCountAggregator";
import {BBox} from "./Logic/GeoOperations";
import StaticFeatureSource from "./Logic/FeatureSource/Sources/StaticFeatureSource";
export class InitUiElements {
static InitAll(
@ -421,9 +422,6 @@ export class InitUiElements {
const flayer = {
isDisplayed: isDisplayed,
layerDef: layer,
isSufficientlyZoomed: state.locationControl.map(l => {
return l.zoom >= (layer.minzoomVisible ?? layer.minzoom)
}),
appliedFilters: new UIEventSource<TagsFilter>(undefined),
};
flayers.push(flayer);
@ -491,7 +489,7 @@ export class InitUiElements {
return true
}, [State.state.locationControl, State.state.currentBounds]
)
new ShowDataLayer(
{
features: source,
@ -502,7 +500,6 @@ export class InitUiElements {
);
}, state
);
}
private static setupAllLayerElements() {

View file

@ -388,10 +388,10 @@ export class BBox {
static global: BBox = new BBox([[-180, -90], [180, 90]]);
constructor(coordinates) {
this.maxLat = Number.MIN_VALUE;
this.maxLon = Number.MIN_VALUE;
this.minLat = Number.MAX_VALUE;
this.minLon = Number.MAX_VALUE;
this.maxLat = -90;
this.maxLon = -180;
this.minLat = 90;
this.minLon = 180;
for (const coordinate of coordinates) {
@ -491,4 +491,23 @@ export class BBox {
toLeaflet() {
return [[this.minLat, this.minLon], [this.maxLat, this.maxLon]]
}
asGeoJson(properties: any) : any{
return {
type:"Feature",
properties: properties,
geometry:{
type:"Polygon",
coordinates:[[
[this.minLon, this.minLat],
[this.maxLon, this.minLat],
[this.maxLon, this.maxLat],
[this.minLon, this.maxLat],
[this.minLon, this.minLat],
]]
}
}
}
}

View file

@ -97,6 +97,9 @@ export default class SimpleMetaTagger {
continue;
}
for (const unit of units) {
if(unit === undefined){
continue
}
if (unit.appliesToKeys === undefined) {
console.error("The unit ", unit, "has no appliesToKey defined")
continue

View file

@ -30,6 +30,8 @@ export default class Minimap {
/**
* Construct a minimap
*/
public static createMiniMap: (options: MinimapOptions) => (BaseUIElement & MinimapObj)
public static createMiniMap: (options: MinimapOptions) => (BaseUIElement & MinimapObj) = (_) => {
throw "CreateMinimap hasn't been initialized yet. Please call MinimapImplementation.initialize()"
}
}

61
test.ts
View file

@ -5,46 +5,29 @@ import MinimapImplementation from "./UI/Base/MinimapImplementation";
import {UIEventSource} from "./Logic/UIEventSource";
import FilteredLayer from "./Models/FilteredLayer";
import {And} from "./Logic/Tags/And";
import ShowDataLayer from "./UI/ShowDataLayer/ShowDataLayer";
import ShowTileInfo from "./UI/ShowDataLayer/ShowTileInfo";
import StaticFeatureSource from "./Logic/FeatureSource/Sources/StaticFeatureSource";
import {BBox} from "./Logic/GeoOperations";
import Minimap from "./UI/Base/Minimap";
const layout = AllKnownLayouts.allKnownLayouts.get("cyclestreets")
State.state = new State(layout)
State.state = new State(undefined)
const leafletMap = new UIEventSource(undefined)
MinimapImplementation.initialize()
const feature = {
"type": "Feature",
"properties": {
id: "way/1234",
"highway":"residential",
"cyclestreet":"yes"
},
"geometry": {
"type": "LineString",
"coordinates": [
[
3.2207107543945312,
51.21978729870313
],
[
3.2198524475097656,
51.21899435057332
],
[
3.2155394554138184,
51.21617188199714
]
]
}
}
Minimap.createMiniMap({
leafletMap: leafletMap,
}).SetStyle("height: 600px; width: 600px")
.AttachTo("maindiv")
State.state.allElements.addOrGetElement(feature)
State.state.filteredLayers = new UIEventSource<FilteredLayer[]>(
layout.layers.map( l => ({
layerDef :l,
appliedFilters: new UIEventSource<And>(undefined),
isDisplayed: new UIEventSource<boolean>(undefined)
}))
)
const bbox = BBox.fromTile(16,32754,21785).asGeoJson({
count: 42,
tileId: 42
})
const splitroad = new SplitRoadWizard("way/1234")
splitroad.AttachTo("maindiv")
splitroad.dialogIsOpened.setData(true)
console.log(bbox)
new ShowDataLayer({
layerToShow: ShowTileInfo.styling,
leafletMap: leafletMap,
features: new StaticFeatureSource([ bbox], false)
})

View file

@ -1,7 +1,8 @@
import {Utils} from "../Utils";
import * as Assert from "assert";
import T from "./TestHelper";
import {GeoOperations} from "../Logic/GeoOperations";
import {BBox, GeoOperations} from "../Logic/GeoOperations";
import {equal} from "assert";
Utils.runningFromConsole = true;
@ -176,7 +177,16 @@ export default class GeoOperationsSpec extends T {
const overlap = GeoOperations.calculateOverlap(point, [GeoOperationsSpec.polygon]);
Assert.equal(1, overlap.length)
}]
}],
["bbox bounds test",
() => {
const bbox = BBox.fromTile(16, 32754, 21785)
equal(-0.0714111328125, bbox.minLon)
equal(-0.076904296875, bbox.maxLon)
equal(51.53266860674158, bbox.minLat)
equal(51.5292513551899, bbox.maxLat)
}
]
]
)