我正试图将UK OS Grid References (easting and northing)的大量集合限制为仅在英国大陆的那些。
-网格引用的背景-
操作系统“国家网格”由相对于原点(0,0)的“东”和“北”组成。就我们的目的而言,(700000,1300000)是理论最大值(英国的右上方)。
-我需要什么,到目前为止我做了什么-
我需要排除任何不在英国大陆(即英国最大的岛)内的网格引用。我很高兴能成为一种粗略的“最佳猜测”算法;但我绝对需要比整个价值范围更好的东西;这就是我现在所拥有的。
操作系统将国家划分为100km squares,这是一个开始。此图显示了英国如何分裂:
(来自自然地球数据,Pethrus和nandhp的cmglee,Strebe,MansLaughter,Alexrk2-英国国家网格。svg位于OSGB 1936 Datum.svg上的西北欧,CC BY-SA 3.0,https://commons.wikimedia.org/w/index.php?curid=35301574)< / p>
因此,鉴于每个正方形(带有两个字母)为十万平方米,我知道我只需要考虑西边的东南SW到东边的TG(100000至700000)以及北边的最高点处的近似范围SW..NC(0到999999)-大大减少了数字;但还有更多工作要做。
因此,到目前为止,我的逻辑是矩形SW..HW..JW..TW。
我知道,对于每个东移或东移范围,我都可以存储有效北移值的地图(反之亦然)-这将是实现此目标的一种选择;但是我想知道是否还有其他想法。我正在考虑存储代表英国的某种多边形,然后检查该多边形是否包含给定点?
我将在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服务调用。
-编辑- 有关我最后使用的坐标,请参见我的答案(https://stackoverflow.com/a/56059697/318414)
答案 0 :(得分:1)
似乎您只想要多边形算法中的一个点。试试这个
答案 1 :(得分:0)
乔恩·吉顿(Jon Guiton)的回答使我朝着正确的方向寻找找到Java java.awt.Polygon
类,该类具有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);
}