hishamkaram / gismanager

Publish Your GIS Data(Vector Data) to PostGIS and Geoserver

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Go Report Card GitHub license GitHub issues Coverage Status Build Status Documentation GitHub forks GitHub stars Twitter

GISManager

Publish Your GIS Data(Vector Data) to PostGIS and Geoserver

  • How to install:
    • go get -v github.com/hishamkaram/gismanager
  • Usage:
    • testdata folder content:
      ./testdata/
      ├── neighborhood_names_gis.geojson
      ├── nested
      │   └── nyc_wi-fi_hotspot_locations.geojson
      ├── sample.gpkg
      
    • create ManagerConfig instance:
      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(),
      }
      
    • get Supported GIS Files:
      files, _ := gismanager.GetGISFiles(manager.Source.Path)
      for _, file := range files {
        fmt.Println(file)
      }
      
      • output:
        <full_path>/testdata/neighborhood_names_gis.geojson
        <full_path>/testdata/nested/nyc_wi-fi_hotspot_locations.geojson
        <full_path>/testdata/sample.gpkg
        
    • read files and get layers Schema:
        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)
              }
            }
          }
        }
      
      • output sample:
        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}
        ...
        
    • add your gis data to your database:
        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())
              }
            }
        }
      
      • output:
        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
        
    • update the previous code to publish your postgis layers to 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")
               }
             }
      
           }
         }
       }
      
      • output:
       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 
      
      • done check you geoserver or via geoserver rest api url http://localhost:8080/geoserver/rest/layers.json :
         {
           "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"
             }]
           }
         }
        

Todo:

  • backup postgis as geopackage

About

Publish Your GIS Data(Vector Data) to PostGIS and Geoserver

License:MIT License


Languages

Language:Go 77.3%Language:Shell 18.5%Language:Dockerfile 4.2%