289 lines
8.8 KiB
Go
289 lines
8.8 KiB
Go
|
// ==========================================================================
|
|||
|
// GFast自动生成controller操作代码。
|
|||
|
// 生成日期:2023-08-08 10:08:24
|
|||
|
// 生成路径: internal/app/system/controller/qianqi_pingchang.go
|
|||
|
// 生成人:gfast
|
|||
|
// desc:平场数据
|
|||
|
// company:云南奇讯科技有限公司
|
|||
|
// ==========================================================================
|
|||
|
|
|||
|
package controller
|
|||
|
|
|||
|
import (
|
|||
|
"context"
|
|||
|
"encoding/json"
|
|||
|
"errors"
|
|||
|
"github.com/gogf/gf/v2/crypto/gmd5"
|
|||
|
"github.com/gogf/gf/v2/database/gdb"
|
|||
|
"github.com/gogf/gf/v2/frame/g"
|
|||
|
"github.com/gogf/gf/v2/net/ghttp"
|
|||
|
"github.com/tiger1103/gfast/v3/api/v1/common/globe"
|
|||
|
"github.com/tiger1103/gfast/v3/api/v1/common/shp"
|
|||
|
"github.com/tiger1103/gfast/v3/api/v1/common/tool"
|
|||
|
"github.com/tiger1103/gfast/v3/api/v1/system"
|
|||
|
"github.com/tiger1103/gfast/v3/internal/app/system/dao"
|
|||
|
"github.com/tomchavakis/turf-go/constants"
|
|||
|
"github.com/tomchavakis/turf-go/measurement"
|
|||
|
"math"
|
|||
|
"strings"
|
|||
|
)
|
|||
|
|
|||
|
const MaxNeighborsLen = 8 //最大邻居个数
|
|||
|
type qianqiPingchangController struct {
|
|||
|
BaseController
|
|||
|
}
|
|||
|
|
|||
|
var QianqiPingchang = new(qianqiPingchangController)
|
|||
|
|
|||
|
func (c *qianqiPingchangController) PingchangImport(ctx context.Context, req *system.PingchangImportReq) (res *system.UsualRes, err error) {
|
|||
|
r := ghttp.RequestFromCtx(ctx)
|
|||
|
files := r.GetUploadFiles("file")
|
|||
|
names, err := files.Save(globe.SOURCE)
|
|||
|
if err != nil {
|
|||
|
return nil, err
|
|||
|
}
|
|||
|
//fmt.Println(names)
|
|||
|
prefix := strings.Split(names[0], ".")[0]
|
|||
|
|
|||
|
shpfile := globe.SOURCE + "/" + prefix + ".shp"
|
|||
|
|
|||
|
err, s := shp.ReadShp(shpfile)
|
|||
|
if err != nil {
|
|||
|
return nil, err
|
|||
|
}
|
|||
|
var pcs []system.PC
|
|||
|
//name := strings.Split(shpfile, ".")[0]
|
|||
|
//导入平场区域时,只处理线部分
|
|||
|
//marshal, err := json.Marshal(s.Polylines)
|
|||
|
//if err != nil {
|
|||
|
// return nil, err
|
|||
|
//}
|
|||
|
|
|||
|
for _, v := range s.Polylines {
|
|||
|
pc := system.PC{
|
|||
|
ProjectID: req.ProjectID,
|
|||
|
PCName: v.Name,
|
|||
|
GridWidth: 3,
|
|||
|
SHP: shpfile,
|
|||
|
}
|
|||
|
marshal, err := json.Marshal(v.Positions)
|
|||
|
if err != nil {
|
|||
|
continue
|
|||
|
}
|
|||
|
pc.Range = string(marshal)
|
|||
|
pc.PcID = gmd5.MustEncryptString(string(marshal))
|
|||
|
count, err := dao.QianqiPingchang.Ctx(ctx).Where(dao.QianqiPingchang.Columns().PcId, pc.PcID).Count()
|
|||
|
if err != nil {
|
|||
|
continue
|
|||
|
}
|
|||
|
if count == 0 {
|
|||
|
pcs = append(pcs, pc)
|
|||
|
}
|
|||
|
}
|
|||
|
if len(pcs) > 0 {
|
|||
|
dao.QianqiPingchang.Ctx(ctx).Insert(&pcs)
|
|||
|
}
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
func (c *qianqiPingchangController) PingchangUpdate(ctx context.Context, req *system.PingchangUpdateReq) (res *system.UsualRes, err error) {
|
|||
|
var pc system.PC
|
|||
|
if len(req.Points) > 0 {
|
|||
|
marshal, err := json.Marshal(req.Points)
|
|||
|
if err != nil {
|
|||
|
return nil, err
|
|||
|
}
|
|||
|
pc.Points = string(marshal)
|
|||
|
}
|
|||
|
pc.GridWidth = req.GridWidth
|
|||
|
pc.PCName = req.PCName
|
|||
|
dao.QianqiPingchang.Ctx(ctx).Where("pc_id", req.PcID).Update(&gdb.Map{
|
|||
|
dao.QianqiPingchang.Columns().PcName: req.PCName,
|
|||
|
dao.QianqiPingchang.Columns().GridWidth: req.GridWidth,
|
|||
|
dao.QianqiPingchang.Columns().Points: pc.Points,
|
|||
|
})
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
func (c *qianqiPingchangController) PingChangList(ctx context.Context, req *system.PingChangListReq) (res *system.PingChangListRes, err error) {
|
|||
|
var pcs []system.PC
|
|||
|
dao.QianqiPingchang.Ctx(ctx).Where("project_id", req.ProjectID).Offset((req.Page - 1) * req.PageSize).Limit(req.PageSize).Order("pc_name asc,created_at desc").Scan(&pcs)
|
|||
|
res = &system.PingChangListRes{}
|
|||
|
for _, v := range pcs {
|
|||
|
pc1 := system.PC1{
|
|||
|
ProjectID: v.ProjectID,
|
|||
|
PCName: v.PCName,
|
|||
|
Progress: v.Progress,
|
|||
|
GridWidth: v.GridWidth,
|
|||
|
PcID: v.PcID,
|
|||
|
Cut: v.Cut,
|
|||
|
Fill: v.Fill,
|
|||
|
Total: v.Total,
|
|||
|
Area: v.Area,
|
|||
|
Shp: v.SHP,
|
|||
|
}
|
|||
|
if len(v.Range) > 0 {
|
|||
|
err1 := json.Unmarshal([]byte(v.Range), &pc1.Range)
|
|||
|
if err1 != nil {
|
|||
|
continue
|
|||
|
}
|
|||
|
}
|
|||
|
pc1.Points = []system.Point{}
|
|||
|
if len(v.Points) > 0 {
|
|||
|
err2 := json.Unmarshal([]byte(v.Points), &pc1.Points)
|
|||
|
if err2 != nil {
|
|||
|
continue
|
|||
|
}
|
|||
|
}
|
|||
|
pc1.SmoothPoints = []system.Point{}
|
|||
|
if len(v.SmoothPoints) > 0 {
|
|||
|
err3 := json.Unmarshal([]byte(v.SmoothPoints), &pc1.SmoothPoints)
|
|||
|
if err3 != nil {
|
|||
|
continue
|
|||
|
}
|
|||
|
}
|
|||
|
res.Range = append(res.Range, pc1)
|
|||
|
}
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
func (c *qianqiPingchangController) PingChangAdd(ctx context.Context, req *system.PingChangAddReq) (res *system.UsualRes, err error) {
|
|||
|
marshal, errs := json.Marshal(req.Range)
|
|||
|
if errs != nil {
|
|||
|
return nil, errs
|
|||
|
}
|
|||
|
dao.QianqiPingchang.Ctx(ctx).Insert(&system.PC{
|
|||
|
ProjectID: req.ProjectID,
|
|||
|
PcID: tool.GetUuid(),
|
|||
|
PCName: req.PCName,
|
|||
|
GridWidth: req.GridWidth,
|
|||
|
Range: string(marshal),
|
|||
|
})
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
func (c *qianqiPingchangController) PingchangDel(ctx context.Context, req *system.PingchangDelReq) (res *system.UsualRes, err error) {
|
|||
|
_, err = dao.QianqiPingchang.Ctx(ctx).Unscoped().Delete(dao.QianqiPingchang.Columns().PcId, req.PcID)
|
|||
|
return
|
|||
|
}
|
|||
|
func (c *qianqiPingchangController) PingchangCalculate(ctx context.Context, req *system.PingchangCalculateReq) (res *system.UsualRes, err error) {
|
|||
|
pc := &system.PC{}
|
|||
|
err = dao.QianqiPingchang.Ctx(ctx).Where(dao.QianqiPingchang.Columns().PcId, req.PcID).Scan(pc)
|
|||
|
if err != nil {
|
|||
|
return nil, err
|
|||
|
}
|
|||
|
if pc == nil {
|
|||
|
return nil, errors.New("资源不存在")
|
|||
|
}
|
|||
|
|
|||
|
widthNeighbors := CalNeighbors(req.Locations, float64(pc.GridWidth*math.Sqrt(float64(2)))+2)
|
|||
|
/* res = &SHPCreateRes{Points: widthNeighbors}
|
|||
|
filename := pcs.PCName + "_" + strconv.Itoa(int(req.GridWidth)) + "m精度"
|
|||
|
CreateSHP(widthNeighbors, filename)*/
|
|||
|
//CreateSHP(widthNeighbors, "test")
|
|||
|
var smoothPoints []system.Point
|
|||
|
for i, v := range widthNeighbors {
|
|||
|
var s_p system.Point
|
|||
|
s_p.Alt = v.Avrage
|
|||
|
s_p.Lng = v.Lng
|
|||
|
s_p.Lat = v.Lat
|
|||
|
smoothPoints = append(smoothPoints, s_p)
|
|||
|
widthNeighbors[i].Neighbors = []system.Point{}
|
|||
|
}
|
|||
|
marshal, err := json.Marshal(smoothPoints)
|
|||
|
if err != nil {
|
|||
|
return nil, err
|
|||
|
}
|
|||
|
locs, err := json.Marshal(req.Locations)
|
|||
|
if err != nil {
|
|||
|
return nil, err
|
|||
|
}
|
|||
|
/* _, err = dao.QianqiPingchang.Ctx(ctx).Where(dao.QianqiPingchang.Columns().PcId, req.PcID).Update(&system.PC{
|
|||
|
SmoothPoints: string(marshal),
|
|||
|
Points: string(locs),
|
|||
|
})*/
|
|||
|
_, err = dao.QianqiPingchang.Ctx(ctx).Where(dao.QianqiPingchang.Columns().PcId, req.PcID).Update(g.Map{
|
|||
|
"smooth_points": string(marshal),
|
|||
|
"points": string(locs),
|
|||
|
})
|
|||
|
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
type Point struct {
|
|||
|
system.Point
|
|||
|
//WeightMap gmap.ListMap `json:"weight_map" dc:"权重表"`
|
|||
|
Neighbors []system.Point `json:"neighbors" dc:"相邻的点"`
|
|||
|
Avrage float64 `json:"avrage" dc:"区域内的平均高度"`
|
|||
|
Total float64 `json:"total" dc:"总高度"`
|
|||
|
}
|
|||
|
|
|||
|
func CalNeighbors(locations []system.Point, dis float64) []*Point {
|
|||
|
var widthNeighbors []*Point
|
|||
|
for i, v := range locations {
|
|||
|
var point Point
|
|||
|
point.Lng = v.Lng
|
|||
|
point.Lat = v.Lat
|
|||
|
point.Alt = v.Alt
|
|||
|
for j, v2 := range locations {
|
|||
|
if i != j {
|
|||
|
//如果已经最多找到了8个临近点,就不再进行寻找,减少计算量
|
|||
|
if len(point.Neighbors) == MaxNeighborsLen {
|
|||
|
break
|
|||
|
}
|
|||
|
//排除自己,计算与其他点的权重
|
|||
|
distance, err := measurement.Distance(v.Lng, v.Lat, v2.Lng, v2.Lat, constants.UnitMeters)
|
|||
|
if err != nil {
|
|||
|
continue
|
|||
|
}
|
|||
|
//如果距离小于网格距离的2倍,代表是邻居
|
|||
|
if distance < dis {
|
|||
|
point.Total += v2.Alt
|
|||
|
point.Neighbors = append(point.Neighbors, v2)
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
widthNeighbors = append(widthNeighbors, &point)
|
|||
|
}
|
|||
|
for i, v := range widthNeighbors {
|
|||
|
num := len(v.Neighbors)
|
|||
|
if num > 0 {
|
|||
|
widthNeighbors[i].Avrage = v.Total / float64(num)
|
|||
|
//fmt.Println(i+1, "个点", "总高度", v.Total, "平均高度", widthNeighbors[i].Avrage, "邻居数量", num)
|
|||
|
}
|
|||
|
}
|
|||
|
return widthNeighbors
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
//// List 列表
|
|||
|
//func (c *qianqiPingchangController) List(ctx context.Context, req *system.QianqiPingchangSearchReq) (res *system.QianqiPingchangSearchRes, err error) {
|
|||
|
// res, err = service.QianqiPingchang().List(ctx, req)
|
|||
|
// return
|
|||
|
//}
|
|||
|
//
|
|||
|
//// Get 获取平场数据
|
|||
|
//func (c *qianqiPingchangController) Get(ctx context.Context, req *system.QianqiPingchangGetReq) (res *system.QianqiPingchangGetRes, err error) {
|
|||
|
// res = new(system.QianqiPingchangGetRes)
|
|||
|
// res.QianqiPingchangInfoRes, err = service.QianqiPingchang().GetById(ctx, req.Id)
|
|||
|
// return
|
|||
|
//}
|
|||
|
//
|
|||
|
//// Add 添加平场数据
|
|||
|
//func (c *qianqiPingchangController) Add(ctx context.Context, req *system.QianqiPingchangAddReq) (res *system.QianqiPingchangAddRes, err error) {
|
|||
|
// err = service.QianqiPingchang().Add(ctx, req)
|
|||
|
// return
|
|||
|
//}
|
|||
|
//
|
|||
|
//// Edit 修改平场数据
|
|||
|
//func (c *qianqiPingchangController) Edit(ctx context.Context, req *system.QianqiPingchangEditReq) (res *system.QianqiPingchangEditRes, err error) {
|
|||
|
// err = service.QianqiPingchang().Edit(ctx, req)
|
|||
|
// return
|
|||
|
//}
|
|||
|
//
|
|||
|
//// Delete 删除平场数据
|
|||
|
//func (c *qianqiPingchangController) Delete(ctx context.Context, req *system.QianqiPingchangDeleteReq) (res *system.QianqiPingchangDeleteRes, err error) {
|
|||
|
// err = service.QianqiPingchang().Delete(ctx, req.Ids)
|
|||
|
// return
|
|||
|
//}
|