golang通过GeoServer REST API操作地理空间数据插件库geoserver的使用

Golang通过GeoServer REST API操作地理空间数据插件库geoserver的使用

介绍

geoserver是一个Go语言包,用于通过GeoServer REST API操作GeoServer实例。

Go Report Card

安装

使用以下命令安装:

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)
		}
	}
}

这个示例展示了如何:

  1. 连接到GeoServer实例
  2. 创建一个新的工作区
  3. 获取所有可用的图层列表
  4. 获取特定图层的详细信息

更多操作可以参考包的测试文件和文档。


更多关于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/httpresty来调用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. 其他注意事项

  1. 安全性: 确保在生产环境中使用HTTPS和安全凭证
  2. 错误处理: GeoServer API可能会返回各种错误,需要适当处理
  3. 性能: 对于大量操作,考虑批量处理和并发控制
  4. 版本兼容性: 不同版本的GeoServer可能有不同的API端点或参数

6. 替代方案

如果你需要更完整的GeoServer客户端功能,可以考虑以下方案:

  1. 使用现有的Go库: 如github.com/gisops/go-geoserver(非官方)
  2. 生成客户端代码: 使用OpenAPI/Swagger生成客户端代码(如果GeoServer提供API规范)
  3. 封装自己的客户端: 基于上述方法封装更高级的功能

希望这些示例能帮助你开始在Go中与GeoServer交互!根据你的具体需求,你可能需要扩展这些基础功能。

回到顶部