I'm trying to remove inner polygons with postgis. I've created a routine, that resumes in:

From a polygon table, with a unique id:

  • Create a linestring table from polygon
  • Import to postgis
  • Get the length of each line

Now I have a table with, for example, 5 linestrings for each id, each linestring was a polygon, and I want to get ONLY the longest line from each ID.

enter image description here

For this, I have a select, but I don't know how to group the geometry, to get ONLY the longest line

select  id, geom as length from esp_lines group by id

I have to group it by another field, but I don't know which one.

The other solution I've found is:

select  id, max(geom) as length from esp_lines group by id

but max(geom) doesn't give me the expected result (the longest linestring)

Does anybody know if is there any function to get the longest linestring of a group?

  • 3
    there is no guarantee that the longest line would be the outer line
    – vinayan
    Commented Jul 30, 2014 at 8:43

2 Answers 2


You are looking for Exterior ring

SELECT gid, ST_ExteriorRing(the_geom) AS ering
FROM sometable;
  • ST_ExteriorRing(the_geom) works only on POLYGONs. We need a solution working on MULTIPOLYGONs... Commented Dec 8, 2020 at 17:46

The ST_ExteriorRing returns a linestring. Use ST_MakePolygon to return a polygon that represents the original polygon with the donut holes removed.

SELECT gid, ST_MakePolygon(ST_ExteriorRing(the_geom)) AS ering
FROM sometable;


Also be careful that sometable does not contain Multipolygons. https://postgis.net/docs/ST_ExteriorRing.html

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.