Mercurial > gemma
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 +}