日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

python 判断一个点(坐标)是否在一个多边形内利用射线法

發(fā)布時間:2024/7/5 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python 判断一个点(坐标)是否在一个多边形内利用射线法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

看了一篇博客寫的用射線法判斷一個經(jīng)緯度點是否在一個多邊形的內(nèi)部的方法 經(jīng)驗證可行所以拿來用作備份:

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]

判斷點是否在外包矩形外 如果不在外包矩形內(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]# 點與多邊形頂點重合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# 判斷線段兩端點是否在射線兩側(cè)if (point_end.lat < point.lat <= point_start.lat) or (point_end.lat >= point.lat > point_start.lat):# 線段上與射線 Y 坐標(biāo)相同的點的 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)# 點在多邊形的邊上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)點,形如# ['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)

判斷一個點是否在多邊形內(nèi)部有多種寫法,比如利用面積計算但是利用面積計算有一個缺點就是計算結(jié)果不是很準(zhǔn)確,因為利用經(jīng)緯度計算出來的距離本身就有偏差,所以將多邊形分成多個小三角形相加后就會有誤差導(dǎo)致最后不能作為判斷的依據(jù),我看大多數(shù)都是用的射線方法計算.

總結(jié)

以上是生活随笔為你收集整理的python 判断一个点(坐标)是否在一个多边形内利用射线法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。