Java 英国大陆的OS UK网格参考
我正试图把大量的收藏限制在那些在英国大陆的 -网格参考的背景知识- OS国家网格由相对于原点0,0的东向和北向组成。就我们而言,7000001300000是英国理论上最大的右上角 -我需要什么,我到目前为止做了什么- 我需要排除不在大不列颠大陆(即英国最大的岛屿)的任何网格参考。我很高兴这是一个粗略的最佳猜测算法;但我肯定需要比整个价值观范围更好的东西;这就是我现在所拥有的 操作系统将这个国家分成几个部分,这是一个开始。此图显示了英国是如何分裂的: 作者:cmglee、Strebe、Manswille、来自naturalearthdata、Pethrus和nandhp的Alexrk2-英国国家电网.svgnorth西欧OSGB 1936 Datum.svg、CC By-SA 3.0、Java 英国大陆的OS UK网格参考,java,coordinates,computational-geometry,Java,Coordinates,Computational Geometry,我正试图把大量的收藏限制在那些在英国大陆的 -网格参考的背景知识- OS国家网格由相对于原点0,0的东向和北向组成。就我们而言,7000001300000是英国理论上最大的右上角 -我需要什么,我到目前为止做了什么- 我需要排除不在大不列颠大陆(即英国最大的岛屿)的任何网格参考。我很高兴这是一个粗略的最佳猜测算法;但我肯定需要比整个价值观范围更好的东西;这就是我现在所拥有的 操作系统将这个国家分成几个部分,这是一个开始。此图显示了英国是如何分裂的: 作者:cmglee、Strebe、Manswi
从这一点出发,假设每一个有两个字母的正方形都是十万米见方,我知道我只需要考虑西向东边的SW到东100000到700000的TG,以及在最短的点0到999999的NoTest,这大大减少了数字;但还有很多事情要做
因此,到目前为止,我的逻辑给我的是矩形SW..HW..JW..TW 我知道,对于每个东距或东距范围,我可以存储有效北距值的地图,反之亦然,这将是实现这一点的一个选项;不过我想知道是否有人有其他想法。我正在考虑存储某种表示英国的多边形,然后检查多边形是否包含给定点 我将用java实现,使用整数表示东距和北距值 因此,我目前的粗略方法只是一个简单的方法: 公共最终静态输入最小值=100000; 公共最终静态int=1; 公共最终静态int maxOSEasting=700000; 公共最终静态int maxOSNorthing=1000000; 公共静态布尔值为有效东距,整数北距 { 返回easting>Minosesting&&easting查看我在最后使用的坐标的答案似乎您只需要多边形算法中的一个点。试试这个
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);
}