|
|
@ -121,10 +121,9 @@ |
|
|
|
<div class="mt-4 h-96 w-5/6 mx-auto"> |
|
|
|
<l-map |
|
|
|
ref="projectMap" |
|
|
|
:center="[localCenterLat, localCenterLong]" |
|
|
|
:zoom="2" |
|
|
|
@ready="onMapReady" |
|
|
|
@moveend="onMoveEnd" |
|
|
|
@movestart="onMoveStart" |
|
|
|
@zoomend="onZoomEnd" |
|
|
|
@zoomstart="onZoomStart" |
|
|
|
> |
|
|
@ -498,12 +497,18 @@ export default class DiscoverView extends Vue { |
|
|
|
} |
|
|
|
|
|
|
|
async onMapReady(map: L.Map) { |
|
|
|
// doing this here instead of the l-map element avoids a recentering after the first drag |
|
|
|
map.setView([this.localCenterLat, this.localCenterLong], 2); |
|
|
|
this.requestTiles(map); |
|
|
|
} |
|
|
|
|
|
|
|
// Tried but failed to use other vue-leaflet methods update:zoom and update:bounds |
|
|
|
// To access the from this.$refs, use this.$refs.projectMap.mapObject |
|
|
|
|
|
|
|
onMoveStart(/* event: L.LocationEvent */) { |
|
|
|
// don't remove markers because they follow the map when moving (and the experience is jarring) |
|
|
|
} |
|
|
|
|
|
|
|
async onMoveEnd(event: L.LocationEvent) { |
|
|
|
if (this.zoomedSoDoNotMove) { |
|
|
|
// since a zoom triggers a moveend, too, don't duplicate a tile request |
|
|
@ -514,14 +519,18 @@ export default class DiscoverView extends Vue { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
async onZoomEnd(event: L.LocationEvent) { |
|
|
|
await this.requestTiles(event.target); |
|
|
|
} |
|
|
|
|
|
|
|
onZoomStart(/* event: L.LocationEvent */) { |
|
|
|
// remove markers because otherwise they jump around at zoom end |
|
|
|
Object.values(this.markers).forEach((marker) => marker.remove()); |
|
|
|
this.markers = {}; |
|
|
|
|
|
|
|
this.zoomedSoDoNotMove = true; |
|
|
|
} |
|
|
|
|
|
|
|
async onZoomEnd(event: L.LocationEvent) { |
|
|
|
await this.requestTiles(event.target); |
|
|
|
} |
|
|
|
|
|
|
|
async requestTiles(targetMap: L.Map) { |
|
|
|
try { |
|
|
|
const bounds = targetMap.getBounds(); |
|
|
@ -535,10 +544,10 @@ export default class DiscoverView extends Vue { |
|
|
|
this.apiServer + "/api/v2/report/planCountsByBBox?" + queryParams, |
|
|
|
); |
|
|
|
if (response.status === 200) { |
|
|
|
Object.values(this.markers).forEach((marker) => marker.remove()); |
|
|
|
this.markers = {}; |
|
|
|
const results = await response.json(); |
|
|
|
if (results.data?.tiles?.length > 0) { |
|
|
|
Object.values(this.markers).forEach((marker) => marker.remove()); |
|
|
|
this.markers = {}; |
|
|
|
for (const tile of results.data.tiles) { |
|
|
|
const pinLat = (tile.minFoundLat + tile.maxFoundLat) / 2; |
|
|
|
const pinLon = (tile.minFoundLon + tile.maxFoundLon) / 2; |
|
|
@ -560,9 +569,7 @@ export default class DiscoverView extends Vue { |
|
|
|
}; |
|
|
|
this.searchLocal(); |
|
|
|
}); |
|
|
|
this.markers[ |
|
|
|
"" + tile.indexLat + "X" + tile.indexLon + "*" + tile.recordCount |
|
|
|
] = marker; |
|
|
|
this.markers["" + tile.indexLat + "X" + tile.indexLon] = marker; |
|
|
|
} |
|
|
|
} |
|
|
|
await this.searchLocal(); |
|
|
@ -664,6 +671,7 @@ export default class DiscoverView extends Vue { |
|
|
|
display: flex; |
|
|
|
align-items: center; |
|
|
|
justify-content: center; |
|
|
|
text-align: center; |
|
|
|
font-size: 14px; |
|
|
|
font-weight: bold; |
|
|
|
color: white; |
|
|
|