Street Level: a posted view without a photo point grounds its look-at too

show_in_gods_eye_view measured a view's altitude from the terrain before
taking the point the camera looks at; a view posted straight into the
embedded app used the ellipsoid altitude, so a camera over high ground
opened photos kilometres ahead. groundedLookAt moves to the view module,
and the embedded app uses it with the app's terrain heights for a posted
street_level that names no point.
This commit is contained in:
German Khokhlov committed 2026-11-11 13:46:10 +04:00
1 parent a8970c1f18
commit f612fc2180
5 files changed
+107 -26

No files matched your search

+21
View File
@@ -19,6 +19,7 @@ import {
annotationsFromParams,
createView,
followFromParams,
groundedLookAt,
streetLevelFromParams,
} from '../view/index.js';
@@ -329,6 +330,7 @@ export function installViews({
dataManager,
run,
signal,
terrain = null,
location = globalThis.location,
windowRef = globalThis.window,
}) {
@@ -477,8 +479,27 @@ export function installViews({
// A panel's host can hand back old results on a remount: only one issued
// just now may open a billed photo. A framing page's view is its own.
const autoOpen = !isEmbeddedInline() || event.data.fresh === true;
// Photos asked for without a point open where the camera looks, measured
// from the ground under it, as show_in_gods_eye_view places them.
const asked = event.data.view?.street_level;
const unplaced =
asked &&
typeof asked === 'object' &&
asked.lat == null &&
asked.lon == null;
queue = queue.then(async () => {
if (signal?.aborted) return;
if (unplaced && view.street_level) {
const point = await groundedLookAt(view.camera, terrain, signal).catch(
() => null,
);
if (signal?.aborted) return;
if (point)
view = createView({
...event.data.view,
street_level: { ...asked, ...point },
});
}
const steps = await applyView(view, {
viewer,
dataManager,