python 判断一个点(坐标)是否在一个多边形内利用射线法
生活随笔
收集整理的這篇文章主要介紹了
python 判断一个点(坐标)是否在一个多边形内利用射线法
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
看了一篇博客寫的用射線法判斷一個經(jīng)緯度點(diǎn)是否在一個多邊形的內(nèi)部的方法 經(jīng)驗(yàn)證可行所以拿來用作備份:
class Point:lng = ''lat = ''def __init__(self, lng, lat):self.lng = lngself.lat = 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 > right.lat:right = points[i]elif points[i].lat < left.lat:left = points[i]else:passtop_left = Point(top.lng, left.lat)top_right = Point(top.lng, right.lat)down_right = Point(down.lng, right.lat)down_left = Point(down.lng, left.lat)return [top_left, top_right, down_right, down_left]判斷點(diǎn)是否在外包矩形外 如果不在外包矩形內(nèi)部那肯定不在多邊形內(nèi)部
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_left.lat <= point.lat <= down_right.lat)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]# 點(diǎn)與多邊形頂點(diǎn)重合if (point.lng == point_start.lng and point.lat == point_start.lat) or (point.lng == point_end.lng and point.lat == point_end.lat):return True# 判斷線段兩端點(diǎn)是否在射線兩側(cè)if (point_end.lat < point.lat <= point_start.lat) or (point_end.lat >= point.lat > point_start.lat):# 線段上與射線 Y 坐標(biāo)相同的點(diǎn)的 X 坐標(biāo)if point_end.lat == point_start.lat:x = (point_start.lng + point_end.lng) / 2else:x = point_end.lng - (point_end.lat - point.lat) * (point_end.lng - point_start.lng) / (point_end.lat - point_start.lat)# 點(diǎn)在多邊形的邊上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 是多個坐標(biāo)點(diǎn),形如# ['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:return is_point_in_polygon(Point(float(input_lng), float(input_lat)), points)判斷一個點(diǎn)是否在多邊形內(nèi)部有多種寫法,比如利用面積計(jì)算但是利用面積計(jì)算有一個缺點(diǎn)就是計(jì)算結(jié)果不是很準(zhǔn)確,因?yàn)槔媒?jīng)緯度計(jì)算出來的距離本身就有偏差,所以將多邊形分成多個小三角形相加后就會有誤差導(dǎo)致最后不能作為判斷的依據(jù),我看大多數(shù)都是用的射線方法計(jì)算.
總結(jié)
以上是生活随笔為你收集整理的python 判断一个点(坐标)是否在一个多边形内利用射线法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2019字节跳动秋招笔试
- 下一篇: python库Camelot从pdf抽取