필터 지우기
필터 지우기

How can I create contour on non-regular shape such as maps?

조회 수: 1 (최근 30일)
Behrooz Daneshian
Behrooz Daneshian 2023년 3월 13일
답변: Kausthub 2023년 9월 5일
Hello all,
I have written a code in which the final aim is to provide contour map outlining frost depth on Alaska sate. For each weather station having specific lat. and long., I have estimated the probability that frost depth exceeds 1, 2 ,3, 4, and 5 feet (The first and second columns of "POFDE" are latitude and longitude respectively and columns 3 to 7 are showing the probability that frost depth exceeds 1 to 5 feet respectively) . Hence, I want to draw 5 contour maps, each showing the probabilties exceeding the mentioned depths. To do this, it is required to create a mesh on Alaska map and use scatteredInterpolant function to do interpolation between all existing weather station for which I estimated the probabilities. Can anyone help me in this regard?
In the code below, I created a mesh on a rectangular extending from minimum longitude to maximum longitude in the X direction, and from minimum latitude to maximum latitude in Y direction. However, that would cause to have contour lines in the water which is not acceptable.
Please use 'tl_2018_02_anrc.shp' file located in the shared zip folder for superimposing Alaska map. POFDE is also attached here.
clear
close all
clc
load('POFDE.mat');
S=shaperead('tl_2018_02_anrc.shp','UseGeoCoords',true);
data = cell2mat(POFDE);
%%%%%%generating mesh as query points based on the Alaska bounding box
X=linspace(-179.148909,-130.1,1500);
Y=linspace(51.214183,71.365162,1500);
[lon,lat] = meshgrid(X,Y);
for i = 1:(size(data, 2)-2)
figure
geoshow(S,"DisplayType","multipoint")
xlim([-179.148909,-130.1]);
ylim([51.214183,71.365162]);
I = scatteredInterpolant(data(:,[1 2]), data(:,i+2));
I.Method='linear';
I.ExtrapolationMethod='linear';
contourm(lat,lon,min(1,max(0,I(lat,lon))))
colorbar
title(['The probability of frost depth exceedance of \Omega_{\delta} = ' num2str(i) ' feet'])
exportgraphics(gca, sprintf('FrostPlot_%d_feet.png', i))
end

답변 (1개)

Kausthub
Kausthub 2023년 9월 5일
I understand that you want the contor lines only on the land and not in water. There are two possible workarounds:
  • Consider random coordinates provided in the S which can be accessed using S(i).Lat and S(i).Lon for creating “lon” and “lat” instead of using linspace. This will ensure all the points are inside Alaska.
for i = 1:12
idx = randi(size(S(i).Lat),[125,1]);
lon = [lon S(i).Lon(idx)];
lat = [lat S(i).Lat(idx)];
end
for j = 1:12
arr = S(j).BoundingBox;
arr = reshape(arr',[1,size(arr,1)*size(arr,2)]);
arr(3) = arr(3)-arr(1);
arr(4) = arr(4)-arr(2);
rectangle('position',arr);
end
I hope this helps and addresses your question regarding potting contour lines over non-regular shapes like maps!

카테고리

Help CenterFile Exchange에서 Surface and Mesh Plots에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by