Commit 4fb92a89 by dliangx

添加area数据操作

parent 540c0826
......@@ -3,10 +3,12 @@ package geo
import (
"database/sql"
"encoding/json"
"errors"
"fmt"
"time"
"com.dliangx.xplot/appserver/model"
"com.dliangx.xplot/appserver/util"
)
func SaveRoute(line model.GeoJson) (model.OptRoute, error) {
......@@ -195,6 +197,7 @@ func GetRoute(id int, opt_type int) (model.OptRoute, error) {
var route model.OptRoute
var query string
var jsonb_data []byte
if opt_type == 1 {
query = `
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) {
}
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 == sql.ErrNoRows {
......@@ -214,7 +217,9 @@ func GetRoute(id int, opt_type int) (model.OptRoute, error) {
}
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
}
......@@ -226,11 +231,12 @@ func GetOptArea(id int, opt_type int) (model.OptArea, error) {
defer db.Close()
var area model.OptArea
var jsonb_data []byte
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
`, 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 == sql.ErrNoRows {
......@@ -238,7 +244,9 @@ func GetOptArea(id int, opt_type int) (model.OptArea, error) {
}
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
}
......@@ -276,7 +284,7 @@ func DeleteOptArea(id int, opt_type int) (bool, error) {
defer db.Close()
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 {
return false, fmt.Errorf("delete route failed: %w", err)
......@@ -290,27 +298,137 @@ func DeleteOptArea(id int, opt_type int) (bool, error) {
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) {
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) {
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) {
if obj1.Geometry == nil || obj2.Geometry == nil {
return false, errors.New("found no geometry")
}
return false, nil
}
......@@ -2,7 +2,6 @@ package handler
import (
"context"
"fmt"
"strconv"
"com.dliangx.xplot/appserver/geo"
......@@ -10,9 +9,6 @@ import (
"github.com/cloudwego/hertz/pkg/app"
"github.com/cloudwego/hertz/pkg/common/utils"
"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) {
......@@ -193,38 +189,11 @@ func CheckTwoOptAreaIsCross(ctx context.Context, c *app.RequestContext) {
c.JSON(consts.StatusBadRequest, utils.H{"message": "need tow geojson body"})
return
}
if req[0].ID == 0 || req[1].ID == 0 {
res, err := geo.CheckAreasCross(req[0], req[1])
if err != nil {
c.JSON(consts.StatusOK, utils.H{"code": 10011, "message": err.Error()})
return
}
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
import (
"fmt"
"testing"
"com.dliangx.xplot/appserver/util"
)
func TestTransGeoToWKT(t *testing.T) {
geojsonStr := `{"type":"Point","coordinates":[102.0, 0.5]}`
wkt, err := TransGeoToWKT(geojsonStr)
wkt, err := util.TransGeoToWKT(geojsonStr)
if err != nil {
fmt.Println(err.Error())
}
......
......@@ -11,18 +11,16 @@ type OptRoute struct {
Type string `json:"type"`
Properties map[string]interface{} `json:"properties"`
OptTime time.Time `json:"opt_time"`
Geometry *geojson.Geometry `json:"route_line"`
Geometry *geojson.Geometry `json:"geometry"`
}
type OptFlyRoute OptRoute
// OptArea 作业区域
type OptArea struct {
ID int `json:"id"` // 区域ID
Type string `json:"type"`
Properties map[string]interface{} `json:"properties"`
OptTime time.Time `json:"opt_time"`
Geometry *geojson.Geometry `json:"area"` // 区域边界坐标点
Geometry *geojson.Geometry `json:"geometry"` // 区域边界坐标点
}
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