[mapserver-users] [Info] S-57 nautical map on MapServer

easyl thlin.box at gmail.com
Fri Jul 23 06:39:42 PDT 2010


Since several months I was looking for an good example or tutorial for
rendering S-57 nautical charts on MapServer. 
After searching without any success I tried to build up my first map with
limit knowledge.

IMO, the most hardest part is how to render them with S-52 style standard.
(The project http://www.opencpn.org/ has done a really good work to render
nautical map in an application.)

Some resource:
http://home.gdal.org/projects/s57/index.html
http://grass.osgeo.org/wiki/S-57_data
http://www.s-57.com/

Here is a short description of what I have done.

1) Conver S-57 (*.000) files into shapefiles by using ogr2ogr.
    An S-57 file is split into several shapefiles; 
    Each shapefile contains single one layer of single geometry type. 

    For example:
    src.000 ------ DEPARE ------> Area    (a shapefile)
                  +                  +--> Line     (a shapefile)
                  |
                  +-- (other layer)  .........................    (a
shapefile)       
  
   Here is the ogr2ogr commands 
   > ogr2ogr -skipfailure -append -f "ESRI Shapefile" output/DEPARE/A
src.000 -nlt POLYGON DEPARE 
   > ogr2ogr -skipfailure -append -f "ESRI Shapefile" output/DEPARE/L
src.000 -nlt LINESTRING DEPARE 

   The SOUNDG layer must be converted with special care.
  > export OGR_S57_OPTIONS="SPLIT_MULTIPOINT=ON,ADD_SOUNDG_DEPTH=ON"
  > ogr2ogr -skipfailure -append -f "ESRI Shapefile" output/SOUNDG/P src.000
-nlt POINT SOUNDG 
   
2) Construct mapfile
  2.1) Generally there are (at least) two things to take care: scale and
layer priority.
         
         S-57 data may have different scale value and overlap with each
other. 
         Moreover, a S-57 data may not have a rectangle extent.

         For those reasons, I construct mapfile with the following manner: 
         Sort layers after scale value, then layer priority.
         Group them if necessary.
         MAP
           LAYER
               // scale:       1:100,000
               // priority:    low
              CONNECTION "shapefile/100000/DEPARE/A/DEPARE.shp"
              DATA "DEPARE"
              GROUP "DEPARE"
           END

           LAYER
               // scale:       1:100,000
               // priority:    high
              CONNECTION "shapefile/100000/LIGHTS/P/LIGHTS.shp"
              DATA "LIGHTS"
              GROUP "LIGHTS"
           END

           LAYER
               // scale:       1:10,000
               // priority:    low
              CONNECTION "shapefile/10000/DEPARE/A/DEPARE.shp"
              DATA "DEPARE"
              GROUP "DEPARE"
           END

           LAYER
               // scale:       1:10,000
               // priority:    high
              CONNECTION "shapefile/10000/LIGHTS/P/LIGHTS.shp"
              DATA "LIGHTS"
              GROUP "LIGHTS"
           END
         END

  2.2) apply style. It is the hardest part. 
         Here I give abother two examples.

  LAYER
    NAME DEPARE_A_1500000_1
    GROUP "DEPARE"
    STATUS ON
    TYPE POLYGON
    CONNECTIONTYPE OGR
    CONNECTION "shapefile/1500000/DEPARE/A/DEPARE.shp"
    PROCESSING "CLOSE_CONNECTION=DEFER"
    PROCESSING "LABEL_NO_CLIP=ON"
    DATA "DEPARE"
    PROJECTION
      "proj=longlat"
      "ellps=WGS84"
      "datum=WGS84"
      "no_defs"
    END
    CLASSITEM DRVAL1
    CLASS
      EXPRESSION ([DRVAL1] < 3)
      STYLE
        COLOR 115 182 239
      END
    END
    CLASS
      EXPRESSION ([DRVAL1] >= 3 && [DRVAL1] < 8)
      STYLE
        COLOR 156 198 247
      END
    END
    CLASS
      EXPRESSION ([DRVAL1] >= 8)
      STYLE
        COLOR 214 235 239
      END
    END
  END


  LAYER
    NAME LIGHTS_P_1500_1
    GROUP "LIGHTS"
    STATUS ON
    TYPE POINT
    #MAXSCALEDENOM 1501
    CONNECTIONTYPE OGR
    CONNECTION "shapefile/1500/LIGHTS/P/LIGHTS.shp"
    PROCESSING "CLOSE_CONNECTION=DEFER"
    PROCESSING "LABEL_NO_CLIP=ON"
    DATA "LIGHTS"
    PROJECTION
      "proj=longlat"
      "ellps=WGS84"
      "datum=WGS84"
      "no_defs"
    END
    CLASSITEM COLOUR
    CLASS
      EXPRESSION ([COLOUR] == 3)
      STYLE
        COLOR 255 0 0
        SIZE [VALNMR]
        OPACITY 50
        OUTLINECOLOR 0 0 0
      END
    END
    CLASS
      EXPRESSION ([COLOUR] == 4)
      STYLE
        COLOR 0 255 0
        SIZE [VALNMR]
        OPACITY 50
        OUTLINECOLOR 0 0 0
      END
    END
    ...
  END

  Here is the result:
http://osgeo-org.1803224.n2.nabble.com/file/n5329589/s57MS.png 
http://osgeo-org.1803224.n2.nabble.com/file/n5329589/s57MS.PNG s57MS.PNG 
  Of course, it needs still a lot of symbols, color encoding, customized
style after standards ....

I have wrote some script to automatically convert S-57 files and construct
mapfile (manually writing a mapfile for 100+ layers from 20+ S-57 files is
not practical...). If anyone has interest, I can share them or even make a
project to let everyone contribute.....

Now the task to be done is to encode every possible style in
mapfile............................:(

Any suggestion is welcome!




-- 
View this message in context: http://osgeo-org.1803224.n2.nabble.com/Info-S-57-nautical-map-on-MapServer-tp5329589p5329589.html
Sent from the Mapserver - User mailing list archive at Nabble.com.



More information about the MapServer-users mailing list