Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
X
xplot_server
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
digit_plot
xplot_server
Commits
76c8e915
Commit
76c8e915
authored
Nov 12, 2024
by
dliangx
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
update
parent
7fe6dc89
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
111 additions
and
2 deletions
+111
-2
geo/area.go
+80
-2
handler/http_handler.go
+30
-0
route/route.go
+1
-0
No files found.
geo/area.go
View file @
76c8e915
...
...
@@ -5,6 +5,8 @@ import (
"encoding/json"
"errors"
"fmt"
"strconv"
"strings"
"time"
"com.dliangx.xplot/appserver/model"
...
...
@@ -436,10 +438,86 @@ func GetRelatedAdmArea(obj model.GeoJson) ([]model.GeoJson, error) {
return
results
,
err
}
func
CalcAreasCenter
(
ids
[]
string
)
(
float64
,
float64
,
error
)
{
db
,
err
:=
connectDB
()
if
err
!=
nil
{
return
0
,
0
,
fmt
.
Errorf
(
"database connection failed: %v"
,
err
)
}
defer
db
.
Close
()
// Convert string slice to comma separated string for SQL IN clause
idList
:=
strings
.
Join
(
ids
,
","
)
var
wktPoint
string
err
=
db
.
QueryRow
(
`
SELECT
ST_AsText(ST_Centroid(ST_Collect(geom))) AS overall_centroid
FROM
geojson_data
WHERE id in (`
+
idList
+
`)
`
)
.
Scan
(
&
wktPoint
)
if
err
!=
nil
{
if
err
==
sql
.
ErrNoRows
{
return
0
,
0
,
fmt
.
Errorf
(
"no areas found"
)
}
return
0
,
0
,
fmt
.
Errorf
(
"calculate center failed: %w"
,
err
)
}
// Parse WKT point string (format: "POINT(lon lat)")
wktPoint
=
strings
.
TrimPrefix
(
wktPoint
,
"POINT("
)
wktPoint
=
strings
.
TrimSuffix
(
wktPoint
,
")"
)
coords
:=
strings
.
Split
(
wktPoint
,
" "
)
if
len
(
coords
)
!=
2
{
return
0
,
0
,
fmt
.
Errorf
(
"invalid point format"
)
}
lon
,
err
:=
strconv
.
ParseFloat
(
coords
[
0
],
64
)
if
err
!=
nil
{
return
0
,
0
,
fmt
.
Errorf
(
"parse longitude failed: %w"
,
err
)
}
lat
,
err
:=
strconv
.
ParseFloat
(
coords
[
1
],
64
)
if
err
!=
nil
{
return
0
,
0
,
fmt
.
Errorf
(
"parse latitude failed: %w"
,
err
)
}
return
lat
,
lon
,
nil
}
func
CheckAreasCross
(
obj1
,
obj2
model
.
GeoJson
)
(
bool
,
error
)
{
if
obj1
.
Geometry
==
nil
||
obj2
.
Geometry
==
nil
{
return
false
,
errors
.
New
(
"found no geometry"
)
return
false
,
fmt
.
Errorf
(
"invalid geometry: geometry cannot be nil"
)
}
db
,
err
:=
connectDB
()
if
err
!=
nil
{
return
false
,
fmt
.
Errorf
(
"database connection failed: %v"
,
err
)
}
defer
db
.
Close
()
// 将两个 GeoJSON 转换为 WKT
geom1
,
err
:=
json
.
Marshal
(
obj1
.
Geometry
)
if
err
!=
nil
{
return
false
,
fmt
.
Errorf
(
"marshal geometry 1 failed: %w"
,
err
)
}
geom2
,
err
:=
json
.
Marshal
(
obj2
.
Geometry
)
if
err
!=
nil
{
return
false
,
fmt
.
Errorf
(
"marshal geometry 2 failed: %w"
,
err
)
}
var
intersects
bool
err
=
db
.
QueryRow
(
`
SELECT ST_Intersects(
ST_GeomFromGeoJSON($1),
ST_GeomFromGeoJSON($2)
)
`
,
string
(
geom1
),
string
(
geom2
))
.
Scan
(
&
intersects
)
if
err
!=
nil
{
return
false
,
fmt
.
Errorf
(
"check intersection failed: %w"
,
err
)
}
return
false
,
nil
return
intersects
,
nil
}
handler/http_handler.go
View file @
76c8e915
...
...
@@ -3,6 +3,7 @@ package handler
import
(
"context"
"strconv"
"strings"
"com.dliangx.xplot/appserver/geo"
"com.dliangx.xplot/appserver/model"
...
...
@@ -178,6 +179,35 @@ func FindRelatedGeometry(ctx context.Context, c *app.RequestContext) {
}
func
CalcAreasCenter
(
ctx
context
.
Context
,
c
*
app
.
RequestContext
)
{
// 获取 ids 参数
idsStr
:=
c
.
Query
(
"ids"
)
if
idsStr
==
""
{
c
.
JSON
(
consts
.
StatusBadRequest
,
utils
.
H
{
"message"
:
"ids parameter required"
})
return
}
// 分割 ids 字符串为数组
ids
:=
strings
.
Split
(
idsStr
,
","
)
if
len
(
ids
)
==
0
{
c
.
JSON
(
consts
.
StatusBadRequest
,
utils
.
H
{
"message"
:
"invalid ids format"
})
return
}
// 调用 geo.CalcAreasCenter 计算中心点
lat
,
lon
,
err
:=
geo
.
CalcAreasCenter
(
ids
)
if
err
!=
nil
{
c
.
JSON
(
consts
.
StatusOK
,
utils
.
H
{
"code"
:
10012
,
"message"
:
err
.
Error
()})
return
}
// 返回结果
c
.
JSON
(
consts
.
StatusOK
,
utils
.
H
{
"latitude"
:
lat
,
"longitude"
:
lon
,
})
}
func
CheckTwoOptAreaIsCross
(
ctx
context
.
Context
,
c
*
app
.
RequestContext
)
{
var
req
[]
model
.
GeoJson
err
:=
c
.
BindAndValidate
(
&
req
)
...
...
route/route.go
View file @
76c8e915
...
...
@@ -12,4 +12,5 @@ func Register(r *server.Hertz) {
r
.
DELETE
(
"/geometry"
,
handler
.
DeleteGeometry
)
r
.
POST
(
"/geometry/related"
,
handler
.
FindRelatedGeometry
)
r
.
POST
(
"/geometry/check"
,
handler
.
CheckTwoOptAreaIsCross
)
r
.
POST
(
"/geometry/calc_center"
,
handler
.
CalcAreasCenter
)
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment