28 views (last 30 days)

Hi,

I am having some difficulties assigning points to multiple polygons. Lets say I have a table with the polygons information:

% Polygons coordinates

poly_name = ['A', 'A', 'A', 'A', 'A', 'A', nan, 'B', 'B', 'B', 'B'].';

poly_latitude = [49.36, 48.87, 48.06, 48.26, 49.3, 49.36, nan, 48.9, 50.41, 50.35, 48.9].';

poly_longitude = [-67.65, -67.2, -69.17, -69.64, -68.24, -67.65, nan, -60.53, -60.45, -65.15, -60.53].';

Y = table(poly_name, poly_latitude, poly_longitude)

and lets say I have another table with the points information

% Points coordinates

points_latitude = [48.44, 48.16].';

points_longitude = [-69.25, -69.58].';

Z = table(points_latitude, points_longitude)

How can I assign a polygons name to each point so the output looks like this?

% Desired output

points_latitude = [48.44, 48.16].';

points_longitude = [-69.25, -69.58].';

poly_name = ['A', 'A'].';

output = table(points_latitude, points_longitude, poly_name)

Please note that I do not have the mapping toolbox

Guillaume
on 5 Aug 2019

There is no point iterating over each point and each polygon. You can pass all the points at once to inpolygon. Here's how I'd implement it. I'm starting with a table of polygon with one polygon per row and stored as a polyshape, such as the one I showed in my comment above:

poly2s = rowfun(@(lat, lon) polyshape(lat, lon), rmmissing(Y), 'GroupingVariables', 'poly_name', 'OutputVariableNames', 'polygon');

%DO check that the order of the points has been preserved. This is not guaranteed (and may change in different versions of matlab).

poly2s.GroupCount = []

It would be better if the table was constructed that way to start with.

With that, and your Z table:

Z.inpoly = repmat({''}, height(Z), 1); %create column indicating which polygon the point belongs to.

for row = 1:height(poly2s) %iterate over each polygon

vertices = poly2s.polygon(row).Vertices; %get the polygon vertices

[in, on] = inpolygon(Z.points_latitude, Z.points_longitude, vertices(:, 1), vertices(:, 2)); %find which points are inside/on the polygon

Z.inpoly(in | on) = {poly2s.poly_name(row)}; %mark the points in/on the polygon as belonging to that polygon

end

Note that if a point belongs to more than one polygon, it'll be marked as belonging to just one.

Akira Agata
on 5 Aug 2019

Looking at your data, one of the Points is outside of the convex hull of polygon A's coordinates. So "inpolygon" function will not work in your case.

How about finding k-nearest neighbors instead? The following is an example.

% Find k-nearest neighbors

idx = knnsearch(...

Y{:,{'poly_longitude','poly_latitude'}},...

Z{:,{'points_longitude','points_latitude'}});

% Arrange output table

output = Z(:,{'points_latitude','points_longitude'});

output.poly_name = Y.poly_name(idx);

>> output

output =

2×3 table

points_longitude points_latitude poly_name

________________ _______________ _________

-69.25 48.44 A

-69.58 48.16 A

Opportunities for recent engineering grads.

Apply TodayFind the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!
## 2 Comments

## Direct link to this comment

https://au.mathworks.com/matlabcentral/answers/474823-how-to-assign-points-to-multiple-polygons-using-inpolygon#comment_732006

⋮## Direct link to this comment

https://au.mathworks.com/matlabcentral/answers/474823-how-to-assign-points-to-multiple-polygons-using-inpolygon#comment_732006

## Direct link to this comment

https://au.mathworks.com/matlabcentral/answers/474823-how-to-assign-points-to-multiple-polygons-using-inpolygon#comment_732020

⋮## Direct link to this comment

https://au.mathworks.com/matlabcentral/answers/474823-how-to-assign-points-to-multiple-polygons-using-inpolygon#comment_732020

Sign in to comment.