Class GMLReader

java.lang.Object
org.xml.sax.helpers.DefaultHandler
com.vividsolutions.jump.io.GMLReader
All Implemented Interfaces:
JUMPReader, TaskMonitorSupport, ContentHandler, DTDHandler, EntityResolver, ErrorHandler
Direct Known Subclasses:
JMLReader

public class GMLReader extends DefaultHandler implements JUMPReader, TaskMonitorSupport
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)
CompressedFileTemplate File 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( <Reader> , <stream name> );


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
<put any object into the recursivegeometry[state-1000] collection>

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]
 <POINT>

 -> added to geometry <POINT>

 -> added to geometry START TAG: multi* -> move to state 1001, geometry =
 recursivegeometry[1] <POINT>

 -> added to geometry <POINT>

 -> added to geometry END TAG: multi -> move to state 1000, build geometry in
 recursivegeometry[1], add to recursivegeometry[0], geometry =
 recursivegeometry[0] <POINT>

 -> added to geometry END TAG: multi -> <finished> 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: <gml:LineString srsName="EPSG:42102"> .... </gml:LineString> The SRID of the created geometry will be 42102. It accepts srsNames of the form "<letters>:<number>". 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: <a> <b>...1...</b> <b>...2...</b> <b>...3...</b> </a> 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) <a><b>...1...</b></a> --> b get the string "...1..." (as before) <a><b>...1...</b><b>...2...</b><b>...3...</b></a> --> 'b' is a list of String ['...1...','...2...','...3...']
  • Field Details

    • multiItemsAsLists

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

    • GMLReader

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