@@ -468,6 +468,145 @@ function get(reqtype, req, res, next) {
468468 } ) ;
469469}
470470
471+ router . post ( "/intersect" , function ( req , res , next ) {
472+ let layer = req . body . layer ;
473+ let noDuplicates = null ;
474+
475+ if ( req . body . noDuplicates === true || req . body . noDuplicates === "true" )
476+ noDuplicates = true ;
477+
478+ //First Find the table name
479+ Geodatasets . findOne ( { where : { name : layer } } )
480+ . then ( ( result ) => {
481+ if ( result ) {
482+ let table = result . dataValues . table ;
483+
484+ let distinct = "" ;
485+ if ( noDuplicates === true ) {
486+ if ( result . dataValues . group_id_field != null )
487+ distinct = ` DISTINCT ON (group_id)` ;
488+ else distinct = ` DISTINCT ON (geom)` ;
489+ }
490+
491+ let q = `SELECT${ distinct } properties, ST_AsGeoJSON(geom) FROM ${ Utils . forceAlphaNumUnder (
492+ table
493+ ) } `;
494+
495+ // Intersect
496+ q += ` WHERE ST_Intersects(geom, ST_GeomFromGeoJSON(:intersect))` ;
497+
498+ let startProp = "start_time" ;
499+ let start_time = "" ;
500+ let endProp = "end_time" ;
501+ let end_time = "" ;
502+ if ( req . body ?. endtime != null ) {
503+ const format = req . body ?. format || "YYYY-MM-DDTHH:MI:SSZ" ;
504+ let t = ` ` ;
505+ t += `AND ` ;
506+
507+ if (
508+ req . body ?. starttime == null ||
509+ req . body ?. starttime . indexOf ( `'` ) != - 1 ||
510+ req . body ?. endtime == null ||
511+ req . body ?. endtime . indexOf ( `'` ) != - 1 ||
512+ format . indexOf ( `'` ) != - 1
513+ ) {
514+ res . send ( {
515+ status : "failure" ,
516+ message : "Missing inner or malformed time parameters." ,
517+ } ) ;
518+ return ;
519+ }
520+
521+ start_time = new Date (
522+ req . body . starttime || "1970-01-01T00:00:00Z"
523+ ) . getTime ( ) ;
524+ end_time = new Date ( req . body . endtime ) . getTime ( ) ;
525+
526+ startProp = Utils . forceAlphaNumUnder ( req . body . startProp || startProp ) ;
527+ endProp = Utils . forceAlphaNumUnder ( req . body . endProp || endProp ) ;
528+ // prettier-ignore
529+ t += [
530+ `((` ,
531+ `${ startProp } IS NOT NULL AND ${ endProp } IS NOT NULL AND` ,
532+ ` ${ startProp } >= ${ start_time } ` ,
533+ ` AND ${ endProp } <= ${ end_time } ` ,
534+ `)` ,
535+ ` OR ` ,
536+ `(` ,
537+ `${ startProp } IS NULL AND ${ endProp } IS NOT NULL AND` ,
538+ ` ${ endProp } >= ${ start_time } ` ,
539+ ` AND ${ endProp } <= ${ end_time } ` ,
540+ `))`
541+ ] . join ( '' )
542+ q += t ;
543+ }
544+
545+ const replacements = {
546+ intersect :
547+ typeof req . body . intersect === "string"
548+ ? req . body . intersect
549+ : JSON . stringify ( req . body . intersect ) ,
550+ startProp : startProp ,
551+ start_time : start_time ,
552+ endProp : endProp ,
553+ end_time : end_time ,
554+ } ;
555+
556+ q += `;` ;
557+
558+ sequelize
559+ . query ( q , {
560+ replacements : replacements ,
561+ } )
562+ . then ( ( [ results ] ) => {
563+ let geojson = { type : "FeatureCollection" , features : [ ] } ;
564+ for ( let i = 0 ; i < results . length ; i ++ ) {
565+ let properties = results [ i ] . properties ;
566+ properties . _ = properties . _ || { } ;
567+ properties . _ . idx = results [ i ] . id ;
568+ let feature = { } ;
569+ feature . type = "Feature" ;
570+ feature . properties = properties ;
571+
572+ feature . geometry = JSON . parse ( results [ i ] . st_asgeojson ) ;
573+ geojson . features . push ( feature ) ;
574+ }
575+
576+ res . setHeader ( "Access-Control-Allow-Origin" , "*" ) ;
577+
578+ res . send ( {
579+ status : "success" ,
580+ body : geojson ,
581+ } ) ;
582+
583+ return null ;
584+ } )
585+ . catch ( ( err ) => {
586+ logger (
587+ "error" ,
588+ "Geodataset query SQL error." ,
589+ req . originalUrl ,
590+ req ,
591+ err
592+ ) ;
593+ res . send ( {
594+ status : "failure" ,
595+ message : "Failed to query Geodataset." ,
596+ } ) ;
597+ } ) ;
598+ } else {
599+ res . send ( { status : "failure" , message : "Not Found" } ) ;
600+ }
601+
602+ return null ;
603+ } )
604+ . catch ( ( err ) => {
605+ logger ( "error" , "Failure finding geodataset." , req . originalUrl , req , err ) ;
606+ res . send ( { status : "failure" , message : "Failure finding geodataset." } ) ;
607+ } ) ;
608+ } ) ;
609+
471610/*
472611req.query.layer
473612req.query.limit
0 commit comments