OS 英国大陆的英国网格参考
OS UK Grid References in Mainland Great Britain
我正在尝试将 UK OS Grid References (easting and northing) 的大 collection 限制为仅在英国大陆的那些。
-- 网格参考背景--
OS "National Grid" 由 "easting" 和 "northing" 相对于原点 (0,0) 组成。对于我们的目的,(700000, 1300000) 是理论上的最大值(top-right of the UK)。
-- 我所需要的,以及我目前所做的--
我需要排除不在英国大陆(即英国最大的岛屿)的任何网格参考。我很高兴这是一个粗略的 "best-guess" 算法;但我绝对需要比整个价值范围更好的东西;这就是我现在所拥有的。
OS系统将国家分裂成100km squares,这是一个开始。此图显示了英国是如何分裂的:
(By cmglee, Strebe, MansLaughter, Alexrk2 from naturalearthdata, Pethrus and nandhp - British National Grid.svgNorthwestern Europe on OSGB 1936 Datum.svg, CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=35301574)
据此,鉴于每个正方形(包含两个字母)是十万平方米,我知道我只需要考虑西边的东距 SW 到东边的 TG(100000 到 700000)和北距在最高点(0 到 999999)的近似范围 SW..NC 中 - 这大大减少了数字;但还有更多工作要做。
到目前为止,我的逻辑是矩形 SW..HW..JW..TW。
我知道,对于每个东距或东距范围,我可以存储有效北距值的地图(和 vice-versa)——这将是实现这一点的一个选择;但是我想知道是否有人有任何其他想法。我正在考虑存储某种代表英国的多边形,然后检查该多边形是否包含给定点?
我将在 java 中实施,使用整数作为东距和北距值。
所以我现在的粗略方法就是一个简单的:
public final static int minOSEasting = 100000;
public final static int minOSNorthing = 1;
public final static int maxOSEasting = 700000;
public final static int maxOSNorthing = 1000000;
public static boolean isValid(int easting, int northing)
{
return (easting > minOSEasting && easting < maxOSEasting && northing > minOSNorthing && northing < maxOSNorthing);
}
我不想使用外部库或 Web 服务调用。
--编辑--
最后使用的坐标请看我的回答()
看来您只需要多边形算法中的一个点。试试这个
Point in Polygon Algorithm
Jon Guiton 的回答让我找到了正确的方向,找到了 Java java.awt.Polygon
class,它有一个 contains
方法已经实现了一个合适的算法 - 这就是我最终使用的算法。
private static final Polygon greatBritain = new Polygon();
// initialisation for static objects
static
{
// All Points are approximate, outlining Great Britain without intersecting the mainland or IoW
// across the south coast, west to east
greatBritain.addPoint(170133,119);
greatBritain.addPoint(203933,39504);
greatBritain.addPoint(282096,32262);
greatBritain.addPoint(324954,81140);
greatBritain.addPoint(360590,61729);
greatBritain.addPoint(567458,85461);
greatBritain.addPoint(662279,148714);
// up the east coast
greatBritain.addPoint(623616,202459);
greatBritain.addPoint(656468,255852);
greatBritain.addPoint(660086,340187);
greatBritain.addPoint(572388,351306);
greatBritain.addPoint(545265,426094);
greatBritain.addPoint(514388,498407);
greatBritain.addPoint(464726,534376);
greatBritain.addPoint(425395,632549);
greatBritain.addPoint(362078,722471);
greatBritain.addPoint(426485,846924);
greatBritain.addPoint(392797,878940);
greatBritain.addPoint(289069,872012);
greatBritain.addPoint(341612,943508);
greatBritain.addPoint(345483,978319);
// across the north coast, east to west
greatBritain.addPoint(213057,976098);
greatBritain.addPoint(183952,903168);
greatBritain.addPoint(138593,888094);
greatBritain.addPoint(90959,827213);
// down the west coast
greatBritain.addPoint(165298,730796);
greatBritain.addPoint(148429,620198);
greatBritain.addPoint(191251,537703);
greatBritain.addPoint(225538,523691);
greatBritain.addPoint(271147,529579);
greatBritain.addPoint(326709,448021);
greatBritain.addPoint(320443,395657);
greatBritain.addPoint(292079,380022);
greatBritain.addPoint(247632,404665);
greatBritain.addPoint(216638,387248);
greatBritain.addPoint(222592,352210);
greatBritain.addPoint(202125,322380);
greatBritain.addPoint(244869,308001);
greatBritain.addPoint(243211,278849);
greatBritain.addPoint(179693,243828);
greatBritain.addPoint(156928,205381);
greatBritain.addPoint(265030,166546);
greatBritain.addPoint(126856,27044);
}
public static boolean isValid(int easting, int northing)
{
return greatBritain.contains(easting, northing);
}
我正在尝试将 UK OS Grid References (easting and northing) 的大 collection 限制为仅在英国大陆的那些。
-- 网格参考背景--
OS "National Grid" 由 "easting" 和 "northing" 相对于原点 (0,0) 组成。对于我们的目的,(700000, 1300000) 是理论上的最大值(top-right of the UK)。
-- 我所需要的,以及我目前所做的--
我需要排除不在英国大陆(即英国最大的岛屿)的任何网格参考。我很高兴这是一个粗略的 "best-guess" 算法;但我绝对需要比整个价值范围更好的东西;这就是我现在所拥有的。
OS系统将国家分裂成100km squares,这是一个开始。此图显示了英国是如何分裂的:
据此,鉴于每个正方形(包含两个字母)是十万平方米,我知道我只需要考虑西边的东距 SW 到东边的 TG(100000 到 700000)和北距在最高点(0 到 999999)的近似范围 SW..NC 中 - 这大大减少了数字;但还有更多工作要做。
到目前为止,我的逻辑是矩形 SW..HW..JW..TW。
我知道,对于每个东距或东距范围,我可以存储有效北距值的地图(和 vice-versa)——这将是实现这一点的一个选择;但是我想知道是否有人有任何其他想法。我正在考虑存储某种代表英国的多边形,然后检查该多边形是否包含给定点?
我将在 java 中实施,使用整数作为东距和北距值。
所以我现在的粗略方法就是一个简单的:
public final static int minOSEasting = 100000;
public final static int minOSNorthing = 1;
public final static int maxOSEasting = 700000;
public final static int maxOSNorthing = 1000000;
public static boolean isValid(int easting, int northing)
{
return (easting > minOSEasting && easting < maxOSEasting && northing > minOSNorthing && northing < maxOSNorthing);
}
我不想使用外部库或 Web 服务调用。
--编辑--
最后使用的坐标请看我的回答(
看来您只需要多边形算法中的一个点。试试这个
Point in Polygon Algorithm
Jon Guiton 的回答让我找到了正确的方向,找到了 Java java.awt.Polygon
class,它有一个 contains
方法已经实现了一个合适的算法 - 这就是我最终使用的算法。
private static final Polygon greatBritain = new Polygon();
// initialisation for static objects
static
{
// All Points are approximate, outlining Great Britain without intersecting the mainland or IoW
// across the south coast, west to east
greatBritain.addPoint(170133,119);
greatBritain.addPoint(203933,39504);
greatBritain.addPoint(282096,32262);
greatBritain.addPoint(324954,81140);
greatBritain.addPoint(360590,61729);
greatBritain.addPoint(567458,85461);
greatBritain.addPoint(662279,148714);
// up the east coast
greatBritain.addPoint(623616,202459);
greatBritain.addPoint(656468,255852);
greatBritain.addPoint(660086,340187);
greatBritain.addPoint(572388,351306);
greatBritain.addPoint(545265,426094);
greatBritain.addPoint(514388,498407);
greatBritain.addPoint(464726,534376);
greatBritain.addPoint(425395,632549);
greatBritain.addPoint(362078,722471);
greatBritain.addPoint(426485,846924);
greatBritain.addPoint(392797,878940);
greatBritain.addPoint(289069,872012);
greatBritain.addPoint(341612,943508);
greatBritain.addPoint(345483,978319);
// across the north coast, east to west
greatBritain.addPoint(213057,976098);
greatBritain.addPoint(183952,903168);
greatBritain.addPoint(138593,888094);
greatBritain.addPoint(90959,827213);
// down the west coast
greatBritain.addPoint(165298,730796);
greatBritain.addPoint(148429,620198);
greatBritain.addPoint(191251,537703);
greatBritain.addPoint(225538,523691);
greatBritain.addPoint(271147,529579);
greatBritain.addPoint(326709,448021);
greatBritain.addPoint(320443,395657);
greatBritain.addPoint(292079,380022);
greatBritain.addPoint(247632,404665);
greatBritain.addPoint(216638,387248);
greatBritain.addPoint(222592,352210);
greatBritain.addPoint(202125,322380);
greatBritain.addPoint(244869,308001);
greatBritain.addPoint(243211,278849);
greatBritain.addPoint(179693,243828);
greatBritain.addPoint(156928,205381);
greatBritain.addPoint(265030,166546);
greatBritain.addPoint(126856,27044);
}
public static boolean isValid(int easting, int northing)
{
return greatBritain.contains(easting, northing);
}