296 lines
7.4 KiB
Go
296 lines
7.4 KiB
Go
package shp
|
||
|
||
import (
|
||
"context"
|
||
"fmt"
|
||
"github.com/gogf/gf/v2/frame/g"
|
||
"github.com/gogf/gf/v2/net/ghttp"
|
||
"github.com/tidwall/gjson"
|
||
shp2 "github.com/tiger1103/gfast/v3/api/v1/common/shp"
|
||
"io"
|
||
"net/http"
|
||
"regexp"
|
||
"strings"
|
||
)
|
||
|
||
const MaxNeighborsLen = 8 //最大邻居个数
|
||
const SOURCE = "static/source/"
|
||
const Gisfile = "gisfile/"
|
||
|
||
// 84的投影文件
|
||
const WGS84_PRJ = "GEOGCS[\"GCS_WGS_1984\",DATUM[\"D_WGS_1984\",SPHEROID[\"WGS_1984\",6378137.0,298.257223563]],PRIMEM[\"Greenwich\",0.0],UNIT[\"Degree\",0.0174532925199433]]"
|
||
|
||
func InitShp(group *ghttp.RouterGroup) {
|
||
group.Group("/shp", func(group *ghttp.RouterGroup) {
|
||
group.Bind(new(SHP))
|
||
})
|
||
}
|
||
|
||
type SHP struct {
|
||
}
|
||
|
||
type SHPLoadReq struct {
|
||
g.Meta `path:"load" summary:"cesium加载shp" method:"get" tags:"shp相关" `
|
||
//SourceID string `json:"source_id" dc:"资源id" v:"required"`
|
||
Path string `json:"path" dc:"路径" v:"required"`
|
||
}
|
||
|
||
type SHPLoadRes struct {
|
||
shp2.ShpObj
|
||
}
|
||
|
||
//func (receiver SHP) LoadSHP(ctx context.Context, req *SHPLoadReq) (res *SHPLoadRes, err error) {
|
||
// err, obj := shp2.ReadShp(req.Path)
|
||
// if err != nil {
|
||
// return nil, err
|
||
// }
|
||
// res = &SHPLoadRes{}
|
||
// res.Points = obj.Points
|
||
// res.Polylines = obj.Polylines
|
||
// res.Polygons = obj.Polygons
|
||
// return res, err
|
||
//}
|
||
|
||
type Range struct {
|
||
MinX float64 `json:"min_x"`
|
||
MinY float64 `json:"min_y"`
|
||
MaxX float64 `json:"max_x"`
|
||
MaxY float64 `json:"max_y"`
|
||
}
|
||
|
||
type Position struct {
|
||
X float64 `json:"x"`
|
||
Y float64 `json:"y"`
|
||
Z float64 `json:"z"`
|
||
Attr map[string]interface{} `json:"attr"`
|
||
}
|
||
|
||
type Text struct {
|
||
X float64 `json:"x"`
|
||
Y float64 `json:"y"`
|
||
Text string `json:"text"`
|
||
}
|
||
|
||
type Circle struct {
|
||
X float64 `json:"x"`
|
||
Y float64 `json:"y"`
|
||
Z float64 `json:"z"`
|
||
Radius float64 `json:"radius"`
|
||
}
|
||
|
||
type Polyline struct {
|
||
Positions []Position `json:"positions"`
|
||
Attr map[string]interface{} `json:"attr"`
|
||
Range Range `json:"range"`
|
||
}
|
||
|
||
type Polygon struct {
|
||
Positions []Position `json:"positions"`
|
||
Attr map[string]interface{} `json:"attr"`
|
||
Range Range `json:"range"`
|
||
}
|
||
|
||
type MultiPolygon struct {
|
||
Polygons []Polygon `json:"polygons"`
|
||
Attr map[string]interface{} `json:"attr"`
|
||
Range Range `json:"range"`
|
||
}
|
||
|
||
type MultiPolyline struct {
|
||
Polylines []Polyline `json:"polylines"`
|
||
Attr map[string]interface{} `json:"attr"`
|
||
Range Range `json:"range"`
|
||
}
|
||
|
||
type LayerData struct {
|
||
LayerName string `json:"layer_name"`
|
||
Proj4 string `json:"proj4"`
|
||
Texts []Text `json:"texts"`
|
||
Circles []Circle `json:"circles"`
|
||
Points []Position `json:"points"`
|
||
Polylines []Polyline `json:"polylines"`
|
||
Polygons []Polygon `json:"polygons"`
|
||
MultiPolygons []MultiPolygon `json:"multi_polygons"`
|
||
MultiPolylines []MultiPolyline `json:"multi_polylines"`
|
||
}
|
||
|
||
type Directory struct {
|
||
Name string `json:"name"`
|
||
IsDir bool `json:"is_dir"`
|
||
Data []LayerData `json:"data"`
|
||
Children []Directory `json:"children"`
|
||
}
|
||
|
||
type Response struct {
|
||
Code int `json:"code"`
|
||
Data Directory `json:"data"`
|
||
}
|
||
|
||
// JoinLoadSHP 原本的LoadSHP有问题,直接调用远程的接口
|
||
func (receiver SHP) JoinLoadSHP(ctx context.Context, req *SHPLoadReq) (res *SHPLoadRes, err error) {
|
||
res = new(SHPLoadRes)
|
||
if req.Path[0] == '/' {
|
||
req.Path = req.Path[1:]
|
||
}
|
||
|
||
url := "http://192.168.1.177:8921/yjearth5/api/v1/vector/load?path=/project/zmkg/" + req.Path
|
||
|
||
reqs, err := http.Get(url)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
defer reqs.Body.Close()
|
||
|
||
body, err := io.ReadAll(reqs.Body)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
|
||
if gjson.Get(string(body), "message").String() == "资源不存在" {
|
||
return nil, fmt.Errorf("资源不存在")
|
||
}
|
||
|
||
var list shp2.ShpObj
|
||
processShapes(body, "data.children.0.data.0.polylines", &list)
|
||
processShapes(body, "data.children.0.data.0.polygons", &list)
|
||
processShapes(body, "data.children.0.data", &list)
|
||
|
||
if list.Polylines == nil {
|
||
list.Polylines = []shp2.Polyline{}
|
||
}
|
||
|
||
if list.Polygons == nil {
|
||
list.Polygons = []shp2.Polygon{}
|
||
}
|
||
|
||
if list.Points == nil {
|
||
list.Points = []shp2.Point{}
|
||
}
|
||
|
||
res.Polygons = list.Polygons
|
||
res.Polylines = list.Polylines
|
||
res.Points = list.Points
|
||
|
||
return res, err
|
||
}
|
||
|
||
func Adasda(path string) (res *SHPLoadRes) {
|
||
fmt.Println("加载shp文件", path)
|
||
res = new(SHPLoadRes)
|
||
if path[0] == '/' {
|
||
path = path[1:]
|
||
}
|
||
|
||
url := "http://192.168.1.177:8921/yjearth5/api/v1/vector/load?path=/project/zmkg/" + path
|
||
|
||
reqs, err := http.Get(url)
|
||
if err != nil {
|
||
fmt.Println("请求数据失败")
|
||
}
|
||
defer reqs.Body.Close()
|
||
|
||
body, err := io.ReadAll(reqs.Body)
|
||
if err != nil {
|
||
fmt.Errorf("读取资源失败")
|
||
}
|
||
|
||
if gjson.Get(string(body), "message").String() == "资源不存在" {
|
||
fmt.Errorf("资源不存在")
|
||
}
|
||
|
||
var list = shp2.ShpObj{
|
||
Polylines: []shp2.Polyline{},
|
||
Polygons: []shp2.Polygon{},
|
||
Points: []shp2.Point{},
|
||
}
|
||
processShapes(body, "data.children.0.data.0.polylines", &list)
|
||
processShapes(body, "data.children.0.data.0.polygons", &list)
|
||
processShapes(body, "data.children.0.data", &list)
|
||
|
||
res.Polygons = list.Polygons
|
||
res.Polylines = list.Polylines
|
||
res.Points = list.Points
|
||
return
|
||
}
|
||
|
||
func processShapes(data []byte, path string, shapes *shp2.ShpObj) {
|
||
gjson.GetBytes(data, path).ForEach(func(key, shape gjson.Result) bool {
|
||
// 面
|
||
var pointsList []shp2.Point
|
||
psGet := shape.Get("positions")
|
||
if psGet.Exists() {
|
||
psGet.ForEach(func(posKey, value gjson.Result) bool {
|
||
longitude := value.Get("x").Float()
|
||
latitude := value.Get("y").Float()
|
||
altitude := value.Get("z").Float()
|
||
|
||
pointsList = append(pointsList, shp2.Point{
|
||
Lng: longitude,
|
||
Lat: latitude,
|
||
Alt: altitude,
|
||
})
|
||
return true
|
||
})
|
||
if len(pointsList) > 0 {
|
||
shapes.Polylines = append(shapes.Polylines, shp2.Polyline{
|
||
Positions: pointsList,
|
||
Width: "5",
|
||
Color: "#f00",
|
||
})
|
||
}
|
||
if shape.Get("attr").Exists() {
|
||
aName := shape.Get("attr.NAME").String()
|
||
fmt.Println("!!! ", aName)
|
||
shapes.Polylines[len(shapes.Polylines)-1].Property = shp2.Property{
|
||
Name: aName,
|
||
}
|
||
}
|
||
if shape.Get("range").Exists() {
|
||
minX := shape.Get("range.min_x").Float()
|
||
minY := shape.Get("range.min_y").Float()
|
||
maxX := shape.Get("range.max_x").Float()
|
||
maxY := shape.Get("range.max_y").Float()
|
||
shapes.Polylines[len(shapes.Polylines)-1].Range = shp2.Box{
|
||
MinX: minX,
|
||
MinY: minY,
|
||
MaxX: maxX,
|
||
MaxY: maxY,
|
||
}
|
||
}
|
||
} else {
|
||
//fmt.Println("!!! ", shape.Get("points"))
|
||
// 点
|
||
var point []shp2.Point
|
||
shape.Get("points").ForEach(func(posKey, value gjson.Result) bool {
|
||
aName := value.Get("attr.NAME")
|
||
if value.Get("attr.NAME").Exists() {
|
||
//排除nc 和 空
|
||
isPureNumber, _ := regexp.MatchString(`^\d+$`, aName.String())
|
||
if strings.Contains(aName.String(), "NC") || strings.TrimSpace(aName.String()) == "" || isPureNumber {
|
||
return true
|
||
}
|
||
longitude := value.Get("x").Float()
|
||
latitude := value.Get("y").Float()
|
||
altitude := value.Get("z").Float()
|
||
|
||
point = append(point, shp2.Point{
|
||
Lng: longitude,
|
||
Lat: latitude,
|
||
Alt: altitude,
|
||
Property: shp2.Property{
|
||
Name: aName.String(),
|
||
},
|
||
})
|
||
|
||
}
|
||
return true
|
||
})
|
||
if len(point) > 0 {
|
||
shapes.Points = append(shapes.Points, point...)
|
||
}
|
||
}
|
||
|
||
return true
|
||
})
|
||
}
|