ОС Великобритании Grid References в материковой части Великобритании - PullRequest
0 голосов
/ 09 мая 2019

Я пытаюсь ограничить большую коллекцию ссылок на ОС Великобритании (восток и север) только теми, которые находятся на материковой части Великобритании.

- Справочная информация о ссылках на сетку-

ОС "Национальная сетка" сформирована из "восточных" и "северных" относительно происхождения (0,0).Для наших целей (700000, 1300000) является теоретическим максимумом (в правом верхнем углу Великобритании).

- Что мне нужно, и что я уже сделал -

Мне нужно исключить любые ссылки на сетки, которые не находятся на материковой части Великобритании (то есть на самом большом острове Великобритании).Я рад, что это грубый алгоритм «лучшего предположения»;но мне определенно нужно что-то лучшее, чем весь диапазон ценностей;что-то вроде того, что я получил сейчас.

Система ОС делит страну на 100км квадратов , что является началом.Это изображение показывает, как раскололась Великобритания:

OS UK Grid References Map (By cmglee, Strebe, MansLaughter, Alexrk2 из naturalearthdata, Pethrus и nandhp - Британская национальная сеть Grid.svgСеверная Европа в OSGB 1936Datum.svg, CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=35301574)

Исходя из этого, учитывая, что каждый квадрат (с двумя буквами в нем) является квадратом в сто тысяч метров, я знаю, что мне нужно учитывать только восточные SW вс запада на TG на востоке (от 100000 до 700000) и на север в приблизительном диапазоне SW..NC в самой высокой точке (от 0 до 999999) - что значительно сокращает числа, но еще многое предстоит сделать.

Поэтому моя логика до сих пор дала мне прямоугольник SW..HW..JW..TW.

Я знаю, что для каждого восточного или диапазона восточных направлений я мог бы хранить картудействительных значений на север (и наоборот) - и это было бы одним из вариантов для реализации этого, однако мне было интересно, если у кого-нибудь есть какие-либо другие идеи. Я рассматриваю вопрос о сохранении некоторого вида многоугольника, который представляет UK, а затем проверить, содержит ли многоугольник заданную точку?

Я буду реализовывать в 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);
    }

Я бы предпочел не использовать вызов из внешней библиотеки или веб-службы.

- Изменить - см. мой ответ (https://stackoverflow.com/a/56059697/318414) для координат, которые я использовалв итоге

Ответы [ 2 ]

1 голос
/ 09 мая 2019

Кажется, вы просто хотите точку в алгоритме многоугольника. Попробуйте это

Точка в алгоритме многоугольника

0 голосов
/ 09 мая 2019

Ответ Джона Гитона заставил меня взглянуть в правильном направлении, чтобы найти класс 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);        
}
...