This example shows how to overlay polygons using set logic. The polybool
function can perform standard set operations, such as intersection, union, subtraction, and exclusive OR, on two sets of vectors, which can represent x-y or latitude-longitude coordinate pairs. For more information, see Polygon Set Logic.
To illustrate these set operations, create a 12-sided polygon and a triangle that overlaps it.
az = (0:pi/6:2*pi)'; lat1 = cos(az); lon1 = sin(az); lat2 = [0 1 -1 0]'; lon2 = [0 2 2 0]';
Plot the two shapes together with blue and red lines. Compute the intersection polygon using polybool
and plot it using geoshow
.
figure axesm miller plotm(lat1,lon1,'b') plotm(lat2,lon2,'r') [loni,lati] = polybool('intersection',lon1,lat1,lon2,lat2); [lati loni]
ans = 5×2
0.0000 1.0000
-0.4409 0.8819
0.0000 0
0.4409 0.8819
0.0000 1.0000
geoshow(lati,loni,'DisplayType','polygon')
Plot the two shapes together with blue and red lines. Compute the union polygon using polybool
and plot it using geoshow
.
figure axesm miller plotm(lat1,lon1,'b') plotm(lat2,lon2,'r') [lonu,latu] = polybool('union',lon1,lat1,lon2,lat2); [latu lonu]
ans = 16×2
-1.0000 2.0000
-0.4409 0.8819
-0.5000 0.8660
-0.8660 0.5000
-1.0000 0.0000
-0.8660 -0.5000
-0.5000 -0.8660
0.0000 -1.0000
0.5000 -0.8660
0.8660 -0.5000
⋮
geoshow(latu,lonu,'DisplayType','polygon')
Plot the two shapes together with blue and red lines. Compute the Exclusive-Or polygon using polybool
and plot it using geoshow
.
figure axesm miller plotm(lat1,lon1,'b') plotm(lat2,lon2,'r') [lonx,latx] = polybool('xor',lon1,lat1,lon2,lat2); [latx lonx]
ans = 22×2
-1.0000 2.0000
-0.4409 0.8819
-0.5000 0.8660
-0.8660 0.5000
-1.0000 0.0000
-0.8660 -0.5000
-0.5000 -0.8660
0.0000 -1.0000
0.5000 -0.8660
0.8660 -0.5000
⋮
geoshow(latx,lonx,'DisplayType','polygon')
Plot the two shapes together with blue and red lines. Subtract the Exclusive-Or triangle from the 12-sided polygon and plot the resulting concave polygon using geoshow
.
figure axesm miller plotm(lat1,lon1,'b') plotm(lat2,lon2,'r') [lonm,latm] = polybool('minus',lon1,lat1,lon2,lat2); [latm lonm]
ans = 15×2
0.8660 0.5000
0.5000 0.8660
0.4409 0.8819
0.0000 0
-0.4409 0.8819
-0.5000 0.8660
-0.8660 0.5000
-1.0000 0.0000
-0.8660 -0.5000
-0.5000 -0.8660
⋮
geoshow(latm,lonm,'DisplayType','polygon')