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

Java 英国大陆的OS UK网格参考,java,coordinates,computational-geometry,Java,Coordinates,Computational Geometry,我正试图把大量的收藏限制在那些在英国大陆的 -网格参考的背景知识- OS国家网格由相对于原点0,0的东向和北向组成。就我们而言,7000001300000是英国理论上最大的右上角 -我需要什么,我到目前为止做了什么- 我需要排除不在大不列颠大陆(即英国最大的岛屿)的任何网格参考。我很高兴这是一个粗略的最佳猜测算法;但我肯定需要比整个价值观范围更好的东西;这就是我现在所拥有的 操作系统将这个国家分成几个部分,这是一个开始。此图显示了英国是如何分裂的: 作者:cmglee、Strebe、Manswi

我正试图把大量的收藏限制在那些在英国大陆的

-网格参考的背景知识-

OS国家网格由相对于原点0,0的东向和北向组成。就我们而言,7000001300000是英国理论上最大的右上角

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

我需要排除不在大不列颠大陆(即英国最大的岛屿)的任何网格参考。我很高兴这是一个粗略的最佳猜测算法;但我肯定需要比整个价值观范围更好的东西;这就是我现在所拥有的

操作系统将这个国家分成几个部分,这是一个开始。此图显示了英国是如何分裂的:

作者:cmglee、Strebe、Manswille、来自naturalearthdata、Pethrus和nandhp的Alexrk2-英国国家电网.svgnorth西欧OSGB 1936 Datum.svg、CC By-SA 3.0、

从这一点出发,假设每一个有两个字母的正方形都是十万米见方,我知道我只需要考虑西向东边的SW到东100000到700000的TG,以及在最短的点0到999999的NoTest,这大大减少了数字;但还有很多事情要做

因此,到目前为止,我的逻辑给我的是矩形SW..HW..JW..TW

我知道,对于每个东距或东距范围,我可以存储有效北距值的地图,反之亦然,这将是实现这一点的一个选项;不过我想知道是否有人有其他想法。我正在考虑存储某种表示英国的多边形,然后检查多边形是否包含给定点

我将用java实现,使用整数表示东距和北距值

因此,我目前的粗略方法只是一个简单的方法:

公共最终静态输入最小值=100000; 公共最终静态int=1; 公共最终静态int maxOSEasting=700000; 公共最终静态int maxOSNorthing=1000000; 公共静态布尔值为有效东距,整数北距 { 返回easting>Minosesting&&eastingMinosNothing&&northing -编辑-
查看我在最后使用的坐标的答案

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


Jon Guiton的答案让我找到了正确的方向,找到了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);        
}