master
Sander Vocke 6 years ago
parent caf7b76ccc
commit e4ec985db4
  1. 114
      src/database.js

@ -1,14 +1,9 @@
import React, { useEffect, useState, useContext } from 'react';
import NodeEnvironment from 'jest-environment-node';
import {
add_geo_area_to_store, get_geo_area_from_store,
initialize_image_index, image_in_area
} from './geo_store.js';
import * as turf from '@turf/turf'
import KDBush from 'kdbush';
export async function sqljs_async_queries(sqljs_object, queries) {
//var t0 = performance.now();
for (let i = 0; i < (queries.length - 1); i++) {
@ -108,115 +103,6 @@ export async function add_full_tag_info(db) {
return db;
}
function polygons_benchmark(database) {
var img_query = "SELECT GROUP_CONCAT(Images.id), ImagePositions.latitudeNumber, ImagePositions.longitudeNumber FROM Images "
+ "LEFT JOIN ImagePositions ON ImagePositions.imageid=Images.id WHERE ImagePositions.latitudeNumber NOT NULL GROUP BY ImagePositions.latitudeNumber, ImagePositions.longitudeNumber;";
sqljs_async_queries(database, [img_query]).then(res => {
console.log("Images query result:", res);
fetch("https://nominatim.openstreetmap.org/search?polygon_geojson=1&polygon_threshold=0.001&format=json&limit=1&q=Australia")
.then(res => res.json())
.then(jsonres => {
var polies;
var points = []; // Contains all unique geometric points as [lat long]
var ids_per_point = []; // Contains a list of ids for each unique geometric point
console.log("Nominatim geo answer:", jsonres);
if (Array.isArray(jsonres) && jsonres.length > 0) {
polies = jsonres[0].geojson;
}
if (res && Array.isArray(res) && res.length > 0) {
var cols = res[0].columns;
var data = res[0].values;
data.forEach(row => {
points.push([parseFloat(row[cols.indexOf("longitudeNumber")]), parseFloat(row[cols.indexOf("latitudeNumber")])]);
ids_per_point.push(row[cols.indexOf("GROUP_CONCAT(Images.id)")].split(',').map(e => parseInt(e)));
});
}
console.log("Points: ", points);
console.log("IDs per point: ", ids_per_point);
console.log("Nominatim GEOJSON: ", polies);
{
// Try Turf
const tpoints = turf.points(points);
console.time("Turf points within polygon");
var found = turf.pointsWithinPolygon(tpoints, polies);
console.timeEnd("Turf points within polygon");
console.log("Turf PointsWithinPolygon: ", found);
}
{
// Try KDBush
console.time("Build KDBush index");
const index = new KDBush(points, p => p[0], p => p[1], 16, Float64Array);
console.timeEnd("Build KDBush index");
console.time("Total KDBush search time");
// Get bounding boxes for all subpolygons
var boxes = [];
console.time("Build KDBush poly boxes");
for (let i = 0; i < polies.coordinates.length; i++) {
const outerPoly = polies.coordinates[i][0];
var minx = Number.POSITIVE_INFINITY;
var miny = Number.POSITIVE_INFINITY;
var maxx = Number.NEGATIVE_INFINITY;
var maxy = Number.NEGATIVE_INFINITY;
for (let j = 0; j < outerPoly.length; j++) {
minx = Math.min(minx, outerPoly[j][0]);
miny = Math.min(miny, outerPoly[j][1]);
maxx = Math.max(maxx, outerPoly[j][0]);
maxy = Math.max(maxy, outerPoly[j][1]);
}
boxes.push([minx, miny, maxx, maxy]);
}
console.timeEnd("Build KDBush poly boxes");
console.log("KDBush boxes: ", boxes);
// Test points in KD tree against each subpolygon bounding box
console.time("Find box points in KDBush");
let hits = new Set();
for (let i = 0; i < boxes.length; i++) {
const ids = index.range(boxes[i][0], boxes[i][1], boxes[i][2], boxes[i][3]);
ids.forEach(e => hits.add(e));
}
console.timeEnd("Find box points in KDBush");
console.log("Hits: ", hits);
// Test hit points exactly
console.time("Get exact hits after KDBush");
var realhits = [];
hits.forEach(hit => {
const point = points[hit];
const is_real_hit = turf.booleanPointInPolygon(turf.point(points[hit]), polies);
if (is_real_hit) {
realhits.push(hit);
}
});
console.log("Real: ", realhits);
console.timeEnd("Get exact hits after KDBush");
// Expand to all image IDs
console.time("Expand exact hits to IDs");
var hit_ids = [];
realhits.forEach(idx => {
hit_ids = hit_ids.concat(ids_per_point[idx]);
});
console.log("Real hit IDs: ", hit_ids);
console.timeEnd("Expand exact hits to IDs");
console.timeEnd("Total KDBush search time");
}
});
})
.catch(err => { throw err; });
}
export function ProvideDB(props) {
const { children, db_url } = props;
const [db, setDb] = useState(null);

Loading…
Cancel
Save