Ticket #1591 (closed defect: invalid)

Opened 15 months ago

Last modified 15 months ago

ST_GeomFromGML crushes for Triangle (Triangulard Surface/TIN)

Reported by: itboyet Owned by: pramsey
Priority: medium Milestone: PostGIS 2.0.0
Component: postgis Version: 2.0.x
Keywords: Cc:

Description

I am trying to use the ST_GeomFromGML to insert some TIN/Triangular Object into Postgres database; however, PostGIS/PostgreSQL exits after I executed the following query:

SELECT ST_AsEWKT(ST_GeomFromGML(' <gml:TriangulatedSurface>

<gml:TrianglePatches>

<gml:Triangle>

<gml:exterior>

<gml:LinearRing gml:id="1">

<gml:posList srsDimension="3">

0 0 1000000 0 10 1000000 10 10 1000000 0 0 1000000

</gml:posList>

</gml:LinearRing>

</gml:exterior>

</gml:Triangle> <gml:Triangle>

<gml:exterior>

<gml:LinearRing gml:id="2">

<gml:posList srsDimension="3">

0 0 8000000 10 10 1000000 0 0 1000000 0 0 8000000

</gml:posList>

</gml:LinearRing>

</gml:exterior>

</gml:Triangle> <gml:Triangle>

<gml:exterior>

<gml:LinearRing gml:id="3">

<gml:posList srsDimension="3">

0 0 8000000 0 10 1000000 10 10 1000000 0 0 8000000

</gml:posList>

</gml:LinearRing>

</gml:exterior>

</gml:Triangle> <gml:Triangle>

<gml:exterior>

<gml:LinearRing gml:id="4">

<gml:posList srsDimension="3">

0 0 8000000 0 0 1000000 0 10 1000000 0 0 8000000

</gml:posList>

</gml:LinearRing>

</gml:exterior>

</gml:Triangle>

</gml:TrianglePatches>

</gml:TriangulatedSurface>'));

However, it would give me an actual error if I change the tag "TriangulatedSurface?" to "TriangularSurface?", which should not be the correct gml tag.

Change History

Changed 15 months ago by pramsey

Can you update your PostGIS to the latest revision? I am not seeing a crash here...

ERROR:  invalid GML representation

Changed 15 months ago by pramsey

select postgis_full_version();
                                                                          postgis_full_version                                                                           
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 POSTGIS="2.0.0alpha6SVN" GEOS="3.4.0dev-CAPI-1.8.0" PROJ="Rel. 4.7.1, 23 September 2009" LIBXML="2.7.8" SVN_REVISION=9229 USE_STATS

Changed 15 months ago by colivier

With TriangulatedSurface? i got: TIN EMPTY

And with TriangularSurface? ERROR: invalid GML representation

PostGIS trunk r9241

Changed 15 months ago by pramsey

I get the same. Pasteable version of the query:

SELECT ST_AsEWKT(ST_GeomFromGML('
<gml:TriangulatedSurface>
 <gml:TrianglePatches>
  <gml:Triangle>
   <gml:exterior>
    <gml:LinearRing gml:id="1">
     <gml:posList srsDimension="3">
      0 0 1000000 0 10 1000000 10 10 1000000 0 0 1000000
     </gml:posList>
    </gml:LinearRing>
   </gml:exterior>
  </gml:Triangle>
  <gml:Triangle>
   <gml:exterior>
    <gml:LinearRing gml:id="2">
     <gml:posList srsDimension="3">
      0 0 8000000 10 10 1000000 0 0 1000000 0 0 8000000
     </gml:posList>
    </gml:LinearRing>
   </gml:exterior>
  </gml:Triangle>
  <gml:Triangle>
   <gml:exterior>
    <gml:LinearRing gml:id="3">
     <gml:posList srsDimension="3">
      0 0 8000000 0 10 1000000 10 10 1000000 0 0 8000000
     </gml:posList>
    </gml:LinearRing>
   </gml:exterior>
  </gml:Triangle>
  <gml:Triangle>
   <gml:exterior>
    <gml:LinearRing gml:id="4">
     <gml:posList srsDimension="3">
      0 0 8000000 0 0 1000000 0 10 1000000 0 0 8000000
     </gml:posList>
    </gml:LinearRing>
   </gml:exterior>
  </gml:Triangle>
 </gml:TrianglePatches>
</gml:TriangulatedSurface>'));

Changed 15 months ago by strk

I see we have no cunit test for GML input, would be worth adding one (we could at least get a valgrind opinion on the matter)

Changed 15 months ago by strk

Comment here also suggests there are memory errors: source:trunk/postgis/lwgeom_in_gml.c#L654 Time to move GML parser into liblwgeom ?

Changed 15 months ago by strk

I'm moving the code to liblwgeom...

Changed 15 months ago by strk

Oops, the gml parser includes reprojection which uses the PROJ cache, which in turn is only at the pgsql level...

Changed 15 months ago by colivier

@strk : there was previous reflexion related to moving it to liblwgeon here #444

I think there's 2 options right now:

  • Check quickly that request posted by itboyet is valgrind clean

(so no need to play with proj4)

  • tackle #444 for 2.0 rather than 2.1

I can spend some time on it, but i didn't plan (at all) to migrate the ~1000 units tests related to GeomFrom?*ML to cunit syntax/logic.

Changed 15 months ago by strk

I've commented on #444, if you can spend some time checking itboyet case with valgrind that would be enough for me.

Changed 15 months ago by strk

I've noticed another thing: the library prints errors on stderr, like these:

namespace error : Namespace prefix gml on TriangulatedSurface is not defined
 <gml:TriangulatedSurface> <gml:TrianglePatches> <gml:Triangle> <gml:exterior> <
                         ^

it probably shouldn't.

Anyway the query runs valgrind-clean on a cassert-enabled postgresql 9.1

Changed 15 months ago by strk

I've dropped the POINTARRAY clone in r9279, still no memory errors I can see either on pgsql 9.1 or 8.4.

Changed 15 months ago by itboyet

I had version alpha5 when I had this error. I got "TIN EMPTY" after upgrading to alpha6. However, the GML has the correct format for insertion. Is it a bug since it returns "TIN EMPTY"?

Changed 15 months ago by pramsey

Well, it's a legal TIN (at least, the WKT version goes in fine) so the GML function should be looked at...

TIN(
((0 0 1000000,0 10 1000000,10 10 1000000,0 0 1000000)),
((0 0 8000000,10 10 1000000,0 0 1000000,0 0 8000000)),
((0 0 8000000,0 10 1000000,10 10 1000000,0 0 8000000)),
((0 0 8000000,0 0 1000000,0 10 1000000,0 0 8000000))
)

Changed 15 months ago by itboyet

Meanwhile, as a remark I also want to point out that ST_AsGML does not support TIN and/or Triangle Geometry. Perhaps it would be great to have both INPUT function (ST_GeomFromGML) and OUTPUT function (ST_AsGML) working in sync.

Changed 15 months ago by pramsey

Yes, that would be far easier, I can just remove the FromGML support! :)

Changed 15 months ago by pramsey

  • status changed from new to closed
  • resolution set to invalid

So, turns out GML is case sensitive... this works

SELECT ST_AsEWKT(ST_GeomFromGML('
<gml:TriangulatedSurface>
 <gml:trianglePatches>
  <gml:Triangle>
   <gml:exterior>
    <gml:LinearRing gml:id="1">
     <gml:posList srsDimension="3">
      0 0 1000000 0 10 1000000 10 10 1000000 0 0 1000000
     </gml:posList>
    </gml:LinearRing>
   </gml:exterior>
  </gml:Triangle>
  <gml:Triangle>
   <gml:exterior>
    <gml:LinearRing gml:id="2">
     <gml:posList srsDimension="3">
      0 0 8000000 10 10 1000000 0 0 1000000 0 0 8000000
     </gml:posList>
    </gml:LinearRing>
   </gml:exterior>
  </gml:Triangle>
  <gml:Triangle>
   <gml:exterior>
    <gml:LinearRing gml:id="3">
     <gml:posList srsDimension="3">
      0 0 8000000 0 10 1000000 10 10 1000000 0 0 8000000
     </gml:posList>
    </gml:LinearRing>
   </gml:exterior>
  </gml:Triangle>
  <gml:Triangle>
   <gml:exterior>
    <gml:LinearRing gml:id="4">
     <gml:posList srsDimension="3">
      0 0 8000000 0 0 1000000 0 10 1000000 0 0 8000000
     </gml:posList>
    </gml:LinearRing>
   </gml:exterior>
  </gml:Triangle>
 </gml:trianglePatches>
</gml:TriangulatedSurface>'));

Changed 15 months ago by pramsey

And, incidentally, As_GML does support TIN, just for GML3 only:

select st_asgml(3,'TIN(((0 0 1000000,0 10 1000000,10 10 1000000,0 0 1000000)),((0 0 8000000,10 10 1000000,0 0 1000000,0 0 8000000)),((0 0 8000000,0 10 1000000,10 10 1000000,0 0 8000000)),((0 0 8000000,0 0 1000000,0 10 1000000,0 0 8000000)))'::geometry);

and the full wrap-around

select st_astext(st_geomfromGML(st_asgml(3,'TIN(((0 0 1000000,0 10 1000000,10 10 1000000,0 0 1000000)),((0 0 8000000,10 10 1000000,0 0 1000000,0 0 8000000)),((0 0 8000000,0 10 1000000,10 10 1000000,0 0 8000000)),((0 0 8000000,0 0 1000000,0 10 1000000,0 0 8000000)))'::geometry)));

Changed 15 months ago by pramsey

There, final answer, the error message from TIN->GML2 is now more useful at r9331.

Changed 15 months ago by colivier

For the record GML 2 don't handle TIN or PolyhedralSurface?...

Note: See TracTickets for help on using tickets.