Commit 990ba963 by dliangx

add get90_cross_area

parent f8941d1b
......@@ -554,3 +554,42 @@ func CheckAreasCross(obj1, obj2 model.GeoJson) (bool, error) {
return intersects, nil
}
func Get90CrossOptArea(obj model.Geometrys) (string, error) {
db, err := connectDB()
if err != nil {
return "", 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 "", err
}
var results string
query := `
SELECT
p.id
FROM
opt_areas p
WHERE
ST_Overlaps(ST_GeomFromText($1, 4326), p.geometry)
AND (100 * ST_Area(ST_Intersection(ST_GeomFromText($1, 4326), p.geometry)) / ST_Area(ST_GeomFromText($1, 4326))) > 90
`
rows, err := db.Query(query, wkt)
if err != nil {
return "", err
}
defer rows.Close()
for rows.Next() {
var res string
rows.Scan(&res)
results += res + ","
}
return results, err
}
......@@ -181,28 +181,32 @@ func FindRelatedGeometry(ctx context.Context, c *app.RequestContext) {
func CalcAreasCenter(ctx context.Context, c *app.RequestContext) {
// 获取 ids 参数
idsStr := c.Query("ids")
if idsStr == "" {
var req model.CalcIds
err := c.BindAndValidate(&req)
if err != nil {
c.JSON(consts.StatusBadRequest, utils.H{"message": "calc ids required"})
return
}
if req.IDS == "" {
c.JSON(consts.StatusBadRequest, utils.H{"code": 10001, "message": "ids parameter required"})
return
}
// 获取 opt 参数
opt, err := strconv.Atoi(c.Query("opt"))
if err != nil {
if req.Opt == 0 {
c.JSON(consts.StatusBadRequest, utils.H{"code": 10003, "message": "opt parameter required"})
return
}
// 分割 ids 字符串为数组
ids := strings.Split(idsStr, ",")
ids := strings.Split(req.IDS, ",")
if len(ids) == 0 {
c.JSON(consts.StatusBadRequest, utils.H{"code": 10001, "message": "invalid ids format"})
return
}
// 调用 geo.CalcAreasCenter 计算中心点,传入 opt 参数
lat, lon, err := geo.CalcAreasCenter(ids, opt)
lat, lon, err := geo.CalcAreasCenter(ids, req.Opt)
if err != nil {
c.JSON(consts.StatusOK, utils.H{"code": 10012, "message": err.Error()})
return
......@@ -234,3 +238,25 @@ func CheckTwoOptAreaIsCross(ctx context.Context, c *app.RequestContext) {
c.JSON(consts.StatusOK, utils.H{"code": 200, "data": res})
}
func Get90CrossArea(ctx context.Context, c *app.RequestContext) {
var req []model.Geometrys
var resp []model.RelatedArea
err := c.BindAndValidate(&req)
if err != nil {
c.JSON(consts.StatusBadRequest, utils.H{"message": "point required"})
return
}
for _, v := range req {
res, err := geo.Get90CrossOptArea(v)
if err != nil {
c.JSON(consts.StatusOK, utils.H{"code": 10010, "message": err.Error()})
return
}
var oresp model.RelatedArea
oresp.Areas = res
resp = append(resp, oresp)
}
c.JSON(consts.StatusOK, utils.H{"code": 200, "data": resp})
}
......@@ -30,3 +30,16 @@ type GeoJson struct {
Properties map[string]interface{} `json:"properties"`
Geometry *geojson.Geometry `json:"geometry"`
}
type CalcIds struct {
IDS string `json:"ids"`
Opt int `json:"opt"`
}
type RelatedArea struct {
Areas string `json:"ids"`
}
type Geometrys struct {
Geometry *geojson.Geometry `json:"geometry"`
}
......@@ -13,4 +13,5 @@ func Register(r *server.Hertz) {
r.POST("/geometry/related", handler.FindRelatedGeometry)
r.POST("/geometry/check", handler.CheckTwoOptAreaIsCross)
r.POST("/geometry/calc_center", handler.CalcAreasCenter)
r.POST("/geometry/get90_cross_area", handler.Get90CrossArea)
}
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