Computing bounding boxes when saving GPX files.
This commit is contained in:
parent
947f4dff3a
commit
9b23bcec5c
|
@ -26,7 +26,17 @@ const GpxImport: React.FC<{}> = () => {
|
||||||
const startTime = new Date(findStartTime(gpx)!);
|
const startTime = new Date(findStartTime(gpx)!);
|
||||||
dispatch({
|
dispatch({
|
||||||
action: 'pruneAndSaveImportedGpx',
|
action: 'pruneAndSaveImportedGpx',
|
||||||
params: { id: { gpx: intToGpxId(startTime.valueOf()) }, gpx: gpx },
|
params: {
|
||||||
|
id: { gpx: intToGpxId(startTime.valueOf()) },
|
||||||
|
gpx: gpx,
|
||||||
|
tech: {
|
||||||
|
lastModified: new Date(file.lastModified).toISOString(),
|
||||||
|
importDate: new Date().toISOString(),
|
||||||
|
name: file.name,
|
||||||
|
size: file.size,
|
||||||
|
type: file.type,
|
||||||
|
},
|
||||||
|
},
|
||||||
});
|
});
|
||||||
// pushGpx(db, {
|
// pushGpx(db, {
|
||||||
// gpx,
|
// gpx,
|
||||||
|
|
|
@ -1,4 +1,6 @@
|
||||||
import { PureComponent } from 'react';
|
import { PureComponent } from 'react';
|
||||||
|
import { Point } from '../components/map/types';
|
||||||
|
import { lat2tile, lon2tile } from '../lib/geo';
|
||||||
import getUri, { intToGpxId } from '../lib/ids';
|
import getUri, { intToGpxId } from '../lib/ids';
|
||||||
import { get, put, putAll } from './lib';
|
import { get, put, putAll } from './lib';
|
||||||
|
|
||||||
|
@ -86,9 +88,75 @@ const prune = (id: any, object: any, docs: any[]) => {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const techFromObject = (
|
||||||
|
object: any,
|
||||||
|
tech = {
|
||||||
|
viewport: { topLeft: <Point>{}, bottomRight: <Point>{} },
|
||||||
|
bbox: {
|
||||||
|
minLon: <number | undefined>undefined,
|
||||||
|
minLat: <number | undefined>undefined,
|
||||||
|
maxLon: <number | undefined>undefined,
|
||||||
|
maxLat: <number | undefined>undefined,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
) => {
|
||||||
|
if (typeof object === 'object') {
|
||||||
|
if ('$' in object) {
|
||||||
|
const attributes = object.$;
|
||||||
|
if ('lat' in attributes) {
|
||||||
|
const lat = +attributes.lat;
|
||||||
|
if (tech.bbox.minLat === undefined || lat < tech.bbox.minLat) {
|
||||||
|
tech.bbox.minLat = lat;
|
||||||
|
}
|
||||||
|
if (tech.bbox.maxLat === undefined || lat > tech.bbox.maxLat) {
|
||||||
|
tech.bbox.maxLat = lat;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ('lon' in attributes) {
|
||||||
|
const lon = +attributes.lon;
|
||||||
|
if (tech.bbox.minLon === undefined || lon < tech.bbox.minLon) {
|
||||||
|
tech.bbox.minLon = lon;
|
||||||
|
}
|
||||||
|
if (tech.bbox.maxLon === undefined || lon > tech.bbox.minLon) {
|
||||||
|
tech.bbox.maxLon = lon;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (const key in object) {
|
||||||
|
techFromObject(object[key], tech);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return tech;
|
||||||
|
};
|
||||||
|
|
||||||
|
const techFromGpx = (gpx: Gpx) => {
|
||||||
|
const tech = techFromObject(gpx);
|
||||||
|
if (tech.bbox.maxLat !== undefined && tech.bbox.minLon !== undefined) {
|
||||||
|
tech.viewport.topLeft = {
|
||||||
|
x: lon2tile(tech.bbox.minLon, 0),
|
||||||
|
y: lat2tile(tech.bbox.maxLat, 0),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
if (tech.bbox.minLat !== undefined && tech.bbox.maxLon !== undefined) {
|
||||||
|
tech.viewport.bottomRight = {
|
||||||
|
x: lon2tile(tech.bbox.maxLon, 0),
|
||||||
|
y: lat2tile(tech.bbox.minLat, 0),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
return tech;
|
||||||
|
};
|
||||||
|
|
||||||
export const pruneAndSaveImportedGpx = async (params: any) => {
|
export const pruneAndSaveImportedGpx = async (params: any) => {
|
||||||
const { id, gpx } = params;
|
const { id, gpx, tech } = params;
|
||||||
let docs: any[] = [{ _id: getUri('gpx', id), type: 'gpx', doc: gpx }];
|
let docs: any[] = [
|
||||||
|
{ _id: getUri('gpx', id), type: 'gpx', doc: gpx },
|
||||||
|
{
|
||||||
|
_id: getUri('tech', id),
|
||||||
|
type: 'tech',
|
||||||
|
doc: { ...tech, ...techFromGpx(gpx) },
|
||||||
|
},
|
||||||
|
];
|
||||||
prune(id, gpx, docs);
|
prune(id, gpx, docs);
|
||||||
console.log(JSON.stringify(docs));
|
console.log(JSON.stringify(docs));
|
||||||
try {
|
try {
|
||||||
|
|
Loading…
Reference in New Issue