利用Matlab判断某些点是否在多边形区域内

目录

 1. 代码作用及实现效果

 2. 技术分析:        

  3. 程序

1. 代码作用及实现效果

        先给各位看看具体效果,如下所示,其中红色的点表示需要判断的点,是否在蓝色区域内,从图中可知,有两个点在蓝色区域内,一个点在边界线上,一个在蓝色区域外。

 2. 技术分析:        

       

原理:射线法;从该点假想一条通向无穷远的射线,通过判断射线与多边形交点的个数奇偶来确定点与多边形的位置关系。具体原理详解可自行百度;

 可以利用Matlab内置的函数inpolygon,也可以写一个函数,加强自己的理解;

inpolygon函数用法:

   in = inpolygon(xq,yq,xv,yv)[in,on] = inpolygon(xq,yq,xv,yv)

  3. 程序

        下面是我根据射线法写的代码:该代码可以判断点是否在这个区域(包含边界线)上,是则输出1;反之则输出0。然后提取输出为1的索引,并找出对应的点坐标;

function Flags = inPoly(Site_Ponit,Area)
%==================================说明====================================
%   判定点目标是否在区域内函数
%   函数作用:判断点坐标是否在所需的区域内
%
%   作者:胡礼珍
%   单位:厦门大学联合遥感接收站
%   邮件:hulizhen@xmu.edu.cn
%
%   输入:
%       Site_Ponit      需要判断的点的位置坐标,n×2矩阵;
%       Area            面状区域,多边形各个顶点位置坐标(可以是经纬度),n×2矩阵;
%   输出:
%       OutImage    输出一个二维矩阵
%       ImageName   将输出的矩阵保存为文件
%
%   语法:
%   flags = inPoly(Site_Ponit,Area):
%           Site_Ponit表示需要判断的点的位置坐标,n×2矩阵;Area表示面状区域,
%           多边形各个顶点位置坐标(可以是经纬度),m×2矩阵;
%--------------------------------------------------------------------------
%   参考博客:https://blog.csdn.net/ye_xiao_yu/article/details/72765726
%==========================================================================
if ~(Area(1,:) == Area(end,:))errordlg('首尾点不相等,请确认区域是否为面状区域。如果是,请忽略;否则,请核对重新运行;','警告:输入可能有误')Area = [Area;Area(1,:)];
endNum_Piont = size(Site_Ponit,1);     % Site_Ponit的行数,也表示检测点的个数
Num_Area = size(Area,1);            % Area的行数,也表示多边形顶点数+1
Flags = zeros(1,Num_Piont);         % 新建存储空间,存放判定结果0和1,初始全为0
% h = waitbar(0,'运行……');          % 新建进度条
for i=1:Num_Piont% 添加一个进度条,显示进展
%    per = fix(i/Num_Piont*10000)/100;                  % 完成度
%    str=['点目标判断函数-完成: ',num2str(per),' % '];  % 进度条上显示的内容
%    waitbar(i/Num_Piont,h,str);if ~isempty(find(Area(:,1)==Site_Ponit(i,1)& ...Area(:,2)==Site_Ponit(i,2), 1))             % 判定点是否在顶点上Flags(i) = 1;               % 符合要求,判定为1continue;                   % 结束本次循环,进行下一次循环end% 射线法:从该点假想一条通向无穷远的射线,通过判断射线与多边形交点的个数奇偶来确定点与多边形的位置关系。% 参考:https://blog.csdn.net/bitcarmanlee/article/details/60591192for j=2:Num_Area% 条件A= 条件01 或 条件02%      = (条件11 与 条件12)% 条件01 = (条件11 与 条件12) 或%        = (Area(j,2)<=Site_Ponit(i,2)) && (Site_Ponit(i,2) < Area(j-1,2))% 条件11:(Area(j,2)<=Site_Ponit(i,2))% 条件12:(Site_Ponit(i,2) < Area(j-1,2))% 条件02 = (条件21 与 条件22)%        = ((Area(j-1,2) <= Site_Ponit(i,2)) && (Site_Ponit(i,2) < Area(j,2)))% 条件21:(Area(j-1,2) <= Site_Ponit(i,2))% 条件22:(Site_Ponit(i,2) < Area(j,2))% 条件B:Site_Ponit(i,1) < (Area(j-1,1) - Area(j,1)) * (Site_Ponit(i,2) - Area(j,2))/(Area(j-1,2)-Area(j,2)) + Area(j,1);if (...(...        % 判断:条件A = 条件01 或 条件02 (...        % 判断:条件01 =(条件11 与 条件12)(Area(j,2)<=Site_Ponit(i,2)) && (Site_Ponit(i,2) < Area(j-1,2))...)...||...   % ********************“或”*******************(...        % 判断:条件02 = (条件21 与 条件22)(Area(j-1,2) <= Site_Ponit(i,2)) && (Site_Ponit(i,2) < Area(j,2))...)...)...   % ----------------------条件A----------------------&& ...  % **********************“与”*********************(...Site_Ponit(i,1) < ...(Area(j-1,1) - Area(j,1)) * (Site_Ponit(i,2) - Area(j,2))/...(Area(j-1,2)-Area(j,2)) +...Area(j,1)...)...   % ----------------------条件B----------------------)Flags(i) = Flags(i) + 1;    % 交点数累加,最后根据奇偶判定是否在其中endend
end
% close(h);               % 关闭进度条
Flags = mod(Flags,2);   % 分裂后剩余,判断奇数偶数,奇数则表示在,偶数则表示不在
end

        调用验证上面函数的代码如下:

clear;close all;clc;
% 设置3个点,第1个点和第二个点在区域内,第三个点不在区域内,第四个点在边界线上
P = [116.5412066049,25.2741767057;116.2906735589,25.4947457375;115.5006735589,24.4947457375;117.9292952035,26.1752619468];      % 需要检测的点
Poly = [118.0562474131,25.521042552;117.9292952035,26.1752619468;115.4280709351,25.7592188999;115.7898649526,24.0756121845;117.7748394579,24.4133199012;117.5551745295,25.4373847646;118.0562474131,25.521042552];   % 判定区域的范围  
% 第一种方法,自己编写函数
tic
flags = inPoly(P,Poly);                 % 判定点目标是否在区域内函数
In_P = P(flags== 1,:)            % 根据判定,找出在判定区域内的点坐标
tocfigure('Name','效果图1')fill(Poly(:,1),Poly(:,2),'b');
title('判断点目标是否在该区域范围内')
hold on
scatter(P(:,1),P(:,2),'r.')
hold offtic
% 第二种方法,用内置函数 inpolygon
flags = inpolygon(P(:,1),P(:,2),Poly(:,1),Poly(:,2));
In_P = P(flags== 1,:)            % 根据判定,找出在判定区域内的点坐标
toc                              % 
% 自己写的,速度差不多,说明还是成功的

不足之处,敬请斧正!

转载请说明出处!

路漫漫其修远兮,吾将上下而求索

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/246502.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

spark1.0和2.0的区别_【系统】华为正式发布鸿蒙OS 2.0手机Beta版:UI界面、交互无区别...

今天上午&#xff0c;华为正式发布了鸿蒙OS 2.0手机开发者Beta版本&#xff0c;HarmonyOS 是面向万物互联时代的全场景分布式操作系统&#xff0c;华为希望和合作伙伴、开发者一起打造面向万物互联时代的超级终端体验。目前也已经开启了公测招募活动&#xff0c;不过报名还是有…

Matlab 纯代码进行GUI界面编程

Matlab界面编程传统的有guide&#xff0c;现在matlab朝着appdesigner方向发展。这两种方法都是非常简单适合新手的&#xff0c;如果是一个未接触这方面的&#xff0c;我建议直接学APPdesigner&#xff0c;如果想了解更深入&#xff0c;可以尝试利用纯代码进行编程。 编程要点…

深入到系统组件是否白盒测试_2019年系统集成项目管理工程师:第一章 信息化知识(三)要点?...

今天幸福哥助理继续为大家分享第一章 第三节 信息化知识(二) 信息系统设计、软件工程及面向对象系统分析与设计等复习知识要点&#xff0c;备考笔记知识点的分享会不定期整理&#xff0c;如果你正好参加这个考试&#xff0c;可以关注我&#xff0c;收藏&#xff0c;或者转发。一…

IDL 文本编码、代码补全快捷方式、IDL doc、格式器、行号显示设置

目录 1. 文本文件编码设置 2. 自动补全设置 3. IDL doc设置 4. 格式器设置 5. 显示行号 每种编程语言的某些设置&#xff08;快捷键、显示风格&#xff09;都大相径庭&#xff0c;因此需要需要对一些显示&#xff0c;使得更符合自己的编程习惯&#xff0c;方便用起来得心…

IDL学习(对象):IDLffShape

目录 一、描述 二、创建 三、属性 3.1 ATTRIBUTE_INFO 3.2 ATTRIBUTE_NAMES 3.3 DBF_ONLY 3.4 ENTITY_TYPE 3.5 FILENAME 3.6 IS_OPEN 3.7 N_ATTRIBUTES 3.8 N_ENTITIES 3.9 N_RECORDS 3.10 UPDATE 四、方法&#xff1a; 4.1 IDLffShape::AddAttribute 4.2 IDLff…

tablueau地图标记圆形_30天30张中国风地图,从青绿山水到秦砖汉瓦

本文来自#30天制图挑战#的GISer November_阿瑜瑜瑜瑜&#xff0c;完成了30幅中国风专辑地图&#xff0c;唯美又有韵味&#xff0c;十分赏心悦目&#xff0c;简直把中国风玩出了花~接下来&#xff0c;快来跟着小编一起细品30幅中国风地图吧~~~ 01day 1千里江山图《千里江山图》是…

IDL学习:语法基础-变量

目录 1. 变量命名规则 2. 数据类型 3. 基本操作 3.1 数据类型选择 3.2 改变数据类型 3.3 科学计数法 1. 变量命名规则 与其他编程语言一样&#xff0c;IDL也有自己的变量命名规则&#xff1a; 字符规则&#xff1a;首字母必须是26个英文字母&#xff0c;且只能由字母、数…

语言省考安徽考区_安徽省中小学新任教师公开招聘统一笔试 中学信息技术学科考试大纲...

一、考试性质安徽省中小学新任教师公开招聘考试为全省统一组织的公开性选拔考试&#xff0c;是落实“省考、县管、校用”教师管理体制的基础工作。其目的是吸引有志于从事基础教育事业的优秀人才到中小学任教&#xff0c;进一步规范中小学新任教师公开招聘工作&#xff0c;把好…

IDL学习:语法基础-数组

目录 1. 创建数组 1.1 直接创建 1. 2 利用函数创建 2. 数组索引 3. 数组操作 3.1 数组的信息 3.2 数组维度变化 3.3 数组的最大值和最小值 3.4 数组方差、均值、标准差、总和运算 3.5 数组元素筛选及重新赋值 3.6 数组元素的排序 3.7 数组间比较 4. 数组运算 4.…

amd为什么还用针脚_为什么AMD不取消cpu上的针脚?

在过去&#xff0c;AMD的速龙系列处理器也使用了LGA触点式接口。包括AMD的皓龙在内的一系列服务器处理器也使用类似于英特尔的LGA接口&#xff0c;但AMD多年来一直在消费级CPU上使用针脚式接口。这样做很好&#xff1f;为什么&#xff1f;这是因为在Intel切换到触点式接口之后&…

IDL学习:语法基础-字符串

1. 创建字符串 IDL中可以用单引号‘’或双引号""来创建字符转 >>a hlz >>b "hlz" >>a eq b1 创建字符串数组&#xff0c;可以利用中括号[]和逗号,相组合的方式进行创建 >>a [Hlz,XMU,厦门] >>a Hlz XMU 厦门 &g…

epoll监听文件_epoll使用详解

epoll介绍epoll的行为与poll(2)相似&#xff0c;监视多个有IO事件的文件描述符。epoll除了提供select/poll那种IO事件的水平触发(Level Triggered)外&#xff0c;还提供了边缘触发(Edge Triggered)&#xff0c;这就使得用户空间程序有可能缓存IO状态&#xff0c;减少epoll_wait…

IDL学习:语法基础-结构体

结构体是由一批数据组合而成的结构型数据。组成结构型数据的每个数据称为结构型数据的“属性”&#xff08;亦称之为“成员”&#xff09;&#xff0c;这些成员可以是变量、数组、字符串以及结构等类型数据。IDL中常用于函数返回值&#xff08;PS&#xff1a;因为IDL中函数最多…

hdfs数据节点分发什么协议_分布式文件系统HDFS解析

Hadoop 主要由HDFS和MapReduce 引擎两部分组成。最底部是HDFS&#xff0c;它存储Hadoop 集群中所有存储节点上的文件。HDFS 的上一层是MapReduce 引擎&#xff0c;该引擎由JobTrackers 和TaskTrackers组成。一、HDFS基本概念1、数据块HDFS默认的最基本的存储单位是64M的数据块&…

IDL学习:语法基础-指针、链表

本博客将介绍IDL语法基础中的指针、链表的创建及相关的用法。记录自己的学习整理理解 。 1. 指针 指针也就是内存地址&#xff0c;是用来存放内存地址的变量&#xff0c;指针可以理解为通讯地址&#xff0c;可以通过通讯地址查询具体的信息&#xff0c;而指针可以查询所指向的…

计算机等级考试java题型_计算机二级考试《java》试题及答案

计算机二级考试《java》试题及答案2017下半年计算机二级考试将于9月23日-26日举行&#xff0c;下面是小编为大家整理的计算机二级考试《java》试题及答案&#xff0c;欢迎参考~计算机二级考试《java》试题及答案一、判断题1. Java语言中的数组元素下标总是从0开始&#xff0c;下…

IDL学习:语法基础-对象、哈希表

本博客将介绍IDL语法基础中的对象、哈希表的创建及相关的操作发法。哈希表、链表都可以看做对象&#xff0c;包含了add、reserve、Sort等方法。记录自己的学习整理理解 。 1. 对象 对象是数据&#xff08;属性&#xff09;和程序&#xff08;方法&#xff09;封装在一起的实体…

hdfs中8031是什么端口号_在宿主机如何访问docker中hadoop的hdfs:ip:9000啊, 端口映射出来啊...

本人有一个3节点hadoop, 启动了3个docker容器, 众所周知, docker容器内服务的端口是可以映射到宿主机的端口的, 我采用-P将容器的所有端口映射到主机端口, 命令如下:docker run -it -v /Users/yc/hadoop/docker:/test -P -h h1 --name h1 sequenceiq/hadoop-docker /etc/bootst…

linux nginx安启动_linux下nginx编译安装启动

1、在指定目录解压包命令&#xff1a;tar -zxvf nginx-1.10.3.tar.gz解压后&#xff0c;在nginx-1.10.3同级目录下&#xff0c;创建nginx目录(编译安装目录)2、编译安装nginx是需要编译安装&#xff0c;在nginx-1.10.3目录下执行命令命令&#xff1a; ./configure --prefix/usr…

linux怎样自制库_如何制作自己的LINUX系统?

创建工作目录使用busybox生成根文件系统中的bin等目录创建服务启动脚本与inittab文件与fstab文件创建根文件系统的init脚本(initrc使用linuxrc&#xff0c;而initramfs使用init脚本&#xff0c;所以先删除busybox为initrc生成的默认的linuxrc文件&#xff0c;rm-rf$LINUX/linux…