使用铁锈FFI的ELTS88和BNG(OSGB36)的快速Lon
convertbng的Python项目详细描述
说明
一个实用程序库,用于将十进制wgs84经纬度坐标转换为etrs89(epsg:25830)和/或英国国家电网。(更准确地说:OSGB36,或epsg:27700)东距和北距,反之亦然。
转换由使用ffi的arust二进制文件来处理,而且非常快。在这里可以找到一些基准。
该软件包已在以下平台上构建和测试: 这个包使用的rust dll和cython扩展是用msvc工具链构建的。您不需要安装任何额外的运行时才能使车轮工作,但如果遇到任何错误,请打开一个问题。 函数接受经度或东距值序列(如列表或numpy数组)和纬度或北距值序列,或单个经度/东距值和单个纬度/北距值。注意返回类型: 注意:bng边界框外或没有ostn15覆盖的坐标对将返回 经度: 所有函数都会尽量自由地选择它们接受的容器: 如果您习惯于限制自己使用 转换函数将接受实现 提供完整性: 从转换和OSGM02™用户指南,第7页。强调我的。 […]ETRS89是为欧洲使用而优化的更为知名的WGS84参考系统的精确版本;但是,在大多数情况下,它可以被视为等同于WGS84。
具体而言,欧洲大陆板块的运动在ETRS89中并不明显,这使得该系统与军械测绘坐标系之间建立了固定的关系。
目前正在使用WGS84的其他精确版本,特别是ITRS;这些版本不等同于ETRS89。itrs与etrs89之间的差距约为0.25米(1999年),英国和爱尔兰每年增长0.025米。这种效应只与国际科学应用有关。对于欧洲构造稳定地区(包括英国和爱尔兰)内的所有导航、制图、地理信息系统和工程应用,术语ETRS89应被视为WGS84的同义词 实际上,这意味着在本自述文件中看到ETRS89的任何地方,都可以替换WGS84。安装
pip安装转换bng
请使用最新版本的PIP(8.1.2
截至2016年6月)支持的平台
Windows二进制文件
用法
"返回两个分别包含浮点数的列表"
[[nan],[nan]]
,无法映射。由于转换后的坐标被保证以与输入相同的顺序返回,因此检查这个值很简单。或者,在转换数据之前,请确保数据位于边界框内:
东部:1.7800
我们ST:-7.5600
纬度:
北:60.8400
南部:49.9600list
,tuple
,array.array
,numpy.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>的大多数序列,如上所述(
list
,tuple
,float
,array
,numpy.ndarray
),但将始终返回numpy f64 ndarray
>。此外,您必须确保输入为float
,f64
或d
,如果是array.array
可用的转换(也称为我想…)
convert_to_etrs89()
将etrs89\u转换为@lonlat()
将ETRS89\u转换为OSGB36()
将osgb36\u转换为etrs89()
ETRS89与WGS84之间的关系
我的数据在
。一切都很好!
- 它们可能是wgs84。一切都很好!
(-626172.1357121646887893.4928337997)
,或者"spheral mercator"这个词在任何地方都有提及:
精度
convert_bng
和convert_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混合坐标进行计算是不可取的。
实施
感兴趣的主要细节是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数据结构转换为元组列表。
为本地开发构建二进制文件
- 确保已安装Rust 1.x和货物
- 克隆https://github.com/urschrei/lonlat_bng" rel="nofollow">https://github.com/urschrei/lonlat_bng,并确保它与此目录相邻(即
code/witnessme/convertbng
和code/witnessme/rust_bng
) - 在此目录中,运行
make clean
然后make
测试
您可以通过运行"make test"来运行python模块测试。
测试需要numpy
和nose