golang将GIS矢量数据发布到PostGIS和Geoserver的插件库gismanager的使用
Golang将GIS矢量数据发布到PostGIS和Geoserver的插件库gismanager使用指南
安装
go get -v github.com/hishamkaram/gismanager
使用示例
1. 创建ManagerConfig实例
manager := gismanager.ManagerConfig{
Geoserver: gismanager.GeoserverConfig{
WorkspaceName: "golang",
Username: "admin",
Password: "geoserver",
ServerURL: "http://localhost:8080/geoserver",
},
Datastore: gismanager.DatastoreConfig{
Host: "localhost",
Port: 5432,
DBName: "gis",
DBUser: "golang",
DBPass: "golang",
Name: "gismanager_data",
},
Source: gismanager.SourceConfig{
Path: "./testdata",
},
logger: gismanager.GetLogger(),
}
2. 获取支持的GIS文件
files, _ := gismanager.GetGISFiles(manager.Source.Path)
for _, file := range files {
fmt.Println(file)
}
输出示例:
<full_path>/testdata/neighborhood_names_gis.geojson
<full_path>/testdata/nested/nyc_wi-fi_hotspot_locations.geojson
<full_path>/testdata/sample.gpkg
3. 读取文件并获取图层结构
for _, file := range files {
source, ok := manager.OpenSource(file, 0)
if ok {
for index := 0; index < source.LayerCount(); index++ {
layer := source.LayerByIndex(index)
gLayer := gismanager.GdalLayer{
Layer: &layer,
}
fmt.Println(layer.Name())
for _, f := range gLayer.GetLayerSchema() {
fmt.Printf("\n%+v\n", *f)
}
}
}
}
输出示例:
neighborhood_names_gis
{Name:geom Type:POINT}
{Name:stacked Type:String}
{Name:name Type:String}
{Name:annoline1 Type:String}
{Name:annoline3 Type:String}
{Name:objectid Type:String}
{Name:annoangle Type:String}
{Name:annoline2 Type:String}
{Name:borough Type:String}
...
4. 将GIS数据添加到数据库
for _, file := range files {
source, ok := manager.OpenSource(file, 0)
targetSource, targetOK := manager.OpenSource(manager.Datastore.BuildConnectionString(), 1)
if ok && targetOK {
for index := 0; index < source.LayerCount(); index++ {
layer := source.LayerByIndex(index)
gLayer := gismanager.GdalLayer{
Layer: &layer,
}
newLayer, postgisErr := gLayer.LayerToPostgis(targetSource, manager, true)
if postgisErr != nil {
panic(postgisErr)
}
logger.Infof("Layer: %s added to you database", newLayer.Name())
}
}
}
输出示例:
INFO[14-10-2018 17:28:37] Layer: neighborhood_names_gis added to you database
INFO[14-10-2018 17:28:38] Layer: nyc_wi_fi_hotspot_locations added to you database
INFO[14-10-2018 17:28:38] Layer: hwy_patrol added to you database
5. 将PostGIS图层发布到Geoserver
for _, file := range files {
source, ok := manager.OpenSource(file, 0)
targetSource, targetOK := manager.OpenSource(manager.Datastore.BuildConnectionString(), 1)
if ok && targetOK {
for index := 0; index < source.LayerCount(); index++ {
layer := source.LayerByIndex(index)
gLayer := gismanager.GdalLayer{
Layer: &layer,
}
if newLayer, postgisErr := gLayer.LayerToPostgis(targetSource, manager, true); newLayer.Layer != nil || postgisErr != nil {
ok, pubErr := manager.PublishGeoserverLayer(newLayer)
if pubErr != nil {
logger.Error(pubErr)
}
if !ok {
logger.Error("Failed to Publish")
} else {
logger.Info("published")
}
}
}
}
}
输出示例:
INFO[14-10-2018 17:37:07] url:http://localhost:8080/geoserver/rest/workspaces/golang Status=404
ERRO[14-10-2018 17:37:07] No such workspace: 'golang' found
INFO[14-10-2018 17:37:07] url:http://localhost:8080/geoserver/rest/workspaces Status=201
INFO[14-10-2018 17:37:07] url:http://localhost:8080/geoserver/rest/workspaces/golang/datastores/gis?quietOnNotFound=true Status=404
INFO[14-10-2018 17:37:07] url:http://localhost:8080/geoserver/rest/workspaces/golang/datastores Status=201
ERRO[14-10-2018 17:37:07] {"featureType":{"name":"neighborhood_names_gis","nativeName":"neighborhood_names_gis"}}
INFO[14-10-2018 17:37:07] url:http://localhost:8080/geoserver/rest/workspaces/golang/datastores/gis/featuretypes Status=201
INFO[14-10-2018 17:37:07] published
INFO[14-10-2018 17:37:08] url:http://localhost:8080/geoserver/rest/workspaces/golang Status=200
INFO[14-10-2018 17:37:08] url:http://localhost:8080/geoserver/rest/workspaces/golang/datastores/gis?quietOnNotFound=true Status=200
ERRO[14-10-2018 17:37:08] {"featureType":{"name":"nyc_wi_fi_hotspot_locations","nativeName":"nyc_wi_fi_hotspot_locations"}}
INFO[14-10-2018 17:37:08] url:http://localhost:8080/geoserver/rest/workspaces/golang/datastores/gis/featuretypes Status=201
INFO[14-10-2018 17:37:08] published
INFO[14-10-2018 17:37:08] url:http://localhost:8080/geoserver/rest/workspaces/golang Status=200
INFO[14-10-2018 17:37:08] url:http://localhost:8080/geoserver/rest/workspaces/golang/datastores/gis?quietOnNotFound=true Status=200
ERRO[14-10-2018 17:37:08] {"featureType":{"name":"hwy_patrol","nativeName":"hwy_patrol"}}
INFO[14-10-2018 17:37:08] url:http://localhost:8080/geoserver/rest/workspaces/golang/datastores/gis/featuretypes Status=201
INFO[14-10-2018 17:37:08] published
验证发布结果
发布完成后,可以通过Geoserver REST API验证图层是否已成功发布:
{
"layers": {
"layer": [..., {
"name": "golang:hwy_patrol",
"href": "http://localhost:8080/geoserver/rest/layers/golang%3Ahwy_patrol.json"
}, {
"name": "golang:neighborhood_names_gis",
"href": "http://localhost:8080/geoserver/rest/layers/golang%3Aneighborhood_names_gis.json"
}, {
"name": "golang:nyc_wi_fi_hotspot_locations",
"href": "http://localhost:8080/geoserver/rest/layers/golang%3Anyc_wi_fi_hotspot_locations.json"
}]
}
}
更多关于golang将GIS矢量数据发布到PostGIS和Geoserver的插件库gismanager的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于golang将GIS矢量数据发布到PostGIS和Geoserver的插件库gismanager的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
使用gismanager库发布GIS矢量数据到PostGIS和Geoserver
gismanager是一个用于将GIS矢量数据发布到PostGIS和Geoserver的Go语言库。下面我将介绍如何使用这个库完成GIS数据的发布流程。
安装gismanager
首先需要安装gismanager库:
go get github.com/sabhiram/gismanager
基本使用示例
1. 连接到PostGIS数据库
package main
import (
"fmt"
"github.com/sabhiram/gismanager"
)
func main() {
// 配置PostGIS连接
pgConfig := &gismanager.PostGISConfig{
Host: "localhost",
Port: 5432,
Database: "gisdb",
User: "postgres",
Password: "password",
}
// 创建PostGIS管理器
pgManager, err := gismanager.NewPostGISManager(pgConfig)
if err != nil {
fmt.Printf("连接PostGIS失败: %v\n", err)
return
}
defer pgManager.Close()
fmt.Println("成功连接到PostGIS数据库")
}
2. 导入Shapefile到PostGIS
func importShapefile(pgManager *gismanager.PostGISManager) {
// Shapefile路径
shpPath := "/path/to/your/file.shp"
// 导入选项
options := &gismanager.ShapefileImportOptions{
TableName: "my_gis_data",
SRID: 4326, // WGS84坐标系统
CreateIndex: true,
Overwrite: true,
}
// 导入Shapefile
err := pgManager.ImportShapefile(shpPath, options)
if err != nil {
fmt.Printf("导入Shapefile失败: %v\n", err)
return
}
fmt.Println("成功导入Shapefile到PostGIS")
}
3. 配置Geoserver连接
func setupGeoserver() *gismanager.GeoserverManager {
// Geoserver配置
gsConfig := &gismanager.GeoserverConfig{
URL: "http://localhost:8080/geoserver",
User: "admin",
Password: "geoserver",
}
// 创建Geoserver管理器
gsManager, err := gismanager.NewGeoserverManager(gsConfig)
if err != nil {
fmt.Printf("连接Geoserver失败: %v\n", err)
return nil
}
return gsManager
}
4. 发布PostGIS表到Geoserver
func publishToGeoserver(pgManager *gismanager.PostGISManager, gsManager *gismanager.GeoserverManager) {
// 工作空间名称
workspace := "my_workspace"
// 数据存储配置
storeConfig := &gismanager.GeoserverStoreConfig{
Name: "my_postgis_store",
Description: "My PostGIS data store",
Workspace: workspace,
Enabled: true,
}
// 创建PostGIS数据存储
err := gsManager.CreatePostGISDataStore(pgManager.GetConfig(), storeConfig)
if err != nil {
fmt.Printf("创建数据存储失败: %v\n", err)
return
}
// 发布图层
layerConfig := &gismanager.GeoserverLayerConfig{
Name: "my_layer",
Title: "My GIS Layer",
Description: "Layer imported from PostGIS",
StoreName: storeConfig.Name,
Workspace: workspace,
Enabled: true,
}
err = gsManager.PublishPostGISLayer(layerConfig)
if err != nil {
fmt.Printf("发布图层失败: %v\n", err)
return
}
fmt.Println("成功发布图层到Geoserver")
}
完整示例
package main
import (
"fmt"
"github.com/sabhiram/gismanager"
)
func main() {
// 1. 连接到PostGIS
pgConfig := &gismanager.PostGISConfig{
Host: "localhost",
Port: 5432,
Database: "gisdb",
User: "postgres",
Password: "password",
}
pgManager, err := gismanager.NewPostGISManager(pgConfig)
if err != nil {
fmt.Printf("连接PostGIS失败: %v\n", err)
return
}
defer pgManager.Close()
// 2. 导入Shapefile
shpPath := "/path/to/your/file.shp"
options := &gismanager.ShapefileImportOptions{
TableName: "my_gis_data",
SRID: 4326,
CreateIndex: true,
Overwrite: true,
}
if err := pgManager.ImportShapefile(shpPath, options); err != nil {
fmt.Printf("导入Shapefile失败: %v\n", err)
return
}
// 3. 连接到Geoserver
gsConfig := &gismanager.GeoserverConfig{
URL: "http://localhost:8080/geoserver",
User: "admin",
Password: "geoserver",
}
gsManager, err := gismanager.NewGeoserverManager(gsConfig)
if err != nil {
fmt.Printf("连接Geoserver失败: %v\n", err)
return
}
// 4. 发布到Geoserver
workspace := "my_workspace"
storeConfig := &gismanager.GeoserverStoreConfig{
Name: "my_postgis_store",
Description: "My PostGIS data store",
Workspace: workspace,
Enabled: true,
}
if err := gsManager.CreatePostGISDataStore(pgManager.GetConfig(), storeConfig); err != nil {
fmt.Printf("创建数据存储失败: %v\n", err)
return
}
layerConfig := &gismanager.GeoserverLayerConfig{
Name: "my_layer",
Title: "My GIS Layer",
Description: "Layer imported from PostGIS",
StoreName: storeConfig.Name,
Workspace: workspace,
Enabled: true,
}
if err := gsManager.PublishPostGISLayer(layerConfig); err != nil {
fmt.Printf("发布图层失败: %v\n", err)
return
}
fmt.Println("GIS数据发布流程完成!")
}
注意事项
- 确保PostGIS和Geoserver服务已启动并正常运行
- 根据实际情况修改连接参数(主机名、端口、用户名、密码等)
- Shapefile路径需要使用绝对路径
- 确保Geoserver的工作空间已存在,或先创建工作空间
- 坐标系统(SRID)需要根据数据实际情况设置
gismanager库提供了更多功能,如管理Geoserver的工作空间、样式、图层组等,可以参考其官方文档获取更多信息。