changeset 746:97b0beecf7c3

merge.
author Bernhard Reiter <bernhard@intevation.de>
date Mon, 24 Sep 2018 14:11:11 +0200
parents f2691e0d4970 (current diff) 6fe6839f5ce6 (diff)
children e33012c0aa7e
files
diffstat 5 files changed, 122 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/cmd/octree2contour/store.go	Mon Sep 24 14:10:44 2018 +0200
+++ b/cmd/octree2contour/store.go	Mon Sep 24 14:11:11 2018 +0200
@@ -23,10 +23,19 @@
 INSERT INTO waterway.sounding_results_contour_lines
   (sounding_result_id, height, lines)
 SELECT
-  id,
+  sr.id,
   $1,
-  ST_Transform(ST_SetSRID(ST_GeomFromWKB($2), $3), 4326)::geography
-FROM waterway.sounding_results
+  ST_Transform(
+    ST_Translate(
+      ST_Force3D(
+        ST_CollectionExtract(
+          ST_Force2D(
+            ST_Intersection(
+              ST_Transform(sr.area::geometry, $3::integer),
+              ST_SetSRID(
+                ST_GeomFromWKB($2), $3::integer))), 2)), 0.0, 0.0, $1::numeric),
+  4326)::geography
+FROM waterway.sounding_results sr
 WHERE bottleneck_id = $4 AND date_info = $5
 `
 )
--- a/pkg/controllers/json.go	Mon Sep 24 14:10:44 2018 +0200
+++ b/pkg/controllers/json.go	Mon Sep 24 14:11:11 2018 +0200
@@ -4,6 +4,7 @@
 	"database/sql"
 	"encoding/json"
 	"fmt"
+	"io"
 	"log"
 	"net/http"
 
@@ -109,7 +110,13 @@
 	}
 	rw.WriteHeader(jr.Code)
 	if jr.Code != http.StatusNoContent {
-		if err := json.NewEncoder(rw).Encode(jr.Result); err != nil {
+		var err error
+		if r, ok := jr.Result.(io.Reader); ok {
+			_, err = io.Copy(rw, r)
+		} else {
+			err = json.NewEncoder(rw).Encode(jr.Result)
+		}
+		if err != nil {
 			log.Printf("error: %v\n", err)
 		}
 	}
--- a/pkg/controllers/routes.go	Mon Sep 24 14:10:44 2018 +0200
+++ b/pkg/controllers/routes.go	Mon Sep 24 14:11:11 2018 +0200
@@ -110,6 +110,12 @@
 		Handle: crossSection,
 	})).Methods(http.MethodPost)
 
+	// Feature search
+	api.Handle("/search", any(&JSONHandler{
+		Input:  func() interface{} { return new(models.SearchRequest) },
+		Handle: searchFeature,
+	})).Methods(http.MethodPost)
+
 	// Token handling: Login/Logout.
 	api.HandleFunc("/login", login).
 		Methods(http.MethodPost)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/pkg/controllers/search.go	Mon Sep 24 14:11:11 2018 +0200
@@ -0,0 +1,89 @@
+package controllers
+
+import (
+	"database/sql"
+	"fmt"
+	"net/http"
+	"regexp"
+	"strconv"
+	"strings"
+
+	"gemma.intevation.de/gemma/pkg/models"
+)
+
+const (
+	searchHectometreSQL = `SELECT json_agg(r)
+FROM (SELECT location_code::text AS name,
+             ST_AsGeoJSON(geom)::json AS geom
+      FROM waterway.distance_marks
+     WHERE (location_code).hectometre = $1) r`
+)
+
+var rkmRegex = regexp.MustCompile(
+	"^[[:space:]]*([0-9]+)([,.]([0-9]))?[[:space:]]*$",
+)
+
+func searchFeature(
+	input interface{},
+	req *http.Request,
+	db *sql.Conn,
+) (jr JSONResult, err error) {
+
+	s := input.(*models.SearchRequest)
+
+	if len(s.SearchString) == 0 {
+		err = JSONError{http.StatusBadRequest,
+			"error: empty search string"}
+		return
+	}
+
+	// Handle search for river kilometre:
+
+	m := rkmRegex.FindStringSubmatch(s.SearchString)
+	if len(m) != 0 {
+		var hectometre int
+		if hectometre, err = strconv.Atoi(m[1]); err != nil {
+			return
+		}
+
+		hectometre *= 10
+		if len(m) == 4 {
+			var h int
+			if h, err = strconv.Atoi(m[3]); err != nil {
+				return
+			}
+			hectometre += h
+		}
+
+		var result string
+
+		err = db.QueryRowContext(
+			req.Context(),
+			searchHectometreSQL,
+			hectometre,
+		).Scan(&result)
+
+		switch {
+		case err == sql.ErrNoRows:
+			err = JSONError{
+				Code: http.StatusNotFound,
+				Message: fmt.Sprintf("Cannot find river hectometre %d.",
+					hectometre),
+			}
+			return
+		case err != nil:
+			return
+		}
+
+		jr.Result = strings.NewReader(result)
+	} else {
+		err = JSONError{
+			Code: http.StatusNotFound,
+			Message: fmt.Sprintf("No Results for %s.",
+				s.SearchString),
+		}
+
+	}
+
+	return
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/pkg/models/search.go	Mon Sep 24 14:11:11 2018 +0200
@@ -0,0 +1,7 @@
+package models
+
+type (
+	SearchRequest struct {
+		SearchString string `json:"string"`
+	}
+)