我从mathworks中获得了以下代码,用于绘制美国地图:
figure; ax = usamap('conus');
states = shaperead('usastatelo', 'UseGeoCoords', true,...
'Selector',...
{@(name) ~any(strcmp(name,{'Alaska','Hawaii'})), 'Name'});
faceColors = makesymbolspec('Polygon',...
{'INDEX', [1 numel(states)], 'FaceColor', ...
polcmap(numel(states))}); %NOTE - colors are random
geoshow(ax, states, 'DisplayType', 'polygon', ...
'SymbolSpec', faceColors)
framem off; gridm off; mlabel off; plabel off
如果有人可以帮助我,我将不胜感激: 我想在分布在美国的概率分布(现在指数为指数,但可以修改任何其他分布)之后绘制1000点。这些聚类点需要与背景颜色区分开来,并且足够大。此外,我希望能够得到这些点的坐标1000点“(x,y)”用于其他计算。我将不胜感激任何帮助。此外,如果美国代码可以更高效,并且可以包括魁北克加拿大国家,那么也将非常感激。谢谢!
答案 0 :(得分:0)
首先,您需要创建一组随机坐标,并记住坐标应位于地图的范围(边界)中: 假设你在x方向上的范围是[xmin xmax] 在y方向,它是[ymin ymax]。
应从地图中提取最小值和最大值。 这就是我提取的内容。 1 - 如果您只是使用不良图像:
xmax = 2.354e6;
ymax = 5.478e6;
xmin = -1.984e6;
ymin = 2.674e6;
2-如果您使用map:
v=[];
allLat=[v states(:).LabelLat];
allLon=[v states(:).LabelLon];
xmin = min(allLon);
xmax = max(allLon);
ymin = min(allLat);
ymax = max(allLat);
然后你应该在区间[a,b]上从均匀分布中生成值。一般形式是这样的:
% r = a + (b-a).*rand(100,1); % don't need to run this line
您可以使用以下命令创建1000个随机分布的点:
X = xmin + (xmax-xmin).*rand(1000,1);
Y = ymin + (ymax-ymin).*rand(1000,1);
现在你有了你随机创建的点,然后简单的部分是绘制点。在此之前,您需要检查该点是否在特定地图内。
function v = checkPoint(x,y)
b = zeros(size(landareas));
for i = 1:max(size(landareas))
if x >= landareas(i).BoundingBox(1,1) && x <= landareas(i).BoundingBox(2,1) && y >= landareas(i).BoundingBox(1,2) && y <= landareas(i).BoundingBox(2,2)
b(i) = 1;
end
end
v = ~isempty(find(b==1))
(上述功能虽未优化)
所以你使用“checkPoint”函数检查你的点,如果返回值是v = 1,那么你绘制点,否则忽略该点。现在您可以使用以下命令:
plot(X,Y,'oy','MarkerSize',10)
此外,您可以稍后使用X和Y向量进行任何计算。
最后,您可以使用以下代码绘制您喜欢的世界的任何部分:
worldmap({'Canada','Usa'})
land = shaperead('landareas.shp', 'UseGeoCoords', true);
geoshow(land, 'FaceColor', [0.15 0.5 0.15])
cities = shaperead('worldcities', 'UseGeoCoords', true);
geoshow(cities, 'Marker', '.', 'Color', 'red')