@ -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 ) ;