当前位置: 首页 > 面试题库 >

检查地理点在多边形内部还是外部

赏夕
2023-03-14
问题内容

我正在使用python,并且已经在地图上定义了多边形的纬度和经度(以度为单位)。我的目标是检查通用P坐标点是否x,y落在此类多边形内。因此,我希望有一个函数可以检查这种情况并返回,True或者False该点在多边形内部还是外部。

在此处输入图片说明

在这个例子中,点在外面,所以结果是 False

问题 :是否有可以实现我的目标的库/软件包?如果是,您推荐哪一个?您能否举一个小例子来说明如何使用它?

这是我到目前为止编写的代码:

import numpy as np

# Define vertices of polygon (lat/lon)
v0 = [7.5, -2.5] 
v1 = [2, 3.5]
v2 = [-2, 4]
v3 = [-5.5, -4]
v4 = [0, -10]
lats_vect = np.array([v0[0],v1[0],v2[0],v3[0],v4[0]])
lons_vect = np.array([v0[1],v1[1],v2[1],v3[1],v4[1]])

# Point of interest P
x, y = -6, 5 # x = Lat, y = Lon

## START MODIFYING FROM HERE; DO NOT MODIFY POLYGON VERTICES AND DATA TYPE
# Check if point of interest falls within polygon boundaries
# If yes, return True
# If no, return False

为了绘制多边形和兴趣点,我使用了cartopy,并编写了以下代码行:

import cartopy.crs as ccrs
import matplotlib.pyplot as plt
ax = plt.axes(projection=ccrs.PlateCarree())
ax.stock_img()

# Append first vertex to end of vector to close polygon when plotting
lats_vect = np.append(lats_vect, lats_vect[0])
lons_vect = np.append(lons_vect, lons_vect[0])
plt.plot([lons_vect[0:-1], lons_vect[1:]], [lats_vect[0:-1], lats_vect[1:]],
         color='black', linewidth=1, 
         transform=ccrs.Geodetic(),
         )

plt.plot(y, x, 
        '*',          # marker shape
        color='blue',  # marker colour
        markersize=8  # marker size
        )

plt.show()

注意事项

  • 点通过大圆圈相互连接!
  • 我研究的Internt的,我最终找到了一些类似的问题像这样的,但我没有成功,因为它们都使用的.shp是我没有的文件。

问题答案:

这是我的问题的可能解决方案

  1. 地理坐标必须正确存储。例np.array([[Lon_A, Lat_A], [Lon_B, Lat_B], [Lon_C, Lat_C]])
  2. 创建多边形
  3. 创建要测试的点
  4. 使用polygon.contains(point)如果点在内部测试(True)或外部(False)的多边形。

这是代码的缺失部分:

from shapely.geometry import Point
from shapely.geometry.polygon import Polygon

lons_lats_vect = np.column_stack((lons_vect, lats_vect)) # Reshape coordinates
polygon = Polygon(lons_lats_vect) # create polygon
point = Point(y,x) # create point
print(polygon.contains(point)) # check if polygon contains point
print(point.within(polygon)) # check if a point is in the polygon

注意 :多边形不考虑大圆,因此有必要将边缘分成许多段,从而增加顶点数量。

特殊情况:如果点位于多边形的边界上

例如print(Polygon([(0, 0), (1, 0), (1, 1)]).contains(Point(0, 0)))会失败

所以可以使用

print(polygon.touches(point)) # check if point lies on border of polygon


 类似资料:
  • 我有一个数据库,其中一个表(ca_licenses)是商业地址,另一个表是市议会区多边形的公共模式(ca_la_la_council)。 我运行此查询是为了将议会表中的地区号码放在企业地址表中: 我的问题是我总是得不到任何结果。两个几何列都是几何类型,SRID是4326。 示例ca_licenses数据:https://raw . githubusercontent . com/pour safe

  • 问题内容: 我正在使用elasticsearch1.4.1-1.4.4。我正在尝试将地理多边形形状(文档)索引到索引中,现在在对形状进行索引时,我想知道地理坐标是否位于该特定索引的地理多边形形状的边界内。 使用上面的地理多边形过滤器,我可以使所有索引的地理坐标都位于所描述的多边形内,但是我还需要知道未索引的地理坐标是否位于此地理多边形中。我的怀疑是,在elasticsearch1.4.1中是否可行

  • 直到今天,我才知道java有堆,堆是由JVM创建的。此外,这个内存是由操作系统分配给JVM实例的,即堆驻留在JVM实例中。 这表明,JVM和堆相距甚远。 所以,我现在很困惑,有谁能让我知道,我以前是错的还是我不能理解这幅画?

  • 问题内容: 我对mysql,多边形的Geometric数据类型有一个典型的问题。 我有经度和纬度数组形式的面数据,例如: 我有一个经度和纬度坐标的点(顶点),例如: 现在,我想查找此顶点(点)是否在多边形内。我如何在php中做到这一点? 问题答案: 这是我从另一种语言转换为PHP的功能: 附加: 有关更多功能,我建议您使用此处提供的polygon.php类。使用顶点创建类,并以测试点作为输入调用该

  • 如何从多个地理位置(长,晚值)创建多边形地理围栏。也可以在Android上跟踪用户进入或退出该地理区域的情况。

  • 我正试图创建一个餐厅的多个多边形的基础上,他们的送货费用的数据,我在这里https://jsoneditoronline.org/?id=7a7287f99c0964ffd6125b4bb48a2e50 这是我已经有的https://codepen.io/mani619cash/pen/mpaqQq?editors=1000 它基于文本区域中显示的输入数据创建类似的东西 我想要的是类似于下图的东西