使用铁锈FFI的ELTS88和BNG(OSGB36)的快速Lon

convertbng的Python项目详细描述


travis(.org)windows构建状态coverage statuspypi versionmit licensed

说明

一个实用程序库,用于将十进制wgs84经纬度坐标转换为etrs89(epsg:25830)和/或英国国家电网。(更准确地说:OSGB36,或epsg:27700)东距和北距,反之亦然。

转换由使用ffi的arust二进制文件来处理,而且非常快。在这里可以找到一些基准。

安装

pip安装转换bng
请使用最新版本的PIP(8.1.2截至2016年6月)

支持的平台

该软件包已在以下平台上构建和测试:

Windows二进制文件

这个包使用的rust dll和cython扩展是用msvc工具链构建的。您不需要安装任何额外的运行时才能使车轮工作,但如果遇到任何错误,请打开一个问题。

用法

函数接受经度或东距值序列(如列表或numpy数组)和纬度或北距值序列,单个经度/东距值和单个纬度/北距值。注意返回类型:
"返回两个分别包含浮点数的列表"

注意:bng边界框外或没有ostn15覆盖的坐标对将返回
[[nan],[nan]],无法映射。由于转换后的坐标被保证以与输入相同的顺序返回,因此检查这个值很简单。或者,在转换数据之前,请确保数据位于边界框内:

经度:
东部:1.7800
我们ST:-7.5600
纬度
北:60.8400
南部:49.9600

所有函数都会尽量自由地选择它们接受的容器:listtuplearray.arraynumpy.ndarray,以及几乎所有具有\uiter\uu属性的函数都应该可以工作,包括生成器。

fromconvertbng.utilimportconvert_bng,convert_lonlat# convert a single valueres=convert_bng(lon,lat)# convert lists of longitude and latitude values to OSGB36 Eastings and Northings, using OSTN15 correctionslons=[lon1,lon2,lon3]lats=[lat1,lat2,lat3]res_list=convert_bng(lons,lats)# convert lists of BNG Eastings and Northings to longitude, latitudeeastings=[easting1,easting2,easting3]northings=[northing1,northing2,northing3]res_list_en=convert_lonlat(eastings,northings)# assumes numpy imported as nplons_np=np.array(lons)lats_np=np.array(lats)res_list_np=convert_bng(lons_np,lats_np)

但我有一个坐标对列表

coords = [[1.0, 2.0], [3.0, 4.0]]
a, b = list(zip(*coords))
# a is (1.0, 3.0)
# b is (2.0, 4.0)

但我有形状的几何图形
from shapely.geometry import LineString

ls = LineString([[651307.003, 313255.686], [651307.004, 313255.687]])
new_linestring = LineString(
    zip(*convert_etrs89_to_lonlat(*zip(*ls.coords)))
)

实验cython模块

如果您习惯于限制自己使用numpy f64数组,则可以使用cython函数代替。它们与下面列出的相同,通过更改import语句来选择
从convertbng.util import
来自convertbng.cutil import

转换函数将接受实现/code>的大多数序列,如上所述(listtuplefloatarraynumpy.ndarray),但将始终返回numpy f64 ndarray>。此外,您必须确保输入为floatf64d,如果是array.array

可用的转换(也称为我想…)

  • 将经纬度转换为OSGB36东向和北向非常准确
    • 使用convert bng()
  • 将OSGB36东、北向转换为经纬度,非常准确
    • 使用convert_lonlat()
  • 将经纬度转换为ETRS89东向和北向,非常快(无OSTN15校正):
    • 使用convert_to_etrs89()
  • 将ETRS89东、北向转换为ETRS89经纬度,非常快(转换不使用OSTN15):
    • 使用将etrs89\u转换为@lonlat()
  • 使用OSTN15修正将ETRS89东距和北距转换为其最精确的真实表示:
    • 使用将ETRS89\u转换为OSGB36()

提供完整性:

  • 将精确的OSGB36东距和北距转换为不精确的ETRS89东距和北距:
    • 使用将osgb36\u转换为etrs89()

ETRS89与WGS84之间的关系

转换和OSGM02™用户指南,第7页。强调我的。

< Buff行情>

[…]ETRS89是为欧洲使用而优化的更为知名的WGS84参考系统的精确版本;但是,在大多数情况下,它可以被视为等同于WGS84。 具体而言,欧洲大陆板块的运动在ETRS89中并不明显,这使得该系统与军械测绘坐标系之间建立了固定的关系。 目前正在使用WGS84的其他精确版本,特别是ITRS;这些版本不等同于ETRS89。itrs与etrs89之间的差距约为0.25米(1999年),英国和爱尔兰每年增长0.025米。这种效应只与国际科学应用有关。对于欧洲构造稳定地区(包括英国和爱尔兰)内的所有导航、制图、地理信息系统和工程应用,术语ETRS89应被视为WGS84的同义词

实际上,这意味着在本自述文件中看到ETRS89的任何地方,都可以替换WGS84。

我的数据在

精度

convert_bngconvert_lonlat首先使用标准的七个步骤来转换坐标。这是快速的,但不是特别准确-它可以引入位置误差高达约5米。对于大多数应用程序,这并不是特别值得关注的——输入数据(特别是那些来自智能手机GPS的数据)在任何情况下都可能超过这个误差水平。为了对此进行调整,将检索ETRS89点落入的公里网格的OSTN15调整,并执行线性插值以给出最终的精确坐标。这个过程与convert lonlat相反

OSTN15

OSTN15数据用于从ETRS89经纬度或ETRS89东、北向OSGB36东、北的高精度转换。Hings,反之亦然。这些数据通常是使用国家GPS网络记录的

您的数据的准确性

使用ostn15转换转换坐标将是准确的,但是如果您使用的是消费类设备,或者从网上获取数据,请注意,您正在转换的坐标可能一开始就没有准确记录。这是因为精确的测量是困难的

此库中使用的OSTN15转换的精度

  • ETRS89经纬度/东距和北距与OSGB36的转换符合42个测试坐标中31的提供的军械测量测试数据(不包括设计为返回无数据的两个坐标;这些坐标正确失效)。
  • 在每种情况下,11个差异均1mm
  • OSGB36到ETRS89的经纬度转换精确到小数点后8位或1.1毫米。

关于椭球的注记

WGS84和ETRS89坐标使用GRS80椭球体,而OSGB36使用AIRY 1830椭球体,这为英国提供了一个最适合的地区。因此,英国的坐标位置可能相差超过100米。因此,尝试使用ETRS89和OSGB36混合坐标进行计算是不可取的。

ostn15

实施

感兴趣的主要细节是python和rust之间的ffi接口,其python端可以在util.py(cTypes实现)中找到,//github.com/urschrei/convertbng/blob/master/convertbng/cutil.pyx l51-l86" rel="nofollow">cutil.pyx(cython实现),其生锈的一面可以在ffi.rs中找到。 库需要c兼容的数据结构,我们在rust中定义(见上文)。然后,我们定义方法,允许我们接收、安全访问、返回和释放跨越ffi边界的数据。
最后,我们再次将rust转换函数链接到util.py。注意errcheck赋值,它将ffi兼容的cTypes数据结构转换为元组列表。

为本地开发构建二进制文件

测试

您可以通过运行"make test"来运行python模块测试。 测试需要numpynose

许可证

麻省理工学院

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

推荐PyPI第三方库


热门话题
反射Java反射:高负载下的NoSuchMethodException   java RxJava:one request>list of Integer>sequence of requests for each int>result to list   java为什么循环之前索引会增加   JavaSpring远程处理和RESTfulURL   java Hibernate搜索仅对我的实体的一部分进行索引   使用DPAD快速滚动时,java RecyclerView onCreateViewHolder调用过多   java将JSON解析到一个表中   java导航抽屉标题textview nullpointerexception   基于接口的Java链接队列   java Guice运行时依赖项参数重新注入   java展平/压缩ZSH中的深度嵌套目录   JavaSpring:Http406此请求标识的资源只能   java如何制作Android启动器图标   Java代码在windows上显示不正确(包含希腊语句子)   使用yourkit进行内存分析所用的java时间   java为什么可以序列化属性而不能序列化对象本身?