annotate pkg/models/cross.go @ 4611:b5aa1eb83bb0 geoserver_sql_views

Add possibility to configure SRS for GeoServer SQL view Automatic detection of spatial reference system for SQL views in GeoServer does not always find the correct SRS.
author Tom Gottfried <tom@intevation.de>
date Fri, 06 Sep 2019 11:58:03 +0200
parents a347468ea545
children 4847ac70103a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1017
a244b18cb916 Added GNU Affero General Public License.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 895
diff changeset
1 // This is Free Software under GNU Affero General Public License v >= 3.0
a244b18cb916 Added GNU Affero General Public License.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 895
diff changeset
2 // without warranty, see README.md and license for details.
a244b18cb916 Added GNU Affero General Public License.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 895
diff changeset
3 //
a244b18cb916 Added GNU Affero General Public License.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 895
diff changeset
4 // SPDX-License-Identifier: AGPL-3.0-or-later
a244b18cb916 Added GNU Affero General Public License.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 895
diff changeset
5 // License-Filename: LICENSES/AGPL-3.0.txt
a244b18cb916 Added GNU Affero General Public License.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 895
diff changeset
6 //
a244b18cb916 Added GNU Affero General Public License.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 895
diff changeset
7 // Copyright (C) 2018 by via donau
a244b18cb916 Added GNU Affero General Public License.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 895
diff changeset
8 // – Österreichische Wasserstraßen-Gesellschaft mbH
a244b18cb916 Added GNU Affero General Public License.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 895
diff changeset
9 // Software engineering by Intevation GmbH
a244b18cb916 Added GNU Affero General Public License.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 895
diff changeset
10 //
a244b18cb916 Added GNU Affero General Public License.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 895
diff changeset
11 // Author(s):
a244b18cb916 Added GNU Affero General Public License.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 895
diff changeset
12 // * Sascha L. Teichmann <sascha.teichmann@intevation.de>
a244b18cb916 Added GNU Affero General Public License.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 895
diff changeset
13
633
6093016fac88 Cross sections: started with implementation of web service (WIP).
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
14 package models
6093016fac88 Cross sections: started with implementation of web service (WIP).
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
15
6093016fac88 Cross sections: started with implementation of web service (WIP).
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
16 import (
643
756f3fc62da6 Cross sections: Using the database in the web service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 636
diff changeset
17 "bytes"
756f3fc62da6 Cross sections: Using the database in the web service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 636
diff changeset
18 "encoding/binary"
633
6093016fac88 Cross sections: started with implementation of web service (WIP).
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
19 "encoding/json"
6093016fac88 Cross sections: started with implementation of web service (WIP).
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
20 "errors"
643
756f3fc62da6 Cross sections: Using the database in the web service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 636
diff changeset
21 "fmt"
756f3fc62da6 Cross sections: Using the database in the web service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 636
diff changeset
22 "math"
633
6093016fac88 Cross sections: started with implementation of web service (WIP).
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
23 "time"
2471
63475c8e710e Moved WKB constants to own package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1683
diff changeset
24
3094
a347468ea545 Use common.DateFormat for parsing dates everywhere.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2471
diff changeset
25 "gemma.intevation.de/gemma/pkg/common"
2471
63475c8e710e Moved WKB constants to own package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1683
diff changeset
26 "gemma.intevation.de/gemma/pkg/wkb"
633
6093016fac88 Cross sections: started with implementation of web service (WIP).
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
27 )
6093016fac88 Cross sections: started with implementation of web service (WIP).
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
28
6093016fac88 Cross sections: started with implementation of web service (WIP).
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
29 type (
6093016fac88 Cross sections: started with implementation of web service (WIP).
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
30 GeoJSONFeature string
6093016fac88 Cross sections: started with implementation of web service (WIP).
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
31 GeoJSONLineStringType string
6093016fac88 Cross sections: started with implementation of web service (WIP).
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
32
6093016fac88 Cross sections: started with implementation of web service (WIP).
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
33 GeoJSONDate struct{ time.Time }
6093016fac88 Cross sections: started with implementation of web service (WIP).
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
34
6093016fac88 Cross sections: started with implementation of web service (WIP).
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
35 GeoJSONLineString struct {
6093016fac88 Cross sections: started with implementation of web service (WIP).
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
36 Type GeoJSONLineStringType `json:"type"`
6093016fac88 Cross sections: started with implementation of web service (WIP).
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
37 }
6093016fac88 Cross sections: started with implementation of web service (WIP).
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
38
6093016fac88 Cross sections: started with implementation of web service (WIP).
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
39 GeoJSONCoordinate struct {
653
7aeacd7f150b Cross sections: Take and produce valid GeoJSON.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 652
diff changeset
40 Lat float64
633
6093016fac88 Cross sections: started with implementation of web service (WIP).
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
41 Lon float64
6093016fac88 Cross sections: started with implementation of web service (WIP).
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
42 }
6093016fac88 Cross sections: started with implementation of web service (WIP).
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
43
643
756f3fc62da6 Cross sections: Using the database in the web service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 636
diff changeset
44 GeoJSONCoordinateZ struct {
653
7aeacd7f150b Cross sections: Take and produce valid GeoJSON.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 652
diff changeset
45 Lat float64
643
756f3fc62da6 Cross sections: Using the database in the web service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 636
diff changeset
46 Lon float64
756f3fc62da6 Cross sections: Using the database in the web service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 636
diff changeset
47 Z float64
756f3fc62da6 Cross sections: Using the database in the web service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 636
diff changeset
48 }
756f3fc62da6 Cross sections: Using the database in the web service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 636
diff changeset
49
633
6093016fac88 Cross sections: started with implementation of web service (WIP).
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
50 CrossSectionInputProperties struct {
6093016fac88 Cross sections: started with implementation of web service (WIP).
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
51 Bottleneck string `json:"bottleneck"`
6093016fac88 Cross sections: started with implementation of web service (WIP).
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
52 Date GeoJSONDate `json:"date"`
6093016fac88 Cross sections: started with implementation of web service (WIP).
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
53 }
6093016fac88 Cross sections: started with implementation of web service (WIP).
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
54
643
756f3fc62da6 Cross sections: Using the database in the web service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 636
diff changeset
55 GeoJSONLineCoordinates []GeoJSONCoordinate
756f3fc62da6 Cross sections: Using the database in the web service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 636
diff changeset
56 GeoJSONLineCoordinatesZ []GeoJSONCoordinateZ
636
7a867e48b3c2 Cross sections: Enforce minimal length of coordinates components and coordinates in input linestrings.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 633
diff changeset
57
648
cf62cb84fa23 Cross sections: Added a naive O(N^2) algorithm to join the neighbored line segments.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 645
diff changeset
58 GeoJSONMultiLineCoordinatesZ []GeoJSONLineCoordinatesZ
cf62cb84fa23 Cross sections: Added a naive O(N^2) algorithm to join the neighbored line segments.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 645
diff changeset
59
653
7aeacd7f150b Cross sections: Take and produce valid GeoJSON.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 652
diff changeset
60 CrossSectionInputGeometry struct {
7aeacd7f150b Cross sections: Take and produce valid GeoJSON.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 652
diff changeset
61 Type GeoJSONLineStringType `json:"type"`
7aeacd7f150b Cross sections: Take and produce valid GeoJSON.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 652
diff changeset
62 Coordinates GeoJSONLineCoordinates `json:"coordinates"`
7aeacd7f150b Cross sections: Take and produce valid GeoJSON.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 652
diff changeset
63 }
7aeacd7f150b Cross sections: Take and produce valid GeoJSON.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 652
diff changeset
64
633
6093016fac88 Cross sections: started with implementation of web service (WIP).
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
65 CrossSectionInput struct {
653
7aeacd7f150b Cross sections: Take and produce valid GeoJSON.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 652
diff changeset
66 Type GeoJSONFeature `json:"type"`
7aeacd7f150b Cross sections: Take and produce valid GeoJSON.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 652
diff changeset
67 Geometry CrossSectionInputGeometry `json:"geometry"`
7aeacd7f150b Cross sections: Take and produce valid GeoJSON.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 652
diff changeset
68 Properties CrossSectionInputProperties `json:"properties"`
7aeacd7f150b Cross sections: Take and produce valid GeoJSON.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 652
diff changeset
69 }
7aeacd7f150b Cross sections: Take and produce valid GeoJSON.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 652
diff changeset
70
7aeacd7f150b Cross sections: Take and produce valid GeoJSON.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 652
diff changeset
71 CrossSectionOutputGeometry struct {
7aeacd7f150b Cross sections: Take and produce valid GeoJSON.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 652
diff changeset
72 Type string `json:"type"`
7aeacd7f150b Cross sections: Take and produce valid GeoJSON.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 652
diff changeset
73 Coordinates GeoJSONMultiLineCoordinatesZ `json:"coordinates"`
633
6093016fac88 Cross sections: started with implementation of web service (WIP).
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
74 }
643
756f3fc62da6 Cross sections: Using the database in the web service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 636
diff changeset
75
756f3fc62da6 Cross sections: Using the database in the web service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 636
diff changeset
76 CrossSectionOutput struct {
653
7aeacd7f150b Cross sections: Take and produce valid GeoJSON.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 652
diff changeset
77 Type string `json:"type"`
7aeacd7f150b Cross sections: Take and produce valid GeoJSON.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 652
diff changeset
78 Geometry CrossSectionOutputGeometry `json:"geometry"`
7aeacd7f150b Cross sections: Take and produce valid GeoJSON.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 652
diff changeset
79 Properties map[string]interface{} `json:"properties"`
643
756f3fc62da6 Cross sections: Using the database in the web service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 636
diff changeset
80 }
633
6093016fac88 Cross sections: started with implementation of web service (WIP).
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
81 )
6093016fac88 Cross sections: started with implementation of web service (WIP).
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
82
6093016fac88 Cross sections: started with implementation of web service (WIP).
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
83 var (
6093016fac88 Cross sections: started with implementation of web service (WIP).
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
84 errNoGeoJSONFeature = errors.New("Not a valid GeoJSON feature")
6093016fac88 Cross sections: started with implementation of web service (WIP).
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
85 errNoGeoJSONLineStringType = errors.New("Not a valid GeoJSON linestring type")
636
7a867e48b3c2 Cross sections: Enforce minimal length of coordinates components and coordinates in input linestrings.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 633
diff changeset
86 errTooLessComponents = errors.New("Too less components in coordinate")
7a867e48b3c2 Cross sections: Enforce minimal length of coordinates components and coordinates in input linestrings.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 633
diff changeset
87 errTooLessCoordinates = errors.New("Too less coordinates")
633
6093016fac88 Cross sections: started with implementation of web service (WIP).
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
88 )
6093016fac88 Cross sections: started with implementation of web service (WIP).
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
89
636
7a867e48b3c2 Cross sections: Enforce minimal length of coordinates components and coordinates in input linestrings.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 633
diff changeset
90 func (lc *GeoJSONLineCoordinates) UnmarshalJSON(data []byte) error {
7a867e48b3c2 Cross sections: Enforce minimal length of coordinates components and coordinates in input linestrings.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 633
diff changeset
91 var coords []GeoJSONCoordinate
7a867e48b3c2 Cross sections: Enforce minimal length of coordinates components and coordinates in input linestrings.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 633
diff changeset
92 if err := json.Unmarshal(data, &coords); err != nil {
7a867e48b3c2 Cross sections: Enforce minimal length of coordinates components and coordinates in input linestrings.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 633
diff changeset
93 return err
7a867e48b3c2 Cross sections: Enforce minimal length of coordinates components and coordinates in input linestrings.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 633
diff changeset
94 }
7a867e48b3c2 Cross sections: Enforce minimal length of coordinates components and coordinates in input linestrings.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 633
diff changeset
95 if len(coords) < 2 {
7a867e48b3c2 Cross sections: Enforce minimal length of coordinates components and coordinates in input linestrings.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 633
diff changeset
96 return errTooLessCoordinates
7a867e48b3c2 Cross sections: Enforce minimal length of coordinates components and coordinates in input linestrings.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 633
diff changeset
97 }
7a867e48b3c2 Cross sections: Enforce minimal length of coordinates components and coordinates in input linestrings.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 633
diff changeset
98 *lc = GeoJSONLineCoordinates(coords)
7a867e48b3c2 Cross sections: Enforce minimal length of coordinates components and coordinates in input linestrings.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 633
diff changeset
99 return nil
7a867e48b3c2 Cross sections: Enforce minimal length of coordinates components and coordinates in input linestrings.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 633
diff changeset
100 }
7a867e48b3c2 Cross sections: Enforce minimal length of coordinates components and coordinates in input linestrings.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 633
diff changeset
101
633
6093016fac88 Cross sections: started with implementation of web service (WIP).
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
102 func (d *GeoJSONDate) UnmarshalJSON(data []byte) error {
6093016fac88 Cross sections: started with implementation of web service (WIP).
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
103 var s string
6093016fac88 Cross sections: started with implementation of web service (WIP).
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
104 if err := json.Unmarshal(data, &s); err != nil {
6093016fac88 Cross sections: started with implementation of web service (WIP).
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
105 return err
6093016fac88 Cross sections: started with implementation of web service (WIP).
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
106 }
3094
a347468ea545 Use common.DateFormat for parsing dates everywhere.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2471
diff changeset
107 t, err := time.Parse(common.DateFormat, s)
633
6093016fac88 Cross sections: started with implementation of web service (WIP).
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
108 if err != nil {
6093016fac88 Cross sections: started with implementation of web service (WIP).
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
109 return err
6093016fac88 Cross sections: started with implementation of web service (WIP).
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
110 }
6093016fac88 Cross sections: started with implementation of web service (WIP).
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
111 *d = GeoJSONDate{t}
6093016fac88 Cross sections: started with implementation of web service (WIP).
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
112 return nil
6093016fac88 Cross sections: started with implementation of web service (WIP).
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
113 }
6093016fac88 Cross sections: started with implementation of web service (WIP).
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
114
6093016fac88 Cross sections: started with implementation of web service (WIP).
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
115 func (c *GeoJSONCoordinate) UnmarshalJSON(data []byte) error {
636
7a867e48b3c2 Cross sections: Enforce minimal length of coordinates components and coordinates in input linestrings.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 633
diff changeset
116 var pos []float64
633
6093016fac88 Cross sections: started with implementation of web service (WIP).
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
117 if err := json.Unmarshal(data, &pos); err != nil {
6093016fac88 Cross sections: started with implementation of web service (WIP).
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
118 return err
6093016fac88 Cross sections: started with implementation of web service (WIP).
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
119 }
636
7a867e48b3c2 Cross sections: Enforce minimal length of coordinates components and coordinates in input linestrings.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 633
diff changeset
120 if len(pos) < 2 {
7a867e48b3c2 Cross sections: Enforce minimal length of coordinates components and coordinates in input linestrings.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 633
diff changeset
121 return errTooLessComponents
7a867e48b3c2 Cross sections: Enforce minimal length of coordinates components and coordinates in input linestrings.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 633
diff changeset
122 }
653
7aeacd7f150b Cross sections: Take and produce valid GeoJSON.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 652
diff changeset
123 *c = GeoJSONCoordinate{Lat: pos[0], Lon: pos[1]}
633
6093016fac88 Cross sections: started with implementation of web service (WIP).
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
124 return nil
6093016fac88 Cross sections: started with implementation of web service (WIP).
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
125 }
6093016fac88 Cross sections: started with implementation of web service (WIP).
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
126
6093016fac88 Cross sections: started with implementation of web service (WIP).
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
127 func (t *GeoJSONFeature) UnmarshalJSON(data []byte) error {
6093016fac88 Cross sections: started with implementation of web service (WIP).
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
128 var s string
6093016fac88 Cross sections: started with implementation of web service (WIP).
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
129 if err := json.Unmarshal(data, &s); err != nil {
6093016fac88 Cross sections: started with implementation of web service (WIP).
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
130 return err
6093016fac88 Cross sections: started with implementation of web service (WIP).
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
131 }
6093016fac88 Cross sections: started with implementation of web service (WIP).
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
132 if s != "Feature" {
6093016fac88 Cross sections: started with implementation of web service (WIP).
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
133 return errNoGeoJSONFeature
6093016fac88 Cross sections: started with implementation of web service (WIP).
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
134 }
6093016fac88 Cross sections: started with implementation of web service (WIP).
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
135 *t = GeoJSONFeature(s)
6093016fac88 Cross sections: started with implementation of web service (WIP).
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
136 return nil
6093016fac88 Cross sections: started with implementation of web service (WIP).
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
137 }
6093016fac88 Cross sections: started with implementation of web service (WIP).
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
138
6093016fac88 Cross sections: started with implementation of web service (WIP).
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
139 func (t *GeoJSONLineStringType) UnmarshalJSON(data []byte) error {
6093016fac88 Cross sections: started with implementation of web service (WIP).
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
140 var s string
6093016fac88 Cross sections: started with implementation of web service (WIP).
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
141 if err := json.Unmarshal(data, &s); err != nil {
6093016fac88 Cross sections: started with implementation of web service (WIP).
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
142 return err
6093016fac88 Cross sections: started with implementation of web service (WIP).
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
143 }
6093016fac88 Cross sections: started with implementation of web service (WIP).
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
144 if s != "LineString" {
6093016fac88 Cross sections: started with implementation of web service (WIP).
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
145 return errNoGeoJSONLineStringType
6093016fac88 Cross sections: started with implementation of web service (WIP).
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
146 }
6093016fac88 Cross sections: started with implementation of web service (WIP).
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
147 *t = GeoJSONLineStringType(s)
6093016fac88 Cross sections: started with implementation of web service (WIP).
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
148 return nil
6093016fac88 Cross sections: started with implementation of web service (WIP).
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
149 }
643
756f3fc62da6 Cross sections: Using the database in the web service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 636
diff changeset
150
645
794592cad75a Cross sections: Fixed SQL, endian, WKB and JSON encoding errors.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 643
diff changeset
151 func (lc GeoJSONLineCoordinates) AsWKB() []byte {
643
756f3fc62da6 Cross sections: Using the database in the web service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 636
diff changeset
152
1683
509e8728e846 Fixed pre-calculated size of 2D WKB line strings.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1324
diff changeset
153 size := 1 + 4 + 4 + len(lc)*(2*8)
643
756f3fc62da6 Cross sections: Using the database in the web service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 636
diff changeset
154
756f3fc62da6 Cross sections: Using the database in the web service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 636
diff changeset
155 buf := bytes.NewBuffer(make([]byte, 0, size))
756f3fc62da6 Cross sections: Using the database in the web service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 636
diff changeset
156
2471
63475c8e710e Moved WKB constants to own package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1683
diff changeset
157 binary.Write(buf, binary.LittleEndian, wkb.NDR)
63475c8e710e Moved WKB constants to own package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1683
diff changeset
158 binary.Write(buf, binary.LittleEndian, wkb.LineString)
643
756f3fc62da6 Cross sections: Using the database in the web service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 636
diff changeset
159 binary.Write(buf, binary.LittleEndian, uint32(len(lc)))
756f3fc62da6 Cross sections: Using the database in the web service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 636
diff changeset
160
756f3fc62da6 Cross sections: Using the database in the web service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 636
diff changeset
161 for i := range lc {
756f3fc62da6 Cross sections: Using the database in the web service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 636
diff changeset
162 c := &lc[i]
653
7aeacd7f150b Cross sections: Take and produce valid GeoJSON.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 652
diff changeset
163 binary.Write(buf, binary.LittleEndian, math.Float64bits(c.Lat))
643
756f3fc62da6 Cross sections: Using the database in the web service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 636
diff changeset
164 binary.Write(buf, binary.LittleEndian, math.Float64bits(c.Lon))
756f3fc62da6 Cross sections: Using the database in the web service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 636
diff changeset
165 }
756f3fc62da6 Cross sections: Using the database in the web service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 636
diff changeset
166
645
794592cad75a Cross sections: Fixed SQL, endian, WKB and JSON encoding errors.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 643
diff changeset
167 return buf.Bytes()
643
756f3fc62da6 Cross sections: Using the database in the web service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 636
diff changeset
168 }
756f3fc62da6 Cross sections: Using the database in the web service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 636
diff changeset
169
756f3fc62da6 Cross sections: Using the database in the web service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 636
diff changeset
170 func (cz GeoJSONCoordinateZ) MarshalJSON() ([]byte, error) {
756f3fc62da6 Cross sections: Using the database in the web service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 636
diff changeset
171 var buf bytes.Buffer
653
7aeacd7f150b Cross sections: Take and produce valid GeoJSON.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 652
diff changeset
172 fmt.Fprintf(&buf, "[%.8f,%.8f,%.8f]", cz.Lat, cz.Lon, cz.Z)
643
756f3fc62da6 Cross sections: Using the database in the web service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 636
diff changeset
173 return buf.Bytes(), nil
756f3fc62da6 Cross sections: Using the database in the web service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 636
diff changeset
174 }
756f3fc62da6 Cross sections: Using the database in the web service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 636
diff changeset
175
756f3fc62da6 Cross sections: Using the database in the web service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 636
diff changeset
176 func (lcz *GeoJSONLineCoordinatesZ) Scan(src interface{}) error {
645
794592cad75a Cross sections: Fixed SQL, endian, WKB and JSON encoding errors.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 643
diff changeset
177 data, ok := src.([]byte)
643
756f3fc62da6 Cross sections: Using the database in the web service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 636
diff changeset
178 if !ok {
645
794592cad75a Cross sections: Fixed SQL, endian, WKB and JSON encoding errors.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 643
diff changeset
179 return errNoByteSlice
643
756f3fc62da6 Cross sections: Using the database in the web service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 636
diff changeset
180 }
756f3fc62da6 Cross sections: Using the database in the web service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 636
diff changeset
181 return lcz.FromWKB(data)
756f3fc62da6 Cross sections: Using the database in the web service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 636
diff changeset
182 }
756f3fc62da6 Cross sections: Using the database in the web service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 636
diff changeset
183
645
794592cad75a Cross sections: Fixed SQL, endian, WKB and JSON encoding errors.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 643
diff changeset
184 func (lcz *GeoJSONLineCoordinatesZ) FromWKB(data []byte) error {
643
756f3fc62da6 Cross sections: Using the database in the web service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 636
diff changeset
185
645
794592cad75a Cross sections: Fixed SQL, endian, WKB and JSON encoding errors.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 643
diff changeset
186 r := bytes.NewReader(data)
643
756f3fc62da6 Cross sections: Using the database in the web service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 636
diff changeset
187
756f3fc62da6 Cross sections: Using the database in the web service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 636
diff changeset
188 endian, err := r.ReadByte()
756f3fc62da6 Cross sections: Using the database in the web service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 636
diff changeset
189
756f3fc62da6 Cross sections: Using the database in the web service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 636
diff changeset
190 var order binary.ByteOrder
756f3fc62da6 Cross sections: Using the database in the web service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 636
diff changeset
191
756f3fc62da6 Cross sections: Using the database in the web service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 636
diff changeset
192 switch {
756f3fc62da6 Cross sections: Using the database in the web service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 636
diff changeset
193 case err != nil:
756f3fc62da6 Cross sections: Using the database in the web service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 636
diff changeset
194 return err
2471
63475c8e710e Moved WKB constants to own package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1683
diff changeset
195 case endian == wkb.NDR:
645
794592cad75a Cross sections: Fixed SQL, endian, WKB and JSON encoding errors.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 643
diff changeset
196 order = binary.LittleEndian
2471
63475c8e710e Moved WKB constants to own package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1683
diff changeset
197 case endian == wkb.XDR:
645
794592cad75a Cross sections: Fixed SQL, endian, WKB and JSON encoding errors.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 643
diff changeset
198 order = binary.BigEndian
643
756f3fc62da6 Cross sections: Using the database in the web service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 636
diff changeset
199 default:
756f3fc62da6 Cross sections: Using the database in the web service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 636
diff changeset
200 return fmt.Errorf("unknown byte order %x", endian)
756f3fc62da6 Cross sections: Using the database in the web service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 636
diff changeset
201 }
756f3fc62da6 Cross sections: Using the database in the web service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 636
diff changeset
202
756f3fc62da6 Cross sections: Using the database in the web service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 636
diff changeset
203 var geomType uint32
756f3fc62da6 Cross sections: Using the database in the web service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 636
diff changeset
204 err = binary.Read(r, order, &geomType)
756f3fc62da6 Cross sections: Using the database in the web service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 636
diff changeset
205
756f3fc62da6 Cross sections: Using the database in the web service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 636
diff changeset
206 switch {
756f3fc62da6 Cross sections: Using the database in the web service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 636
diff changeset
207 case err != nil:
756f3fc62da6 Cross sections: Using the database in the web service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 636
diff changeset
208 return err
2471
63475c8e710e Moved WKB constants to own package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1683
diff changeset
209 case geomType != wkb.LineStringZ:
645
794592cad75a Cross sections: Fixed SQL, endian, WKB and JSON encoding errors.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 643
diff changeset
210 return fmt.Errorf("unknown geometry type %x", geomType)
643
756f3fc62da6 Cross sections: Using the database in the web service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 636
diff changeset
211 }
756f3fc62da6 Cross sections: Using the database in the web service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 636
diff changeset
212
756f3fc62da6 Cross sections: Using the database in the web service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 636
diff changeset
213 var num uint32
756f3fc62da6 Cross sections: Using the database in the web service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 636
diff changeset
214 if err = binary.Read(r, order, &num); err != nil {
756f3fc62da6 Cross sections: Using the database in the web service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 636
diff changeset
215 return err
756f3fc62da6 Cross sections: Using the database in the web service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 636
diff changeset
216 }
756f3fc62da6 Cross sections: Using the database in the web service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 636
diff changeset
217
756f3fc62da6 Cross sections: Using the database in the web service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 636
diff changeset
218 coords := make(GeoJSONLineCoordinatesZ, num)
756f3fc62da6 Cross sections: Using the database in the web service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 636
diff changeset
219
756f3fc62da6 Cross sections: Using the database in the web service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 636
diff changeset
220 for i := range coords {
756f3fc62da6 Cross sections: Using the database in the web service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 636
diff changeset
221 c := &coords[i]
756f3fc62da6 Cross sections: Using the database in the web service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 636
diff changeset
222 for _, addr := range []*float64{&c.Lat, &c.Lon, &c.Z} {
756f3fc62da6 Cross sections: Using the database in the web service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 636
diff changeset
223 if err = binary.Read(r, order, addr); err != nil {
756f3fc62da6 Cross sections: Using the database in the web service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 636
diff changeset
224 return err
756f3fc62da6 Cross sections: Using the database in the web service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 636
diff changeset
225 }
756f3fc62da6 Cross sections: Using the database in the web service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 636
diff changeset
226 }
756f3fc62da6 Cross sections: Using the database in the web service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 636
diff changeset
227 }
756f3fc62da6 Cross sections: Using the database in the web service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 636
diff changeset
228
756f3fc62da6 Cross sections: Using the database in the web service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 636
diff changeset
229 *lcz = coords
756f3fc62da6 Cross sections: Using the database in the web service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 636
diff changeset
230
756f3fc62da6 Cross sections: Using the database in the web service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 636
diff changeset
231 return nil
756f3fc62da6 Cross sections: Using the database in the web service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 636
diff changeset
232 }
648
cf62cb84fa23 Cross sections: Added a naive O(N^2) algorithm to join the neighbored line segments.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 645
diff changeset
233
651
ce18231825a2 Cross sections: Small details on Equals Method of GeoJSONCoordinateZ (forget to commit).
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 648
diff changeset
234 func (cz GeoJSONCoordinateZ) Equals(other GeoJSONCoordinateZ) bool {
648
cf62cb84fa23 Cross sections: Added a naive O(N^2) algorithm to join the neighbored line segments.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 645
diff changeset
235 const (
cf62cb84fa23 Cross sections: Added a naive O(N^2) algorithm to join the neighbored line segments.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 645
diff changeset
236 xyEps = 1e-7
cf62cb84fa23 Cross sections: Added a naive O(N^2) algorithm to join the neighbored line segments.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 645
diff changeset
237 zEps = 1e-5
cf62cb84fa23 Cross sections: Added a naive O(N^2) algorithm to join the neighbored line segments.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 645
diff changeset
238 )
651
ce18231825a2 Cross sections: Small details on Equals Method of GeoJSONCoordinateZ (forget to commit).
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 648
diff changeset
239 return math.Abs(cz.Lat-other.Lat) < xyEps &&
648
cf62cb84fa23 Cross sections: Added a naive O(N^2) algorithm to join the neighbored line segments.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 645
diff changeset
240 math.Abs(cz.Lon-other.Lon) < xyEps &&
cf62cb84fa23 Cross sections: Added a naive O(N^2) algorithm to join the neighbored line segments.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 645
diff changeset
241 math.Abs(cz.Z-other.Z) < zEps
cf62cb84fa23 Cross sections: Added a naive O(N^2) algorithm to join the neighbored line segments.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 645
diff changeset
242 }
cf62cb84fa23 Cross sections: Added a naive O(N^2) algorithm to join the neighbored line segments.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 645
diff changeset
243
652
f5ecd1d72a6e Cross section: Replaced naive O(N^2) segment joining with a more clever one.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 651
diff changeset
244 func deg2rad(d float64) float64 { return d * math.Pi / 180.0 }
f5ecd1d72a6e Cross section: Replaced naive O(N^2) segment joining with a more clever one.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 651
diff changeset
245
f5ecd1d72a6e Cross section: Replaced naive O(N^2) segment joining with a more clever one.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 651
diff changeset
246 func (cz GeoJSONCoordinateZ) Distance(other GeoJSONCoordinateZ) float64 {
f5ecd1d72a6e Cross section: Replaced naive O(N^2) segment joining with a more clever one.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 651
diff changeset
247
f5ecd1d72a6e Cross section: Replaced naive O(N^2) segment joining with a more clever one.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 651
diff changeset
248 const EarthRadius = 6378137.0
f5ecd1d72a6e Cross section: Replaced naive O(N^2) segment joining with a more clever one.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 651
diff changeset
249
f5ecd1d72a6e Cross section: Replaced naive O(N^2) segment joining with a more clever one.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 651
diff changeset
250 dLat := deg2rad(other.Lat - cz.Lat)
f5ecd1d72a6e Cross section: Replaced naive O(N^2) segment joining with a more clever one.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 651
diff changeset
251 dLng := math.Abs(deg2rad(other.Lon - cz.Lon))
f5ecd1d72a6e Cross section: Replaced naive O(N^2) segment joining with a more clever one.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 651
diff changeset
252
f5ecd1d72a6e Cross section: Replaced naive O(N^2) segment joining with a more clever one.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 651
diff changeset
253 if dLng > math.Pi {
f5ecd1d72a6e Cross section: Replaced naive O(N^2) segment joining with a more clever one.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 651
diff changeset
254 dLng = 2*math.Pi - dLng
f5ecd1d72a6e Cross section: Replaced naive O(N^2) segment joining with a more clever one.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 651
diff changeset
255 }
f5ecd1d72a6e Cross section: Replaced naive O(N^2) segment joining with a more clever one.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 651
diff changeset
256
f5ecd1d72a6e Cross section: Replaced naive O(N^2) segment joining with a more clever one.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 651
diff changeset
257 x := dLng * math.Cos(deg2rad((cz.Lat+other.Lat)/2.0))
f5ecd1d72a6e Cross section: Replaced naive O(N^2) segment joining with a more clever one.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 651
diff changeset
258 return math.Sqrt(dLat*dLat+x*x) * EarthRadius
f5ecd1d72a6e Cross section: Replaced naive O(N^2) segment joining with a more clever one.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 651
diff changeset
259 }
808
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
260
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
261 func (mls *GeoJSONMultiLineCoordinatesZ) FromWKB(data []byte) error {
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
262 r := bytes.NewReader(data)
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
263
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
264 var order binary.ByteOrder
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
265
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
266 endian, err := r.ReadByte()
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
267
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
268 switch {
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
269 case err != nil:
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
270 return err
2471
63475c8e710e Moved WKB constants to own package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1683
diff changeset
271 case endian == wkb.NDR:
808
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
272 order = binary.LittleEndian
2471
63475c8e710e Moved WKB constants to own package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1683
diff changeset
273 case endian == wkb.XDR:
808
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
274 order = binary.BigEndian
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
275 default:
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
276 return fmt.Errorf("unknown byte order %x", endian)
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
277 }
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
278
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
279 var geomType uint32
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
280 err = binary.Read(r, order, &geomType)
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
281
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
282 switch {
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
283 case err != nil:
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
284 return err
2471
63475c8e710e Moved WKB constants to own package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1683
diff changeset
285 case geomType != wkb.MultiLineStringZ:
808
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
286 return fmt.Errorf("unknown geometry type %d", geomType)
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
287 }
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
288
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
289 var numLines uint32
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
290 if err = binary.Read(r, order, &numLines); err != nil {
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
291 return err
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
292 }
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
293
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
294 lines := make(GeoJSONMultiLineCoordinatesZ, numLines)
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
295
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
296 for i := range lines {
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
297 endian, err = r.ReadByte()
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
298
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
299 switch {
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
300 case err != nil:
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
301 return err
2471
63475c8e710e Moved WKB constants to own package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1683
diff changeset
302 case endian == wkb.NDR:
808
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
303 order = binary.LittleEndian
2471
63475c8e710e Moved WKB constants to own package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1683
diff changeset
304 case endian == wkb.XDR:
808
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
305 order = binary.BigEndian
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
306 default:
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
307 return fmt.Errorf("unknown byte order %x", endian)
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
308 }
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
309
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
310 err = binary.Read(r, order, &geomType)
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
311 switch {
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
312 case err != nil:
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
313 return err
2471
63475c8e710e Moved WKB constants to own package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1683
diff changeset
314 case geomType != wkb.LineStringZ:
808
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
315 return fmt.Errorf("unknown geometry type %d", geomType)
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
316 }
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
317
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
318 var numPoints uint32
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
319 if err = binary.Read(r, order, &numPoints); err != nil {
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
320 return err
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
321 }
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
322
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
323 points := make(GeoJSONLineCoordinatesZ, numPoints)
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
324 for j := range points {
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
325 var lat, lon, z uint64
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
326 if err = binary.Read(r, order, &lat); err != nil {
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
327 return err
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
328 }
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
329 if err = binary.Read(r, order, &lon); err != nil {
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
330 return err
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
331 }
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
332 if err = binary.Read(r, order, &z); err != nil {
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
333 return err
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
334 }
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
335 c := &points[j]
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
336 c.Lat = math.Float64frombits(lat)
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
337 c.Lon = math.Float64frombits(lon)
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
338 c.Z = math.Float64frombits(z)
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
339 }
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
340 lines[i] = points
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
341 }
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
342
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
343 *mls = lines
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
344
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
345 return nil
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
346 }
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
347
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
348 func (mls *GeoJSONMultiLineCoordinatesZ) Scan(src interface{}) error {
895
3bb275235c89 Let GeoJSONMultiLineCoordinatesZ be nil when scanned from DB.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 808
diff changeset
349 if src == nil {
3bb275235c89 Let GeoJSONMultiLineCoordinatesZ be nil when scanned from DB.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 808
diff changeset
350 return nil
3bb275235c89 Let GeoJSONMultiLineCoordinatesZ be nil when scanned from DB.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 808
diff changeset
351 }
808
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
352 data, ok := src.([]byte)
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
353 if !ok {
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
354 return errNoByteSlice
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
355 }
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
356 return mls.FromWKB(data)
e10a8a682297 Cross sections: Clip result against area of the sounding result.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 801
diff changeset
357 }