bespoke-support/osgb-tools

此软件包最新版本(0.2)没有可用的许可证信息。

OSGB(东西向和南北向)转换工具

0.2 2015-09-09 21:14 UTC

This package is auto-updated.

Last update: 2024-09-21 00:29:03 UTC


README

英国(GB)的大不列颠(GB)地形测量局(OS)国家网格参考转换工具。

用法

要创建一个正方形,传入一个国家网格参考(NGR)字符串

$square = new Academe\OsgbTools\Square($ngr_string);

正方形是OSGB国家网格上的一个正方形区域,其由其西南角来识别。正方形的大小,即位置的精确度,由数字和字母的数量决定。两个字母和五个数字的NGR是一个1米的正方形,这是OSGB支持的最小单位。

NGR字符串可以采取任何形式,只要字母在前,然后是东西向,然后是南北向。OSGB的示例(这些都是相同的位置)

NT 0456 1230 (to 10m)
NT04561230
NT 04560 12300 (to 1m)
N 30456 11230
0304560,0612300 (to 1m)
304560, 612300 (to 1m)

字母和数字都是可选的

NT 00000 00000 (to 1m)
NT (to 100km)
N (to 500km)
0,0 (square 'S' to 1m)
0000000,0000000 (square 'S' to 1m)
401250,1234350 (to 1m - note 7 digit northing to reach Orkneys)

注意:当使用字母时,前导零很重要,因为最高位数字代表相同的正方形角落,无论其后跟多少位数字。当不使用字母时,纯数字值被视为从虚原点起的米数。下面有更详细的解释。

尽管数字的处理可以遵循从两个字母到无字母的模式,但它确实引入了一些歧义。当涉及字母时,提供的数字假定以最高位数字开头。这允许1,10,100,1000等所有数字都引用相同的点(正方形的西南角),尽管精度(正方形的大小)不同。然而,纯数字的东西向/南北向总是以米为单位测量,并描述从正方形SV点起的距离。因此,1,10,100等在纯数字参考中将是非常不同的东西向或南北向值。因此,库将处理纯数字参考与字母/数字参考不同。纯数字始终是1平方米的点。

注意,单个字母代表一个500km的正方形,因此"N 712 834"将超出该正方形,并显示为"J 212 334"(向北和向东移动一个500km的方块)。这样做是为了避免抛出异常;"N 712 834"通常不会被使用("N 000 000"到"N 499 499"是正常的),但它仍然代表一个实际的位置。然而,这个库不会生成超出范围的数字,因此如果您传入"N 712 834",您总是会得到"J 212 334"(或等效的)在J方块上。

在NGR中使用的不字母数字字符将被忽略。这包括空格和逗号。

精度(以米为单位的方块大小)通过以下方式返回

$square->getSize();

可以单独提取格式化参考的部分

$letters = $square->getLetters();
$easting = $square->getEasting();
$northing = $square->getNorthing();
echo "OSGB reference = " . trim("$letters $easting $northing");

或者可以一次格式化

echo (string)$square; // e.g. 'SE 0123034300'
echo $square->setNumberOfLetters(1)->format(); // e.g. 'S 401230434300'
echo $square->format('%l %e %n', 1, 3); // e.g. 'S 401 434' with 1 letter and 3 digits
echo $square->format('%x,%y'); // e.g. '401250,1234350' numeric-only easting/northing metres from false origin

默认情况下,部分的格式将与传入的相同。这可以被覆盖

$square->setNumberOfLetters($number_letters); // 0, 1 or 2
$square->setNumberOfDigits($number_digits); // 0 to 7

随着字母数量的变化,数字的数量将自动改变以尝试保持相同的精度,即表示相同的正方形大小。您仍然可以在之后更改数字的数量以获得更高的或更低的精度。

并非所有字母组合都覆盖了OS地图上的土地。只有H,N,O,S和T这五个500km的正方形被OS使用。理论上,这些方块确实延伸到那里,但精度迅速下降。在这些500km的正方形内部,只有一部分100km的正方形被OS绘制。同样,该库仍然支持该范围之外的100km方块,但在OS地图上它们没有意义。

顺便说一下,500平方公里的大O只覆盖了约克郡的一小部分,其中大部分位于北海。因此,唯一以O开头的100平方公里方格是OV。

要检查当前参考是否位于OS绘制的有效100平方公里方格内,请使用此方法

if ($square->isInBound()) echo "Yes, this place is on a printed map";

坐标转换示例

这部分正在开发中,可能会发生变化。然而,它确实演示了这个过程。

  • Academe\OsgbTools\Convert::osGridToLatLong()将返回一个Academe\OsgbTools\Coordinate
  • Academe\OsgbTools\Convert::latLongToOsGrid()将返回一个Academe\OsgbTools\Square

我们将把SE0123034300转换为纬度/经度。首先创建一个方格

// Spaces in the reference are optional - they are shown here for clarity.
$square = new Academe\OsgbTools\Square('SE 01230 34300');

然后提取经度和纬度

list($Easting, $Northing) = $square->getEastNorth();
// Easting = 401230, Northing = 434300

这给出了只有7位数字的值。转换类有一个将此转换为纬度/经度值的方法。请注意,这将是Airy基准(也称为OSGB纬度/经度),如果与GPS坐标进行比较,则需要进一步的椭球转换。

$convert = new Academe\OsgbTools\Convert;
$lat_long = $convert->osGridToLatLong($Easting, $Northing);
var_dump($lat_long);
// object(Academe\OsgbTools\Coordinate)#8 (2) { ["latitude":protected]=> float(53.805230674459) ["longitude":protected]=> float(-1.9810171150917) }

相同的转换也可以在这里看到: http://www.nearby.org.uk/coord.cgi?p=SE0123034300&f=full

另一个检查工具:http://www.russ-hore.co.uk/osgb/(粘贴OSGB参考"SE 01230 34300")。我怀疑所有工具都在以不同方式受到舍入误差的影响,或者可能使用了不同的椭球。需要调查以找到正确的一个

现在可以一步完成转换

// Conert an OSGB NGR to lat/long object (\Academe\OsgbTools\Coordinate).
$lat_long = Academe\OsgbTools\Convert::osGridToLatLong('SE 0120 3430');
//
// A Square or array can also be passed in, as well as the examples further back:
$lat_log = Academe\OsgbTools\Convert::osGridToLatLong(array($easting, $northing));
$lat_log = Academe\OsgbTools\Convert::osGridToLatLong($square);

相反方向的转换也可以完成。纬度/经度值必须在Airy基准上,所以如果不在,需要将其从使用的基准转换过来。

$convert = new Academe\OsgbTools\Convert;
$square = $convert->latLongToOsGrid($latitude, $longitude);
echo $square;
// e.g. SE 01230 34300
//
// or
$square = Academe\OsgbTools\Convert::latLongToOsGrid($latitude, $longitude);
//
$latitude = 53.804781271911;
$longitude = -1.9813210410013;
$lat_long = new Academe\OsgbTools\Coordinate(array($latitude, $longitude));
$square = Academe\OsgbTools\Convert::latLongToOsGrid($lat_long);

一些术语:大地测量坐标(也称为地理坐标)包括大地测量纬度、大地测量经度和大地测量高度。地心坐标是笛卡尔坐标(X,Y,Z),用于定义相对于地球质心的点的位置。

再次注意:这将会改变,这只是快速放入的库以进行演示(虽然越来越稳定)。

待办事项

  • 目前此库只支持GB国家网格。爱尔兰网格类似,我们应该能够将OSGB扩展到包括爱尔兰网格。爱尔兰网格只使用一个500公里方格,该方格在参考中未列出。相反,只使用一个字母来表示5x5 100公里方格网格中的100公里方格。
  • 将其他基准(特别是WGS84)转换为椭球,包括转换为适当的椭球。可能需要进行一些重构以保持各种关注点分离。看起来似乎没有我们可以拉入以处理转换的composer依赖项,所以我不确定我们是否创建一个单独的库(基于其他经过测试的库)或将其代码合并到这个库中。可能后一种,然后我们稍后可以分叉它。这里的关键是要保持NGR(方格/位置参考)以及与其他坐标系统之间的转换分离。这将有助于测试和理解。我没有找到其他任何composer库做这件事。

有用的链接

理想情况下,OSGB(南北/东西 + 网格)应直接从/到WGS84转换,而不是Airy。

处理OSGB坐标及其所有变化的一个类将是必要的。