Getting attributes of intersected polygons using PostGIS The Next CEO of Stack OverflowST_Intersection: Intersection of all geometries in a tableHow to get smallest line segments from intersection + difference of multiple overlapping lines?Separate polygons based on intersection using PostGISNearest Neighbor calculation in PostGIS?How to use ST_Intersection?Identifying topological relationships using PostGISAdjusting polygons to boundary and filling holesStrange behavior of of ST_Intersects in PostGISHow to use St_intersects with different geometry typeHow to get all attributes from overlapping polygons with identical geometry into one single polygon in QGISPostgis : separate nested polygonsPostGIS query to split a polygon by n other polygons
At which OSI layer a user-generated data resides?
Anatomically Correct Strange Women In Ponds Distributing Swords
What was the first Unix version to run on a microcomputer?
On model categories where every object is bifibrant
Would a galaxy be visible from outside, but nearby?
Hindi speaking tourist to UK from India
Why does the UK parliament need a vote on the political declaration?
How did people program for Consoles with multiple CPUs?
Why does standard notation not preserve intervals (visually)
If a black hole is created from light, can this black hole then move at speed of light?
What benefits would be gained by using human laborers instead of drones in deep sea mining?
Can I equip Skullclamp on a creature I am sacrificing?
What's the best way to handle refactoring a big file?
Is there a difference between "Fahrstuhl" and "Aufzug"
Keeping you safe
Inappropriate reference requests from Journal reviewers
What exact does MIB represent in SNMP? How is it different from OID?
Return the Closest Prime Number
Was a professor correct to chastise me for writing "Prof. X" rather than "Professor X"?
Is it possible to search for a directory/file combination?
Won the lottery - how do I keep the money?
Workaholic Formal/Informal
Why didn't Khan get resurrected in the Genesis Explosion?
What happened in Rome, when the western empire "fell"?
Getting attributes of intersected polygons using PostGIS
The Next CEO of Stack OverflowST_Intersection: Intersection of all geometries in a tableHow to get smallest line segments from intersection + difference of multiple overlapping lines?Separate polygons based on intersection using PostGISNearest Neighbor calculation in PostGIS?How to use ST_Intersection?Identifying topological relationships using PostGISAdjusting polygons to boundary and filling holesStrange behavior of of ST_Intersects in PostGISHow to use St_intersects with different geometry typeHow to get all attributes from overlapping polygons with identical geometry into one single polygon in QGISPostgis : separate nested polygonsPostGIS query to split a polygon by n other polygons
I have a PostGIS table containing about 50,000 polygons and some of them are overlapping.
I'm trying to use PostGIS to return a table with all the Intersecting parts of the polygons along with some of the attributes of the original polygons.
To get the Intersecting parts table (table (b) in the figure below), I use this script (Similar to the solution here):
SELECT (ST_intersection(a.geom, b.geom))
INTO Intersecting_parts _table
FROM t1 a
INNER JOIN t1 b ON ST_Intersects (a.geom,b.geom)
WHERE a.id < b.id
THE PROBLEM I'M STRUGGLING WITH:
I want the table with the intersecting parts (table b) to hold attributes from the original polygons, so anyone exploring new table can retrace the intersection to the originals. Furthermore, database-wise, I know it is better to put these attributes in a new relationship-table, and not in table b).
The process and table schematics:

So, I've put in the figure below a schematic of the new table I want to create (table (c)).
I tried doing this:
SELECT ST_intersection(a.geom, b.geom), a.*
INTO Intersecting_parts_table
FROM t1 a
INNER JOIN t1 b ON ST_Intersects (a.geom,b.geom)
WHERE a.id < b.id
But of course – In the simple case although there were only 2 intersecting polygons, it returns only the attributes of one of them, randomly, which clearly does not meet my needs.
But, I think I'm stuck in the basic understanding:
It seems to me that as the ST_Intersection geographic operator (and ST_Overlaps, ST_Intersects and so on) works on whole tables, they are not the answer. They can't return attributes from two polygons at once (or I don't understand how to do it).
I tried extracting the attributes using a point derived from ST_PointOnSurface (and not ST_centroid), but didn't get very far with it).
I'm using PostGIS 2.3 and PostgreSQL 9.6.1.
postgis polygon attribute-table intersection overlapping-features
add a comment |
I have a PostGIS table containing about 50,000 polygons and some of them are overlapping.
I'm trying to use PostGIS to return a table with all the Intersecting parts of the polygons along with some of the attributes of the original polygons.
To get the Intersecting parts table (table (b) in the figure below), I use this script (Similar to the solution here):
SELECT (ST_intersection(a.geom, b.geom))
INTO Intersecting_parts _table
FROM t1 a
INNER JOIN t1 b ON ST_Intersects (a.geom,b.geom)
WHERE a.id < b.id
THE PROBLEM I'M STRUGGLING WITH:
I want the table with the intersecting parts (table b) to hold attributes from the original polygons, so anyone exploring new table can retrace the intersection to the originals. Furthermore, database-wise, I know it is better to put these attributes in a new relationship-table, and not in table b).
The process and table schematics:

So, I've put in the figure below a schematic of the new table I want to create (table (c)).
I tried doing this:
SELECT ST_intersection(a.geom, b.geom), a.*
INTO Intersecting_parts_table
FROM t1 a
INNER JOIN t1 b ON ST_Intersects (a.geom,b.geom)
WHERE a.id < b.id
But of course – In the simple case although there were only 2 intersecting polygons, it returns only the attributes of one of them, randomly, which clearly does not meet my needs.
But, I think I'm stuck in the basic understanding:
It seems to me that as the ST_Intersection geographic operator (and ST_Overlaps, ST_Intersects and so on) works on whole tables, they are not the answer. They can't return attributes from two polygons at once (or I don't understand how to do it).
I tried extracting the attributes using a point derived from ST_PointOnSurface (and not ST_centroid), but didn't get very far with it).
I'm using PostGIS 2.3 and PostgreSQL 9.6.1.
postgis polygon attribute-table intersection overlapping-features
gis.stackexchange.com/questions/186242/…
– Cyril
11 hours ago
add a comment |
I have a PostGIS table containing about 50,000 polygons and some of them are overlapping.
I'm trying to use PostGIS to return a table with all the Intersecting parts of the polygons along with some of the attributes of the original polygons.
To get the Intersecting parts table (table (b) in the figure below), I use this script (Similar to the solution here):
SELECT (ST_intersection(a.geom, b.geom))
INTO Intersecting_parts _table
FROM t1 a
INNER JOIN t1 b ON ST_Intersects (a.geom,b.geom)
WHERE a.id < b.id
THE PROBLEM I'M STRUGGLING WITH:
I want the table with the intersecting parts (table b) to hold attributes from the original polygons, so anyone exploring new table can retrace the intersection to the originals. Furthermore, database-wise, I know it is better to put these attributes in a new relationship-table, and not in table b).
The process and table schematics:

So, I've put in the figure below a schematic of the new table I want to create (table (c)).
I tried doing this:
SELECT ST_intersection(a.geom, b.geom), a.*
INTO Intersecting_parts_table
FROM t1 a
INNER JOIN t1 b ON ST_Intersects (a.geom,b.geom)
WHERE a.id < b.id
But of course – In the simple case although there were only 2 intersecting polygons, it returns only the attributes of one of them, randomly, which clearly does not meet my needs.
But, I think I'm stuck in the basic understanding:
It seems to me that as the ST_Intersection geographic operator (and ST_Overlaps, ST_Intersects and so on) works on whole tables, they are not the answer. They can't return attributes from two polygons at once (or I don't understand how to do it).
I tried extracting the attributes using a point derived from ST_PointOnSurface (and not ST_centroid), but didn't get very far with it).
I'm using PostGIS 2.3 and PostgreSQL 9.6.1.
postgis polygon attribute-table intersection overlapping-features
I have a PostGIS table containing about 50,000 polygons and some of them are overlapping.
I'm trying to use PostGIS to return a table with all the Intersecting parts of the polygons along with some of the attributes of the original polygons.
To get the Intersecting parts table (table (b) in the figure below), I use this script (Similar to the solution here):
SELECT (ST_intersection(a.geom, b.geom))
INTO Intersecting_parts _table
FROM t1 a
INNER JOIN t1 b ON ST_Intersects (a.geom,b.geom)
WHERE a.id < b.id
THE PROBLEM I'M STRUGGLING WITH:
I want the table with the intersecting parts (table b) to hold attributes from the original polygons, so anyone exploring new table can retrace the intersection to the originals. Furthermore, database-wise, I know it is better to put these attributes in a new relationship-table, and not in table b).
The process and table schematics:

So, I've put in the figure below a schematic of the new table I want to create (table (c)).
I tried doing this:
SELECT ST_intersection(a.geom, b.geom), a.*
INTO Intersecting_parts_table
FROM t1 a
INNER JOIN t1 b ON ST_Intersects (a.geom,b.geom)
WHERE a.id < b.id
But of course – In the simple case although there were only 2 intersecting polygons, it returns only the attributes of one of them, randomly, which clearly does not meet my needs.
But, I think I'm stuck in the basic understanding:
It seems to me that as the ST_Intersection geographic operator (and ST_Overlaps, ST_Intersects and so on) works on whole tables, they are not the answer. They can't return attributes from two polygons at once (or I don't understand how to do it).
I tried extracting the attributes using a point derived from ST_PointOnSurface (and not ST_centroid), but didn't get very far with it).
I'm using PostGIS 2.3 and PostgreSQL 9.6.1.
postgis polygon attribute-table intersection overlapping-features
postgis polygon attribute-table intersection overlapping-features
edited yesterday
JGH
13.3k21139
13.3k21139
asked yesterday
jonatrjonatr
1,85053051
1,85053051
gis.stackexchange.com/questions/186242/…
– Cyril
11 hours ago
add a comment |
gis.stackexchange.com/questions/186242/…
– Cyril
11 hours ago
gis.stackexchange.com/questions/186242/…
– Cyril
11 hours ago
gis.stackexchange.com/questions/186242/…
– Cyril
11 hours ago
add a comment |
1 Answer
1
active
oldest
votes
The query used to find the intersection adds the clause WHERE a.id < b.id to ensure that an intersection between two polygons is reported once only (A intersects B, and ignores B intersects A).
It is invalid to consider an intersections as being related to a single polygon... they must include two polygons.
It is important to note that since st_intersects returns a boolean, using it in the JOIN clause allows retrieving the complete rows from the two tables, just like a join on id1 = id2.
What you can do is to record the involved polygons IDs while computing the intersection:
SELECT ST_intersection(a.geom, b.geom), a.id as id1, b.id as id2
FROM t1 a
INNER JOIN t1 b ON ST_Intersects (a.geom,b.geom)
WHERE a.id < b.id
It is then easy to join on the original data to get more information about the original polygon.
To produce the table having one source polygon per row, you can union two joins on the source table.
In pseudo code:
SELECT inter_section.name, source.id, source.pop
FROM inter_section
JOIN source ON inter_section.id1 = source.id
UNION
SELECT inter_section.name,source.id, source.pop
FROM inter_section
JOIN source ON inter_section.id2 = source.id
I didn't understand the pseudo-code part, as my join is based on spatial relationships, not on a id... if I do a "regular join" based on a field, each inter_section hold the ID of two polygons...
– jonatr
yesterday
As per the approach in your question, you would do it in two steps: 1) compute the intersection and record the 2 involved polygon ID and 2) join this table of intersection, by ID, to the source table
– JGH
yesterday
add a comment |
Your Answer
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "79"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);
else
createEditor();
);
function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fgis.stackexchange.com%2fquestions%2f317004%2fgetting-attributes-of-intersected-polygons-using-postgis%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
The query used to find the intersection adds the clause WHERE a.id < b.id to ensure that an intersection between two polygons is reported once only (A intersects B, and ignores B intersects A).
It is invalid to consider an intersections as being related to a single polygon... they must include two polygons.
It is important to note that since st_intersects returns a boolean, using it in the JOIN clause allows retrieving the complete rows from the two tables, just like a join on id1 = id2.
What you can do is to record the involved polygons IDs while computing the intersection:
SELECT ST_intersection(a.geom, b.geom), a.id as id1, b.id as id2
FROM t1 a
INNER JOIN t1 b ON ST_Intersects (a.geom,b.geom)
WHERE a.id < b.id
It is then easy to join on the original data to get more information about the original polygon.
To produce the table having one source polygon per row, you can union two joins on the source table.
In pseudo code:
SELECT inter_section.name, source.id, source.pop
FROM inter_section
JOIN source ON inter_section.id1 = source.id
UNION
SELECT inter_section.name,source.id, source.pop
FROM inter_section
JOIN source ON inter_section.id2 = source.id
I didn't understand the pseudo-code part, as my join is based on spatial relationships, not on a id... if I do a "regular join" based on a field, each inter_section hold the ID of two polygons...
– jonatr
yesterday
As per the approach in your question, you would do it in two steps: 1) compute the intersection and record the 2 involved polygon ID and 2) join this table of intersection, by ID, to the source table
– JGH
yesterday
add a comment |
The query used to find the intersection adds the clause WHERE a.id < b.id to ensure that an intersection between two polygons is reported once only (A intersects B, and ignores B intersects A).
It is invalid to consider an intersections as being related to a single polygon... they must include two polygons.
It is important to note that since st_intersects returns a boolean, using it in the JOIN clause allows retrieving the complete rows from the two tables, just like a join on id1 = id2.
What you can do is to record the involved polygons IDs while computing the intersection:
SELECT ST_intersection(a.geom, b.geom), a.id as id1, b.id as id2
FROM t1 a
INNER JOIN t1 b ON ST_Intersects (a.geom,b.geom)
WHERE a.id < b.id
It is then easy to join on the original data to get more information about the original polygon.
To produce the table having one source polygon per row, you can union two joins on the source table.
In pseudo code:
SELECT inter_section.name, source.id, source.pop
FROM inter_section
JOIN source ON inter_section.id1 = source.id
UNION
SELECT inter_section.name,source.id, source.pop
FROM inter_section
JOIN source ON inter_section.id2 = source.id
I didn't understand the pseudo-code part, as my join is based on spatial relationships, not on a id... if I do a "regular join" based on a field, each inter_section hold the ID of two polygons...
– jonatr
yesterday
As per the approach in your question, you would do it in two steps: 1) compute the intersection and record the 2 involved polygon ID and 2) join this table of intersection, by ID, to the source table
– JGH
yesterday
add a comment |
The query used to find the intersection adds the clause WHERE a.id < b.id to ensure that an intersection between two polygons is reported once only (A intersects B, and ignores B intersects A).
It is invalid to consider an intersections as being related to a single polygon... they must include two polygons.
It is important to note that since st_intersects returns a boolean, using it in the JOIN clause allows retrieving the complete rows from the two tables, just like a join on id1 = id2.
What you can do is to record the involved polygons IDs while computing the intersection:
SELECT ST_intersection(a.geom, b.geom), a.id as id1, b.id as id2
FROM t1 a
INNER JOIN t1 b ON ST_Intersects (a.geom,b.geom)
WHERE a.id < b.id
It is then easy to join on the original data to get more information about the original polygon.
To produce the table having one source polygon per row, you can union two joins on the source table.
In pseudo code:
SELECT inter_section.name, source.id, source.pop
FROM inter_section
JOIN source ON inter_section.id1 = source.id
UNION
SELECT inter_section.name,source.id, source.pop
FROM inter_section
JOIN source ON inter_section.id2 = source.id
The query used to find the intersection adds the clause WHERE a.id < b.id to ensure that an intersection between two polygons is reported once only (A intersects B, and ignores B intersects A).
It is invalid to consider an intersections as being related to a single polygon... they must include two polygons.
It is important to note that since st_intersects returns a boolean, using it in the JOIN clause allows retrieving the complete rows from the two tables, just like a join on id1 = id2.
What you can do is to record the involved polygons IDs while computing the intersection:
SELECT ST_intersection(a.geom, b.geom), a.id as id1, b.id as id2
FROM t1 a
INNER JOIN t1 b ON ST_Intersects (a.geom,b.geom)
WHERE a.id < b.id
It is then easy to join on the original data to get more information about the original polygon.
To produce the table having one source polygon per row, you can union two joins on the source table.
In pseudo code:
SELECT inter_section.name, source.id, source.pop
FROM inter_section
JOIN source ON inter_section.id1 = source.id
UNION
SELECT inter_section.name,source.id, source.pop
FROM inter_section
JOIN source ON inter_section.id2 = source.id
edited yesterday
answered yesterday
JGHJGH
13.3k21139
13.3k21139
I didn't understand the pseudo-code part, as my join is based on spatial relationships, not on a id... if I do a "regular join" based on a field, each inter_section hold the ID of two polygons...
– jonatr
yesterday
As per the approach in your question, you would do it in two steps: 1) compute the intersection and record the 2 involved polygon ID and 2) join this table of intersection, by ID, to the source table
– JGH
yesterday
add a comment |
I didn't understand the pseudo-code part, as my join is based on spatial relationships, not on a id... if I do a "regular join" based on a field, each inter_section hold the ID of two polygons...
– jonatr
yesterday
As per the approach in your question, you would do it in two steps: 1) compute the intersection and record the 2 involved polygon ID and 2) join this table of intersection, by ID, to the source table
– JGH
yesterday
I didn't understand the pseudo-code part, as my join is based on spatial relationships, not on a id... if I do a "regular join" based on a field, each inter_section hold the ID of two polygons...
– jonatr
yesterday
I didn't understand the pseudo-code part, as my join is based on spatial relationships, not on a id... if I do a "regular join" based on a field, each inter_section hold the ID of two polygons...
– jonatr
yesterday
As per the approach in your question, you would do it in two steps: 1) compute the intersection and record the 2 involved polygon ID and 2) join this table of intersection, by ID, to the source table
– JGH
yesterday
As per the approach in your question, you would do it in two steps: 1) compute the intersection and record the 2 involved polygon ID and 2) join this table of intersection, by ID, to the source table
– JGH
yesterday
add a comment |
Thanks for contributing an answer to Geographic Information Systems Stack Exchange!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fgis.stackexchange.com%2fquestions%2f317004%2fgetting-attributes-of-intersected-polygons-using-postgis%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
gis.stackexchange.com/questions/186242/…
– Cyril
11 hours ago