英国大陆上的OS UK网格参考

时间:2019-05-09 11:16:25

标签: java coordinates computational-geometry

我正试图将UK OS Grid References (easting and northing)的大量集合限制为仅在英国大陆的那些。

-网格引用的背景-

操作系统“国家网格”由相对于原点(0,0)的“东”和“北”组成。就我们的目的而言,(700000,1300000)是理论最大值(英国的右上方)。

-我需要什么,到目前为止我做了什么-

我需要排除任何不在英国大陆(即英国最大的岛)内的网格引用。我很高兴能成为一种粗略的“最佳猜测”算法;但我绝对需要比整个价值范围更好的东西;这就是我现在所拥有的。

操作系统将国家划分为100km squares,这是一个开始。此图显示了英国如何分裂:

OS UK Grid References Map(来自自然地球数据,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

2 个答案:

答案 0 :(得分:1)

似乎您只想要多边形算法中的一个点。试试这个

Point in Polygon Algorithm

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