GitHub - hishamkaram/gismanager: Publish Your GIS Data(Vector Data) to PostGIS and Geoserver

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"
           }]
         }
       }