golang通过GeoServer REST API操作地理空间数据插件库geoserver的使用
Golang通过GeoServer REST API操作地理空间数据插件库geoserver的使用
介绍
geoserver是一个Go语言包,用于通过GeoServer REST API操作GeoServer实例。
安装
使用以下命令安装:
go get -v gopkg.in/hishamkaram/geoserver.v1
然后可以这样导入包:
import (
// ...
"gopkg.in/hishamkaram/geoserver.v1"
// ...
)
使用示例
1. 创建Catalog
// 创建新的Catalog(包含所有可用操作)
gsCatalog := geoserver.GetCatalog("http://localhost:8080/geoserver13/", "admin", "geoserver")
2. 创建工作区
created, err := gsCatalog.CreateWorkspace("golang")
if err != nil {
fmt.Printf("\nError:%s\n", err)
}
fmt.Println(strconv.FormatBool(created))
成功输出示例:
INFO[31-03-2018 16:26:35] url:http://localhost:8080/geoserver13/rest/workspaces response Status=201
true
错误输出示例:
INFO[31-03-2018 16:26:37] url:http://localhost:8080/geoserver13/rest/workspaces response Status=401
WARN[31-03-2018 16:26:37] <!doctype html><html lang="en">...错误信息...
Error:Unauthorized
false
3. 获取图层列表
// 获取所有公共图层
layers, err := gsCatalog.GetLayers("")
if err != nil {
fmt.Printf("\nError:%s\n", err)
}
for _, lyr := range layers {
fmt.Printf("\nName:%s href:%s\n", lyr.Name, lyr.Href)
}
输出示例:
INFO[31-03-2018 19:04:44] url:http://localhost:8080/geoserver13/rest/layers response Status=200
Name:tiger:giant_polygon href:http://localhost:8080/geoserver13/rest/layers/tiger%3Agiant_polygon.json
Name:tiger:poi href:http://localhost:8080/geoserver13/rest/layers/tiger%3Apoi.json
...
4. 获取特定图层
layer, err := gsCatalog.GetLayer("nurc", "Arc_Sample")
if err != nil {
fmt.Printf("\nError:%s\n", err)
} else {
fmt.Printf("%+v\n", layer)
}
输出示例:
INFO[31-03-2018 20:12:07] url:http://localhost:8080/geoserver13/rest/workspaces/nurc/layers/Arc_Sample response Status=200
{Name:Arc_Sample Path:/ Type:RASTER DefaultStyle:{Class: Name:rain Href:http://localhost:8080/geoserver13/rest/styles/rain.json} Styles:{Class:linked-hash-set Style:[{Class: Name:raster Href:http://localhost:8080/geoserver13/rest/styles/raster.json}]} Resource:{Class:coverage Name:nurc:Arc_Sample Href:http://localhost:8080/geoserver13/rest/workspaces/nurc/coveragestores/arcGridSample/coverages/Arc_Sample.json} Queryable:false Opaque:false Attribution:{Title: Href: LogoURL: LogoType: LogoWidth:0 LogoHeight:0}}
测试环境
Go版本 | GeoServer版本 | 测试状态 | |
---|---|---|---|
1 | 1.13.x | 2.13.x | ✔️ |
2 | 1.13.x | 2.14.x | ✔️ |
3 | 1.14.x | 2.13.x | ✔️ |
4 | 1.14.x | 2.14.x | ✔️ |
5 | 1.15.x | 2.13.x | ✔️ |
6 | 1.15.x | 2.14.x | ✔️ |
完整示例Demo
package main
import (
"fmt"
"strconv"
"gopkg.in/hishamkaram/geoserver.v1"
)
func main() {
// 1. 初始化GeoServer连接
gsCatalog := geoserver.GetCatalog("http://localhost:8080/geoserver/", "admin", "geoserver")
// 2. 创建工作区
workspaceName := "golang_demo"
created, err := gsCatalog.CreateWorkspace(workspaceName)
if err != nil {
fmt.Printf("创建工作区错误: %s\n", err)
return
}
fmt.Printf("创建工作区 %s 结果: %s\n", workspaceName, strconv.FormatBool(created))
// 3. 获取所有图层
layers, err := gsCatalog.GetLayers("")
if err != nil {
fmt.Printf("获取图层列表错误: %s\n", err)
return
}
fmt.Println("\n可用图层列表:")
for _, layer := range layers {
fmt.Printf("- %s\n", layer.Name)
}
// 4. 获取特定图层详情
if len(layers) > 0 {
// 假设我们要获取第一个图层的详细信息
layerParts := strings.Split(layers[0].Name, ":")
if len(layerParts) == 2 {
workspace := layerParts[0]
layerName := layerParts[1]
layerDetail, err := gsCatalog.GetLayer(workspace, layerName)
if err != nil {
fmt.Printf("获取图层详情错误: %s\n", err)
return
}
fmt.Printf("\n图层 %s 的详细信息:\n", layers[0].Name)
fmt.Printf("类型: %s\n", layerDetail.Type)
fmt.Printf("默认样式: %s\n", layerDetail.DefaultStyle.Name)
}
}
}
这个示例展示了如何:
- 连接到GeoServer实例
- 创建一个新的工作区
- 获取所有可用的图层列表
- 获取特定图层的详细信息
更多操作可以参考包的测试文件和文档。
更多关于golang通过GeoServer REST API操作地理空间数据插件库geoserver的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于golang通过GeoServer REST API操作地理空间数据插件库geoserver的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
使用Go语言通过GeoServer REST API操作地理空间数据
GeoServer是一个开源的地理空间数据服务器,它提供了REST API来管理地理空间数据。在Go语言中,我们可以使用现有的库或直接调用REST API来与GeoServer交互。
1. 安装必要的库
虽然Go没有专门针对GeoServer的官方客户端库,但我们可以使用通用的HTTP客户端库如net/http
或resty
来调用GeoServer REST API。
go get github.com/go-resty/resty/v2
2. 基本配置
首先,我们需要配置GeoServer的连接信息:
package main
import (
"fmt"
"github.com/go-resty/resty/v2"
)
const (
geoserverURL = "http://localhost:8080/geoserver"
username = "admin"
password = "geoserver"
workspace = "myworkspace"
datastore = "mydatastore"
)
func getClient() *resty.Client {
client := resty.New()
client.SetBasicAuth(username, password)
return client
}
3. 常用操作示例
3.1 创建工作区(Workspace)
func createWorkspace(client *resty.Client, workspaceName string) error {
url := fmt.Sprintf("%s/rest/workspaces", geoserverURL)
payload := fmt.Sprintf(`<workspace><name>%s</name></workspace>`, workspaceName)
resp, err := client.R().
SetHeader("Content-Type", "text/xml").
SetBody(payload).
Post(url)
if err != nil {
return fmt.Errorf("创建workspace失败: %v", err)
}
if resp.StatusCode() != 201 {
return fmt.Errorf("创建workspace失败, 状态码: %d, 响应: %s", resp.StatusCode(), resp.String())
}
fmt.Printf("成功创建workspace: %s\n", workspaceName)
return nil
}
3.2 创建数据存储(DataStore)
func createShapefileDataStore(client *resty.Client, workspaceName, storeName, shapefilePath string) error {
url := fmt.Sprintf("%s/rest/workspaces/%s/datastores", geoserverURL, workspaceName)
payload := fmt.Sprintf(`<dataStore>
<name>%s</name>
<type>Shapefile</type>
<enabled>true</enabled>
<connectionParameters>
<entry key="url">file:%s</entry>
<entry key="create spatial index">true</entry>
</connectionParameters>
</dataStore>`, storeName, shapefilePath)
resp, err := client.R().
SetHeader("Content-Type", "text/xml").
SetBody(payload).
Post(url)
if err != nil {
return fmt.Errorf("创建datastore失败: %v", err)
}
if resp.StatusCode() != 201 {
return fmt.Errorf("创建datastore失败, 状态码: %d, 响应: %s", resp.StatusCode(), resp.String())
}
fmt.Printf("成功创建datastore: %s\n", storeName)
return nil
}
3.3 发布图层(Layer)
func publishLayer(client *resty.Client, workspaceName, storeName, layerName string) error {
url := fmt.Sprintf("%s/rest/workspaces/%s/datastores/%s/featuretypes", geoserverURL, workspaceName, storeName)
payload := fmt.Sprintf(`<featureType>
<name>%s</name>
<nativeName>%s</nativeName>
<title>%s</title>
<enabled>true</enabled>
</featureType>`, layerName, layerName, layerName)
resp, err := client.R().
SetHeader("Content-Type", "text/xml").
SetBody(payload).
Post(url)
if err != nil {
return fmt.Errorf("发布图层失败: %v", err)
}
if resp.StatusCode() != 201 {
return fmt.Errorf("发布图层失败, 状态码: %d, 响应: %s", resp.StatusCode(), resp.String())
}
fmt.Printf("成功发布图层: %s\n", layerName)
return nil
}
3.4 获取图层信息
func getLayerInfo(client *resty.Client, workspaceName, layerName string) (string, error) {
url := fmt.Sprintf("%s/rest/layers/%s:%s.json", geoserverURL, workspaceName, layerName)
resp, err := client.R().
Get(url)
if err != nil {
return "", fmt.Errorf("获取图层信息失败: %v", err)
}
if resp.StatusCode() != 200 {
return "", fmt.Errorf("获取图层信息失败, 状态码: %d", resp.StatusCode())
}
return resp.String(), nil
}
4. 完整示例
package main
import (
"fmt"
"log"
"github.com/go-resty/resty/v2"
)
func main() {
client := getClient()
// 创建工作区
err := createWorkspace(client, workspace)
if err != nil {
log.Fatal(err)
}
// 创建数据存储
shapefilePath := "/path/to/your/shapefile.shp"
err = createShapefileDataStore(client, workspace, datastore, shapefilePath)
if err != nil {
log.Fatal(err)
}
// 发布图层
layerName := "mylayer"
err = publishLayer(client, workspace, datastore, layerName)
if err != nil {
log.Fatal(err)
}
// 获取图层信息
info, err := getLayerInfo(client, workspace, layerName)
if err != nil {
log.Fatal(err)
}
fmt.Println("图层信息:", info)
}
5. 其他注意事项
- 安全性: 确保在生产环境中使用HTTPS和安全凭证
- 错误处理: GeoServer API可能会返回各种错误,需要适当处理
- 性能: 对于大量操作,考虑批量处理和并发控制
- 版本兼容性: 不同版本的GeoServer可能有不同的API端点或参数
6. 替代方案
如果你需要更完整的GeoServer客户端功能,可以考虑以下方案:
- 使用现有的Go库: 如
github.com/gisops/go-geoserver
(非官方) - 生成客户端代码: 使用OpenAPI/Swagger生成客户端代码(如果GeoServer提供API规范)
- 封装自己的客户端: 基于上述方法封装更高级的功能
希望这些示例能帮助你开始在Go中与GeoServer交互!根据你的具体需求,你可能需要扩展这些基础功能。