判断一个面(Polygon)是不是矩形
判断一个面是不是矩形在GIS中很长用的功能,那么怎么判断一个面是不是矩形呢。
这里先要弄懂一些概念,面是什么,先看OGC标准的定义。

我的英文水平有限,(有翻译更好的请留言,如果翻译的准确将被采纳)大概的意思就是一个面(Polygon 后面说的面都指的是Polygon)是平面的,是由1个外边界和0或者多个内边界组成,每个内边界是一个多边形的孔。
这样还是抽象啊,上个图就清醒多了。
上面三个都是面,但是有一些特殊的情况,这里就不做深入讨论了,在不同的GIS框架中也有一点点小区别。
好了我们就判断这样的面是不是矩形。
//首先在这里声明一下,这里不是全都得代码,你要是copy肯能不能运行这里讲的是个思想也是个基本的思路,希望大家能根据我的思路写出自己的代码
public boolean isRectangle()
{
//首先判断外外环上是不是有5个点
if(outLine.getPointNum() != 5) return false;
//内环的数量只能是零
if(getNumInteriorRing() != 0) return false;
//取这个面的外包络线
Envelope envelope = getEnvelope();
//取出外包络线的宽和高
double envelopeHeight = envelope.getHeight();
double envelopeWidth = envelope.getWidth();
//这里为什么循环4次,因为面的定义是闭合的,闭合要求首点和末点相等,这个是GIS的知识
//这个for循环排出了一些情况。看图一
for (int i = 0 ; i < 5; i ++)
{
Coordinate coordinate = outLine.getPoint(i);
double x = coordinate.getX();
double y = coordinate.getY(); if (!(x == envelope.getMaxX() || x == envelope.getMinX()))
{
return false;
} if(!(y == envelope.getMaxY() || y == envelope.getMinY()))
{
return false;
}
}
//这里是本框架的特殊定义,线有外接矩形。
if (envelopeHeight == 0 || envelopeWidth == 0)
{
return true;
} Coordinate upCoor = outLine.getPoint(0);
Coordinate nextCoor = outLine.getPoint(1);
//因为计算机计算乘法比开方快,就选择了用乘法去进行进行
double doubleEnvelopeHeight = envelopeHeight * envelopeHeight;
double doubleEnvelopWidth = envelopeWidth * envelopeWidth;
//除了图一难道还要其他的情况
//请看图二
for (int i = 1; i < 4; i ++)
{
//a^2 + b^2 这里不进行开方计算,为了效率
double length = MathUtil.distanceTwoPointNoSquare(upCoor,nextCoor);
if (length > doubleEnvelopeHeight && length > doubleEnvelopWidth)
{
return false;
}
upCoor = outLine.getPoint(i);
nextCoor = outLine.getPoint(i+1);
} return true;
}

图一
for (int i = 0 ; i < 5; i ++)
{
Coordinate coordinate = outLine.getPoint(i);
double x = coordinate.getX();
double y = coordinate.getY(); if (!(x == envelope.getMaxX() || x == envelope.getMinX()))
{
return false;
} if(!(y == envelope.getMaxY() || y == envelope.getMinY()))
{
return false;
}
}
这个for选好排出了点不在外接矩形的顶点上的情况。

图二
for (int i = 1; i < 4; i ++)
{
//a^2 + b^2 这里不进行开方计算,为了效率
double length = MathUtil.distanceTwoPointNoSquare(upCoor,nextCoor);
if (length > doubleEnvelopeHeight && length > doubleEnvelopWidth)
{
return false;
}
upCoor = outLine.getPoint(i);
nextCoor = outLine.getPoint(i+1);
}
这个for循环式排出图二那种情况,每个点都在外接矩形的点上,(这里要特别的说明一下,有的GIS框架中点不能定义重复的点如最后面的三角形中最后两个点相同,大家不要有什么争议)。
作者 Young-Ken(微博)
审阅者 Cindy-Leee(微博)
转载请注明 http://www.cnblogs.com/youngKen/p/4987049.html
判断一个面(Polygon)是不是矩形的更多相关文章
- Android判断一个点是否在矩形区域内
个人遇到的问题判断按钮的点击事件还是滑动事件 private boolean button1Down = false; private boolean button2Down = false; pri ...
- js 判断一个点是否在一个多边形之内
出处: https://github.com/substack/point-in-polygon/blob/master/index.js github: https://github.com/sub ...
- Mysql中判断一个点是否落在多边形内
关于地理空间数据,经常需要处理两个空间数据的关联关系.有很多种方法可以处理,通过编写程序算法,或者是调用数据库中对应的function.在mysql数据库中,https://dev.mysql.com ...
- 2019-11-29-win10-uwp-如何判断一个控件在滚动条的里面是用户可见
原文:2019-11-29-win10-uwp-如何判断一个控件在滚动条的里面是用户可见 title author date CreateTime categories win10 uwp 如何判断一 ...
- 2019-4-29-win10-uwp-如何判断一个控件在滚动条的里面是用户可见
title author date CreateTime categories win10 uwp 如何判断一个控件在滚动条的里面是用户可见 lindexi 2019-04-29 10:40:33 + ...
- 2019-4-29-WPF-如何判断一个控件在滚动条的里面是用户可见
title author date CreateTime categories WPF 如何判断一个控件在滚动条的里面是用户可见 lindexi 2019-4-29 9:42:2 +0800 2019 ...
- Android 判断一个 View 是否可见 getLocalVisibleRect(rect) 与 getGlobalVisibleRect(rect)
Android 判断一个 View 是否可见 getLocalVisibleRect(rect) 与 getGlobalVisibleRect(rect) [TOC] 这两个方法的区别 View.ge ...
- excel批处理_判断一个名称是不是药品
把药品名称导入到sheet1的A字段 # -*- coding: utf-8 -*-"""Created on Fri Dec 9 09:38:58 2016判断一个名 ...
- 判断一个字符串str不为空的方法
1.str == null; 2."".equals(str); 3.str.length 4.str.isEmpty(); 注意:length是属性,一般集合类对象拥有的属性,取 ...
随机推荐
- 使用Web代理实现Ajax跨域
目前的工作项目分为前端和后台,双方事先约定接口,之后独立开发.后台每天开发完后在测试服务器上部署,前端连接测试服务器进行数据交互.前端和后台分开的好处是代码不用混在一个工程里一起build,互不干涉. ...
- SDUT 2527 斗地主
http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2527 思路 :以前的结训比赛,当时不会做,比完 ...
- Servlet中乱码问题
页面编码方式为utf-8 当使用post传值时 request.setContentType("utf-8"); 当使用get传值时 String str = request.ge ...
- cocos2d-html5 onEnter init ctor构造函数 ----js特有特性(和c++有一点不一样)
ctor 构造函数, new 一个对象的时候调用-----coco2d-js , 默认ctor,为对象的构造函数,其它也可以默认其它函数为构造函数. 说白了就是: ctor构造函数 new 对象后自动 ...
- live555源码研究(一)------live555MediaServer的启动过程和基本类图
live555MediaServer.cpp就是live555服务器启动的过程. 一.启动过程 1,构造运行环境,运行环境包括了TaskScheduler 2,构造鉴权数据,也就是登陆的用户名和密码等 ...
- 算法Sedgewick第四版-第1章基础-001递归
一. 方法可以调用自己(如果你对递归概念感到奇怪,请完成练习 1.1.16 到练习 1.1.22).例如,下面给出了 BinarySearch 的 rank() 方法的另一种实现.我们会经常使用递归, ...
- C++中的指针与const
刚开始接触C++时,指针和const之间的关系有点混乱,现在总结如下: 一.指向const变量的指针 #include<iostream.h> void main() { const in ...
- 转:C语言宏定义时#(井号)和##(双井号)的用法
转自:http://www.cnblogs.com/welkinwalker/archive/2012/03/30/2424844.html#2678295 #在英语里面叫做 pound 在C语言的宏 ...
- Android安全问题 钓鱼程序
导读:文本介绍一种钓鱼应用,讲述如何骗取用户的用户名和密码,无须root 这个话题是继续android安全问题(二) 程序锁延伸的 之前我已经展示了如何制作程序锁.当打开指定应用的时候,弹出一个密码页 ...
- How to Send an HTTP Header With Every Request With Spring RestTemplate
In Know Which Apps Are Hitting Your Web Service, I showed how to write a servlet filter that enforce ...