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

结论:使用异步。