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数据发布流程完成!")
}

注意事项

  1. 确保PostGIS和Geoserver服务已启动并正常运行
  2. 根据实际情况修改连接参数(主机名、端口、用户名、密码等)
  3. Shapefile路径需要使用绝对路径
  4. 确保Geoserver的工作空间已存在,或先创建工作空间
  5. 坐标系统(SRID)需要根据数据实际情况设置

gismanager库提供了更多功能,如管理Geoserver的工作空间、样式、图层组等,可以参考其官方文档获取更多信息。

回到顶部