生成竞争随机坐标的python库

PyCristoforo的Python项目详细描述


皮克里斯托福罗

v2.0.0版

用于生成有争议的随机坐标的新python库。 pycristoforo输入一个国家名称,并在该国家内部(不包括海洋/海洋部分)生成随机坐标。

支持的Python版本:3.6、3.7

最新更新

<表><广告>日期 说明 < /广告><正文>2019年6月30日pycristoforo 1.0.0发布在pypi上2019年7月8日pycristoforo 1.0.0.post4发布在pypi上 2019年7月9日pycristoforo 1.1.0发布在pypi上2019年7月28日pycristoforo 2.0.0发布在pypi上

目录

随机点生成

在本节中,您可以找到有关随机坐标生成方法的一些详细信息。

版本1

pycristoforo v1实现了一个非常简单的随机点生成算法:

  • 从国家多边形开始,它首先得到它周围的矩形,然后是最小/最大纬度和经度。
# getting min, max lat/lng
min_lng = get_min_lng(shape)
min_lat = get_min_lat(shape)
max_lng = get_max_lng(shape)
max_lat = get_max_lat(shape)

Germany Envelope

  • 其中,随机坐标以统一的方式生成
# generate random float between [min_lng, max_lng)
val1 = numpy_random.uniform(min_lng, max_lng)
# generate random float between [min_lat, max_lat)
val2 = numpy_random.uniform(min_lat, max_lat)

德国信封点ko

  • 最后,只保留乡村形状内的点,丢弃乡村形状外的点。 然后生成新点,直到达到用户期望的数量。
# random point generation
while counter != points:
  if random_point.within(shape):
    ...
    list_of_points.append(ran_point)
    counter += 1

德国信封点确定

如上所述,该算法非常简单,但也非常低效。

基准:

  • 国家:"德国"
  • 数量:100K
  • 时间:4分钟20秒

版本2

为了使算法更快、更健壮(https://codereview.stackexchange.com/questions/69833/generate-sample-coordinates-inside-a-polygon" rel="nofollow">https://codereview.stackexchange.com/questions/69833/generate-sample-coordinates-inside-a-polygon),v2更改生成随机点的方式:

  • 对国家多边形进行三角剖分,然后计算每个三角形的面积;
  • 对于每个样本:
  • 使用每个三角形面积加权的随机选择,选择包含样本的三角形。
  • 在三角形中均匀地拾取一个随机点,如下所示:
    • 在单位正方形中均匀地选取一个随机点,_。
    • 如果_+_>;1,则使用点1-,1-。这样做的效果是确保在具有顶点(0,0),(0,1),(1,0)的单位直角三角形中均匀地选择点
    • 应用适当的a将单位直角三角形转换为三角形的ffine变换。

这种方法的硬约束是它只适用于凸多边形,因此某些点可能会产生出乡村形状(凸壳)。 德国凸面船体点ko

如果位于乡村形状内,则检查所有点。 对于国外的每个点,都会生成一个新点。

德国凸面船体点ko

这种方法比基准测试快20%。

基准:

  • 国家:"德国"
  • 数量:100K
  • 时间:3分钟30秒

要求

  • Numpy 1.16.4版
  • shapely v1.6.4.post2

详情请点击此处

资源

  • 世界国家GeoJSON(链接

安装

pycristoforo非常易于安装和使用(请确保已安装依赖项(请参见"要求"一节)

pip3 install pycristoforo

用法

  • 现在您可以将其导入到脚本中:
import pycristoforo as pyc
  • 现在您可以加载要在以下位置生成地理坐标的国家的geojson:
country = pyc.get_shape("Italy")

get_shape方法支持的输入不仅是扩展的国家/地区名称:您可以使用iso_a3代码。 在这里您可以找到支持的输入(country_name,iso_a3)。 方法不区分大小写:

country = pyc.get_shape("ITALY")

行为与:

country = pyc.get_shape("italy")

countryvar现在包含输入中传递的国家的形状(通常是形状为poligon的multipligon的):

MULTIPOLYGON (((12.127777 47.00166300000012, 12.13611 46.966942, 12.16027600000012 46.92805, 12.18138900000014 46.909721, 12.189722 46.90610500000014, 12.232222 46.888885, 12.301666 46.84111, 12.378611 46.72666, 12.38888700000012 46.715553, ... , 12.047777 36.753052, 12.03833200000014 36.747215, 12.027777 36.74222, 12.01583 36.738327)))
  • 现在已经加载了国家形状,现在是获取随机地理坐标的时候了。 假设生成100个地理坐标:
# getting min, max lat/lng
min_lng = get_min_lng(shape)
min_lat = get_min_lat(shape)
max_lng = get_max_lng(shape)
max_lat = get_max_lat(shape)
0

是点列表:

# getting min, max lat/lng
min_lng = get_min_lng(shape)
min_lat = get_min_lat(shape)
max_lng = get_max_lng(shape)
max_lat = get_max_lat(shape)
1

现在您可以遍历列表并充分利用它们。

  • 打印刚生成的内容:
# getting min, max lat/lng
min_lng = get_min_lng(shape)
min_lat = get_min_lat(shape)
max_lng = get_max_lng(shape)
max_lat = get_max_lat(shape)
2
  • 实用方法是获取信封一个:
# getting min, max lat/lng
min_lng = get_min_lng(shape)
min_lat = get_min_lat(shape)
max_lng = get_max_lng(shape)
max_lat = get_max_lat(shape)
3

构建

# getting min, max lat/lng
min_lng = get_min_lng(shape)
min_lat = get_min_lat(shape)
max_lng = get_max_lng(shape)
max_lat = get_max_lat(shape)
4

运行测试

进行中的工作

更改日志

当前版本:2.0.0

更改日志

许可证

此项目是在麻省理工学院许可证下获得许可的-有关详细信息,请参见许可证文件

下一步

  • v2.1.0:打印在外部文件中的随机点
  • v3.0.0:区域支持
  • v3.1.0:县支持
  • v3.2.0:城市支持

作者

另请参见参与此项目的贡献者列表。

注释

此项目是使用Pyscaffold 3.1设置的。详细信息和用法 有关pyscaffold的信息,请参见https://pyscaffold.org/" rel="nofollow">https://pyscaffold.org/

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java Android解析JSON数据显示重复结果   Java图像写入   java将JSON对象作为对象而不是字符串写入文件   java获取servlet中的选定下拉列表值   java PowerMockito 1.6.0验证Mockito扩展API中的私有最终重载方法   java将地图图像更改为节点和边   java如何更改IntelliJ IDEA方案和窗格主题?   如何在java中解析文本文件?   当我使用Selenium IDE时,java WebDriver无法找到WebElement,而同样的css在哪里工作良好   java Android无线遥控摄像机   Go、Java和C#中数组的最大长度是多少?   java Guava的@Subscribe事件总线可见性   java如何将带有服务调用的循环重构为流?   java如何处理自定义Hamcrest匹配器中的异常?   java在Android中保存GUI状态   基于时间戳的java检索卡夫卡主题中的偏移量   图像构造函数中的java差异   java RxAndroidBle如何从多个服务读取通知?