Created
August 9, 2023 16:40
-
-
Save betolink/77469f38f7b25aa16b1550a0e24e6474 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from collections import namedtuple | |
from functools import partial | |
from shapely.affinity import translate | |
from shapely.geometry.multipolygon import MultiPolygon | |
from shapely.geometry.point import Point | |
from shapely.geometry.polygon import Polygon | |
from shapely.ops import transform | |
# For some plates, points that cross the meridian need to be adjusted | |
# to be negative for coordinate continuity. This allows us to test for | |
# point inclusion correctly with Shapely. | |
def _shift_large_longitudes(threshold, x, y): | |
if x > threshold: | |
return (x - 360, y) | |
else: | |
return (x, y) | |
ANTA = Polygon([ | |
(359.70, -54.50), | |
(359.30, -54.80), | |
(358.90, -54.80), | |
(358.60, -55.10), | |
(358.40, -55.30), | |
(358.40, -55.60), | |
(355.30, -55.80), | |
(353.00, -57.80), | |
(343.80, -58.30), | |
(343.80, -59.00), | |
(342.00, -59.10), | |
(342.00, -59.60), | |
(341.50, -59.60), | |
(341.50, -60.20), | |
(341.10, -60.20), | |
(341.00, -60.50), | |
(340.70, -60.50), | |
(340.60, -60.80), | |
(340.10, -60.90), | |
(339.50, -60.90), | |
(338.80, -61.00), | |
(338.10, -61.00), | |
(337.40, -61.00), | |
(336.70, -61.00), | |
(336.10, -61.00), | |
(335.60, -60.90), | |
(335.10, -60.80), | |
(334.40, -60.70), | |
(326.70, -60.00), | |
(322.50, -61.00), | |
(312.50, -60.00), | |
(304.00, -60.70), | |
(289.20, -55.40), | |
(288.00, -54.90), | |
(286.90, -54.40), | |
(285.70, -53.60), | |
(284.80, -53.00), | |
(284.70, -51.90), | |
(284.60, -50.70), | |
(284.60, -49.60), | |
(284.30, -48.80), | |
(284.10, -47.70), | |
(284.00, -46.90), | |
(283.80, -45.80), | |
(283.80, -45.30), | |
(283.40, -45.60), | |
(282.70, -45.60), | |
(281.50, -45.20), | |
(280.40, -45.00), | |
(279.40, -44.90), | |
(277.70, -44.80), | |
(277.30, -44.30), | |
(277.10, -43.30), | |
(276.90, -41.90), | |
(276.10, -41.80), | |
(275.30, -41.70), | |
(273.60, -41.50), | |
(271.30, -41.30), | |
(268.90, -41.20), | |
(268.30, -40.30), | |
(268.20, -39.10), | |
(267.50, -38.80), | |
(266.30, -38.40), | |
(266.40, -37.40), | |
(265.40, -37.20), | |
(263.70, -37.10), | |
(263.70, -36.50), | |
(263.00, -36.40), | |
(261.60, -36.30), | |
(259.70, -36.10), | |
(258.20, -35.90), | |
(256.30, -35.80), | |
(254.70, -35.70), | |
(253.40, -35.50), | |
(252.30, -35.30), | |
(251.10, -35.20), | |
(249.80, -35.20), | |
(249.10, -35.10), | |
(248.00, -34.90), | |
(248.30, -38.40), | |
(247.80, -40.70), | |
(247.30, -42.70), | |
(246.70, -45.20), | |
(245.90, -48.30), | |
(245.00, -50.00), | |
(243.60, -49.60), | |
(243.00, -50.80), | |
(241.60, -53.20), | |
(242.00, -53.30), | |
(241.00, -54.50), | |
(239.50, -54.30), | |
(237.70, -55.80), | |
(233.60, -54.70), | |
(233.00, -55.30), | |
(231.30, -54.90), | |
(227.60, -54.10), | |
(227.00, -54.90), | |
(223.10, -54.00), | |
(222.40, -55.00), | |
(222.10, -54.90), | |
(220.80, -56.20), | |
(220.10, -56.00), | |
(219.20, -56.80), | |
(215.30, -55.70), | |
(213.40, -57.30), | |
(212.90, -57.10), | |
(210.70, -58.70), | |
(210.90, -58.80), | |
(209.20, -60.00), | |
(207.90, -59.60), | |
(202.50, -63.10), | |
(198.70, -61.70), | |
(195.60, -63.30), | |
(194.10, -62.80), | |
(189.20, -65.10), | |
(188.10, -64.70), | |
(182.30, -66.70), | |
(174.80, -63.70), | |
(173.40, -64.10), | |
(170.50, -62.50), | |
(168.40, -63.00), | |
(167.40, -62.60), | |
(166.40, -62.90), | |
(165.00, -62.00), | |
(163.80, -62.30), | |
(163.20, -61.80), | |
(155.90, -63.00), | |
(155.70, -62.90), | |
(153.80, -60.10), | |
(150.40, -60.50), | |
(148.80, -57.50), | |
(147.50, -57.60), | |
(147.20, -55.60), | |
(146.20, -55.70), | |
(146.10, -54.70), | |
(145.00, -54.70), | |
(144.50, -54.30), | |
(143.90, -54.40), | |
(143.60, -54.10), | |
(141.20, -54.20), | |
(140.80, -52.70), | |
(140.00, -52.80), | |
(139.60, -51.90), | |
(138.60, -52.00), | |
(137.70, -50.60), | |
(136.40, -50.80), | |
(136.00, -50.40), | |
(134.40, -50.40), | |
(134.20, -50.30), | |
(132.30, -50.30), | |
(132.30, -50.10), | |
(130.90, -50.10), | |
(130.80, -50.30), | |
(127.50, -49.90), | |
(127.70, -49.00), | |
(126.90, -48.90), | |
(126.60, -49.70), | |
(125.70, -49.60), | |
(125.80, -49.40), | |
(125.40, -49.30), | |
(125.40, -49.20), | |
(125.00, -49.10), | |
(124.80, -49.40), | |
(124.50, -49.40), | |
(124.50, -49.70), | |
(123.90, -49.60), | |
(123.70, -50.00), | |
(122.70, -49.80), | |
(122.90, -49.30), | |
(122.30, -49.20), | |
(121.70, -50.20), | |
(118.80, -49.70), | |
(118.60, -49.90), | |
(118.10, -49.80), | |
(118.00, -50.10), | |
(116.40, -49.80), | |
(115.90, -50.70), | |
(114.80, -50.40), | |
(114.30, -51.20), | |
(100.40, -47.60), | |
(99.70, -48.20), | |
(95.10, -46.30), | |
(95.50, -46.00), | |
(88.30, -42.00), | |
(87.20, -43.00), | |
(85.30, -41.80), | |
(83.50, -43.20), | |
(81.10, -41.20), | |
(79.60, -42.20), | |
(75.90, -39.10), | |
(79.00, -36.30), | |
(78.30, -35.80), | |
(79.10, -35.10), | |
(77.40, -33.70), | |
(78.10, -32.90), | |
(74.80, -30.20), | |
(75.50, -29.50), | |
(74.10, -28.40), | |
(74.20, -28.20), | |
(73.00, -27.40), | |
(72.80, -27.50), | |
(71.20, -26.20), | |
(70.80, -26.30), | |
(70.05, -25.51), | |
(70.05, -25.51), | |
(69.30, -25.80), | |
(68.90, -26.00), | |
(67.80, -26.60), | |
(66.10, -27.70), | |
(63.20, -28.10), | |
(61.00, -29.00), | |
(60.80, -30.70), | |
(59.00, -30.70), | |
(58.30, -31.80), | |
(57.00, -31.90), | |
(57.00, -33.80), | |
(55.10, -34.70), | |
(54.20, -34.70), | |
(54.10, -35.40), | |
(53.40, -35.30), | |
(53.30, -36.10), | |
(52.30, -36.10), | |
(52.20, -37.50), | |
(49.00, -37.80), | |
(46.20, -38.80), | |
(46.00, -40.10), | |
(42.70, -40.90), | |
(42.40, -42.80), | |
(39.30, -43.70), | |
(35.70, -44.80), | |
(34.80, -47.20), | |
(32.50, -47.00), | |
(30.50, -49.80), | |
(29.50, -50.20), | |
(27.80, -52.80), | |
(26.20, -52.50), | |
(25.50, -53.80), | |
(22.50, -53.00), | |
(20.00, -52.80), | |
(18.50, -52.70), | |
(15.90, -51.70), | |
(15.10, -52.20), | |
(13.90, -51.80), | |
(12.70, -52.80), | |
(11.50, -52.20), | |
(8.30, -54.00), | |
(7.60, -53.60), | |
(5.00, -54.80), | |
(4.00, -54.20), | |
(3.00, -53.60), | |
(0.80, -54.90), | |
(0.00, -54.90), # Synthetic | |
(0.00, -90.00), # Synthetic | |
(360.00, -90.00), # Synthetic | |
(360.00, -54.50), # Synthetic | |
(359.70, -54.50), # Synthetic | |
]) | |
ANTA_FALSE_EASTING = 0.0 | |
ARAB = Polygon([ | |
(65.80, 25.20), | |
(65.00, 25.20), | |
(64.00, 25.20), | |
(63.00, 25.00), | |
(62.00, 24.90), | |
(61.00, 25.00), | |
(60.00, 25.20), | |
(59.80, 25.20), | |
(59.00, 25.40), | |
(58.70, 25.40), | |
(58.10, 25.60), | |
(57.00, 25.80), | |
(56.00, 26.00), | |
(55.10, 26.20), | |
(54.30, 26.30), | |
(53.30, 26.50), | |
(52.40, 27.30), | |
(51.80, 28.00), | |
(51.20, 28.70), | |
(50.40, 29.70), | |
(49.80, 30.40), | |
(49.30, 31.30), | |
(48.70, 32.10), | |
(48.10, 32.80), | |
(47.70, 33.50), | |
(47.10, 34.10), | |
(46.40, 35.00), | |
(45.90, 35.50), | |
(45.40, 36.00), | |
(44.90, 36.40), | |
(44.30, 37.20), | |
(44.00, 37.60), | |
(43.60, 38.00), | |
(43.60, 38.00), | |
(43.00, 38.30), | |
(42.30, 38.90), | |
(41.60, 39.20), | |
(40.70, 39.20), | |
(40.10, 39.00), | |
(39.50, 38.70), | |
(39.00, 38.40), | |
(38.50, 38.20), | |
(37.90, 37.90), | |
(37.40, 37.50), | |
(36.80, 37.20), | |
(36.30, 36.70), | |
(35.90, 36.40), | |
(35.60, 35.90), | |
(35.80, 35.70), | |
(35.70, 34.90), | |
(35.50, 34.00), | |
(35.20, 32.90), | |
(35.00, 32.10), | |
(35.00, 31.30), | |
(34.90, 30.80), | |
(34.90, 30.00), | |
(34.90, 29.50), | |
(34.70, 29.00), | |
(34.50, 28.40), | |
(34.20, 27.90), | |
(34.20, 27.10), | |
(34.60, 26.60), | |
(35.30, 25.30), | |
(36.20, 23.80), | |
(37.20, 22.00), | |
(38.50, 19.80), | |
(39.40, 18.10), | |
(40.50, 16.00), | |
(41.60, 14.30), | |
(42.50, 13.20), | |
(43.50, 12.20), | |
(43.70, 11.90), | |
(46.30, 12.20), | |
(46.50, 12.50), | |
(48.20, 12.60), | |
(48.80, 13.00), | |
(49.80, 13.10), | |
(50.20, 13.40), | |
(51.20, 13.10), | |
(52.20, 14.60), | |
(52.80, 14.40), | |
(53.00, 14.60), | |
(53.80, 14.30), | |
(54.50, 15.20), | |
(56.10, 14.30), | |
(56.30, 14.50), | |
(57.50, 13.50), | |
(58.30, 12.70), | |
(58.60, 13.00), | |
(58.90, 13.50), | |
(59.10, 14.00), | |
(59.50, 14.50), | |
(59.80, 15.00), | |
(59.90, 15.50), | |
(60.00, 16.00), | |
(60.00, 16.50), | |
(60.10, 17.00), | |
(60.20, 17.50), | |
(60.30, 18.00), | |
(60.45, 18.50), | |
(60.80, 19.00), | |
(61.20, 20.00), | |
(61.60, 20.50), | |
(62.00, 21.00), | |
(62.25, 21.50), | |
(62.50, 22.00), | |
(63.00, 22.50), | |
(63.50, 23.00), | |
(63.80, 23.20), | |
(64.80, 23.30), | |
(65.20, 24.00), | |
(65.70, 25.00), | |
(65.80, 25.20), | |
]) | |
ARAB_FALSE_EASTING = 0.0 | |
AUST = Polygon([ | |
(91.80, 9.30), | |
(90.00, 5.00), | |
(89.50, 0.00), | |
(89.00, -5.00), | |
(80.00, -5.00), | |
(68.73, -4.51), | |
(68.36, -4.90), | |
(68.60, -5.10), | |
(68.78, -5.24), | |
(67.98, -6.08), | |
(68.50, -6.56), | |
(67.92, -7.12), | |
(68.25, -7.40), | |
(67.86, -7.75), | |
(68.28, -8.20), | |
(66.54, -9.64), | |
(66.84, -9.88), | |
(66.28, -10.40), | |
(66.79, -10.78), | |
(66.20, -11.30), | |
(66.32, -11.56), | |
(65.75, -12.00), | |
(65.56, -12.14), | |
(66.44, -12.88), | |
(66.49, -13.12), | |
(66.70, -13.34), | |
(65.86, -13.99), | |
(66.38, -14.80), | |
(66.72, -14.90), | |
(67.24, -15.44), | |
(67.08, -15.68), | |
(67.38, -16.00), | |
(66.47, -16.61), | |
(66.82, -16.96), | |
(65.02, -17.98), | |
(66.23, -20.25), | |
(66.82, -19.95), | |
(67.24, -20.38), | |
(67.64, -20.13), | |
(67.91, -20.64), | |
(68.40, -20.46), | |
(69.22, -22.13), | |
(69.08, -22.20), | |
(69.35, -22.69), | |
(69.26, -22.74), | |
(69.35, -22.91), | |
(69.26, -22.96), | |
(69.35, -23.13), | |
(69.19, -23.25), | |
(69.74, -24.22), | |
(69.61, -24.30), | |
(69.81, -24.62), | |
(69.77, -24.65), | |
(70.07, -25.19), | |
(69.95, -25.32), | |
(70.05, -25.51), | |
(70.80, -26.30), | |
(71.20, -26.20), | |
(72.80, -27.50), | |
(73.00, -27.40), | |
(74.20, -28.20), | |
(74.10, -28.40), | |
(75.50, -29.50), | |
(74.80, -30.20), | |
(78.10, -32.90), | |
(77.40, -33.70), | |
(79.10, -35.10), | |
(78.30, -35.80), | |
(79.00, -36.30), | |
(75.90, -39.10), | |
(79.60, -42.20), | |
(81.10, -41.20), | |
(83.50, -43.20), | |
(85.30, -41.80), | |
(87.20, -43.00), | |
(88.30, -42.00), | |
(95.50, -46.00), | |
(95.10, -46.30), | |
(99.70, -48.20), | |
(100.40, -47.60), | |
(114.30, -51.20), | |
(114.80, -50.40), | |
(115.90, -50.70), | |
(116.40, -49.80), | |
(118.00, -50.10), | |
(118.10, -49.80), | |
(118.60, -49.90), | |
(118.80, -49.70), | |
(121.70, -50.20), | |
(122.30, -49.20), | |
(122.90, -49.30), | |
(122.70, -49.80), | |
(123.70, -50.00), | |
(123.90, -49.60), | |
(124.50, -49.70), | |
(124.50, -49.40), | |
(124.80, -49.40), | |
(125.00, -49.10), | |
(125.40, -49.20), | |
(125.40, -49.30), | |
(125.80, -49.40), | |
(125.70, -49.60), | |
(126.60, -49.70), | |
(126.90, -48.90), | |
(127.70, -49.00), | |
(127.50, -49.90), | |
(130.80, -50.30), | |
(130.90, -50.10), | |
(132.30, -50.10), | |
(132.30, -50.30), | |
(134.20, -50.30), | |
(134.40, -50.40), | |
(136.00, -50.40), | |
(136.40, -50.80), | |
(137.70, -50.60), | |
(138.60, -52.00), | |
(139.60, -51.90), | |
(140.00, -52.80), | |
(140.80, -52.70), | |
(141.20, -54.20), | |
(143.60, -54.10), | |
(143.90, -54.40), | |
(144.50, -54.30), | |
(145.00, -54.70), | |
(146.10, -54.70), | |
(146.20, -55.70), | |
(147.20, -55.60), | |
(147.50, -57.60), | |
(148.80, -57.50), | |
(150.40, -60.50), | |
(153.80, -60.10), | |
(155.70, -62.90), | |
(155.90, -63.00), | |
(161.20, -61.80), | |
(160.90, -61.60), | |
(158.80, -59.70), | |
(158.80, -59.60), | |
(158.60, -59.50), | |
(158.50, -59.40), | |
(158.50, -59.30), | |
(158.40, -59.20), | |
(158.30, -59.10), | |
(158.20, -59.00), | |
(158.10, -58.90), | |
(158.00, -58.80), | |
(157.90, -58.80), | |
(157.80, -58.70), | |
(157.80, -58.60), | |
(157.70, -58.50), | |
(157.60, -58.40), | |
(157.50, -58.30), | |
(157.30, -58.10), | |
(157.30, -57.90), | |
(157.30, -57.80), | |
(157.40, -57.70), | |
(157.40, -57.50), | |
(157.50, -57.40), | |
(157.60, -57.30), | |
(157.70, -57.20), | |
(157.70, -57.10), | |
(157.70, -56.90), | |
(157.90, -56.80), | |
(158.00, -56.60), | |
(158.10, -56.50), | |
(158.30, -56.40), | |
(158.40, -56.10), | |
(158.60, -55.90), | |
(158.50, -55.80), | |
(158.60, -55.60), | |
(158.70, -55.40), | |
(158.70, -55.30), | |
(158.80, -55.10), | |
(158.90, -54.90), | |
(159.10, -54.70), | |
(159.20, -54.40), | |
(159.30, -54.20), | |
(159.40, -54.10), | |
(159.50, -53.90), | |
(159.70, -53.70), | |
(159.90, -53.50), | |
(160.60, -52.70), | |
(161.10, -52.10), | |
(162.40, -50.90), | |
(163.30, -50.30), | |
(164.10, -49.70), | |
(164.30, -49.10), | |
(164.70, -48.60), | |
(165.30, -47.90), | |
(165.90, -47.00), | |
(166.50, -46.00), | |
(167.30, -45.20), | |
(167.80, -44.70), | |
(169.00, -44.10), | |
(169.90, -43.70), | |
(171.00, -43.20), | |
(172.20, -42.60), | |
(173.30, -42.00), | |
(174.40, -41.70), | |
(175.30, -41.60), | |
(176.40, -41.10), | |
(176.90, -40.70), | |
(178.20, -39.40), | |
(178.80, -38.70), | |
(179.60, -37.40), | |
(180.80, -35.80), | |
(181.50, -34.40), | |
(182.00, -33.30), | |
(182.90, -31.70), | |
(183.10, -31.10), | |
(183.80, -29.80), | |
(184.30, -28.60), | |
(184.90, -27.20), | |
(185.50, -25.40), | |
(186.20, -23.60), | |
(186.50, -22.60), | |
(187.10, -21.40), | |
(187.90, -19.70), | |
(188.60, -18.10), | |
(188.90, -16.80), | |
(188.90, -15.40), | |
(188.40, -14.50), | |
(188.40, -14.50), | |
(187.20, -14.50), | |
(186.10, -14.50), | |
(185.10, -14.50), | |
(183.80, -14.60), | |
(182.30, -14.70), | |
(181.10, -15.10), | |
(180.70, -15.20), | |
(179.70, -15.50), | |
(178.30, -16.10), | |
(177.20, -17.20), | |
(176.20, -18.30), | |
(175.60, -19.30), | |
(174.30, -21.10), | |
(173.50, -22.00), | |
(172.50, -22.90), | |
(171.50, -23.70), | |
(170.60, -23.70), | |
(169.90, -23.10), | |
(169.10, -22.10), | |
(168.40, -21.00), | |
(168.00, -20.00), | |
(167.40, -19.00), | |
(166.90, -17.80), | |
(166.40, -16.80), | |
(165.80, -15.00), | |
(165.40, -13.60), | |
(164.80, -12.20), | |
(163.80, -11.80), | |
(162.90, -11.70), | |
(161.70, -11.60), | |
(160.50, -11.00), | |
(159.50, -10.40), | |
(158.50, -10.00), | |
(157.70, -9.60), | |
(156.60, -8.90), | |
(155.30, -8.00), | |
(154.20, -7.20), | |
(153.20, -6.70), | |
(152.40, -6.70), | |
(151.30, -6.90), | |
(150.50, -7.10), | |
(149.70, -7.30), | |
(148.60, -7.50), | |
(147.50, -7.30), | |
(147.00, -6.70), | |
(146.60, -5.90), | |
(146.10, -5.20), | |
(145.50, -4.40), | |
(144.60, -3.60), | |
(143.80, -3.00), | |
(142.70, -2.30), | |
(141.40, -1.90), | |
(140.10, -1.70), | |
(139.10, -1.60), | |
(137.80, -1.40), | |
(136.80, -1.40), | |
(136.50, -1.20), | |
(136.20, -1.00), | |
(135.90, -0.70), | |
(135.70, -0.50), | |
(135.40, -0.20), | |
(135.10, 0.00), | |
(134.30, 0.20), | |
(133.40, 0.50), | |
(132.60, 0.70), | |
(131.80, 1.00), | |
(130.90, 1.10), | |
(130.70, -0.30), | |
(130.60, -1.80), | |
(130.70, -3.40), | |
(131.10, -4.60), | |
(131.30, -6.10), | |
(130.00, -7.20), | |
(127.90, -7.40), | |
(125.80, -7.50), | |
(124.50, -7.90), | |
(123.30, -9.30), | |
(122.40, -10.30), | |
(119.90, -10.30), | |
(118.10, -10.20), | |
(116.40, -9.50), | |
(114.90, -9.40), | |
(114.40, -9.30), | |
(113.50, -9.20), | |
(113.20, -9.30), | |
(112.60, -9.40), | |
(111.60, -9.30), | |
(110.90, -9.00), | |
(110.30, -9.00), | |
(109.30, -8.80), | |
(108.50, -8.50), | |
(107.80, -8.30), | |
(107.00, -8.00), | |
(106.40, -7.80), | |
(106.10, -7.50), | |
(105.70, -7.60), | |
(105.00, -7.40), | |
(104.40, -7.10), | |
(104.10, -7.30), | |
(103.40, -7.00), | |
(102.80, -6.40), | |
(102.30, -6.30), | |
(101.40, -5.10), | |
(100.80, -4.60), | |
(100.20, -4.00), | |
(99.70, -3.20), | |
(99.50, -2.80), | |
(99.10, -2.80), | |
(98.60, -2.00), | |
(97.90, -1.30), | |
(97.40, -0.30), | |
(96.80, 0.80), | |
(96.20, 1.50), | |
(95.40, 2.10), | |
(94.90, 2.30), | |
(94.50, 2.90), | |
(93.60, 3.80), | |
(93.10, 4.20), | |
(92.90, 5.30), | |
(93.00, 5.90), | |
(93.00, 6.80), | |
(92.40, 7.80), | |
(92.00, 8.80), | |
(91.80, 9.30), | |
]) | |
AUST_FALSE_EASTING = 0.0 | |
EURA = Polygon([ | |
(144.80, 41.00), | |
(143.00, 42.00), | |
(142.20, 43.00), | |
(142.00, 44.00), | |
(142.00, 46.00), | |
(142.20, 48.00), | |
(142.50, 50.00), | |
(142.50, 52.50), | |
(142.50, 55.00), | |
(147.00, 61.90), | |
(146.20, 63.30), | |
(146.10, 63.90), | |
(142.10, 66.20), | |
(140.00, 67.70), | |
(126.20, 70.20), | |
(122.80, 75.50), | |
(126.70, 78.20), | |
(122.00, 80.70), | |
(98.50, 85.00), | |
(43.00, 86.50), | |
(7.50, 84.90), | |
(0.00, 84.10), | |
(355.50, 83.40), | |
(354.00, 82.10), | |
(356.50, 80.90), | |
(358.00, 80.38), | |
(4.25, 79.60), | |
(3.00, 79.04), | |
(7.00, 78.45), | |
(7.60, 77.90), | |
(7.40, 76.75), | |
(7.20, 76.55), | |
(7.30, 75.60), | |
(8.40, 74.80), | |
(8.40, 74.60), | |
(8.70, 74.35), | |
(8.80, 73.95), | |
(8.25, 73.55), | |
(7.80, 73.40), | |
(6.80, 73.25), | |
(4.40, 72.80), | |
(1.10, 72.20), | |
(355.30, 71.40), | |
(353.50, 70.92), | |
(348.00, 71.70), | |
(346.80, 70.92), | |
(346.20, 70.97), | |
(345.30, 70.55), | |
(344.60, 70.00), | |
(343.50, 68.90), | |
(342.70, 68.98), | |
(341.90, 68.40), | |
(341.50, 67.70), | |
(340.50, 66.70), | |
(343.50, 66.40), | |
(343.00, 66.00), | |
(343.00, 65.00), | |
(341.00, 63.70), | |
(337.50, 64.10), | |
(335.40, 63.00), | |
(333.00, 61.60), | |
(330.50, 60.00), | |
(326.00, 57.00), | |
(324.70, 55.20), | |
(324.80, 53.00), | |
(325.00, 52.70), | |
(328.20, 52.60), | |
(328.20, 52.20), | |
(330.00, 52.10), | |
(330.00, 51.20), | |
(331.00, 49.80), | |
(332.50, 47.80), | |
(332.60, 46.50), | |
(332.00, 45.00), | |
(331.80, 44.50), | |
(331.50, 43.80), | |
(331.00, 43.30), | |
(330.70, 42.90), | |
(330.70, 42.70), | |
(330.70, 42.30), | |
(330.70, 41.70), | |
(330.30, 40.00), | |
(330.25, 39.45), | |
(330.90, 39.30), | |
(331.90, 39.00), | |
(332.60, 38.80), | |
(333.20, 38.40), | |
(333.80, 38.10), | |
(334.60, 37.70), | |
(335.30, 37.30), | |
(335.90, 36.82), | |
(336.80, 36.97), | |
(338.50, 37.07), | |
(338.70, 37.10), | |
(339.10, 37.14), | |
(339.50, 37.13), | |
(339.80, 37.12), | |
(342.00, 37.80), | |
(344.00, 37.80), | |
(346.00, 37.00), | |
(350.00, 36.00), | |
(354.00, 36.00), | |
(1.40, 36.20), | |
(6.80, 36.40), | |
(14.20, 38.50), | |
(15.10, 38.50), | |
(16.60, 38.30), | |
(17.30, 38.90), | |
(18.20, 39.70), | |
(18.90, 40.20), | |
(19.40, 39.90), | |
(19.70, 39.10), | |
(20.00, 38.20), | |
(20.50, 37.30), | |
(20.90, 36.50), | |
(21.60, 35.80), | |
(22.20, 35.20), | |
(23.00, 34.70), | |
(23.70, 34.40), | |
(24.60, 34.20), | |
(25.70, 34.30), | |
(26.70, 34.40), | |
(27.40, 34.50), | |
(28.20, 34.80), | |
(29.20, 35.20), | |
(29.80, 35.70), | |
(30.30, 35.80), | |
(30.90, 35.40), | |
(31.40, 34.90), | |
(32.30, 34.30), | |
(32.90, 34.20), | |
(34.00, 34.60), | |
(34.50, 35.00), | |
(35.20, 35.60), | |
(35.60, 35.90), | |
(35.90, 36.40), | |
(36.30, 36.70), | |
(36.80, 37.20), | |
(37.40, 37.50), | |
(37.90, 37.90), | |
(38.50, 38.20), | |
(39.00, 38.40), | |
(39.50, 38.70), | |
(40.10, 39.00), | |
(40.70, 39.20), | |
(41.60, 39.20), | |
(42.30, 38.90), | |
(43.00, 38.30), | |
(43.60, 38.00), | |
(43.60, 38.00), | |
(44.00, 37.60), | |
(44.30, 37.20), | |
(44.90, 36.40), | |
(45.40, 36.00), | |
(45.90, 35.50), | |
(46.40, 35.00), | |
(47.10, 34.10), | |
(47.70, 33.50), | |
(48.10, 32.80), | |
(48.70, 32.10), | |
(49.30, 31.30), | |
(49.80, 30.40), | |
(50.40, 29.70), | |
(51.20, 28.70), | |
(51.80, 28.00), | |
(52.40, 27.30), | |
(53.30, 26.50), | |
(54.30, 26.30), | |
(55.10, 26.20), | |
(56.00, 26.00), | |
(57.00, 25.80), | |
(58.10, 25.60), | |
(58.70, 25.40), | |
(59.00, 25.40), | |
(59.80, 25.20), | |
(60.00, 25.20), | |
(61.00, 25.00), | |
(62.00, 24.90), | |
(63.00, 25.00), | |
(64.00, 25.20), | |
(65.00, 25.20), | |
(65.80, 25.20), | |
(66.10, 26.00), | |
(66.00, 27.00), | |
(65.90, 28.00), | |
(65.90, 29.00), | |
(66.10, 30.00), | |
(66.50, 31.00), | |
(67.20, 32.00), | |
(68.00, 33.00), | |
(68.80, 34.00), | |
(69.20, 34.40), | |
(70.00, 34.00), | |
(71.00, 33.90), | |
(72.00, 33.60), | |
(73.00, 33.60), | |
(73.70, 34.00), | |
(74.00, 33.70), | |
(75.00, 33.10), | |
(76.00, 32.30), | |
(77.00, 31.00), | |
(78.00, 30.40), | |
(79.00, 29.70), | |
(80.00, 29.20), | |
(81.00, 29.00), | |
(82.00, 28.30), | |
(83.00, 27.90), | |
(84.00, 27.80), | |
(85.00, 27.50), | |
(86.00, 27.30), | |
(87.00, 26.90), | |
(88.00, 26.80), | |
(89.00, 26.90), | |
(90.00, 26.70), | |
(91.00, 26.80), | |
(92.00, 26.90), | |
(93.00, 27.20), | |
(93.30, 27.10), | |
(93.60, 27.10), | |
(94.00, 27.10), | |
(94.20, 27.10), | |
(94.40, 27.10), | |
(94.60, 27.10), | |
(94.80, 27.10), | |
(95.00, 27.10), | |
(95.30, 27.20), | |
(95.50, 27.20), | |
(95.70, 27.20), | |
(95.70, 26.80), | |
(95.60, 26.50), | |
(95.40, 26.30), | |
(95.30, 26.10), | |
(95.20, 25.90), | |
(95.10, 25.80), | |
(95.00, 25.70), | |
(94.80, 25.50), | |
(94.70, 25.30), | |
(94.50, 24.90), | |
(94.50, 24.70), | |
(94.40, 24.40), | |
(94.30, 23.90), | |
(94.20, 23.50), | |
(94.20, 23.40), | |
(94.20, 23.10), | |
(94.10, 22.70), | |
(94.10, 22.60), | |
(94.00, 22.40), | |
(94.00, 21.80), | |
(94.00, 21.80), | |
(93.90, 21.10), | |
(93.90, 21.00), | |
(93.90, 20.90), | |
(93.90, 20.60), | |
(93.90, 20.60), | |
(93.80, 20.30), | |
(93.80, 20.20), | |
(93.80, 20.10), | |
(93.80, 20.00), | |
(93.90, 19.60), | |
(93.90, 19.10), | |
(93.90, 18.70), | |
(94.00, 18.30), | |
(94.00, 17.90), | |
(94.10, 17.40), | |
(94.10, 17.00), | |
(94.10, 16.80), | |
(93.80, 16.60), | |
(93.70, 16.00), | |
(93.50, 15.00), | |
(93.20, 14.40), | |
(92.80, 13.80), | |
(92.30, 13.10), | |
(92.00, 12.50), | |
(91.80, 11.70), | |
(91.80, 11.10), | |
(91.90, 10.30), | |
(91.80, 9.30), | |
(92.00, 8.80), | |
(92.40, 7.80), | |
(93.00, 6.80), | |
(93.00, 5.90), | |
(92.90, 5.30), | |
(93.10, 4.20), | |
(93.60, 3.80), | |
(94.50, 2.90), | |
(94.90, 2.30), | |
(95.40, 2.10), | |
(96.20, 1.50), | |
(96.80, 0.80), | |
(97.40, -0.30), | |
(97.90, -1.30), | |
(98.60, -2.00), | |
(99.10, -2.80), | |
(99.50, -2.80), | |
(99.70, -3.20), | |
(100.20, -4.00), | |
(100.80, -4.60), | |
(101.40, -5.10), | |
(102.30, -6.30), | |
(102.80, -6.40), | |
(103.40, -7.00), | |
(104.10, -7.30), | |
(104.40, -7.10), | |
(105.00, -7.40), | |
(105.70, -7.60), | |
(106.10, -7.50), | |
(106.40, -7.80), | |
(107.00, -8.00), | |
(107.80, -8.30), | |
(108.50, -8.50), | |
(109.30, -8.80), | |
(110.30, -9.00), | |
(110.90, -9.00), | |
(111.60, -9.30), | |
(112.60, -9.40), | |
(113.20, -9.30), | |
(113.50, -9.20), | |
(114.40, -9.30), | |
(114.90, -9.40), | |
(116.40, -9.50), | |
(118.10, -10.20), | |
(119.90, -10.30), | |
(122.40, -10.30), | |
(123.30, -9.30), | |
(124.50, -7.90), | |
(125.80, -7.50), | |
(127.90, -7.40), | |
(130.00, -7.20), | |
(131.30, -6.10), | |
(131.10, -4.60), | |
(130.70, -3.40), | |
(130.60, -1.80), | |
(130.70, -0.30), | |
(130.90, 1.10), | |
(130.50, 1.90), | |
(130.00, 2.70), | |
(128.70, 4.00), | |
(128.10, 4.90), | |
(126.90, 6.10), | |
(126.70, 7.60), | |
(126.40, 8.90), | |
(125.90, 10.60), | |
(125.10, 12.20), | |
(124.30, 13.80), | |
(123.60, 14.80), | |
(122.50, 16.00), | |
(122.50, 17.80), | |
(122.40, 18.90), | |
(122.20, 20.10), | |
(121.80, 21.40), | |
(121.60, 22.30), | |
(121.90, 22.90), | |
(123.20, 23.20), | |
(124.80, 23.60), | |
(125.90, 24.00), | |
(127.20, 24.80), | |
(128.10, 25.90), | |
(129.00, 27.10), | |
(129.90, 28.20), | |
(130.50, 29.20), | |
(131.00, 30.40), | |
(132.40, 31.70), | |
(133.70, 32.60), | |
(135.30, 33.60), | |
(136.50, 34.10), | |
(138.30, 34.50), | |
(142.00, 35.00), | |
(142.80, 36.00), | |
(143.50, 37.00), | |
(144.00, 38.00), | |
(144.20, 39.00), | |
(144.50, 40.00), | |
(144.80, 41.00), | |
]) | |
EURA = transform(partial(_shift_large_longitudes, 270.0), EURA) | |
EURA_FALSE_EASTING = abs(min(EURA.exterior.xy[0])) | |
EURA = translate(EURA, xoff=EURA_FALSE_EASTING) | |
INDI = Polygon([ | |
(91.80, 9.30), | |
(91.90, 10.30), | |
(91.80, 11.10), | |
(91.80, 11.70), | |
(92.00, 12.50), | |
(92.30, 13.10), | |
(92.80, 13.80), | |
(93.20, 14.40), | |
(93.50, 15.00), | |
(93.70, 16.00), | |
(93.80, 16.60), | |
(94.10, 16.80), | |
(94.10, 17.00), | |
(94.10, 17.40), | |
(94.00, 17.90), | |
(94.00, 18.30), | |
(93.90, 18.70), | |
(93.90, 19.10), | |
(93.90, 19.60), | |
(93.80, 20.00), | |
(93.80, 20.10), | |
(93.80, 20.20), | |
(93.80, 20.30), | |
(93.90, 20.60), | |
(93.90, 20.60), | |
(93.90, 20.90), | |
(93.90, 21.00), | |
(93.90, 21.10), | |
(94.00, 21.80), | |
(94.00, 21.80), | |
(94.00, 22.40), | |
(94.10, 22.60), | |
(94.10, 22.70), | |
(94.20, 23.10), | |
(94.20, 23.40), | |
(94.20, 23.50), | |
(94.30, 23.90), | |
(94.40, 24.40), | |
(94.50, 24.70), | |
(94.50, 24.90), | |
(94.70, 25.30), | |
(94.80, 25.50), | |
(95.00, 25.70), | |
(95.10, 25.80), | |
(95.20, 25.90), | |
(95.30, 26.10), | |
(95.40, 26.30), | |
(95.60, 26.50), | |
(95.70, 26.80), | |
(95.70, 27.20), | |
(95.50, 27.20), | |
(95.30, 27.20), | |
(95.00, 27.10), | |
(94.80, 27.10), | |
(94.60, 27.10), | |
(94.40, 27.10), | |
(94.20, 27.10), | |
(94.00, 27.10), | |
(93.60, 27.10), | |
(93.30, 27.10), | |
(93.00, 27.20), | |
(92.00, 26.90), | |
(91.00, 26.80), | |
(90.00, 26.70), | |
(89.00, 26.90), | |
(88.00, 26.80), | |
(87.00, 26.90), | |
(86.00, 27.30), | |
(85.00, 27.50), | |
(84.00, 27.80), | |
(83.00, 27.90), | |
(82.00, 28.30), | |
(81.00, 29.00), | |
(80.00, 29.20), | |
(79.00, 29.70), | |
(78.00, 30.40), | |
(77.00, 31.00), | |
(76.00, 32.30), | |
(75.00, 33.10), | |
(74.00, 33.70), | |
(73.70, 34.00), | |
(73.00, 33.60), | |
(72.00, 33.60), | |
(71.00, 33.90), | |
(70.00, 34.00), | |
(69.20, 34.40), | |
(68.80, 34.00), | |
(68.00, 33.00), | |
(67.20, 32.00), | |
(66.50, 31.00), | |
(66.10, 30.00), | |
(65.90, 29.00), | |
(65.90, 28.00), | |
(66.00, 27.00), | |
(66.10, 26.00), | |
(65.80, 25.20), | |
(65.70, 25.00), | |
(65.20, 24.00), | |
(64.80, 23.30), | |
(63.80, 23.20), | |
(63.50, 23.00), | |
(63.00, 22.50), | |
(62.50, 22.00), | |
(62.25, 21.50), | |
(62.00, 21.00), | |
(61.60, 20.50), | |
(61.20, 20.00), | |
(60.80, 19.00), | |
(60.45, 18.50), | |
(60.30, 18.00), | |
(60.20, 17.50), | |
(60.10, 17.00), | |
(60.00, 16.50), | |
(60.00, 16.00), | |
(59.90, 15.50), | |
(59.80, 15.00), | |
(59.50, 14.50), | |
(59.10, 14.00), | |
(58.90, 13.50), | |
(58.60, 13.00), | |
(58.30, 12.70), | |
(57.90, 12.00), | |
(57.40, 11.00), | |
(56.75, 10.25), | |
(57.22, 9.90), | |
(57.50, 10.12), | |
(58.15, 9.68), | |
(58.06, 9.24), | |
(58.44, 9.11), | |
(58.28, 8.48), | |
(59.04, 8.00), | |
(59.24, 8.00), | |
(59.80, 7.72), | |
(59.56, 7.18), | |
(60.00, 7.00), | |
(60.16, 6.68), | |
(60.32, 6.60), | |
(60.40, 6.38), | |
(60.76, 6.20), | |
(61.60, 5.56), | |
(61.54, 5.44), | |
(62.20, 4.98), | |
(62.06, 4.80), | |
(62.56, 4.48), | |
(62.52, 4.32), | |
(63.08, 3.96), | |
(63.32, 3.92), | |
(63.52, 3.76), | |
(64.14, 3.66), | |
(65.12, 2.96), | |
(65.88, 3.00), | |
(66.76, 2.30), | |
(66.66, 1.60), | |
(67.04, 1.32), | |
(67.25, 0.88), | |
(66.80, 0.48), | |
(67.02, 0.16), | |
(67.02, 0.00), | |
(67.22, -0.18), | |
(67.00, -0.46), | |
(67.34, -0.66), | |
(67.34, -0.80), | |
(67.58, -0.96), | |
(67.34, -1.36), | |
(68.04, -1.84), | |
(67.92, -2.06), | |
(68.19, -2.21), | |
(67.88, -2.72), | |
(68.21, -2.92), | |
(67.98, -3.28), | |
(68.61, -3.69), | |
(68.28, -4.16), | |
(68.73, -4.51), | |
(68.73, -4.51), | |
(80.00, -5.00), | |
(89.00, -5.00), | |
(89.50, 0.00), | |
(90.00, 5.00), | |
(91.80, 9.30), | |
]) | |
INDI_FALSE_EASTING = 0.0 | |
NAZC = Polygon([ | |
(257.40, 2.30), | |
(257.40, -0.50), | |
(257.20, -2.90), | |
(257.20, -4.10), | |
(255.70, -4.30), | |
(254.30, -4.70), | |
(253.70, -4.90), | |
(253.00, -6.40), | |
(252.40, -8.10), | |
(252.20, -9.00), | |
(250.80, -9.30), | |
(250.10, -9.40), | |
(249.40, -11.00), | |
(248.80, -12.60), | |
(248.60, -13.60), | |
(247.80, -13.70), | |
(247.40, -15.70), | |
(246.90, -17.80), | |
(246.50, -19.40), | |
(246.30, -20.00), | |
(246.10, -20.70), | |
(245.80, -20.70), | |
(245.50, -22.70), | |
(244.80, -22.80), | |
(244.90, -24.10), | |
(245.10, -26.30), | |
(245.60, -26.80), | |
(246.10, -26.70), | |
(246.60, -27.20), | |
(247.90, -29.50), | |
(247.90, -31.10), | |
(247.90, -32.00), | |
(248.00, -33.80), | |
(248.00, -34.90), | |
(249.10, -35.10), | |
(249.80, -35.20), | |
(251.10, -35.20), | |
(252.30, -35.30), | |
(253.40, -35.50), | |
(254.70, -35.70), | |
(256.30, -35.80), | |
(258.20, -35.90), | |
(259.70, -36.10), | |
(261.60, -36.30), | |
(263.00, -36.40), | |
(263.70, -36.50), | |
(263.70, -37.10), | |
(265.40, -37.20), | |
(266.40, -37.40), | |
(266.30, -38.40), | |
(267.50, -38.80), | |
(268.20, -39.10), | |
(268.30, -40.30), | |
(268.90, -41.20), | |
(271.30, -41.30), | |
(273.60, -41.50), | |
(275.30, -41.70), | |
(276.10, -41.80), | |
(276.90, -41.90), | |
(277.10, -43.30), | |
(277.30, -44.30), | |
(277.70, -44.80), | |
(279.40, -44.90), | |
(280.40, -45.00), | |
(281.50, -45.20), | |
(282.70, -45.60), | |
(283.40, -45.60), | |
(283.80, -45.30), | |
(283.80, -44.80), | |
(283.80, -43.90), | |
(284.10, -43.00), | |
(284.30, -41.80), | |
(284.40, -40.50), | |
(284.90, -38.90), | |
(285.70, -37.60), | |
(286.50, -36.40), | |
(286.90, -35.10), | |
(287.30, -33.70), | |
(287.40, -32.00), | |
(287.90, -30.20), | |
(288.40, -28.50), | |
(288.80, -26.60), | |
(289.20, -24.90), | |
(289.40, -23.40), | |
(289.20, -22.20), | |
(288.80, -21.20), | |
(288.40, -20.40), | |
(287.80, -19.50), | |
(286.90, -18.10), | |
(286.00, -17.40), | |
(285.00, -16.60), | |
(284.20, -15.90), | |
(283.20, -15.10), | |
(282.10, -13.90), | |
(281.30, -12.80), | |
(280.50, -11.70), | |
(279.90, -10.50), | |
(279.40, -9.40), | |
(279.00, -7.80), | |
(278.70, -6.50), | |
(278.70, -5.40), | |
(278.70, -4.10), | |
(279.00, -2.50), | |
(279.10, -1.20), | |
(279.70, 0.30), | |
(280.20, 1.00), | |
(280.90, 1.90), | |
(281.20, 2.20), | |
(281.70, 2.60), | |
(281.90, 3.60), | |
(282.10, 4.30), | |
(282.20, 4.90), | |
(282.20, 5.40), | |
(282.00, 6.00), | |
(281.90, 6.50), | |
(281.60, 7.10), | |
(281.30, 7.40), | |
(280.90, 7.50), | |
(280.50, 7.50), | |
(280.10, 7.20), | |
(279.70, 7.00), | |
(279.20, 6.90), | |
(278.70, 7.00), | |
(278.30, 7.10), | |
(278.00, 7.20), | |
(277.60, 7.20), | |
(277.50, 7.00), | |
(277.50, 6.90), | |
(277.50, 6.50), | |
(277.50, 5.90), | |
(277.50, 5.20), | |
(277.60, 4.60), | |
(277.50, 4.00), | |
(277.60, 3.50), | |
(277.00, 3.50), | |
(276.30, 3.50), | |
(275.50, 3.40), | |
(275.50, 2.50), | |
(275.50, 1.80), | |
(274.80, 1.80), | |
(274.80, 1.40), | |
(274.80, 0.90), | |
(274.10, 1.00), | |
(272.60, 1.10), | |
(271.60, 1.10), | |
(270.40, 1.10), | |
(269.40, 1.10), | |
(269.40, 1.60), | |
(269.00, 1.90), | |
(267.90, 2.00), | |
(266.90, 2.00), | |
(265.80, 2.10), | |
(265.00, 2.10), | |
(264.20, 2.10), | |
(263.30, 2.10), | |
(262.40, 2.10), | |
(261.40, 2.10), | |
(260.30, 2.10), | |
(259.50, 2.10), | |
(258.70, 2.20), | |
(257.80, 2.20), | |
(257.40, 2.30), | |
]) | |
NAZC_FALSE_EASTING = 0.0 | |
NOAM = MultiPolygon([ | |
Polygon([ | |
(0.00, 84.10), | |
(7.50, 84.90), | |
(43.00, 86.50), | |
(98.50, 85.00), | |
(122.00, 80.70), | |
(126.70, 78.20), | |
(122.80, 75.50), | |
(126.20, 70.20), | |
(140.00, 67.70), | |
(142.10, 66.20), | |
(146.10, 63.90), | |
(146.20, 63.30), | |
(147.00, 61.90), | |
(142.50, 55.00), | |
(142.50, 52.50), | |
(142.50, 50.00), | |
(142.20, 48.00), | |
(142.00, 46.00), | |
(142.00, 44.00), | |
(142.20, 43.00), | |
(143.00, 42.00), | |
(144.80, 41.00), | |
(147.00, 42.00), | |
(148.50, 43.00), | |
(150.00, 44.00), | |
(152.00, 45.00), | |
(153.80, 46.00), | |
(155.00, 47.00), | |
(156.20, 48.00), | |
(157.80, 49.00), | |
(159.50, 50.00), | |
(160.50, 51.00), | |
(161.00, 52.00), | |
(162.20, 53.00), | |
(163.00, 54.00), | |
(164.00, 55.50), | |
(166.00, 54.30), | |
(168.00, 53.60), | |
(170.00, 52.60), | |
(172.00, 51.90), | |
(174.00, 51.30), | |
(176.00, 50.80), | |
(178.00, 50.50), | |
(180.00, 50.50), | |
(182.00, 50.40), | |
(184.00, 50.50), | |
(186.00, 50.80), | |
(188.00, 51.00), | |
(190.00, 51.30), | |
(192.00, 51.70), | |
(194.00, 52.20), | |
(196.00, 52.80), | |
(198.00, 53.20), | |
(200.00, 53.70), | |
(202.00, 54.00), | |
(204.00, 54.70), | |
(206.00, 55.20), | |
(208.00, 56.00), | |
(210.00, 56.80), | |
(212.00, 57.80), | |
(213.00, 58.30), | |
(214.00, 59.00), | |
(215.00, 59.20), | |
(216.00, 59.30), | |
(217.00, 59.40), | |
(218.00, 59.80), | |
(219.00, 60.10), | |
(220.00, 59.90), | |
(221.00, 59.50), | |
(222.00, 59.00), | |
(223.00, 58.50), | |
(223.50, 58.00), | |
(223.90, 57.00), | |
(224.50, 56.00), | |
(225.50, 55.00), | |
(226.10, 54.00), | |
(227.20, 53.00), | |
(228.70, 52.00), | |
(229.30, 51.50), | |
(230.10, 51.00), | |
(230.80, 50.50), | |
(231.80, 50.00), | |
(233.00, 49.00), | |
(233.90, 48.00), | |
(234.50, 47.00), | |
(234.90, 46.00), | |
(235.00, 45.00), | |
(235.00, 44.00), | |
(235.00, 43.00), | |
(235.10, 42.00), | |
(235.30, 41.00), | |
(235.60, 40.20), | |
(236.00, 40.00), | |
(236.10, 39.50), | |
(236.30, 39.00), | |
(236.80, 38.50), | |
(237.25, 38.00), | |
(237.70, 37.50), | |
(238.30, 37.00), | |
(238.90, 36.50), | |
(239.45, 36.00), | |
(239.95, 35.50), | |
(240.65, 34.90), | |
(241.50, 34.70), | |
(242.70, 34.15), | |
(243.45, 34.00), | |
(244.40, 33.30), | |
(244.50, 32.90), | |
(244.80, 32.50), | |
(244.90, 32.30), | |
(245.10, 32.10), | |
(245.30, 31.90), | |
(245.30, 31.80), | |
(245.50, 31.60), | |
(245.60, 31.30), | |
(245.70, 31.00), | |
(245.80, 30.80), | |
(246.10, 30.50), | |
(246.40, 30.10), | |
(246.50, 29.90), | |
(246.70, 29.70), | |
(246.90, 29.50), | |
(247.30, 29.10), | |
(247.50, 28.80), | |
(247.70, 28.50), | |
(247.90, 28.30), | |
(248.10, 28.00), | |
(248.20, 27.90), | |
(248.40, 27.70), | |
(248.50, 27.50), | |
(248.70, 27.30), | |
(248.90, 27.10), | |
(249.10, 26.80), | |
(249.30, 26.60), | |
(249.50, 26.40), | |
(249.60, 26.20), | |
(249.70, 26.10), | |
(249.70, 26.00), | |
(249.70, 26.00), | |
(249.90, 25.80), | |
(250.00, 25.60), | |
(250.10, 25.50), | |
(250.20, 25.30), | |
(250.30, 25.10), | |
(250.80, 24.90), | |
(250.90, 24.70), | |
(250.90, 24.60), | |
(251.00, 24.50), | |
(251.30, 24.10), | |
(251.70, 23.50), | |
(252.00, 23.00), | |
(252.30, 22.90), | |
(252.40, 22.60), | |
(252.70, 22.40), | |
(253.20, 22.10), | |
(253.80, 21.90), | |
(254.10, 21.60), | |
(254.40, 21.20), | |
(254.30, 20.60), | |
(254.30, 20.20), | |
(254.40, 19.60), | |
(254.80, 19.20), | |
(255.20, 18.90), | |
(255.70, 18.40), | |
(256.40, 18.00), | |
(257.10, 17.60), | |
(257.90, 17.20), | |
(258.60, 16.90), | |
(259.30, 16.60), | |
(260.10, 16.30), | |
(260.60, 16.10), | |
(261.20, 15.80), | |
(261.70, 15.60), | |
(262.40, 15.30), | |
(263.00, 15.20), | |
(263.60, 15.10), | |
(264.20, 15.00), | |
(270.70, 15.30), | |
(273.00, 16.40), | |
(275.00, 16.90), | |
(277.00, 17.50), | |
(278.50, 17.80), | |
(278.50, 18.80), | |
(280.00, 19.20), | |
(283.00, 19.70), | |
(285.00, 19.70), | |
(286.40, 19.90), | |
(287.20, 19.90), | |
(288.10, 20.10), | |
(289.20, 20.10), | |
(290.30, 20.10), | |
(291.20, 20.10), | |
(292.10, 20.10), | |
(292.90, 20.00), | |
(294.00, 19.80), | |
(294.00, 19.80), | |
(295.00, 19.70), | |
(295.90, 19.60), | |
(296.60, 19.40), | |
(297.50, 19.00), | |
(298.20, 18.60), | |
(299.00, 18.00), | |
(314.30, 20.30), | |
(314.40, 21.30), | |
(314.50, 22.00), | |
(315.00, 22.80), | |
(315.00, 23.00), | |
(315.10, 23.70), | |
(313.70, 23.90), | |
(313.70, 23.90), | |
(313.70, 24.20), | |
(313.90, 24.50), | |
(314.60, 25.20), | |
(315.00, 25.70), | |
(315.20, 26.20), | |
(315.50, 26.90), | |
(315.80, 27.50), | |
(316.25, 28.75), | |
(316.85, 28.75), | |
(317.30, 30.10), | |
(318.00, 30.00), | |
(318.10, 30.50), | |
(318.30, 30.90), | |
(319.50, 31.90), | |
(320.70, 33.80), | |
(322.20, 33.50), | |
(323.60, 35.30), | |
(325.00, 35.00), | |
(325.90, 36.00), | |
(326.30, 36.50), | |
(326.80, 36.80), | |
(328.00, 37.50), | |
(328.85, 37.90), | |
(329.20, 38.00), | |
(329.35, 38.30), | |
(329.70, 38.40), | |
(330.05, 39.45), | |
(330.25, 39.45), | |
(330.30, 40.00), | |
(330.70, 41.70), | |
(330.70, 42.30), | |
(330.70, 42.70), | |
(330.70, 42.90), | |
(331.00, 43.30), | |
(331.50, 43.80), | |
(331.80, 44.50), | |
(332.00, 45.00), | |
(332.60, 46.50), | |
(332.50, 47.80), | |
(331.00, 49.80), | |
(330.00, 51.20), | |
(330.00, 52.10), | |
(328.20, 52.20), | |
(328.20, 52.60), | |
(325.00, 52.70), | |
(324.80, 53.00), | |
(324.70, 55.20), | |
(326.00, 57.00), | |
(330.50, 60.00), | |
(333.00, 61.60), | |
(335.40, 63.00), | |
(337.50, 64.10), | |
(341.00, 63.70), | |
(343.00, 65.00), | |
(343.00, 66.00), | |
(343.50, 66.40), | |
(340.50, 66.70), | |
(341.50, 67.70), | |
(341.90, 68.40), | |
(342.70, 68.98), | |
(343.50, 68.90), | |
(344.60, 70.00), | |
(345.30, 70.55), | |
(346.20, 70.97), | |
(346.80, 70.92), | |
(348.00, 71.70), | |
(353.50, 70.92), | |
(355.30, 71.40), | |
(360.00, 72.05), # Synthetic | |
(360.00, 80.13), # Synthetic | |
(358.00, 80.38), | |
(356.50, 80.90), | |
(354.00, 82.10), | |
(355.50, 83.40), | |
(360.00, 84.10), # Synthetic | |
(360.00, 90.00), # Synthetic | |
(0.00, 90.00), # Synthetic | |
(0.00, 84.10), # Synthetic | |
]), | |
Polygon([ | |
(0.00, 72.05), # Synthetic | |
(1.10, 72.20), | |
(4.40, 72.80), | |
(6.80, 73.25), | |
(7.80, 73.40), | |
(8.25, 73.55), | |
(8.80, 73.95), | |
(8.70, 74.35), | |
(8.40, 74.60), | |
(8.40, 74.80), | |
(7.30, 75.60), | |
(7.20, 76.55), | |
(7.40, 76.75), | |
(7.60, 77.90), | |
(7.00, 78.45), | |
(3.00, 79.04), | |
(4.25, 79.60), | |
(0.00, 80.13), # Synthetic | |
(0.00, 72.05), # Synthetic | |
]) | |
]) | |
NOAM_FALSE_EASTING = 0.0 | |
PCFC = Polygon([ | |
(144.80, 41.00), | |
(144.50, 40.00), | |
(144.20, 39.00), | |
(144.00, 38.00), | |
(143.50, 37.00), | |
(142.80, 36.00), | |
(142.00, 35.00), | |
(142.00, 34.00), | |
(142.00, 33.00), | |
(142.20, 31.00), | |
(142.50, 30.00), | |
(142.80, 29.00), | |
(143.20, 28.00), | |
(143.20, 27.00), | |
(143.00, 26.00), | |
(143.00, 25.00), | |
(144.00, 24.00), | |
(145.00, 23.00), | |
(146.20, 22.00), | |
(147.00, 21.00), | |
(147.30, 20.00), | |
(147.30, 18.80), | |
(147.30, 17.50), | |
(147.30, 15.60), | |
(146.60, 13.90), | |
(144.80, 12.30), | |
(142.30, 11.20), | |
(140.60, 10.70), | |
(138.60, 10.10), | |
(137.80, 8.80), | |
(136.70, 8.10), | |
(135.40, 7.80), | |
(134.30, 5.90), | |
(133.40, 4.50), | |
(132.10, 3.10), | |
(131.00, 1.20), | |
(130.90, 1.10), | |
(131.80, 1.00), | |
(132.60, 0.70), | |
(133.40, 0.50), | |
(134.30, 0.20), | |
(135.10, 0.00), | |
(135.40, -0.20), | |
(135.70, -0.50), | |
(135.90, -0.70), | |
(136.20, -1.00), | |
(136.50, -1.20), | |
(136.80, -1.40), | |
(137.80, -1.40), | |
(139.10, -1.60), | |
(140.10, -1.70), | |
(141.40, -1.90), | |
(142.70, -2.30), | |
(143.80, -3.00), | |
(144.60, -3.60), | |
(145.50, -4.40), | |
(146.10, -5.20), | |
(146.60, -5.90), | |
(147.00, -6.70), | |
(147.50, -7.30), | |
(148.60, -7.50), | |
(149.70, -7.30), | |
(150.50, -7.10), | |
(151.30, -6.90), | |
(152.40, -6.70), | |
(153.20, -6.70), | |
(154.20, -7.20), | |
(155.30, -8.00), | |
(156.60, -8.90), | |
(157.70, -9.60), | |
(158.50, -10.00), | |
(159.50, -10.40), | |
(160.50, -11.00), | |
(161.70, -11.60), | |
(162.90, -11.70), | |
(163.80, -11.80), | |
(164.80, -12.20), | |
(165.40, -13.60), | |
(165.80, -15.00), | |
(166.40, -16.80), | |
(166.90, -17.80), | |
(167.40, -19.00), | |
(168.00, -20.00), | |
(168.40, -21.00), | |
(169.10, -22.10), | |
(169.90, -23.10), | |
(170.60, -23.70), | |
(171.50, -23.70), | |
(172.50, -22.90), | |
(173.50, -22.00), | |
(174.30, -21.10), | |
(175.60, -19.30), | |
(176.20, -18.30), | |
(177.20, -17.20), | |
(178.30, -16.10), | |
(179.70, -15.50), | |
(180.70, -15.20), | |
(181.10, -15.10), | |
(182.30, -14.70), | |
(183.80, -14.60), | |
(185.10, -14.50), | |
(186.10, -14.50), | |
(187.20, -14.50), | |
(188.40, -14.50), | |
(188.40, -14.50), | |
(188.90, -15.40), | |
(188.90, -16.80), | |
(188.60, -18.10), | |
(187.90, -19.70), | |
(187.10, -21.40), | |
(186.50, -22.60), | |
(186.20, -23.60), | |
(185.50, -25.40), | |
(184.90, -27.20), | |
(184.30, -28.60), | |
(183.80, -29.80), | |
(183.10, -31.10), | |
(182.90, -31.70), | |
(182.00, -33.30), | |
(181.50, -34.40), | |
(180.80, -35.80), | |
(179.60, -37.40), | |
(178.80, -38.70), | |
(178.20, -39.40), | |
(176.90, -40.70), | |
(176.40, -41.10), | |
(175.30, -41.60), | |
(174.40, -41.70), | |
(173.30, -42.00), | |
(172.20, -42.60), | |
(171.00, -43.20), | |
(169.90, -43.70), | |
(169.00, -44.10), | |
(167.80, -44.70), | |
(167.30, -45.20), | |
(166.50, -46.00), | |
(165.90, -47.00), | |
(165.30, -47.90), | |
(164.70, -48.60), | |
(164.30, -49.10), | |
(164.10, -49.70), | |
(163.30, -50.30), | |
(162.40, -50.90), | |
(161.10, -52.10), | |
(160.60, -52.70), | |
(159.90, -53.50), | |
(159.70, -53.70), | |
(159.50, -53.90), | |
(159.40, -54.10), | |
(159.30, -54.20), | |
(159.20, -54.40), | |
(159.10, -54.70), | |
(158.90, -54.90), | |
(158.80, -55.10), | |
(158.70, -55.30), | |
(158.70, -55.40), | |
(158.60, -55.60), | |
(158.50, -55.80), | |
(158.60, -55.90), | |
(158.40, -56.10), | |
(158.30, -56.40), | |
(158.10, -56.50), | |
(158.00, -56.60), | |
(157.90, -56.80), | |
(157.70, -56.90), | |
(157.70, -57.10), | |
(157.70, -57.20), | |
(157.60, -57.30), | |
(157.50, -57.40), | |
(157.40, -57.50), | |
(157.40, -57.70), | |
(157.30, -57.80), | |
(157.30, -57.90), | |
(157.30, -58.10), | |
(157.50, -58.30), | |
(157.60, -58.40), | |
(157.70, -58.50), | |
(157.80, -58.60), | |
(157.80, -58.70), | |
(157.90, -58.80), | |
(158.00, -58.80), | |
(158.10, -58.90), | |
(158.20, -59.00), | |
(158.30, -59.10), | |
(158.40, -59.20), | |
(158.50, -59.30), | |
(158.50, -59.40), | |
(158.60, -59.50), | |
(158.80, -59.60), | |
(158.80, -59.70), | |
(160.90, -61.60), | |
(161.20, -61.80), | |
(163.20, -61.80), | |
(163.80, -62.30), | |
(165.00, -62.00), | |
(166.40, -62.90), | |
(167.40, -62.60), | |
(168.40, -63.00), | |
(170.50, -62.50), | |
(173.40, -64.10), | |
(174.80, -63.70), | |
(182.30, -66.70), | |
(188.10, -64.70), | |
(189.20, -65.10), | |
(194.10, -62.80), | |
(195.60, -63.30), | |
(198.70, -61.70), | |
(202.50, -63.10), | |
(207.90, -59.60), | |
(209.20, -60.00), | |
(210.90, -58.80), | |
(210.70, -58.70), | |
(212.90, -57.10), | |
(213.40, -57.30), | |
(215.30, -55.70), | |
(219.20, -56.80), | |
(220.10, -56.00), | |
(220.80, -56.20), | |
(222.10, -54.90), | |
(222.40, -55.00), | |
(223.10, -54.00), | |
(227.00, -54.90), | |
(227.60, -54.10), | |
(231.30, -54.90), | |
(233.00, -55.30), | |
(233.60, -54.70), | |
(237.70, -55.80), | |
(239.50, -54.30), | |
(241.00, -54.50), | |
(242.00, -53.30), | |
(241.60, -53.20), | |
(243.00, -50.80), | |
(243.60, -49.60), | |
(245.00, -50.00), | |
(245.90, -48.30), | |
(246.70, -45.20), | |
(247.30, -42.70), | |
(247.80, -40.70), | |
(248.30, -38.40), | |
(248.00, -34.90), | |
(248.00, -33.80), | |
(247.90, -32.00), | |
(247.90, -31.10), | |
(247.90, -29.50), | |
(246.60, -27.20), | |
(246.10, -26.70), | |
(245.60, -26.80), | |
(245.10, -26.30), | |
(244.90, -24.10), | |
(244.80, -22.80), | |
(245.50, -22.70), | |
(245.80, -20.70), | |
(246.10, -20.70), | |
(246.30, -20.00), | |
(246.50, -19.40), | |
(246.90, -17.80), | |
(247.40, -15.70), | |
(247.80, -13.70), | |
(248.60, -13.60), | |
(248.80, -12.60), | |
(249.40, -11.00), | |
(250.10, -9.40), | |
(250.80, -9.30), | |
(252.20, -9.00), | |
(252.40, -8.10), | |
(253.00, -6.40), | |
(253.70, -4.90), | |
(254.30, -4.70), | |
(255.70, -4.30), | |
(257.20, -4.10), | |
(257.20, -2.90), | |
(257.40, -0.50), | |
(257.40, 2.30), | |
(257.40, 2.70), | |
(257.40, 3.50), | |
(257.40, 4.30), | |
(257.40, 4.90), | |
(257.40, 5.50), | |
(257.40, 6.20), | |
(257.40, 7.00), | |
(257.40, 7.90), | |
(257.40, 8.40), | |
(256.90, 8.50), | |
(256.40, 8.50), | |
(256.40, 8.90), | |
(256.30, 9.50), | |
(256.30, 10.10), | |
(256.00, 10.20), | |
(255.70, 10.40), | |
(255.60, 11.00), | |
(255.60, 11.90), | |
(255.60, 13.00), | |
(255.60, 14.30), | |
(255.60, 15.20), | |
(255.00, 15.20), | |
(254.60, 15.20), | |
(254.60, 16.50), | |
(254.60, 17.30), | |
(254.70, 18.10), | |
(254.40, 18.20), | |
(253.70, 18.50), | |
(252.90, 18.90), | |
(252.10, 19.20), | |
(251.40, 19.40), | |
(250.80, 19.70), | |
(250.60, 19.80), | |
(250.80, 20.20), | |
(251.20, 20.90), | |
(251.60, 21.70), | |
(251.90, 22.30), | |
(252.10, 22.70), | |
(252.30, 22.90), | |
(252.00, 23.00), | |
(251.70, 23.50), | |
(251.30, 24.10), | |
(251.00, 24.50), | |
(250.90, 24.60), | |
(250.90, 24.70), | |
(250.80, 24.90), | |
(250.30, 25.10), | |
(250.20, 25.30), | |
(250.10, 25.50), | |
(250.00, 25.60), | |
(249.90, 25.80), | |
(249.70, 26.00), | |
(249.70, 26.00), | |
(249.70, 26.10), | |
(249.60, 26.20), | |
(249.50, 26.40), | |
(249.30, 26.60), | |
(249.10, 26.80), | |
(248.90, 27.10), | |
(248.70, 27.30), | |
(248.50, 27.50), | |
(248.40, 27.70), | |
(248.20, 27.90), | |
(248.10, 28.00), | |
(247.90, 28.30), | |
(247.70, 28.50), | |
(247.50, 28.80), | |
(247.30, 29.10), | |
(246.90, 29.50), | |
(246.70, 29.70), | |
(246.50, 29.90), | |
(246.40, 30.10), | |
(246.10, 30.50), | |
(245.80, 30.80), | |
(245.70, 31.00), | |
(245.60, 31.30), | |
(245.50, 31.60), | |
(245.30, 31.80), | |
(245.30, 31.90), | |
(245.10, 32.10), | |
(244.90, 32.30), | |
(244.80, 32.50), | |
(244.50, 32.90), | |
(244.40, 33.30), | |
(243.45, 34.00), | |
(242.70, 34.15), | |
(241.50, 34.70), | |
(240.65, 34.90), | |
(239.95, 35.50), | |
(239.45, 36.00), | |
(238.90, 36.50), | |
(238.30, 37.00), | |
(237.70, 37.50), | |
(237.25, 38.00), | |
(236.80, 38.50), | |
(236.30, 39.00), | |
(236.10, 39.50), | |
(236.00, 40.00), | |
(235.60, 40.20), | |
(235.00, 40.40), | |
(232.50, 40.40), | |
(232.60, 41.60), | |
(232.80, 41.60), | |
(233.10, 42.30), | |
(233.50, 43.00), | |
(232.20, 43.50), | |
(230.80, 44.00), | |
(229.50, 44.50), | |
(229.90, 45.50), | |
(230.40, 46.50), | |
(230.80, 47.50), | |
(231.20, 48.20), | |
(231.00, 48.50), | |
(229.50, 49.20), | |
(229.60, 49.50), | |
(230.30, 50.10), | |
(230.80, 50.50), | |
(230.10, 51.00), | |
(229.30, 51.50), | |
(228.70, 52.00), | |
(227.20, 53.00), | |
(226.10, 54.00), | |
(225.50, 55.00), | |
(224.50, 56.00), | |
(223.90, 57.00), | |
(223.50, 58.00), | |
(223.00, 58.50), | |
(222.00, 59.00), | |
(221.00, 59.50), | |
(220.00, 59.90), | |
(219.00, 60.10), | |
(218.00, 59.80), | |
(217.00, 59.40), | |
(216.00, 59.30), | |
(215.00, 59.20), | |
(214.00, 59.00), | |
(213.00, 58.30), | |
(212.00, 57.80), | |
(210.00, 56.80), | |
(208.00, 56.00), | |
(206.00, 55.20), | |
(204.00, 54.70), | |
(202.00, 54.00), | |
(200.00, 53.70), | |
(198.00, 53.20), | |
(196.00, 52.80), | |
(194.00, 52.20), | |
(192.00, 51.70), | |
(190.00, 51.30), | |
(188.00, 51.00), | |
(186.00, 50.80), | |
(184.00, 50.50), | |
(182.00, 50.40), | |
(180.00, 50.50), | |
(178.00, 50.50), | |
(176.00, 50.80), | |
(174.00, 51.30), | |
(172.00, 51.90), | |
(170.00, 52.60), | |
(168.00, 53.60), | |
(166.00, 54.30), | |
(164.00, 55.50), | |
(163.00, 54.00), | |
(162.20, 53.00), | |
(161.00, 52.00), | |
(160.50, 51.00), | |
(159.50, 50.00), | |
(157.80, 49.00), | |
(156.20, 48.00), | |
(155.00, 47.00), | |
(153.80, 46.00), | |
(152.00, 45.00), | |
(150.00, 44.00), | |
(148.50, 43.00), | |
(147.00, 42.00), | |
(144.80, 41.00), | |
]) | |
PCFC_FALSE_EASTING = 0.0 | |
SOAM = Polygon([ | |
(359.30, -54.80), | |
(359.00, -54.60), | |
(358.50, -54.00), | |
(357.60, -54.30), | |
(357.00, -53.50), | |
(355.20, -52.20), | |
(353.00, -50.10), | |
(352.00, -49.30), | |
(350.20, -48.20), | |
(349.30, -46.90), | |
(346.70, -47.40), | |
(346.20, -46.20), | |
(344.80, -45.20), | |
(344.00, -44.10), | |
(343.50, -41.70), | |
(343.20, -40.30), | |
(344.10, -40.10), | |
(344.00, -39.10), | |
(342.50, -37.30), | |
(342.20, -35.50), | |
(344.70, -35.30), | |
(344.80, -34.30), | |
(345.40, -33.90), | |
(345.50, -33.00), | |
(345.50, -32.50), | |
(346.70, -32.30), | |
(346.60, -31.70), | |
(346.60, -31.10), | |
(346.30, -29.20), | |
(347.10, -29.00), | |
(346.80, -27.30), | |
(346.20, -26.90), | |
(346.30, -25.10), | |
(346.60, -24.70), | |
(346.50, -23.10), | |
(347.50, -22.60), | |
(348.40, -21.10), | |
(348.00, -19.20), | |
(347.00, -17.80), | |
(345.90, -17.90), | |
(346.00, -17.00), | |
(345.70, -16.20), | |
(346.80, -16.10), | |
(346.50, -15.00), | |
(346.40, -14.00), | |
(345.70, -14.10), | |
(345.50, -13.50), | |
(345.10, -11.90), | |
(347.10, -11.50), | |
(347.00, -10.50), | |
(346.50, -8.00), | |
(346.60, -7.20), | |
(348.50, -6.80), | |
(347.20, -0.90), | |
(344.20, -1.40), | |
(343.70, 0.10), | |
(335.40, -1.20), | |
(335.00, 0.50), | |
(333.80, 0.60), | |
(333.50, 0.90), | |
(329.60, 0.90), | |
(328.60, 3.90), | |
(327.40, 4.00), | |
(327.40, 5.20), | |
(326.00, 7.20), | |
(322.60, 7.60), | |
(322.20, 8.10), | |
(320.80, 8.10), | |
(320.60, 8.70), | |
(319.80, 8.80), | |
(319.30, 9.50), | |
(319.10, 10.70), | |
(316.30, 10.80), | |
(316.30, 12.10), | |
(315.90, 12.10), | |
(315.90, 12.60), | |
(315.20, 12.60), | |
(315.20, 13.50), | |
(315.00, 13.70), | |
(315.00, 15.30), | |
(313.30, 15.40), | |
(313.40, 16.80), | |
(313.60, 18.50), | |
(313.90, 19.00), | |
(314.20, 19.80), | |
(314.30, 20.30), | |
(314.30, 20.30), | |
(299.00, 18.00), | |
(299.70, 17.40), | |
(300.20, 16.90), | |
(300.60, 16.30), | |
(300.70, 15.60), | |
(300.70, 14.90), | |
(300.60, 14.50), | |
(300.40, 14.10), | |
(300.30, 13.60), | |
(300.10, 13.10), | |
(298.30, 10.40), | |
(297.40, 10.40), | |
(296.00, 10.40), | |
(294.80, 10.40), | |
(293.40, 10.50), | |
(291.90, 10.40), | |
(290.70, 10.30), | |
(289.90, 9.90), | |
(289.30, 9.20), | |
(288.60, 8.40), | |
(288.00, 7.70), | |
(287.30, 7.00), | |
(286.50, 6.20), | |
(285.60, 5.50), | |
(284.60, 4.90), | |
(283.60, 4.30), | |
(282.50, 3.80), | |
(281.90, 3.60), | |
(281.70, 2.60), | |
(281.20, 2.20), | |
(280.90, 1.90), | |
(280.20, 1.00), | |
(279.70, 0.30), | |
(279.10, -1.20), | |
(279.00, -2.50), | |
(278.70, -4.10), | |
(278.70, -5.40), | |
(278.70, -6.50), | |
(279.00, -7.80), | |
(279.40, -9.40), | |
(279.90, -10.50), | |
(280.50, -11.70), | |
(281.30, -12.80), | |
(282.10, -13.90), | |
(283.20, -15.10), | |
(284.20, -15.90), | |
(285.00, -16.60), | |
(286.00, -17.40), | |
(286.90, -18.10), | |
(287.80, -19.50), | |
(288.40, -20.40), | |
(288.80, -21.20), | |
(289.20, -22.20), | |
(289.40, -23.40), | |
(289.20, -24.90), | |
(288.80, -26.60), | |
(288.40, -28.50), | |
(287.90, -30.20), | |
(287.40, -32.00), | |
(287.30, -33.70), | |
(286.90, -35.10), | |
(286.50, -36.40), | |
(285.70, -37.60), | |
(284.90, -38.90), | |
(284.40, -40.50), | |
(284.30, -41.80), | |
(284.10, -43.00), | |
(283.80, -43.90), | |
(283.80, -44.80), | |
(283.80, -45.30), | |
(283.80, -45.80), | |
(284.00, -46.90), | |
(284.10, -47.70), | |
(284.30, -48.80), | |
(284.60, -49.60), | |
(284.60, -50.70), | |
(284.70, -51.90), | |
(284.80, -53.00), | |
(285.70, -53.60), | |
(286.90, -54.40), | |
(288.00, -54.90), | |
(289.20, -55.40), | |
(291.00, -55.60), | |
(293.10, -55.60), | |
(294.30, -55.50), | |
(295.20, -55.60), | |
(296.60, -55.70), | |
(297.70, -55.80), | |
(299.90, -56.00), | |
(300.00, -56.00), | |
(302.50, -55.90), | |
(305.00, -55.70), | |
(307.50, -55.60), | |
(310.00, -55.50), | |
(311.80, -55.40), | |
(313.50, -55.20), | |
(315.30, -55.10), | |
(317.00, -55.00), | |
(317.80, -55.00), | |
(318.50, -54.90), | |
(319.30, -54.80), | |
(320.00, -54.80), | |
(322.50, -54.80), | |
(325.00, -54.80), | |
(327.50, -54.80), | |
(330.00, -54.80), | |
(330.70, -54.80), | |
(331.50, -54.90), | |
(333.00, -55.00), | |
(333.50, -55.20), | |
(334.00, -55.40), | |
(334.50, -55.50), | |
(335.00, -55.70), | |
(335.20, -55.80), | |
(335.50, -55.90), | |
(335.80, -56.00), | |
(336.00, -56.10), | |
(336.30, -56.60), | |
(336.60, -57.00), | |
(336.90, -57.50), | |
(337.20, -58.00), | |
(336.90, -58.40), | |
(336.60, -58.80), | |
(336.30, -59.20), | |
(336.00, -59.60), | |
(335.10, -60.70), | |
(334.40, -60.70), | |
(335.10, -60.80), | |
(335.60, -60.90), | |
(336.10, -61.00), | |
(336.70, -61.00), | |
(337.40, -61.00), | |
(338.10, -61.00), | |
(338.80, -61.00), | |
(339.50, -60.90), | |
(340.10, -60.90), | |
(340.60, -60.80), | |
(340.70, -60.50), | |
(341.00, -60.50), | |
(341.10, -60.20), | |
(341.50, -60.20), | |
(341.50, -59.60), | |
(342.00, -59.60), | |
(342.00, -59.10), | |
(343.80, -59.00), | |
(343.80, -58.30), | |
(353.00, -57.80), | |
(355.30, -55.80), | |
(358.40, -55.60), | |
(358.40, -55.30), | |
(358.60, -55.10), | |
(358.90, -54.80), | |
(359.30, -54.80), | |
]) | |
SOAM_FALSE_EASTING = 0.0 | |
def shift_lon(x, y): | |
if x < 0.0: | |
return (360.0 + x, y) | |
else: | |
return (x, y) | |
Plate = namedtuple('Plate', 'polygon, false_easting name') | |
PLATES = [ | |
Plate(NOAM, NOAM_FALSE_EASTING, 'NOAM'), | |
Plate(EURA, EURA_FALSE_EASTING, 'EURA'), | |
Plate(ANTA, ANTA_FALSE_EASTING, 'ANTA'), | |
Plate(SOAM, SOAM_FALSE_EASTING, 'SOAM'), | |
Plate(PCFC, PCFC_FALSE_EASTING, 'PCFC'), | |
Plate(ARAB, ARAB_FALSE_EASTING, 'ARAB'), | |
Plate(AUST, AUST_FALSE_EASTING, 'AUST'), | |
Plate(INDI, INDI_FALSE_EASTING, 'INDI'), | |
Plate(NAZC, NAZC_FALSE_EASTING, 'NAZC'), | |
] | |
def plate_name(point): | |
"""Determine the Tectonic plate name based on the lon/lat of the given | |
point. The point's longitude (x) should be in the range [-180, 180], | |
and latitude (y) in the range [-90, 90]. | |
""" | |
x, y = point.coords.xy | |
for polygon, fe, name in PLATES: | |
p = Point(*shift_lon(x[0] + fe, y[0])) | |
if polygon.intersects(p): | |
return name |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import collections | |
import datetime as dt | |
import logging | |
import os | |
import time | |
import arrow | |
import pandas as pd | |
from pyproj import Transformer | |
from shapely.geometry.point import Point | |
from valkyrie.itrf.plate_boundaries import plate_name | |
DF_CHUNKSIZE = 250000 | |
GranuleItrfRange = collections.namedtuple('GranuleItrfRange', 'start end itrf') | |
ATM1B_GRANULE_ITRFS = [ | |
GranuleItrfRange(arrow.Arrow(1993, 6, 23), arrow.Arrow(1996, 6, 5), "ITRF93"), | |
GranuleItrfRange(arrow.Arrow(1997, 4, 25), arrow.Arrow(1997, 5, 28), "ITRF94"), | |
GranuleItrfRange(arrow.Arrow(1998, 6, 27), arrow.Arrow(1999, 5, 25), "ITRF96"), | |
GranuleItrfRange(arrow.Arrow(2000, 5, 12), arrow.Arrow(2001, 5, 27), "ITRF97"), | |
GranuleItrfRange(arrow.Arrow(2001, 12, 18), arrow.Arrow(2002, 11, 21), "ITRF2000"), | |
GranuleItrfRange(arrow.Arrow(2002, 11, 22), arrow.Arrow(2002, 11, 22), "ITRF97"), | |
GranuleItrfRange(arrow.Arrow(2002, 11, 23), arrow.Arrow(2002, 12, 13), "ITRF2000"), | |
GranuleItrfRange(arrow.Arrow(2002, 12, 14), arrow.Arrow(2002, 12, 14), "ITRF97"), | |
GranuleItrfRange(arrow.Arrow(2002, 12, 15), arrow.Arrow(2007, 5, 11), "ITRF2000"), | |
GranuleItrfRange(arrow.Arrow(2007, 9, 10), arrow.Arrow(2011, 5, 16), "ITRF2005"), | |
GranuleItrfRange(arrow.Arrow(2011, 10, 12), arrow.Arrow(2018, 5, 1), "ITRF2008"), | |
] | |
def convert_itrf(order_id, dataset_name, csv_filename, target_itrf=None, target_epoch=None): | |
target_csv_filename = csv_filename | |
root, ext = os.path.splitext(csv_filename) | |
src_csv_filename = f"{root}.src{ext}" | |
os.rename(csv_filename, src_csv_filename) | |
df_reader = _df_reader_from_csv(src_csv_filename, DF_CHUNKSIZE) | |
for chunk in df_reader: | |
chunk = _rename_columns(chunk) | |
if target_epoch is not None: | |
groups = _itrf_plate_groups(chunk) | |
else: | |
groups = _itrf_groups(chunk) | |
logging.info(f"Number of groups: {len(groups)}") | |
for grouping, part in groups: | |
if target_epoch is not None: | |
source_itrf, plate = grouping | |
logging.info(f"Converting part of size {len(part)} " | |
f"from {source_itrf} to {target_itrf} " | |
f"with plate name {plate} " | |
f"and epoch {target_epoch}") | |
lons, lats, elevs, _ = _convert_df(part, source_itrf, target_itrf, plate, target_epoch) | |
else: | |
source_itrf = grouping | |
logging.info(f"Converting part of size {len(part)} " | |
f"from {source_itrf} to {target_itrf}") | |
lons, lats, elevs, _ = _convert_df(part, source_itrf, target_itrf) | |
new_part = part.copy() | |
new_part["latitude"] = lats | |
new_part["longitude"] = lons | |
new_part["elevation"] = elevs | |
del new_part["itrf"] | |
if "plate" in new_part.columns: | |
del new_part["plate"] | |
new_part.to_csv(csv_filename, mode="a", header=False, index=False) | |
# Cleanup | |
# os.remove(src_csv_filename) | |
return target_csv_filename | |
def _df_reader_from_csv(csv_filepath, df_chunksize): | |
"""Copies data from the database to file, and returns a reader to a pandas | |
dataframe of the data. | |
""" | |
return pd.read_csv( | |
csv_filepath, | |
parse_dates=[0], | |
header=None, | |
chunksize=df_chunksize, | |
) | |
def _rename_columns(df): | |
"""Renames the first four columns to useful names since we only use | |
these and don't need the others to be named. This also allows us to | |
work with any of the data products since all have the same first four | |
columns.""" | |
return df.rename(columns={ | |
0: 'utc_datetime', | |
1: 'longitude', | |
2: 'latitude', | |
3: 'elevation' | |
}) | |
def _itrf_plate_groups(chunk): | |
logging.info("Adding source ITRF") | |
chunk['itrf'] = chunk['utc_datetime'].apply(_granule_itrf) | |
logging.info("Adding source plate name") | |
chunk['plate'] = chunk[['longitude', 'latitude']].apply(lambda lonlat: plate_name(Point(*lonlat)), axis=1) | |
logging.info("Grouping by source ITRF and plate") | |
return chunk.groupby(['itrf', 'plate'], sort=False) | |
def _itrf_groups(chunk): | |
logging.info("Adding source ITRF") | |
chunk['itrf'] = chunk['utc_datetime'].apply(_granule_itrf) | |
logging.info("Grouping by source ITRF") | |
return chunk.groupby('itrf', sort=False) | |
def _granule_itrf(granule_datetime): | |
def _find(gdt, i, lower, upper): | |
# Binary search for the correct ITRF to make this fast. If we | |
# do a naive linear search, it can run up to 10x longer. | |
g = ATM1B_GRANULE_ITRFS[i] | |
if gdt < g.start: | |
if i > lower: | |
return _find(gdt, (i - lower) // 2, lower, i) | |
else: | |
return None | |
elif gdt <= g.end: | |
return g.itrf | |
else: | |
if i < (upper - 1): | |
return _find(gdt, (upper + i) // 2, i, upper) | |
else: | |
return None | |
gdt = arrow.get(granule_datetime) | |
lower, upper = (0, len(ATM1B_GRANULE_ITRFS)) | |
i = (upper - lower) // 2 | |
return _find(gdt, i, lower, upper) | |
def _convert_df(chunk, source_itrf, target_itrf, plate=None, target_epoch=None): | |
"""Converts a chunk of a dataframe from a source ITRF to a target ITRF""" | |
decimalyears = chunk.utc_datetime.apply(_datetime_to_decimal_year).to_numpy() | |
# TODO: Should we create a new decimalyears when doing an epoch | |
# propagation since PROJ doesn't do this? | |
return _transformer(source_itrf, target_itrf, plate, target_epoch).transform( | |
chunk.longitude.to_numpy(), | |
chunk.latitude.to_numpy(), | |
chunk.elevation.to_numpy(), | |
decimalyears, | |
) | |
def _datetime_to_decimal_year(date): | |
"""Stolen from | |
https://stackoverflow.com/questions/6451655/python-how-to-convert-datetime-dates-to-decimal-years | |
""" | |
def sinceEpoch(date): | |
# returns seconds since epoch | |
return time.mktime(date.timetuple()) | |
s = sinceEpoch | |
year = date.year | |
startOfThisYear = dt.datetime(year=year, month=1, day=1) | |
startOfNextYear = dt.datetime(year=year + 1, month=1, day=1) | |
yearElapsed = s(date) - s(startOfThisYear) | |
yearDuration = s(startOfNextYear) - s(startOfThisYear) | |
fraction = yearElapsed / yearDuration | |
return date.year + fraction | |
def _transformer(source_itrf, target_itrf, plate=None, target_epoch=None): | |
"""Pipeline string for proj to transform from the source to the target | |
ITRF frame and, optionally, epoch. | |
""" | |
plate_model_step = "" | |
if plate and target_epoch: | |
plate_model_step = ( | |
f"+step +inv +init={target_itrf}:{plate} +t_epoch={target_epoch} " | |
) | |
pipeline = ( | |
f"+proj=pipeline +ellps=WGS84 " | |
f"+step +proj=unitconvert +xy_in=deg +xy_out=rad " | |
f"+step +proj=latlon " | |
f"+step +proj=cart " | |
f"+step +inv +init={target_itrf}:{source_itrf} " | |
f"{plate_model_step}" | |
f"+step +inv +proj=cart " | |
f"+step +proj=unitconvert +xy_in=rad +xy_out=deg" | |
) | |
return Transformer.from_pipeline(pipeline) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment