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);        
}