How to assign points to multiple polygons using inpolygon
이전 댓글 표시
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
댓글 수: 2
What if a point is in inside multiple polygons?
What if a point is in inside none?
I think your storage of the polygons is slightly problematic. You may be better aggregating all the coordinates of the same polygon in just one row. While the aggregation can be done on the fly by matlab (e.g. with rowfun and the 'GroupingVariables' option), the aggregation functions are not guaranteed to respect the ordering of the data. In your table the row ordering is critical.
Therefore I would transform your Y table into something similar to:
polys = varfun(@(in) {in}, rmmissing(Y), 'GroupingVariables', 'poly_name');
%DO check that the order of the points has been preserved. This is not guaranteed (and may change in different versions of matlab).
polys.GroupCount = [];
polys.Properties.VariableNames = {'name', 'longitude', 'latitude'}
or
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 = []
The latter one has the advantage that it's easy to plot:
figure; hold on; rowfun(@plot, poly2s, 'InputVariables', 'polygon');
%or for a legend:
figure; hold on; rowfun(@(name, poly) plot(poly, 'DisplayName', name), poly2s); legend('show');
Blue
2019년 8월 5일
채택된 답변
추가 답변 (1개)
Akira Agata
2019년 8월 5일
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
댓글 수: 2
카테고리
도움말 센터 및 File Exchange에서 NaNs에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!