Skip to content

Commit

Permalink
draft zoom/heat/style, restructure store actions
Browse files Browse the repository at this point in the history
  • Loading branch information
warm-coolguy committed Mar 1, 2024
1 parent 6987535 commit 3033174
Show file tree
Hide file tree
Showing 15 changed files with 385 additions and 139 deletions.
30 changes: 5 additions & 25 deletions packages/clients/textLocator/TODO.md
Original file line number Diff line number Diff line change
@@ -1,28 +1,8 @@
# TODO

## MUSS

* Liste ermittelter Orte
* Liste ermittelter Texte mit Ortsbezug
* Ortsbezüge eines Textes graphisch darstellen
* Suchgeometrien: Rechtecke, Punkte
* Suchgeometrien: Ortspolygone (Adresssuche?)
* Kontextsuche: Filtern ermittelter Texte (???)
* Relevanzbewertung von Ortsbezügen (UI nur Count?)

## SOLL

* Häufigkeit von Funden
* Dataport-Geo-Design
* Ortsbezüge von Texten als Ortsgebirge (?)
* Zugriff auf weitere Geodaten (???)
* Schreibweisen/Sprachen von Orten berücksichtigen
* Historische Ortspolygone beachten
* Suchgeometrien: Kreise, Vielecke
* Ortssuche

## KANN

* 3D-Darstellung Ortsgebirge
* Höhenlinien Ortsgebirge
* Farbliche Markieren Ortsgebirge
* Suchgeometrien: Ortspolygone (Ort => Alle bezüglichen Orte)
* Schreibweisen/Sprachen von Orten berücksichtigen (=> Zusammenfassung in Übersicht?)
* Historische Ortspolygone beachten (=> Zeitslot-Auswahl)
* Ortsbezüge von Texten als Ortsgebirge (explorativ)
* Mehrsprachigkeit (en/de)
1 change: 1 addition & 0 deletions packages/clients/textLocator/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
"devDependencies": {
"@polar/core": "^1.4.1",
"@polar/lib-custom-types": "^1.4.1",
"@polar/lib-tooltip": "^1.0.0",
"@polar/plugin-address-search": "^1.2.1",
"@polar/plugin-attributions": "^1.2.1",
"@polar/plugin-draw": "1.1.0",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,10 +52,8 @@
v-if="treeViewItems.length"
dense
hoverable
activatable
color="info"
:items="treeViewItems"
@update:active="changeActiveData"
>
<template #label="{ item }">
<v-badge
Expand All @@ -68,6 +66,48 @@
{{ item.name }}
</v-badge>
</template>
<template #append="{ item }">
<v-tooltip v-if="item.type === 'toponym' || item.children" left>
<template #activator="{ on, attrs }">
<!-- on single feature "Auf Fund zoomen", no heatmap -->
<v-btn
:aria-label="$t('plugins.geometrySearch.tooltip.highlight')"
color="secondary"
icon
fab
x-small
dark
v-bind="attrs"
v-on="on"
@click="changeActiveData(item)"
@keypress="changeActiveData(item)"
>
<v-icon>fa-map-location-dot</v-icon>
</v-btn>
</template>
<!-- TODO fix font -->
<span>{{ $t('plugins.geometrySearch.tooltip.highlight') }}</span>
</v-tooltip>
<v-tooltip v-if="item.type === 'toponym'" left>
<template #activator="{ on, attrs }">
<v-btn
:aria-label="$t('plugins.geometrySearch.tooltip.focusSearch')"
color="secondary"
icon
fab
x-small
dark
v-bind="attrs"
v-on="on"
@click="fullSearchOnToponym(item)"
@keypress="fullSearchOnToponym(item)"
>
<v-icon>fa-magnifying-glass-arrow-right</v-icon>
</v-btn>
</template>
<span>{{ $t('plugins.geometrySearch.tooltip.focusSearch') }}</span>
</v-tooltip>
</template>
</v-treeview>
<v-card-text v-else>
{{ $t('common:plugins.geometrySearch.results.none') }}
Expand Down Expand Up @@ -112,7 +152,10 @@ export default Vue.extend({
},
methods: {
...mapActions('plugin/draw', ['setDrawMode']),
...mapActions('plugin/geometrySearch', ['changeActiveData']),
...mapActions('plugin/geometrySearch', [
'changeActiveData',
'fullSearchOnToponym',
]),
...mapMutations('plugin/geometrySearch', ['setByCategory']),
},
})
Expand Down Expand Up @@ -149,6 +192,7 @@ export default Vue.extend({
}
.text-locator-result-badge {
cursor: pointer;
max-width: 500px;
width: 500px;
white-space: normal;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,11 @@ const language: LanguageOption[] = [
Common: 'Neue Zeichnungen verwerfen vorangehende Ergebnisse.',
},
},
tooltip: {
title: 'Orte',
highlight: 'Auf Funde zoomen und nach Relevanz färben',
focusSearch: 'Neue Suche nach allen Geometrien zu dieser Geometrie',
},
results: {
title: 'Funde',
byLocation: 'Ort',
Expand Down Expand Up @@ -53,6 +58,11 @@ const language: LanguageOption[] = [
Common: 'New drawings discard previous results.',
},
},
tooltip: {
title: 'Locations',
highlight: 'Zoom to findings and colour by relevance',
focusSearch: 'New search for all geometries to this geometry',
},
results: {
title: 'Findings',
byLocation: 'Place',
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
import { PolarActionHandler, PolarStore } from '@polar/lib-custom-types'
import debounce from 'lodash.debounce'
import { Feature } from 'ol'
import VectorSource, { VectorSourceEvent } from 'ol/source/Vector'
import { GeometrySearchGetters, GeometrySearchState } from '../../types'

let debouncedSearchGeometry: PolarActionHandler<
GeometrySearchState,
GeometrySearchGetters
>

export function setupDrawReaction(
this: PolarStore<GeometrySearchState, GeometrySearchGetters>,
{ rootGetters, dispatch }
) {
// features added multiple times; avoid overly requesting
debouncedSearchGeometry = debounce(
(feature) => dispatch('searchGeometry', feature),
20
).bind(this)

// only keep a single feature in the draw tool
const drawSource = rootGetters['plugin/draw/drawSource'] as VectorSource
let lastFeature: Feature | undefined
drawSource.on(['addfeature'], function (event) {
const nextFeature = (event as VectorSourceEvent).feature
if (nextFeature && lastFeature !== nextFeature) {
lastFeature = nextFeature
drawSource.clear()
drawSource.addFeature(nextFeature)
// @ts-expect-error | The function is bound and hence already has context.
debouncedSearchGeometry(nextFeature)
}
})
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
import { Tooltip, getTooltip } from '@polar/lib-tooltip'
import { Feature, Overlay } from 'ol'
import { vectorLayer } from '../../utils/vectorDisplay'

export function setupTooltip({ rootGetters: { map } }) {
let element: Tooltip['element'], unregister: Tooltip['unregister']
const overlay = new Overlay({
positioning: 'bottom-center',
offset: [0, -5],
})
map.addOverlay(overlay)
map.on('pointermove', ({ pixel, dragging, originalEvent }) => {
if (dragging || ['touch', 'pen'].includes(originalEvent.pointerType)) {
return
}
let hasFeatureAtPixel = false
const localeKeys: [string, string][] = [
['h2', 'plugins.geometrySearch.tooltip.title'],
]
// TODO do not list every name separately,
map.forEachFeatureAtPixel(
pixel,
(feature) => {
if (!(feature instanceof Feature)) {
return false
}
if (!hasFeatureAtPixel) {
hasFeatureAtPixel = true
overlay.setPosition(map.getCoordinateFromPixel(pixel))
}
localeKeys.push([
'ul',
feature
.get('names')
.map((name) => `<li>${name.Name}</li>`)
.join(''),
])
},
{
layerFilter: (layer) => layer === vectorLayer,
}
)
if (!hasFeatureAtPixel) {
overlay.setPosition(undefined)
} else {
unregister?.()
;({ element, unregister } = getTooltip({ localeKeys }))
overlay.setElement(element)
return true
}
})
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
import { PolarStore } from '@polar/lib-custom-types'
import { GeometrySearchGetters, GeometrySearchState } from '../../types'
import { searchLiteratureByToponym } from '../../../../utils/literatureByToponym'

export function setupWatchers(
this: PolarStore<GeometrySearchState, GeometrySearchGetters>,
{ commit, dispatch, rootGetters }
) {
// load titleLocationFrequency on each featureCollection update
this.watch(
() => rootGetters['plugin/geometrySearch/featureCollection'],
async (featureCollection) => {
if (!featureCollection.features.length) {
dispatch(
'plugin/toast/addToast',
{
type: 'info',
text: 'textLocator.info.noGeometriesFound',
timeout: 10000,
},
{ root: true }
)
commit('setTitleLocationFrequency', {})
return
}
const names: string[] = featureCollection.features
.map((feature) => feature.properties?.names?.map((name) => name.Name))
.flat(1)
.filter((x) => x)
const titleLocationFrequency = await searchLiteratureByToponym(
rootGetters.configuration.textLocatorBackendUrl,
names
)
commit('setTitleLocationFrequency', titleLocationFrequency)
if (Object.keys(titleLocationFrequency).length) {
dispatch('plugin/iconMenu/openMenuById', 'geometrySearch', {
root: true,
})
} else {
dispatch(
'plugin/toast/addToast',
{
type: 'info',
text: 'textLocator.info.noLiteratureFound',
timeout: 10000,
},
{ root: true }
)
}
dispatch('changeActiveData', null)
}
)
}
Loading

0 comments on commit 3033174

Please sign in to comment.