Commit 4fb92a89 by dliangx

添加area数据操作

parent 540c0826
...@@ -3,10 +3,12 @@ package geo ...@@ -3,10 +3,12 @@ package geo
import ( import (
"database/sql" "database/sql"
"encoding/json" "encoding/json"
"errors"
"fmt" "fmt"
"time" "time"
"com.dliangx.xplot/appserver/model" "com.dliangx.xplot/appserver/model"
"com.dliangx.xplot/appserver/util"
) )
func SaveRoute(line model.GeoJson) (model.OptRoute, error) { func SaveRoute(line model.GeoJson) (model.OptRoute, error) {
...@@ -195,6 +197,7 @@ func GetRoute(id int, opt_type int) (model.OptRoute, error) { ...@@ -195,6 +197,7 @@ func GetRoute(id int, opt_type int) (model.OptRoute, error) {
var route model.OptRoute var route model.OptRoute
var query string var query string
var jsonb_data []byte
if opt_type == 1 { if opt_type == 1 {
query = ` query = `
SELECT id, type, properties, opt_time, ST_AsGeoJSON(geometry) as geometry SELECT id, type, properties, opt_time, ST_AsGeoJSON(geometry) as geometry
...@@ -206,7 +209,7 @@ func GetRoute(id int, opt_type int) (model.OptRoute, error) { ...@@ -206,7 +209,7 @@ func GetRoute(id int, opt_type int) (model.OptRoute, error) {
} }
err = db.QueryRow(query, id).Scan( err = db.QueryRow(query, id).Scan(
&route.ID, &route.Type, &route.Properties, &route.OptTime, &route.Geometry, &route.ID, &route.Type, &jsonb_data, &route.OptTime, &route.Geometry,
) )
if err != nil { if err != nil {
if err == sql.ErrNoRows { if err == sql.ErrNoRows {
...@@ -214,7 +217,9 @@ func GetRoute(id int, opt_type int) (model.OptRoute, error) { ...@@ -214,7 +217,9 @@ func GetRoute(id int, opt_type int) (model.OptRoute, error) {
} }
return model.OptRoute{}, fmt.Errorf("query route failed: %w", err) return model.OptRoute{}, fmt.Errorf("query route failed: %w", err)
} }
if err := json.Unmarshal(jsonb_data, &route.Properties); err != nil {
return model.OptRoute{}, fmt.Errorf("parse Properties error")
}
return route, nil return route, nil
} }
...@@ -226,11 +231,12 @@ func GetOptArea(id int, opt_type int) (model.OptArea, error) { ...@@ -226,11 +231,12 @@ func GetOptArea(id int, opt_type int) (model.OptArea, error) {
defer db.Close() defer db.Close()
var area model.OptArea var area model.OptArea
var jsonb_data []byte
err = db.QueryRow(` err = db.QueryRow(`
SELECT id, type, properties, opt_time, ST_AsGeoJSON(geometry) as geometry SELECT id, type, JSON(properties), opt_time, ST_AsGeoJSON(geometry) as geometry
FROM opt_areas WHERE id = $1 FROM opt_areas WHERE id = $1
`, id).Scan( `, id).Scan(
&area.ID, &area.Type, &area.Properties, &area.OptTime, &area.Geometry, &area.ID, &area.Type, &jsonb_data, &area.OptTime, &area.Geometry,
) )
if err != nil { if err != nil {
if err == sql.ErrNoRows { if err == sql.ErrNoRows {
...@@ -238,7 +244,9 @@ func GetOptArea(id int, opt_type int) (model.OptArea, error) { ...@@ -238,7 +244,9 @@ func GetOptArea(id int, opt_type int) (model.OptArea, error) {
} }
return model.OptArea{}, fmt.Errorf("query area failed: %w", err) return model.OptArea{}, fmt.Errorf("query area failed: %w", err)
} }
if err := json.Unmarshal(jsonb_data, &area.Properties); err != nil {
return model.OptArea{}, fmt.Errorf("parse Properties error")
}
return area, nil return area, nil
} }
...@@ -276,7 +284,7 @@ func DeleteOptArea(id int, opt_type int) (bool, error) { ...@@ -276,7 +284,7 @@ func DeleteOptArea(id int, opt_type int) (bool, error) {
defer db.Close() defer db.Close()
var result sql.Result var result sql.Result
result, err = db.Exec(`DELETE FROM opt_area WHERE id = $1`, id) result, err = db.Exec(`DELETE FROM opt_areas WHERE id = $1`, id)
if err != nil { if err != nil {
return false, fmt.Errorf("delete route failed: %w", err) return false, fmt.Errorf("delete route failed: %w", err)
...@@ -290,27 +298,137 @@ func DeleteOptArea(id int, opt_type int) (bool, error) { ...@@ -290,27 +298,137 @@ func DeleteOptArea(id int, opt_type int) (bool, error) {
return rowsAffected > 0, nil return rowsAffected > 0, nil
} }
func GetRelatedRoute(obj model.GeoJson) ([]model.OptArea, error) { func GetRelatedRoute(obj model.GeoJson) ([]model.OptRoute, error) {
db, err := connectDB()
if err != nil {
return []model.OptRoute{}, fmt.Errorf("database connection failed: %v", err)
}
defer db.Close()
jsonstr, _ := json.Marshal(obj.Geometry)
wkt, err := util.TransGeoToWKT(string(jsonstr))
if err != nil {
return []model.OptRoute{}, err
}
var results []model.OptRoute
var query string
if obj.Opt == 1 {
query = `SELECT id, type, properties, opt_time, ST_AsGeoJSON(geometry) as geometry FROM opt_routes WHERE ST_Intersects(ST_SetSRID($1::geometry,4326), geometry)`
} else if obj.Opt == 2 {
query = `SELECT id, type, properties, opt_time, ST_AsGeoJSON(geometry) as geometry FROM opt_fly_routes WHERE ST_Intersects(ST_SetSRID($1::geometry,4326), geometry)`
}
rows, err := db.Query(query, wkt)
if err != nil {
return []model.OptRoute{}, err
}
defer rows.Close()
for rows.Next() {
var result model.OptRoute
var jsonb_data []byte
err = rows.Scan(&result.ID, &result.Type, &jsonb_data, &result.OptTime, &result.Geometry)
if err != nil {
return []model.OptRoute{}, err
}
if err := json.Unmarshal(jsonb_data, &result.Properties); err != nil {
return []model.OptRoute{}, fmt.Errorf("parse Properties error")
}
results = append(results, result)
}
return results, err
return []model.OptArea{}, nil
} }
func GetRelatedOptArea(obj model.GeoJson) ([]model.OptArea, error) { func GetRelatedOptArea(obj model.GeoJson) ([]model.OptArea, error) {
db, err := connectDB()
if err != nil {
return []model.OptArea{}, fmt.Errorf("database connection failed: %v", err)
}
defer db.Close()
jsonstr, _ := json.Marshal(obj.Geometry)
wkt, err := util.TransGeoToWKT(string(jsonstr))
if err != nil {
return []model.OptArea{}, err
}
var results []model.OptArea
var query string
if obj.Opt == 3 {
query = `SELECT id, type, properties, opt_time, ST_AsGeoJSON(geometry) as geometry FROM opt_areas WHERE ST_Intersects(ST_SetSRID($1::geometry,4326), geometry)`
}
rows, err := db.Query(query, wkt)
if err != nil {
return []model.OptArea{}, err
}
defer rows.Close()
return []model.OptArea{}, nil for rows.Next() {
var result model.OptArea
var jsonb_data []byte
err = rows.Scan(&result.ID, &result.Type, &result.Properties, &result.OptTime, &result.Geometry)
if err != nil {
return []model.OptArea{}, err
}
if err := json.Unmarshal(jsonb_data, &result.Properties); err != nil {
return []model.OptArea{}, fmt.Errorf("parse Properties error")
}
results = append(results, result)
}
return results, err
} }
func GetRelatedAdmArea(obj model.GeoJson) ([]model.GeoJson, error) { func GetRelatedAdmArea(obj model.GeoJson) ([]model.GeoJson, error) {
db, err := connectDB()
if err != nil {
return []model.GeoJson{}, fmt.Errorf("database connection failed: %v", err)
}
defer db.Close()
return []model.GeoJson{}, nil jsonstr, _ := json.Marshal(obj.Geometry)
} wkt, err := util.TransGeoToWKT(string(jsonstr))
if err != nil {
return []model.GeoJson{}, err
}
var results []model.GeoJson
var query string
func CheckOptAreasCrossById(id1, id2 int) (bool, error) { if obj.Opt == 4 {
query = `SELECT id, type, properties, ST_AsGeoJSON(geom) as geometry FROM geojson_data WHERE ST_Intersects(ST_SetSRID($1::geometry,4326), geometry)`
}
return false, nil rows, err := db.Query(query, wkt)
if err != nil {
return []model.GeoJson{}, err
}
defer rows.Close()
for rows.Next() {
var result model.GeoJson
var jsonb_data []byte
err = rows.Scan(&result.ID, &result.Type, &result.Properties, &result.Geometry)
if err != nil {
return []model.GeoJson{}, err
}
if err := json.Unmarshal(jsonb_data, &result.Properties); err != nil {
return []model.GeoJson{}, fmt.Errorf("parse Properties error")
}
results = append(results, result)
}
return results, err
} }
func CheckAreasCross(obj1, obj2 model.GeoJson) (bool, error) { func CheckAreasCross(obj1, obj2 model.GeoJson) (bool, error) {
if obj1.Geometry == nil || obj2.Geometry == nil {
return false, errors.New("found no geometry")
}
return false, nil return false, nil
} }
...@@ -2,7 +2,6 @@ package handler ...@@ -2,7 +2,6 @@ package handler
import ( import (
"context" "context"
"fmt"
"strconv" "strconv"
"com.dliangx.xplot/appserver/geo" "com.dliangx.xplot/appserver/geo"
...@@ -10,9 +9,6 @@ import ( ...@@ -10,9 +9,6 @@ import (
"github.com/cloudwego/hertz/pkg/app" "github.com/cloudwego/hertz/pkg/app"
"github.com/cloudwego/hertz/pkg/common/utils" "github.com/cloudwego/hertz/pkg/common/utils"
"github.com/cloudwego/hertz/pkg/protocol/consts" "github.com/cloudwego/hertz/pkg/protocol/consts"
"github.com/twpayne/go-geom"
"github.com/twpayne/go-geom/encoding/geojson"
"github.com/twpayne/go-geom/encoding/wkt"
) )
func SaveGeometry(ctx context.Context, c *app.RequestContext) { func SaveGeometry(ctx context.Context, c *app.RequestContext) {
...@@ -193,38 +189,11 @@ func CheckTwoOptAreaIsCross(ctx context.Context, c *app.RequestContext) { ...@@ -193,38 +189,11 @@ func CheckTwoOptAreaIsCross(ctx context.Context, c *app.RequestContext) {
c.JSON(consts.StatusBadRequest, utils.H{"message": "need tow geojson body"}) c.JSON(consts.StatusBadRequest, utils.H{"message": "need tow geojson body"})
return return
} }
if req[0].ID == 0 || req[1].ID == 0 {
res, err := geo.CheckAreasCross(req[0], req[1]) res, err := geo.CheckAreasCross(req[0], req[1])
if err != nil { if err != nil {
c.JSON(consts.StatusOK, utils.H{"code": 10011, "message": err.Error()}) c.JSON(consts.StatusOK, utils.H{"code": 10011, "message": err.Error()})
return return
} }
c.JSON(consts.StatusOK, res) c.JSON(consts.StatusOK, res)
return
} else {
res, err := geo.CheckOptAreasCrossById(req[0].ID, req[1].ID)
if err != nil {
c.JSON(consts.StatusOK, utils.H{"code": 10012, "message": err.Error()})
return
}
c.JSON(consts.StatusOK, res)
return
}
}
func TransGeoToWKT(geojsonStr string) (string, error) {
// 解码GeoJSON字符串为geom.T类型
var g geom.T
if err := geojson.Unmarshal([]byte(geojsonStr), &g); err != nil {
return "", fmt.Errorf("error unmarshalling GeoJSON: %w", err)
}
// 将geom.T类型转换为WKT
wktStr, err := wkt.Marshal(g)
if err != nil {
return "", fmt.Errorf("error marshalling to WKT: %w", err)
}
return string(wktStr), nil
} }
...@@ -3,11 +3,13 @@ package handler ...@@ -3,11 +3,13 @@ package handler
import ( import (
"fmt" "fmt"
"testing" "testing"
"com.dliangx.xplot/appserver/util"
) )
func TestTransGeoToWKT(t *testing.T) { func TestTransGeoToWKT(t *testing.T) {
geojsonStr := `{"type":"Point","coordinates":[102.0, 0.5]}` geojsonStr := `{"type":"Point","coordinates":[102.0, 0.5]}`
wkt, err := TransGeoToWKT(geojsonStr) wkt, err := util.TransGeoToWKT(geojsonStr)
if err != nil { if err != nil {
fmt.Println(err.Error()) fmt.Println(err.Error())
} }
......
...@@ -11,18 +11,16 @@ type OptRoute struct { ...@@ -11,18 +11,16 @@ type OptRoute struct {
Type string `json:"type"` Type string `json:"type"`
Properties map[string]interface{} `json:"properties"` Properties map[string]interface{} `json:"properties"`
OptTime time.Time `json:"opt_time"` OptTime time.Time `json:"opt_time"`
Geometry *geojson.Geometry `json:"route_line"` Geometry *geojson.Geometry `json:"geometry"`
} }
type OptFlyRoute OptRoute
// OptArea 作业区域 // OptArea 作业区域
type OptArea struct { type OptArea struct {
ID int `json:"id"` // 区域ID ID int `json:"id"` // 区域ID
Type string `json:"type"` Type string `json:"type"`
Properties map[string]interface{} `json:"properties"` Properties map[string]interface{} `json:"properties"`
OptTime time.Time `json:"opt_time"` OptTime time.Time `json:"opt_time"`
Geometry *geojson.Geometry `json:"area"` // 区域边界坐标点 Geometry *geojson.Geometry `json:"geometry"` // 区域边界坐标点
} }
type GeoJson struct { type GeoJson struct {
......
package util
import (
"fmt"
"github.com/twpayne/go-geom"
"github.com/twpayne/go-geom/encoding/geojson"
"github.com/twpayne/go-geom/encoding/wkt"
)
func TransGeoToWKT(geojsonStr string) (string, error) {
// 解码GeoJSON字符串为geom.T类型
var g geom.T
if err := geojson.Unmarshal([]byte(geojsonStr), &g); err != nil {
return "", fmt.Errorf("error unmarshalling GeoJSON: %w", err)
}
// 将geom.T类型转换为WKT
wktStr, err := wkt.Marshal(g)
if err != nil {
return "", fmt.Errorf("error marshalling to WKT: %w", err)
}
return string(wktStr), nil
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment