Class GMLReader

  • All Implemented Interfaces:
    JUMPReader, ContentHandler, DTDHandler, EntityResolver, ErrorHandler

    public class GMLReader
    extends DefaultHandler
    implements JUMPReader
    GMLReader is a JUMPReader specialized to read GML files.

    DataProperties for the JCSReader load(DataProperties) interface:

    Parameter Meaning
    File or DefaultValue File name for the input .xml file
    InputTemplateFile Filename for the GMLInputTemplate .xml file
    CompressedFile File name (a .zip or .gz) with a .jml/.xml/.gml inside (specified by File)
    CompressedFileTemplateFile name (.zip or .gz) with the input template in (specified by InputTemplateFile)


    NOTE: If InputTemplateFile is unspecified, GMLReader will try to read one off the top of the input .xml file (the JCS format). This is the same as specifying the File and TemplateFile to be the same.

    Typically, you would write:
         gmlReader = new GMLReader();
         gmlReader.load( DriverProperties) ; // has InputFile and InputTemplate
      
    or:
         gmlReader.setInputTemplate( GMLInputTemplate);
         gmlReader.load(  ,  );
      


    Internal Details - This is based on a small finite state machine with these states:

    STATE MEANING
    0 Init
    1 Waiting for Collection tag
    2 Waiting for Feature tag
    3 Getting jcs columns
    4 Parsing geometry (goes back to state 3)
    1000 Parsing Multi-geometry, recursion level =1
    1001 Parsing Multi-geometry, recursion level =2
    ...


    State Diagram

    init
            0  ----->  1
                       |
                       | Collection start Tag
                       |
                    -->2---------------->     FINISH
                    \  |   End Collection tag
     End Feature tag \ |
                      \|
            4<-------->3
               Geometry start/end
    

    For multi-geometries
    On start Multi-geometry, increment state by 1 (or jump to 1000 if at state 4)
    make sure recursivegeometry[state-1000] is null


    on end multi-geometry,
    build geometry in recursivegeometry[state-1000], add it to recursivegeometry[state-1000-1]
    state= state-1

    For single geometries - they will be stuck into recursivegeometry[0], which is the same
    as geometry

    For multi geometries - they will also be stuck into recursivegeometry[0], which is the same
    as geometry. But, for the first nested geometry, it will be stuck into recursivegeometry[1],
    which will then be geometry
      example of double GCs:
      START geometry     ->move to state 4
      START TAG: multi*  -> move to state 1000, geometry = recursivegeometry[0]
      
    
      -> added to geometry 
    
      -> added to geometry START TAG: multi* -> move to state 1001, geometry =
      recursivegeometry[1] 
    
      -> added to geometry 
    
      -> added to geometry END TAG: multi -> move to state 1000, build geometry in
      recursivegeometry[1], add to recursivegeometry[0], geometry =
      recursivegeometry[0] 
    
      -> added to geometry END TAG: multi ->  move to state 4, build
      geometry in recursivegeometry[0] (thats the result) and put it in
      finalGeometry END geometry -> add to feature collection example of simple
      geometry: START geometry ->move to state 4 BEGIN polygon ->clear out inner
      ring accumulator BEGIN outerboundary BEGIN linearring END linearring -> put
      points in linearRing END outerboundary -> put linearRing in outerBoundary
      BEGIN innerboundary BEGIN linearring END linearring -> put points in
      linearRing END innerboundary -> add linearRing to innerBoundary list END
      polygon -> build polygon (put in geometry, which is recursivegeometry[0] END
      geometry => add to feature collection
      
    Most of the work is done in the endTag method!

    New additions: Jan 2005 by Dave Blasby allow srid to be parsed from the GML file For example: .... The SRID of the created geometry will be 42102. It accepts srsNames of the form ":". ie. "EPSG:111" or "DAVE:222" or "BCGOV:333" etc... The Geometry's SRID will be the number. If you have a GEOMETRYCOLLECTION with more than one SRID specified the SRID of the result will be indeterminate (this isnt correct GML). Geometries without a srsName will get SRID 0. This functionality defaults to off for compatibility. To turn it on or off, call the acceptSRID(true|false) function. New Addition: Jan, 2005by Dave Blasby Added slightly better support for type=OBJECT. It sticks a String in. Before it would probably throw an error. Added support for multi-objects for example: ...1... ...2... ...3... Old behavior would be to for column 'b' to have value "...3...". New behavior (only if you set b's type to 'OBJECT' and set the GMLReader to processMultiItems as lists) ...1... --> b get the string "...1..." (as before) ...1......2......3... --> 'b' is a list of String ['...1...','...2...','...3...']
    • Field Detail

      • parseSRID

        public boolean parseSRID
      • multiItemsAsLists

        public boolean multiItemsAsLists
        true => for 'OBJECT' types, if you find more than 1 item, make a list and store all the results
    • Constructor Detail

      • GMLReader

        public GMLReader()
        Constructor - make a SAXParser and have this GMLReader be its ContentHandler and ErrorHandler.