sam-it / cs2cs
Cs2cs 的 PHP 封装
v1.0.0
2016-04-22 07:38 UTC
This package is auto-updated.
Last update: 2024-09-08 06:59:34 UTC
README
通过 PHP 和 cs2cs 进行坐标转换
用法
$cs2cs = new SamIT\Proj4\Cs2cs([
'proj' => 'sterea',
'lat_0' => 52.15616055555555,
'lon_0' => 5.38763888888889,
'k' => 0.9999079,
'x_0' => 155000,
'y_0' => 463000,
'ellps' => 'bessel',
'towgs84' => implode(',', [565.417,50.3319,465.552,-0.398957,0.343988,-1.8774,4.0725]),
'no_defs',
], [
'proj' => 'longlat',
'datum' => 'WGS84',
'no_defs'
], []);
$x = 236296.709;
$y = 590744.631;
$cs2cs->transform($x, $y, function($x, $y, $lon, $lat) use (&$count) {
$count++;
});
$cs2cs->close();
说明
Cs2cs 使用输出缓冲区,而不是在从 stdin 读取一行后立即写入,它等待输出缓冲区满后自动刷新。
为了有效地转换许多坐标,我们改为传递一个回调,当结果可用时调用该回调。
简短的功能文档
transform($x, $y, $callback)
设置一个回调,当 $x 和 $y 的转换完成时被调用。
close()
终止 cs2cs 进程,读取所有剩余数据。这将调用所有剩余的回调。
read($timeout = 0)
尝试从 cs2cs 读取数据并触发适当的回调。主要在内部使用。如果设置了超时,它将阻塞直到数据可用。使用此方法可能会导致死锁。
blockingTransform($x, $y)
如果您确实需要同步进行转换,可以使用此方法。这将向 cs2cs 写入哑数据并强制其刷新缓冲区。如果您只需要转换单个坐标,请使用 transform()
后跟 flush()
。使用此方法实际上写入 4000 字节而不是 ~25 字节。这比异步操作慢 10000 倍。
克隆
如果您想要更快地进行此操作(未经测试!),对象支持克隆。当 cs2cs 对象被克隆时,它将创建一个新的 cs2cs 进程。
基准测试,阻塞与异步
同步,注意运行大小为 100。
[Runcount] => 50
[Runsize] => 100
[Blocking] => 1
[Average:] => 1.0074578237534
[Minimum:] => 0.94923281669617
[Maximum:] => 1.6763138771057
异步,注意运行大小为 10000。
[Runcount] => 50
[Runsize] => 10000
[Blocking] =>
[Average:] => 0.19135624885559
[Minimum:] => 0.17859697341919
[Maximum:] => 0.20333218574524
结论:使用异步。