python经纬度判断点是否在矩形内部的方法

合集下载

如何判断一个指定的经纬度点是否落在一个多边形区域内?

如何判断一个指定的经纬度点是否落在一个多边形区域内?

如何判断⼀个指定的经纬度点是否落在⼀个多边形区域内?百度MAP⾥⾯的JS代码//点在多边形内function ptInPolygon(){var pts = [];var pt1 = new BMap.Point(116.395, 39.910);var pt2 = new BMap.Point(116.394, 39.914);var pt3 = new BMap.Point(116.403, 39.920);var pt4 = new BMap.Point(116.402, 39.914);var pt5 = new BMap.Point(116.410, 39.913);pts.push(pt1);pts.push(pt2);pts.push(pt3);pts.push(pt4);pts.push(pt5);var ply = new BMap.Polygon(pts);var pt =new BMap.Point(116.400, 39.914);var result = BMapLib.GeoUtils.isPointInPolygon(pt, ply);if(result == true){alert("点在多边形内");} else {alert("点在多边形外")}//演⽰:将⾯添加到地图上map.clearOverlays();var mkr = new BMap.Marker(pt);map.addOverlay(mkr);map.addOverlay(ply);}b.isPointInPolygon = function(o, l) {if (! (o instanceof BMap.Point) || !(l instanceof BMap.Polygon)) {return false}var k = l.getBounds();if (!this.isPointInRect(o, k)) {return false}var t = l.getPath();var h = t.length;var n = true;var j = 0;var g = 2e-10;var s, q;var e = o;s = t[0];for (var f = 1; f <= h; ++f) {if (e.equals(s)) {return n}q = t[f % h];if (t < Math.min(t, t) || t > Math.max(t, t)) {s = q;continue}if (t > Math.min(t, t) && t < Math.max(t, t)) {if (e.lng <= Math.max(s.lng, q.lng)) {if (t == t && e.lng >= Math.min(s.lng, q.lng)) {return n}if (s.lng == q.lng) {if (s.lng == e.lng) {return n} else {++j}} else {var r = (t - t) * (q.lng - s.lng) / (t - t) + s.lng;if (Math.abs(e.lng - r) < g) {return n}if (e.lng < r) {++j}}}} else {if (t == t && e.lng <= q.lng) {var m = t[(f + 1) % h];if (t >= Math.min(t, t) && t <= Math.max(t, t)) {++j} else {j += 2}}}s = q}if (j % 2 == 0) {return false} else {return true}};SuperMap.IS.Utility.js ⾥⾯找到的代码function _RegisterNamespaces() { for (var i = 0; i < arguments.length; i++) { var gv = arguments[i].split("."); var gX = window; for (var j = 0; j < gv.length; j++) { if (!gX[gv[j]]) { gX[gv[j]] = new Object(); } gX = gX[gv[j]]; } } } _RegisterNamespaces("SuperMap.IS");//from prototype.jsif (typeof $ != 'function') {$ = function() {var elements = new Array();for (var i = 0; i < arguments.length; i++) {var element = arguments[i];if (typeof element == 'string') { element = document.getElementById(element); }if (arguments.length == 1) { return element; }elements.push(element);}return elements;};}//from Yahoo! dragdrop_1.0.2.jsfunction _GetScroll() { var t, l; if (document.documentElement && document.documentElement.scrollTop) { t = document.documentElement.scrollTop; l = document.documentElement.scrollLeft; } else { if (document.body) { t = document.body.sc function _GetStyle(el, _95) { if (el.style.styleProp) { return el.style.styleProp; } else { if (el.currentStyle) { return el.currentStyle[_95]; } else { if (document.defaultView) { return document.defaultView.getComputedStyle(el, null).getPropertyValue(_95 function _GetScrollTop() { return _GetScroll().top; };function _GetScrollLeft() { return _GetScroll().left; };//_AddEvent(element,"mousedown",handleMouseDown)function _AddEvent(el, eventType, fn, useCapture) { if (eventType.indexOf("on") == 0) { eventType = eventType.substring(2); } useCapture = (useCapture) ? true : false; if (el.addEventListener) { el.addEventListener(eventType, fn, useCapture); } function _RemoveEvent(el, eventType, fn, useCapture) { if (eventType.indexOf("on") == 0) { eventType = eventType.substring(2); } useCapture = (useCapture) ? true : false; if (el.removeEventListener) { el.removeEventListener(eventType, fn, use function _FixIEEvent(ev) {if (typeof ev.charCode == "undefined") { ev.charCode = (ev.type == "keypress") ? ev.keyCode : 0; ev.isChar = (ev.charCode > 0); } if (ev.srcElement && !ev.target) {ev.eventPhase = 2; ev.pageX = ev.clientX + _GetScrollLeft(); ev.pageY = ev.clientY + _GetScrollTop();if (!ev.preventDefault) { ev.preventDefault = function() { this.returnValue = false; }; } if (ev.type == "mouseout") { ev.relatedTarget = ev.toElement; } else { if (ev.type == "mouseover") { ev.relatedTarget = ev.fromElement; } } if (!ev.stopPropagation) { ev.stopPropagation = function() { this.cancelBubble = true; }; } ev.target = ev.srcElement; ev.time = (new Date).getTime();} return ev;};function _FixDOMEvent(ev) { if (!ev.srcElement) { ev.srcElement = ev.originalTarget; } if (!ev.pageX && ev.clientX && ev.clientY) { ev.pageX = ev.clientX; ev.pageY = ev.clientY; } return ev; };// 下⾯这个⽅法有内存泄漏,暂时弃⽤。

Python射线法判断一个点坐标是否在一个坐标区域内

Python射线法判断一个点坐标是否在一个坐标区域内

Python射线法判断⼀个点坐标是否在⼀个坐标区域内class Point:lng = ''lat = ''def __init__(self, lng, lat):self.lng = lngt = lat# 求外包矩形def get_polygon_bounds(points):length = len(points)top = down = left = right = points[0]for i in range(1, length):if points[i].lng > top.lng:top = points[i]elif points[i].lng < down.lng:down = points[i]else:passif points[i].lat > t:right = points[i]elif points[i].lat < t:left = points[i]else:passtop_left = Point(top.lng, t)top_right = Point(top.lng, t)down_right = Point(down.lng, t)down_left = Point(down.lng, t)return [top_left, top_right, down_right, down_left]# 判断点是否在外包矩形外def is_point_in_rect(point, polygon_bounds):top_left = polygon_bounds[0]top_right = polygon_bounds[1]down_right = polygon_bounds[2]down_left = polygon_bounds[3]return (down_left.lng <= point.lng <= top_right.lngand top_t <= t <= down_t)def is_point_in_polygon(point, points):polygon_bounds = get_polygon_bounds(points)if not is_point_in_rect(point, polygon_bounds):return Falselength = len(points)point_start = points[0]flag = Falsefor i in range(1, length):point_end = points[i]# 点与多边形顶点重合if (point.lng == point_start.lng and t == point_t) or (point.lng == point_end.lng and t == point_t):return True# 判断线段两端点是否在射线两侧if (point_t < t <= point_t) or (point_t >= t > point_t):# 线段上与射线 Y 坐标相同的点的 X 坐标if point_t == point_t:x = (point_start.lng + point_end.lng) / 2else:x = point_end.lng - (point_t - t) * (point_end.lng - point_start.lng) / (point_t - point_t)# 点在多边形的边上if x == point.lng:return True# 射线穿过多边形的边界if x > point.lng:flag = not flagelse:passelse:passpoint_start = point_endreturn flagdef test(input_lng=116.732617, input_lat=39.722676):# polyline 是多个坐标点,形如# ['116.732617,39.722676', '116.732617,39.722676', '116.732617,39.722676', # '116.732617,39.722676', '116.732617,39.722676']polyline = []points = []for line in polyline:if line:try:lng, lat = line.split(',')points.append(Point(float(lng), float(lat)))except ValueError:passif points:is_point_in_polygon(Point(float(input_lng), float(input_lat)), points) 缺点:慢。

python射线法判断一个点在图形区域内外

python射线法判断一个点在图形区域内外

python射线法判断⼀个点在图形区域内外⽤python 实现的代码:判断⼀个点在图形区域内外,供⼤家参考,具体内容如下# -*-encoding:utf-8 -*-# file:class.py#"""信息楼0 123.425658,41.7741771 123.425843,41.7741662 123.425847,41.7741193 123.42693,41.7740624 123.426943,41.7740995 123.427118,41.7740896 123.427066,41.7735487 123.426896,41.7735448 123.426916,41.7739209 123.425838,41.77396510 123.425804,41.77358511 123.425611,41.773595图书馆0 123.425649,41.773031 123.426656,41.7729932 123.426611,41.7723983 123.425605,41.772445"""class Point:lat = ''lng = ''def __init__(self,lat,lng):t = lat #纬度self.lng = lng #经度def show(self):print t," ",self.lng#将信息楼的边界点实例化并存储到points1⾥point0 = Point(123.425658,41.774177)point1 = Point(123.425843,41.774166)point2 = Point(123.425847,41.774119)point3 = Point(123.42693,41.774062)point4 = Point(123.426943,41.774099)point5 = Point(123.427118,41.774089)point6 = Point(123.427066,41.773548)point7 = Point(123.426896,41.773544)point8 = Point(123.426916,41.773920)point9 = Point(123.425838,41.773961)point10 = Point(123.425804,41.773585)point11 = Point(123.425611,41.773595)points1 = [point0,point1,point2,point3,point4,point5,point6,point7,point8,point9,point10,point11,]#将图书馆的边界点实例化并存储到points2⾥point0 = Point(123.425649,41.77303)point1 = Point(123.426656,41.772993)point2 = Point(123.426611,41.772398)point3 = Point(123.425605,41.772445)points2 = [point0,point1,point2,point3]'''将points1和points2存储到points⾥,points可以作为参数传⼊'''points = [points1,points2]'''输⼊⼀个测试点,这个点通过GPS产⽣建议输⼊三个点测试在信息学馆内的点:123.4263790000,41.7740520000 123.42699,41.773592在图书馆内的点: 123.4261550000,41.7726740000 123.42571,41.772499 123.425984,41.772919 不在⼆者内的点: 123.4246270000,41.7738130000在信息学馆外包矩形内,但不在信息学馆中的点:123.4264060000,41.7737860000'''#lat = raw_input(please input lat)#lng = raw_input(please input lng)lat = 123.42699lng = 41.773592point = Point(lat,lng)debug = raw_input("请输⼊debug")if debug == '1':debug = Trueelse:debug = False#求外包矩形def getPolygonBounds(points):length = len(points)#top down left right 都是point类型top = down = left = right = points[0]for i in range(1,length):if points[i].lng > top.lng:top = points[i]elif points[i].lng < down.lng:down = points[i]else:passif points[i].lat > t:right = points[i]elif points[i].lat < t:left = points[i]else:passpoint0 = Point(t,top.lng)point1 = Point(t,top.lng)point2 = Point(t,down.lng)point3 = Point(t,down.lng)polygonBounds = [point0,point1,point2,point3]return polygonBounds#测试求外包矩形的⼀段函数if debug:poly1 = getPolygonBounds(points[0])print "第⼀个建筑的外包是:"for i in range(0,len(poly1)):poly1[i].show()poly2 = getPolygonBounds(points[1])print "第⼆个建筑的外包是:"for i in range(0,len(poly2)):poly2[i].show()#判断点是否在外包矩形外def isPointInRect(point,polygonBounds):if point.lng >= polygonBounds[3].lng and \point.lng <= polygonBounds[0].lng and \t >= polygonBounds[3].lat and \t <= polygonBounds[2].lat:\return Trueelse:return False#测试是否在外包矩形外的代码if debug:if(isPointInRect(point,poly1)):print "在信息外包矩形内"else:print "在信息外包矩形外"if(isPointInRect(point,poly2)):print "在图书馆外包矩形内"else:print "在图书馆外包矩形外"#采⽤射线法,计算测试点是否任意⼀个建筑内def isPointInPolygon(point,points):#定义在边界上或者在顶点都建筑内Bound = Vertex = Truecount = 0precision = 2e-10#⾸先求外包矩形polygonBounds = getPolygonBounds(points)#然后判断是否在外包矩形内,如果不在,直接返回false if not isPointInRect(point, polygonBounds):if debug:print "在外包矩形外"return Falseelse:if debug:print "在外包矩形内"length = len(points)p = pointp1 = points[0]for i in range(1,length):if p.lng == p1.lng and t == t:if debug:print "Vertex1"return Vertexp2 = points[i % length]if p.lng == p2.lng and t == t:if dubug:print "Vertex2"return Vertexif debug:print i-1,iprint "p:"p.show()print "p1:"p1.show()print "p2:"p2.show()if p.lng < min(p1.lng,p2.lng) or \p.lng > max(p1.lng,p2.lng) or \t > max(t,t):p1 = p2if debug:print "Outside"continueelif p.lng > min(p1.lng,p2.lng) and \p.lng < max(p1.lng,p2.lng):if t == t:if t == t and \p.lng > min(p1.lng,p2.lng) and \p.lng < max(p1.lng,p2.lng):return Boundelse:count = count + 1if debug:print "count1:",countcontinueif debug:print "into left or right"a = p2.lng - p1.lngb = t - tc = t * p1.lng - t * p2.lngd = a * t + b * p.lng + cif p1.lng < p2.lng and t > t or \p1.lng < p2.lng and t < t:if d < 0:count = count + 1if debug:print "count2:",countelif d > 0:p1 = p2continueelif abs(p.lng-d) < precision :return Boundelse :if d < 0:p1 = p2continueelif d > 0:count = count + 1if debug:print "count3:",countelif abs(p.lng-d) < precision :return Boundelse:if p1.lng == p2.lng:if p.lng == p1.lng and \t > min(t,t) and \t < max(t,t):return Boundelse:p3 = points[(i+1) % length]if p.lng < min(p1.lng,p3.lng) or \p.lng > max(p1.lng,p3.lng):count = count + 2if debug:print "count4:",countelse:count = count + 1if debug:print "count5:",countp1 = p2if count % 2 == 0 :return Falseelse :return Truelength = len(points)flag = 0for i in range(length):if isPointInPolygon(point,points[i]):print "你刚才输⼊的点在第 %d 个建筑⾥" % (i+1)print "然后根据i值,可以读出建筑名,或者修改传⼊的points参数"breakelse:flag = flag + 1if flag == length:print "在头 %d 建筑外" % (i+1)以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

判断一个坐标点是否在不规则多边形内部的算法

判断一个坐标点是否在不规则多边形内部的算法

判断⼀个坐标点是否在不规则多边形内部的算法在GIS(地理信息管理系统)中,判断⼀个坐标是否在多边形内部是个经常要遇到的问题。

乍听起来还挺复杂。

根据W. Randolph Franklin 提出的PNPoly算法,只需区区⼏⾏代码就解决了这个问题。

假设多边形的坐标存放在⼀个数组⾥,⾸先我们需要取得该数组在横坐标和纵坐标的最⼤值和最⼩值,根据这四个点算出⼀个四边型,⾸先判断⽬标坐标点是否在这个四边型之内,如果在这个四边型之外,那可以跳过后⾯较为复杂的计算,直接返回false。

if (p.x < minX || p.x > maxX || p.y < minY || p.y > maxY) {// 这个测试都过不了。

直接返回false;}接下来是核⼼算法部分:int pnpoly(int nvert, float *vertx, float *verty, float testx, float testy){int i, j, c = 0;for (i = 0, j = nvert-1; i < nvert; j = i++) {if ( ((verty[i]>testy) != (verty[j]>testy)) &&(testx < (vertx[j]-vertx[i]) * (testy-verty[i]) / (verty[j]-verty[i]) + vertx[i]) )c = !c;}return c;}Argument Meaningnvert Number of vertices in the polygon. Whether to repeat the first vertex at the end is discussed below.vertx, verty Arrays containing the x- and y-coordinates of the polygon's vertices.testx, testy X- and y-coordinate of the test point.额,代码就这么简单,但到底啥意思呢:⾸先,参数nvert 代表多边形有⼏个点。

python判断经纬是否在多边形经纬内的方法

python判断经纬是否在多边形经纬内的方法

python判断经纬是否在多边形经纬内的方法在 Python 中,要判断一个点的经纬度是否在一个多边形的经纬范围内,可以使用`Shapely`库。

`Shapely`是一个用于地理空间分析和几何运算的 Python 库,它提供了一系列的函数和类,用于处理几何图形,包括点、线、多边形等。

使用`pip`命令可以安装`Shapely`库,命令如下:`pip install shapely`。

下面是一个简单的示例代码,展示如何判断一个点是否在一个多边形内:```pythonfrom shapely.geometry import Point, Polygondef IsPtInPoly(aLon, aLat, pointList):"""判断点是否在多边形内:param aLon: 经度:param aLat: 纬度:param pointList: 多边形的顶点坐标列表,格式为[(lon1, lat1), (lon2, lat2), ...]:return: 如果点在多边形内,返回 True;否则返回 False"""# 创建多边形对象polygon = Polygon(pointList)# 创建点对象point = Point(aLon, aLat)# 判断点是否在多边形内if polygon.contains(point):return Trueelse:return False# 示例:判断一个点是否在多边形内point = (116.403, 39.914)pointList = [(116.397, 39.908), (116.410, 39.908), (116.410, 39.920), (116.397, 39.920)]result = IsPtInPoly(point[0], point[1], pointList)print(f"点: ({point[0]}, {point[1]}) 是否在多边形内: {result}")```上述代码定义了一个名为`IsPtInPoly`的函数,它接受三个参数:`aLon`表示经度,`aLat`表示纬度,`pointList`表示多边形的顶点坐标列表,该函数会返回一个布尔值,用于判断给定的点是否在给定的多边形内。

点在矩形内的判断

点在矩形内的判断

点在矩形内的判断判断一个点是否在矩形内是程序开发中常见的问题。

本文将分为以下几个部分进行介绍:1. 问题概述2. 判断方法3. 实现方法4. 总结1. 问题概述首先,我们需要了解矩形。

矩形是一个四边形,其中相邻的两条边长度相等,并且相对平行。

我们需要判断的点可以是矩形内部或矩形的边界上。

2. 判断方法判断一个点在矩形内的方法有很多,以下列举三种:(1)坐标轴法:矩形两条对边平行于坐标轴。

如果该点的横坐标在矩形的左右两个顶点的横坐标之间,且该点的纵坐标在矩形的上下两个顶点的纵坐标之间,那么该点在矩形内。

(2)向量法:假设要判断的点为P,矩形的顶点为A、B、C、D。

分别计算AP、AB、AD向量之间的夹角,如果夹角之和等于360度,则说明该点在矩形内。

(3)叉积法:假设要判断的点为P,矩形的其中一条边为AB,计算向量AP和向量AB的叉积,同时计算向量BP和向量BA的叉积,如果它们的乘积都大于0,那么点P就在矩形内。

3. 实现方法以坐标轴法为例,以下是判断一个点在矩形内的具体实现:```pythondef point_in_rectangle(point, rect):"""判断一个点是否在矩形内point: 要判断的点,格式为(x, y)rect: 矩形的四个点,第一个和第四个点为对角线的两个顶点,格式为((x1, y1), (x2, y2), (x3, y3), (x4, y4))"""x, y = pointx1, y1 = rect[0]x4, y4 = rect[3]if (x >= x1 and x <= x4) or (x >= x4 and x <= x1):if (y >= y1 and y <= y4) or (y >= y4 and y <= y1):return Truereturn False```4. 总结本文介绍了判断一个点是否在矩形内的三种方法,以及具体代码实现。

判断点在多边形内部

判断点在多边形内部

判断点在多边形内部0.前言最近不断遇到类似的几何位置问题,一直没有花时间去总结,本文总结了我常用点跟多边形的位置判断方法以及代码。

希望能够对大家有所帮助。

文中所指的多边形均为凸多边形,一些描述可能有误,欢迎指正。

1.测试的多边形在开始之前,我们需要先构建好测试环境。

我构建了一个比较特殊的多边形,如下。

/ \| ||_|从最上面的顶点顺时针坐标(屏幕坐标系)分别为:(40,10) (60,30)(60,50) (20,50) (20,30) 2.射线判别法根据对多边形的了解,我们可以得出如下结论:如果一个点在多边形内部,任意角度做射线肯定会与多边形要么有一个交点,要么有与多边形边界线重叠。

如果一个点在多边形外部,任意角度做射线要么与多边形有一个交点,要么有两个交点,要么没有交点,要么有与多边形边界线重叠。

利用上面的结论,我们只要判断这个点与多边形的交点个数,就可以判断出点与多边形的位置关系了。

首先罗列下注意事项:l 射线跟多边形的边界线重叠的情况l 区别内部点和外部点的射线在有一个交点时的情况对于第一个注意事项,可以将射线角度设为零度,这样子只需要判断两个相邻顶点的Y值是否相等即可。

然后再判断这个点的X值方位。

对于第二个注意事项,网上许多文章都说到做射线以后交点为奇数则表示在多边形内部,这是一个错误的观点,不仅对于凹多边形不成立,对于凸多边形也不成立。

例如:从外部点做射线刚好经过一顶点,这样子交点个数就为奇数,但是该点却不在多边形内部。

至于要如何区分这两种情况呢,我能想到了一个不完美的方法,外部点的射线跟多边形有一个交点的时候,该交点肯定为顶点,如果该射线上移一位或者下移一位,要么变成有两个交点要么没有交点。

当然为了安全起见,这里把射线尽量往相邻点中心移动。

这样子就能够判断出是外部点的射线跟多边形有一个交点。

不过这个方法并不完美,因为有了移位操作,可能会把内部点移动出外部。

而且如果判断点在(60,30)位置,判断的时候先遇到(20,30),然后移位操作,就判断就出错了。

python find rects 方法

python find rects 方法

python find rects 方法【原创实用版3篇】正文(篇1)目录(篇2)1.Python find rects 方法的概述2.find rects 方法的实现原理3.find rects 方法的应用示例4.find rects 方法的优点与局限性正文(篇2)1.Python find rects 方法的概述在 Python 中,find rects 方法是一个用于图像处理的技术,主要用于检测图像中的矩形区域。

该方法基于图像的像素颜色值,通过一定的算法找出符合条件的矩形区域,并将其存储在一个列表中,以便后续处理或分析。

2.find rects 方法的实现原理find rects 方法的实现原理主要基于图像处理中的矩形检测算法。

常见的矩形检测算法有:Haar-like 特征、HOG 特征、卷积神经网络等。

在 Python 中,find rects 方法通常使用 OpenCV 库中的相关函数来实现。

以 Haar-like 特征为例,首先需要对图像进行预处理,如转换为灰度图像、进行高斯滤波等。

然后,通过计算图像中每个小块的 Haar-like 特征值,得到一个特征图。

接着,对特征图进行非极大值抑制,以消除噪声。

最后,通过扫描特征图,找出符合条件的矩形区域。

3.find rects 方法的应用示例下面是一个使用 find rects 方法检测图像中矩形区域的简单示例:```pythonimport cv2# 读取图像img = cv2.imread("example.jpg")# 转换为灰度图像gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 应用高斯滤波blurred = cv2.GaussianBlur(gray, (5, 5), 0)# 检测矩形区域rects = cv2.findContours(blurred, cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)# 在原始图像中标出矩形区域result = img.copy()for rect in rects:cv2.rectangle(result, (rect[0], rect[1]), (rect[2],rect[3]), (0, 0, 255), 2)# 显示结果cv2.imshow("Result", result)cv2.waitKey(0)cv2.destroyAllWindows()```4.find rects 方法的优点与局限性优点:- find rects 方法可以快速准确地检测出图像中的矩形区域,适用于许多实际场景。

java坐标系运算判断一个地理坐标是否在电子围栏圆、矩形、多边形区域内

java坐标系运算判断一个地理坐标是否在电子围栏圆、矩形、多边形区域内

java坐标系运算判断⼀个地理坐标是否在电⼦围栏圆、矩形、多边形区域内转载⾃:测试没问题,我⽤的是原始坐标;要注意的是坐标转换问题,要看当前是属于什么坐标系1/**2 * 地球半径3*/4private static double EARTH_RADIUS = 6378138.0;56private static double rad(double d)7 {8return d * Math.PI / 180.0;9 }1/**2 * 计算是否在圆上(单位/千⽶)3 *4 * @Title: GetDistance5 * @Description: TODO()6 * @param radius 半径7 * @param lat1 纬度8 * @param lng1 经度9 * @return10 * @return double11 * @throws12*/13public static boolean isInCircle(double radius,double lat1, double lng1, double lat2, double lng2)14 {15double radLat1 = rad(lat1);16double radLat2 = rad(lat2);17double a = radLat1 - radLat2;18double b = rad(lng1) - rad(lng2);19double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a/2),2) + Math.cos(radLat1)*Math.cos(radLat2)*Math.pow(Math.sin(b/2),2)));21 s = s * EARTH_RADIUS;22 s = Math.round(s * 10000) / 10000;23if(s > radius) {//不在圆上24return false;25 }else {26return true;27 }28 }1 /**2 * 是否在矩形区域内3 * @Title: isInArea4 * @Description: TODO()5 * @param lat 测试点经度6 * @param lng 测试点纬度7 * @param minLat 纬度范围限制18 * @param maxLat 纬度范围限制29 * @param minLng 经度限制范围110 * @param maxLng 经度范围限制211 * @return12 * @return boolean13 * @throws14*/15public static boolean isInRectangleArea(double lat,double lng,double minLat,16double maxLat,double minLng,double maxLng){17if(isInRange(lat, minLat, maxLat)){//如果在纬度的范围内18if(minLng*maxLng>0){19if(isInRange(lng, minLng, maxLng)){20return true;21 }else {22return false;23 }24 }else {25if(Math.abs(minLng)+Math.abs(maxLng)<180){26if(isInRange(lng, minLng, maxLng)){27return true;28 }else {29return false;30 }31 }else{32double left = Math.max(minLng, maxLng);33double right = Math.min(minLng, maxLng);34if(isInRange(lng, left, 180)||isInRange(lng, right,-180)){35return true;36 }else {37return false;38 }39 }40 }41 }else{42return false;43 }44 }1 /**2 * 判断是否在经纬度范围内3 * @Title: isInRange4 * @Description: TODO()5 * @param point6 * @param left7 * @param right8 * @return9 * @return boolean10 * @throws11*/12public static boolean isInRange(double point, double left,double right){13if(point>=Math.min(left, right)&&point<=Math.max(left, right)){14return true;15 }else {16return false;17 }18 }1 /**2 * 判断点是否在多边形内3 * @Title: IsPointInPoly4 * @Description: TODO()5 * @param point 测试点6 * @param pts 多边形的点7 * @return8 * @return boolean9 * @throws10*/11public static boolean isInPolygon(Point2D.Double point, List<Point2D.Double> pts){1213int N = pts.size();14boolean boundOrVertex = true;15int intersectCount = 0;//交叉点数量16double precision = 2e-10; //浮点类型计算时候与0⽐较时候的容差17 Point2D.Double p1, p2;//临近顶点18 Point2D.Double p = point; //当前点1920 p1 = pts.get(0);21for(int i = 1; i <= N; ++i){22if(p.equals(p1)){23return boundOrVertex;24 }2526 p2 = pts.get(i % N);27if(p.x < Math.min(p1.x, p2.x) || p.x > Math.max(p1.x, p2.x)){28 p1 = p2;29continue;30 }3132//射线穿过算法33if(p.x > Math.min(p1.x, p2.x) && p.x < Math.max(p1.x, p2.x)){34if(p.y <= Math.max(p1.y, p2.y)){35if(p1.x == p2.x && p.y >= Math.min(p1.y, p2.y)){36return boundOrVertex;37 }3839if(p1.y == p2.y){40if(p1.y == p.y){41return boundOrVertex;42 }else{43 ++intersectCount;44 }45 }else{46double xinters = (p.x - p1.x) * (p2.y - p1.y) / (p2.x - p1.x) + p1.y; 47if(Math.abs(p.y - xinters) < precision){48return boundOrVertex;49 }5051if(p.y < xinters){52 ++intersectCount;53 }54 }55 }56 }else{57if(p.x == p2.x && p.y <= p2.y){58 Point2D.Double p3 = pts.get((i+1) % N);59if(p.x >= Math.min(p1.x, p3.x) && p.x <= Math.max(p1.x, p3.x)){60 ++intersectCount;61 }else{62 intersectCount += 2;63 }64 }65 }66 p1 = p2;67 }68if(intersectCount % 2 == 0){//偶数在多边形外69return false;70 } else { //奇数在多边形内71return true;72 }73 }。

python写出点是否在多边形内的判定方法

python写出点是否在多边形内的判定方法

python写出点是否在多边形内的判定方法在Python中,判断一个点是否在多边形内部是一个常见的问题。

下面介绍几种判定方法:方法一:射线法射线法是一种常用的判定方法,它的基本思想是:从待判定的点向任意方向引一条射线,如果该射线与多边形相交的次数是奇数,则点在多边形内;否则,点在多边形外。

具体实现如下:定义一个函数,输入参数为待判定的点和多边形的顶点坐标列表。

首先求出该点的x坐标最大值加上1,并定义一条射线从该点向右水平方向发出。

依次遍历多边形的每条边,如果该边和射线相交,则计数器加1。

最后如果计数器为奇数,则点在多边形内;否则点在多边形外。

方法二:边界法边界法的基本思想是:判断待判定的点是否在多边形的边界上或者在多边形内部。

如果点在多边形的边界上,则点在多边形内;如果点在多边形内部,则从该点向任意方向引一条射线,如果射线与多边形相交的次数是奇数,则点在多边形内;否则点在多边形外。

具体实现如下:定义一个函数,输入参数为待判定的点和多边形的顶点坐标列表。

首先判断该点是否在多边形的边界上。

如果在,则点在多边形内;否则,定义一条射线从该点向右水平方向发出,依次遍历多边形的每条边,如果该边和射线相交,则计数器加1。

最后如果计数器为奇数,则点在多边形内;否则点在多边形外。

方法三:凸包法凸包法是一种基于凸包的判定方法,它的基本思想是:如果待判定点在多边形内部,则从该点向多边形的任意方向引一条射线,该射线与多边形必定有两个交点。

具体实现如下:定义一个函数,输入参数为待判定的点和多边形的顶点坐标列表。

首先求出多边形的凸包,然后从该点向凸包的任意方向引一条射线,找到该射线与凸包相交的两个点。

如果这两个点恰好是多边形的相邻顶点,则点在多边形内;否则点在多边形外。

以上是三种常用的判定方法,具体实现可以根据实际需求进行选择。

python之判断点是否在多边形范围内

python之判断点是否在多边形范围内

python之判断点是否在多边形范围内#coding=UTF-8import csvimport json# 点是否在外包矩形内def isPoiWithinBox(poi, sbox, toler=0.0001):# sbox=[[x1,y1],[x2,y2]]# 不考虑在边界上,需要考虑就加等号if poi[0] > sbox[0][0] and poi[0] < sbox[1][0] and poi[1] > sbox[0][1] and poi[1] < sbox[1][1]:return Trueif toler > 0:passreturn False# 射线与边是否有交点def isRayIntersectsSegment(poi, s_poi, e_poi): # [x,y] [lng,lat]if s_poi[1] == e_poi[1]: # 排除与射线平⾏、重合,线段⾸尾端点重合的情况return Falseif s_poi[1] > poi[1] and e_poi[1] > poi[1]:return Falseif s_poi[1] < poi[1] and e_poi[1] < poi[1]:return Falseif s_poi[1] == poi[1] and e_poi[1] > poi[1]:return Falseif e_poi[1] == poi[1] and s_poi[1] > poi[1]:return Falseif s_poi[0] < poi[0] and e_poi[1] < poi[1]:return Falsexseg = e_poi[0] - (e_poi[0] - s_poi[0]) * (e_poi[1] - poi[1]) / (e_poi[1] - s_poi[1]) # 求交if xseg < poi[0]:return Falsereturn True#只适⽤简单多边形def isPoiWithinSimplePoly(poi, simPoly, tolerance=0.0001):# 点;多边形数组;容限# simPoly=[[x1,y1],[x2,y2],……,[xn,yn],[x1,y1]]# 如果simPoly=[[x1,y1],[x2,y2],……,[xn,yn]] i循环到终点后还需要判断[xn,yx]和[x1,y1]# 先判断点是否在外包矩形内if not isPoiWithinBox(poi, [[0, 0], [180, 90]], tolerance):return Falsepolylen = len(simPoly)sinsc = 0 # 交点个数for i in range(polylen - 1):s_poi = simPoly[i]e_poi = simPoly[i + 1]if isRayIntersectsSegment(poi, s_poi, e_poi):sinsc += 1return True if sinsc % 2 == 1 else Falsedef isPoiWithinPoly(poi, poly, tolerance=0.0001):# 点;多边形三维数组;容限# poly=[[[x1,y1],[x2,y2],……,[xn,yn],[x1,y1]],[[w1,t1],……[wk,tk]]] 三维数组# 先判断点是否在外包矩形内if not isPoiWithinBox(poi, [[0, 0], [180, 90]], tolerance):return Falsesinsc = 0 # 交点个数for epoly in poly: #逐个⼆维数组进⾏判断for i in range(len(epoly) - 1): # [0,len-1]s_poi = epoly[i]e_poi = epoly[i + 1]if isRayIntersectsSegment(poi, s_poi, e_poi):sinsc += 1return sinse %2 !=0 #这样更简洁些#return True if sinsc % 2 == 1 else False### ⽐较完备的版本def pointInPolygon(cin_path,out_path,gfile,t=0):pindex = [2,3] # wgslng,wgslat 2,3with open(out_path, 'w', newline='') as cut_file:fin = open(cin_path, 'r', encoding='gbk')gfn = open(gfile, 'r', encoding='utf-8')gjson = json.load(gfn)if gjson["features"][0]["geometry"]['type']=="MultiPolygon":plist=gjson["features"][0]["geometry"]['coordinates'] #四维filewriter = csv.writer(cut_file, delimiter=',')w = 0for line in csv.reader(fin, delimiter=','):if w == 0:filewriter.writerow(line)w = 1continuepoint = [float(line[pindex[0]]), float(line[pindex[1]])]for polygon in plist: #if isPoiWithinPoly(point, polygon):filewriter.writerow(line)breakfin.close()gfn.close()elif gjson["features"][0]["geometry"]['type']=="Polygon":polygon=gjson["features"][0]["geometry"]['coordinates'] #三维filewriter = csv.writer(cut_file, delimiter=',')w = 0for line in csv.reader(fin, delimiter=','):if w == 0:filewriter.writerow(line)w = 1continuepoint = [float(line[pindex[0]]), float(line[pindex[1]])]if isPoiWithinPoly(point, polygon):filewriter.writerow(line)fin.close()gfn.close()else:print('check',gfile)print('end')#调⽤def baTch():import osimport globwpath="D:/DigitalC_data/coordConvert"#⽂件路径sname="D:/DigitalC_data/coordConvertOut"gpath='D:/cityBoundaryJson/guangzhou_wgs84.json'for input_file in glob.glob(os.path.join(wpath, '*.csv')):fname=input_file.split('\\')pointInPolygon(input_file,os.path.join(sname,fname[1]),gpath)print(fname[1])## 应⽤### 应⽤3'''对⼀个csv数据,如果点在多边形内,给某⼀列(tag)(或者加⼀列)加上这个多边形的属性(有多个多边形)'''def givePolyTag():pass### 应⽤⽅式1def pointInPolygon1():gfile = 'E:/ComputerGraphicsProj/Geojson2kml/J2K_data/深圳poly_bd09.geojson'cin_path = 'L:/OtherSys/DigitalCityData/深圳特征图层/city_site_poi_sec_shenzhen.csv'out_path = 'L:/OtherSys/DigitalCityData/深圳特征图层/city_site_poi_sec_shenzhen_out1.csv'pindex = [4, 5] # wgslng,wgslat 2,3with open(out_path, 'w', newline='') as cut_file:fin = open(cin_path, 'r', encoding='gbk')gfn = open(gfile, 'r', encoding='utf-8')gjson = json.load(gfn)polygon = gjson["features"][0]["geometry"]['coordinates'][0]filewriter = csv.writer(cut_file, delimiter=',')w = 0for line in csv.reader(fin, delimiter=','):if w == 0:filewriter.writerow(line)w = 1continuepoint = [float(line[pindex[0]]), float(line[pindex[1]])]if isPoiWithinSimplePoly(point, polygon):filewriter.writerow(line)fin.close()gfn.close()print('done')#pointInPolygon1()def csvToDArrary(csvpath):#csv⽂件转⼆维数组cdata = []with open(csvpath, 'r', encoding='gbk') as rfile:for line in csv.reader(rfile, delimiter=','):cdata.append(line)return cdata### 应⽤⽅式2def pointInPolygon2():gfile = 'E:/ComputerGraphicsProj/Geojson2kml/J2K_data/深圳poly_bd09.geojson' cin_path = 'L:/OtherSys/DigitalCityData/深圳特征图层/shenzhen_tAllNotIn.csv'out_path = 'L:/OtherSys/DigitalCityData/深圳特征图层/shenzhen_tAllNotIn_out2.csv' pindex = [4, 5] # wgslng,wgslat 2,3with open(out_path, 'w', newline='') as cut_file:gfn = open(gfile, 'r', encoding='utf-8')gjson = json.load(gfn)polygon = gjson["features"][0]["geometry"]['coordinates'][0]filewriter = csv.writer(cut_file, delimiter=',')w = 0cdata = csvToDArrary(cin_path)for line in cdata:if w == 0:filewriter.writerow(line)w = 1continuepoint = [float(line[pindex[0]]), float(line[pindex][1])]if isPoiWithinSimplePoly(point, polygon):filewriter.writerow(line)gfn.close()print('done')pointInPolygon()。

判断点是否在多边形内地5种方法

判断点是否在多边形内地5种方法

判断点是否在多边形内(凸包和任意多边形分类讨论)/*POJ 1548:判断是否为凸包,判断点(圆是否在凸包内),其中判定点是否在多边形内是主要部分Sample Input5 1.5 1.5 2.01.0 1.02.0 2.01.752.01.0 3.00.0 2.05 1.5 1.5 2.01.0 1.02.0 2.01.752.51.0 3.00.0 2.01Sample OutputHOLE IS ILL-FORMEDPEG WILL NOT FIT*///法1、2:叉积判定、面积法判定(适用于凸包)。

#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<cmath>#include<cstdlib>#include<queue>#include<stack>#include<map>#include<vector>#include<algorithm>using namespace std;#define maxn 10005#define eps 1e-8#define max(x,y) (x>y?x:y)#define min(x,y) (x<y?x:y)int Fabs(double d) //重点:精度控制,如果d精度很高,如-0.00000000001即使是小于0,但也当做是0,关系到后面数据处理{if(fabs(d)<eps) return 0;else return d>0?1:-1;}struct point{double x,y;bool operator == (const point& p){return Fabs(x-p.x)==0&&Fabs(y-p.y)==0;}}p[maxn];int n;double pegx,pegy,pegr,max_x,max_y;double x_multi(point p1,point p2,point p3){return (p2.x-p1.x)*(p3.y-p1.y)-(p3.x-p1.x)*(p2.y-p1.y);bool point_is_inside() //叉积判断点在凸包内部!只针对于凸多边形。

经纬度点在区域高效算法

经纬度点在区域高效算法

经纬度点在区域高效算法简介在实际应用中,经纬度数据是一种常见的地理位置数据表示方式。

经纬度点在区域高效算法是指根据给定的经纬度点,判断该点是否位于指定区域内的算法。

这种算法常用于地图应用、位置服务等领域。

本文将介绍经纬度点在区域高效算法的原理、常用的实现方法以及应用场景。

算法原理地球坐标系和经纬度地球是一个近似于椭球的三维球体,为了方便描述地球上的点位,人们定义了地球坐标系。

地球坐标系通过经度和纬度来确定地球上的位置。

经度表示在经线上的位置,取值范围为[-180,180],以0经线为中央经线。

纬度表示在纬线上的位置,取值范围为[-90,90],以赤道为基准。

点在区域内的判断判断一个经纬度点是否位于一个指定区域内,可以通过点位的经纬度值和区域的边界值进行比较。

如果点的经度大于区域的最小经度、小于区域的最大经度,并且点的纬度大于区域的最小纬度、小于区域的最大纬度,那么该点就位于该区域内。

具体判断过程如下:1.定义一个区域边界结构,包含最小经度、最大经度、最小纬度和最大纬度。

2.给定点位的经纬度值。

3.判断点位的经度是否在区域边界的经度范围内,即最小经度 <= 经度 <= 最大经度。

4.判断点位的纬度是否在区域边界的纬度范围内,即最小纬度 <= 纬度 <= 最大纬度。

5.如果经度和纬度都满足条件,则点位位于区域内;否则,点位不在区域内。

算法实现方法一:矩形区域矩形区域判断方法是最简单和常见的一种方法,适用于规则的矩形区域。

该方法只需要比较经度和纬度的范围,时间复杂度为O(1)。

def is_point_in_rectangle(point, rectangle):longitude = point.longitudelatitude = titudemin_longitude = rectangle.min_longitudemax_longitude = rectangle.max_longitudemin_latitude = rectangle.min_latitudemax_latitude = rectangle.max_latitudeif (longitude >= min_longitude and longitude <= max_longitudeand latitude >= min_latitude and latitude <= max_latitude): return Trueelse:return False方法二:圆形区域圆形区域判断方法适用于以某个中心经纬度和半径确定的圆形区域。

函数判断位置的练习题

函数判断位置的练习题

函数判断位置的练习题在编程的世界里,根据位置进行判断是一个常见的任务。

通过函数来判断位置,可以更加灵活地处理各种情况。

在这篇文章中,我们将提供一些函数判断位置的练习题来帮助大家更好地理解和掌握这个概念。

第一题:点在圆内还是圆外?假设有一个圆的圆心坐标为(xc, yc),半径为r。

我们需要编写一个函数判断一个给定点的坐标(x, y)是在圆内还是圆外。

如果点在圆内,则返回True;如果点在圆外,则返回False。

解答:我们可以使用勾股定理来判断点是否在圆内。

根据勾股定理,如果点到圆心的距离小于等于半径,则点在圆内;否则,点在圆外。

```import mathdef point_in_circle(x, y, xc, yc, r):distance = math.sqrt((x - xc) ** 2 + (y - yc) ** 2)if distance <= r:return Trueelse:return False```通过调用函数point_in_circle(x, y, xc, yc, r),我们就可以得到一个判断结果。

第二题:点在矩形内还是矩形外?假设有一个矩形,其左上角和右下角的坐标分别为(x1, y1)和(x2, y2)。

我们需要编写一个函数判断一个给定点的坐标(x, y)是在矩形内还是矩形外。

如果点在矩形内,则返回True;如果点在矩形外,则返回False。

解答:要判断点是否在矩形内,我们只需检查其x坐标是否在x1和x2之间,以及其y坐标是否在y1和y2之间即可。

```def point_in_rectangle(x, y, x1, y1, x2, y2):if x >= x1 and x <= x2 and y >= y1 and y <= y2:return Trueelse:return False```我们可以通过调用函数point_in_rectangle(x, y, x1, y1, x2, y2)来得到一个判断结果。

python folium 画矩形用法

python folium 画矩形用法

python folium 画矩形用法Python Folium是一款基于Python语言的地图可视化工具,它允许使用python的大数据技术来直接构建交互式Web地图。

Folium能够与大量的数据可视化库完美兼容,能够实现各种复杂而创新的数据可视化方案。

在Folium中,标记类对象能够用多种方式显示,比如Popup窗口,点击后会显示一些附加信息;Tooltip类似于一条悬浮文本,鼠标移上去才会显示;Circle、Rectangle、Polygon等标记形状种类丰富。

本文主要介绍在Folium中配合Leaflet绘制矩形的语法,以及如何使用Folium的其他功能定制矩形标记。

1.使用Rectangle方法绘制矩形Folium提供了一种叫做Rectangle()方法的函数,能够通过指定矩形的经纬度大小来画出一个矩形。

接下来是此方法的详细使用步骤:第一步:定义地图初始中心位置经纬度。

这里我们以New York纽约市为例。

latitude, longitude = 40.71427, -74.00597location = [latitude, longitude]第二步:定义初始地图缩放级别和地图样式zoom_start = 12tiles = "OpenStreetMap"第三步:定义地图对象并添加Rectangle矩形标记from folium.plugins import MarkerClusterfrom folium.features import DivIcon, Markerm = folium.Map(location=location, zoom_start=zoom_start, tiles=tiles)rectangle = folium.Rectangle(bounds=((latitude - 0.05, longitude - 0.05), (latitude + 0.05, longitude + 0.05)), fill=True) rectangle.add_to(m)m上述代码中的rectangle是一个Rectangle对象,bounds表示矩形的左下角和右上角经纬度对,fill=True则表示矩形内部要填充颜色。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

python经纬度判断点是否在矩形内部的方法经纬度是一种用来表示地理位置信息的坐标系统。

在经纬度坐标
系中,经度表示水平的位置,范围为-180度至180度,纬度表示垂直
的位置,范围为-90度至90度。

判断一个点是否在一个矩形内部,首先需要知道矩形的边界坐标,并将该矩形转换为经纬度坐标系统。

然后,我们可以使用以下几种方
法来判断一个点是否在矩形内部。

1.矩形边界判断法
首先,我们需要确定一个矩形的四个边界坐标,可以通过最小经
度(最西点)、最大经度(最东点)、最小纬度(最南点)和最大纬
度(最北点)来确定。

然后,我们可以用以下逻辑来判断一个点是否
在矩形内部:
-如果点的经度小于最小经度或大于最大经度,那么它肯定不在矩
形内部。

-如果点的纬度小于最小纬度或大于最大纬度,那么它肯定不在矩形内部。

-如果点的经度和纬度均在矩形的边界之内,那么它在矩形内部。

这种方法简单直观,但有一个限制条件,即纬度需在最小纬度与最大纬度之间,否则无法判断。

此外,这种方法无法处理特定国家或地区范围内的矩形,因为经度的范围通常有所不同。

2.矩形顶点判断法
在这种方法中,我们需要知道矩形的四个顶点的坐标。

然后,我们可以使用以下逻辑来判断一个点是否在矩形内部:
-使用一个循环遍历矩形的四个顶点。

-对于每个顶点,计算该顶点与下一个顶点之间的两条边的斜率。

-如果点的纬度小于该顶点所在边的最小纬度,那么它肯定不在矩形内部。

-如果点的纬度大于该顶点所在边的最大纬度,那么它肯定在矩形内部。

-如果点的纬度在该顶点所在边的最小纬度和最大纬度之间,那么
根据斜率判断点是否在边的两侧。

如果点在边的两侧,那么它在矩形
内部。

该方法可以处理任意形状的矩形,但需要额外的代码来计算斜率。

3.线性插值判断法
这种方法使用点到矩形四个边的线性插值来判断点是否在矩形内部。

首先,我们需要知道矩形的四个边界坐标,可以通过最小经度、
最大经度、最小纬度和最大纬度来确定。

然后,我们可以使用以下逻
辑来判断一个点是否在矩形内部:
-对于一个给定的点,分别计算它到矩形的四条边的线性插值。

线
性插值是通过计算点在边上的投影点,然后计算该投影点在边上的线
性插值。

-如果点的经度小于线性插值的最小经度值或大于线性插值的最大
经度值,那么它肯定不在矩形内部。

-如果点的纬度小于线性插值的最小纬度值或大于线性插值的最大
纬度值,那么它肯定不在矩形内部。

-如果点的经度和纬度均在线性插值的范围内,那么它在矩形内部。

该方法可以处理任意形状的矩形,但需要进行更多的数学计算。

同时,不同边界上的插值计算也可能会带来一些误差。

总结起来,以上是三种常见的判断一个点是否在矩形内部的方法。

选择合适的方法取决于具体的需求和场景。

对于简单矩形的判断,矩
形边界判断法是最简单直观的方法。

对于不规则形状的矩形,可以考
虑使用矩形顶点判断法或线性插值判断法。

无论使用哪种方法,都需
要注意坐标系统的一致性,并进行必要的坐标转换。

相关文档
最新文档