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
bd046fc0
Commit
bd046fc0
authored
Nov 26, 2024
by
dliangx
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
change connectdb() to db
parent
1cbfa985
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
43 additions
and
106 deletions
+43
-106
db/postgres.go
+19
-0
geo/area.go
+19
-91
geo/geojson_processor.go
+3
-14
main.go
+2
-1
No files found.
db/postgres.go
0 → 100644
View file @
bd046fc0
package
db
import
(
"database/sql"
_
"github.com/lib/pq"
)
var
DB
*
sql
.
DB
const
connStr
=
"postgres://liang:postgres@localhost/xpolt?sslmode=disable"
func
init
()
{
db
,
err
:=
sql
.
Open
(
"postgres"
,
connStr
)
if
err
!=
nil
{
panic
(
"failed to connect database"
)
}
DB
=
db
}
geo/area.go
View file @
bd046fc0
...
...
@@ -9,20 +9,14 @@ import (
"strings"
"time"
"com.dliangx.xplot/appserver/db"
"com.dliangx.xplot/appserver/model"
"com.dliangx.xplot/appserver/util"
)
func
SaveRoute
(
line
model
.
GeoJson
)
(
model
.
OptRoute
,
error
)
{
// 连接数据库
db
,
err
:=
connectDB
()
if
err
!=
nil
{
return
model
.
OptRoute
{},
fmt
.
Errorf
(
"database connection failed: %v"
,
err
)
}
defer
db
.
Close
()
// 开启事务
tx
,
err
:=
db
.
Begin
()
tx
,
err
:=
db
.
DB
.
Begin
()
if
err
!=
nil
{
return
model
.
OptRoute
{},
fmt
.
Errorf
(
"begin transaction failed: %w"
,
err
)
}
...
...
@@ -66,13 +60,8 @@ func SaveRoute(line model.GeoJson) (model.OptRoute, error) {
}
func
SaveOptArea
(
optArea
model
.
GeoJson
)
(
model
.
OptArea
,
error
)
{
db
,
err
:=
connectDB
()
if
err
!=
nil
{
return
model
.
OptArea
{},
fmt
.
Errorf
(
"database connection failed: %v"
,
err
)
}
defer
db
.
Close
()
tx
,
err
:=
db
.
Begin
()
tx
,
err
:=
db
.
DB
.
Begin
()
if
err
!=
nil
{
return
model
.
OptArea
{},
fmt
.
Errorf
(
"begin transaction failed: %w"
,
err
)
}
...
...
@@ -112,13 +101,8 @@ func SaveOptArea(optArea model.GeoJson) (model.OptArea, error) {
}
func
UpdateRoute
(
line
model
.
GeoJson
)
(
model
.
OptRoute
,
error
)
{
db
,
err
:=
connectDB
()
if
err
!=
nil
{
return
model
.
OptRoute
{},
fmt
.
Errorf
(
"database connection failed: %v"
,
err
)
}
defer
db
.
Close
()
tx
,
err
:=
db
.
Begin
()
tx
,
err
:=
db
.
DB
.
Begin
()
if
err
!=
nil
{
return
model
.
OptRoute
{},
fmt
.
Errorf
(
"begin transaction failed: %w"
,
err
)
}
...
...
@@ -162,13 +146,8 @@ func UpdateRoute(line model.GeoJson) (model.OptRoute, error) {
}
func
UpdateOptArea
(
optArea
model
.
GeoJson
)
(
model
.
OptArea
,
error
)
{
db
,
err
:=
connectDB
()
if
err
!=
nil
{
return
model
.
OptArea
{},
fmt
.
Errorf
(
"database connection failed: %v"
,
err
)
}
defer
db
.
Close
()
tx
,
err
:=
db
.
Begin
()
tx
,
err
:=
db
.
DB
.
Begin
()
if
err
!=
nil
{
return
model
.
OptArea
{},
fmt
.
Errorf
(
"begin transaction failed: %w"
,
err
)
}
...
...
@@ -209,11 +188,6 @@ func UpdateOptArea(optArea model.GeoJson) (model.OptArea, error) {
}
func
GetRoute
(
id
int
,
opt_type
int
)
(
model
.
OptRoute
,
error
)
{
db
,
err
:=
connectDB
()
if
err
!=
nil
{
return
model
.
OptRoute
{},
fmt
.
Errorf
(
"database connection failed: %v"
,
err
)
}
defer
db
.
Close
()
var
route
model
.
OptRoute
var
query
string
...
...
@@ -228,7 +202,7 @@ func GetRoute(id int, opt_type int) (model.OptRoute, error) {
FROM opt_fly_routes WHERE id = $1`
}
err
=
db
.
QueryRow
(
query
,
id
)
.
Scan
(
err
:=
db
.
DB
.
QueryRow
(
query
,
id
)
.
Scan
(
&
route
.
ID
,
&
route
.
Type
,
&
jsonb_data
,
&
route
.
OptTime
,
&
route
.
Geometry
,
)
if
err
!=
nil
{
...
...
@@ -244,15 +218,10 @@ func GetRoute(id int, opt_type int) (model.OptRoute, error) {
}
func
GetOptArea
(
id
int
,
opt_type
int
)
(
model
.
OptArea
,
error
)
{
db
,
err
:=
connectDB
()
if
err
!=
nil
{
return
model
.
OptArea
{},
fmt
.
Errorf
(
"database connection failed: %v"
,
err
)
}
defer
db
.
Close
()
var
area
model
.
OptArea
var
jsonb_data
[]
byte
err
=
db
.
QueryRow
(
`
err
:=
db
.
DB
.
QueryRow
(
`
SELECT id, type, JSON(properties), opt_time, ST_AsGeoJSON(geometry) as geometry
FROM opt_areas WHERE id = $1
`
,
id
)
.
Scan
(
...
...
@@ -271,17 +240,12 @@ func GetOptArea(id int, opt_type int) (model.OptArea, error) {
}
func
DeleteRoute
(
id
int
,
opt_type
int
)
(
bool
,
error
)
{
db
,
err
:=
connectDB
()
if
err
!=
nil
{
return
false
,
fmt
.
Errorf
(
"database connection failed: %v"
,
err
)
}
defer
db
.
Close
()
var
err
error
var
result
sql
.
Result
if
opt_type
==
1
{
result
,
err
=
db
.
Exec
(
`DELETE FROM opt_routes WHERE id = $1`
,
id
)
result
,
err
=
db
.
DB
.
Exec
(
`DELETE FROM opt_routes WHERE id = $1`
,
id
)
}
else
if
opt_type
==
2
{
result
,
err
=
db
.
Exec
(
`DELETE FROM opt_fly_routes WHERE id = $1`
,
id
)
result
,
err
=
db
.
DB
.
Exec
(
`DELETE FROM opt_fly_routes WHERE id = $1`
,
id
)
}
if
err
!=
nil
{
...
...
@@ -297,14 +261,9 @@ func DeleteRoute(id int, opt_type int) (bool, error) {
}
func
DeleteOptArea
(
id
int
,
opt_type
int
)
(
bool
,
error
)
{
db
,
err
:=
connectDB
()
if
err
!=
nil
{
return
false
,
fmt
.
Errorf
(
"database connection failed: %v"
,
err
)
}
defer
db
.
Close
()
var
err
error
var
result
sql
.
Result
result
,
err
=
db
.
Exec
(
`DELETE FROM opt_areas WHERE id = $1`
,
id
)
result
,
err
=
db
.
DB
.
Exec
(
`DELETE FROM opt_areas WHERE id = $1`
,
id
)
if
err
!=
nil
{
return
false
,
fmt
.
Errorf
(
"delete route failed: %w"
,
err
)
...
...
@@ -319,11 +278,6 @@ func DeleteOptArea(id int, opt_type int) (bool, 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
))
...
...
@@ -340,7 +294,7 @@ func GetRelatedRoute(obj model.GeoJson) ([]model.OptRoute, error) {
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
)
rows
,
err
:=
db
.
DB
.
Query
(
query
,
wkt
)
if
err
!=
nil
{
return
[]
model
.
OptRoute
{},
err
}
...
...
@@ -367,11 +321,6 @@ func GetRelatedRoute(obj model.GeoJson) ([]model.OptRoute, error) {
}
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
))
...
...
@@ -386,7 +335,7 @@ func GetRelatedOptArea(obj model.GeoJson) ([]model.OptArea, error) {
query
=
`SELECT id, type, properties, opt_time as geometry FROM opt_areas WHERE ST_Intersects(ST_SetSRID($1::geometry,4326), geometry)`
}
rows
,
err
:=
db
.
Query
(
query
,
wkt
)
rows
,
err
:=
db
.
DB
.
Query
(
query
,
wkt
)
if
err
!=
nil
{
return
[]
model
.
OptArea
{},
err
}
...
...
@@ -412,11 +361,6 @@ func GetRelatedOptArea(obj model.GeoJson) ([]model.OptArea, error) {
}
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
()
jsonstr
,
_
:=
json
.
Marshal
(
obj
.
Geometry
)
wkt
,
err
:=
util
.
TransGeoToWKT
(
string
(
jsonstr
))
...
...
@@ -431,7 +375,7 @@ func GetRelatedAdmArea(obj model.GeoJson) ([]model.GeoJson, error) {
query
=
`SELECT id, type, properties as geometry FROM geojson_data WHERE ST_Intersects(ST_SetSRID($1::geometry,4326), geom)`
}
rows
,
err
:=
db
.
Query
(
query
,
wkt
)
rows
,
err
:=
db
.
DB
.
Query
(
query
,
wkt
)
if
err
!=
nil
{
return
[]
model
.
GeoJson
{},
err
}
...
...
@@ -457,15 +401,11 @@ func GetRelatedAdmArea(obj model.GeoJson) ([]model.GeoJson, error) {
}
func
CalcAreasCenter
(
ids
[]
string
,
opt
int
)
(
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
err
error
var
wktPoint
string
var
query
string
...
...
@@ -489,7 +429,7 @@ func CalcAreasCenter(ids []string, opt int) (float64, float64, error) {
return
0
,
0
,
errors
.
New
(
"opt value is not allow! "
)
}
err
=
db
.
QueryRow
(
query
)
.
Scan
(
&
wktPoint
)
err
=
db
.
DB
.
QueryRow
(
query
)
.
Scan
(
&
wktPoint
)
if
wktPoint
==
""
{
return
0
,
0
,
fmt
.
Errorf
(
"no areas found"
)
}
...
...
@@ -523,12 +463,6 @@ func CheckAreasCross(obj1, obj2 model.GeoJson) (bool, error) {
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
{
...
...
@@ -541,7 +475,7 @@ func CheckAreasCross(obj1, obj2 model.GeoJson) (bool, error) {
}
var
intersects
bool
err
=
db
.
QueryRow
(
`
err
=
db
.
DB
.
QueryRow
(
`
SELECT ST_Intersects(
ST_GeomFromGeoJSON($1),
ST_GeomFromGeoJSON($2)
...
...
@@ -557,12 +491,6 @@ func CheckAreasCross(obj1, obj2 model.GeoJson) (bool, error) {
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
{
...
...
@@ -574,7 +502,7 @@ func Get90CrossOptArea(obj model.Geometrys) (string, error) {
SELECT p.id from opt_areas p WHERE st_area(ST_Intersection(ST_GeomFromText($1, 4326), p.geometry))/st_area(p.geometry) > 0.9;
`
rows
,
err
:=
db
.
Query
(
query
,
wkt
)
rows
,
err
:=
db
.
DB
.
Query
(
query
,
wkt
)
if
err
!=
nil
{
return
""
,
err
}
...
...
geo/geojson_processor.go
View file @
bd046fc0
...
...
@@ -8,10 +8,10 @@ import (
"log"
"os"
"com.dliangx.xplot/appserver/db"
"github.com/cloudwego/hertz/pkg/app"
"github.com/cloudwego/hertz/pkg/common/utils"
"github.com/cloudwego/hertz/pkg/protocol/consts"
_
"github.com/lib/pq"
)
// Feature GeoJSON特征结构体
...
...
@@ -24,31 +24,20 @@ type Feature struct {
// ProcessGeoJSONFile 处理GeoJSON文件的主函数
func
ProcessGeoJSONFile
(
filename
string
)
error
{
// 连接数据库
db
,
err
:=
connectDB
()
if
err
!=
nil
{
return
fmt
.
Errorf
(
"database connection failed: %v"
,
err
)
}
defer
db
.
Close
()
// 创建表
if
err
:=
createTable
(
db
);
err
!=
nil
{
if
err
:=
createTable
(
db
.
DB
);
err
!=
nil
{
return
fmt
.
Errorf
(
"table creation failed: %v"
,
err
)
}
// 处理文件
if
err
:=
processFile
(
filename
,
db
);
err
!=
nil
{
if
err
:=
processFile
(
filename
,
db
.
DB
);
err
!=
nil
{
return
fmt
.
Errorf
(
"file processing failed: %v"
,
err
)
}
return
nil
}
func
connectDB
()
(
*
sql
.
DB
,
error
)
{
connStr
:=
"postgres://postgres:postgres@localhost/xpolt?sslmode=disable"
return
sql
.
Open
(
"postgres"
,
connStr
)
}
func
createTable
(
db
*
sql
.
DB
)
error
{
// _, err := db.Exec(`
// CREATE TABLE IF NOT EXISTS geojson_data (
...
...
main.go
View file @
bd046fc0
...
...
@@ -8,6 +8,7 @@ import (
"github.com/cloudwego/hertz/pkg/common/utils"
"github.com/cloudwego/hertz/pkg/protocol/consts"
"com.dliangx.xplot/appserver/db"
"com.dliangx.xplot/appserver/geo"
"com.dliangx.xplot/appserver/route"
)
...
...
@@ -18,7 +19,7 @@ func main() {
h
:=
server
.
Default
(
server
.
WithHostPorts
(
":8686"
),
)
defer
db
.
DB
.
Close
()
h
.
GET
(
"/ping"
,
func
(
ctx
context
.
Context
,
c
*
app
.
RequestContext
)
{
c
.
JSON
(
consts
.
StatusOK
,
utils
.
H
{
"message"
:
"pong"
})
})
...
...
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