def processAlgorithm(self, progress):
        filename = self.getParameterValue(self.INPUT)
        layer = dataobjects.getObjectFromUri(filename)
        provider = layer.dataProvider()

        caps = provider.capabilities()
        if not (caps & QgsVectorDataProvider.AddAttributes):
            raise GeoAlgorithmExecutionException(
                'The selected layer does not '
                ' support adding new attributes.')

        fields = layer.fields()
        idxField = fields.indexFromName('MGRS')
        if idxField == -1:
            provider.addAttributes([QgsField('MGRS', QVariant.String)])
            layer.updateFields()
            idxField = len(fields)

        epsg4326 = QgsCoordinateReferenceSystem('EPSG:4326')
        transform = QgsCoordinateTransform(layer.crs(), epsg4326)

        features = vector.features(layer)
        total = 100.0 / float(len(features))
        for i, feat in enumerate(features):
            pt = feat.geometry().asPoint()
            try:
                pt4326 = transform.transform(pt.x(), pt.y())
                mgrsCoord = mgrs.toMgrs(pt4326.y(), pt4326.x())
            except Exception as e:
                mgrsCoord = ''

            provider.changeAttributeValues({feat.id(): {idxField: mgrsCoord}})

        self.setOutputValue(self.OUTPUT, filename)
Beispiel #2
0
    def testWgsCoordinates(self):
        # to MGRS
        self.assertEqual(mgrs.toMgrs(42.0, -93.0), '15TVG0000049776')
        self.assertEqual(mgrs.toMgrs(42.0, -93.0, 5), '15TVG0000049776')
        self.assertEqual(mgrs.toMgrs(42.0, -93.0, 3), '15TVG000497')
        self.assertEqual(mgrs.toMgrs(42.0, -93.0, 0), '15TVG')

        self.assertEqual(mgrs.toMgrs(38.9072, -77.0369), '18SUJ2338308450')
        self.assertEqual(mgrs.toMgrs(39.9526, -75.1652), '18SVK8588822509')
        self.assertEqual(mgrs.toMgrs(37.6539, 44.0062), '38SMG1233767880')

        # to WGS
        lat, lon = mgrs.toWgs('15TVG0000049776')
        self.assertAlmostEqual(lat, 41.99364855788585)
        self.assertAlmostEqual(lon, -94.20734290469866)

        lat, lon = mgrs.toWgs('15TVG000497')
        self.assertAlmostEqual(lat, 41.54988934568494)
        self.assertAlmostEqual(lon, -94.19904899028688)

        lat, lon = mgrs.toWgs('15TVG')
        self.assertAlmostEqual(lat, 41.545413660388625)
        self.assertAlmostEqual(lon, -94.19896628704795)

        lat, lon = mgrs.toWgs('18SUJ2338308450')
        self.assertAlmostEqual(lat, 38.90719314018781)
        self.assertAlmostEqual(lon, -77.03690158268294)

        lat, lon = mgrs.toWgs('18SVK8588822509')
        self.assertAlmostEqual(lat, 39.95259667537377)
        self.assertAlmostEqual(lon, -75.16520969399382)

        lat, lon = mgrs.toWgs('38SMG1233767880')
        self.assertAlmostEqual(lat, 37.65389907949628)
        self.assertAlmostEqual(lon, 44.00619523636414)
Beispiel #3
0
    def toMgrs(self, pt):
        canvas = iface.mapCanvas()
        canvasCrs = canvas.mapSettings().destinationCrs()
        transform = QgsCoordinateTransform(canvasCrs, self.epsg4326)
        pt4326 = transform.transform(pt.x(), pt.y())
        try:
            mgrsCoords = mgrs.toMgrs(pt4326.y(), pt4326.x())
        except Exception as e:
            mgrsCoords = None

        return mgrsCoords
Beispiel #4
0
    def testPopulatedPlaces(self):
        if os.environ.get('MGRSPY_TEST_PLACES', None) is None:
            self.skipTest('MGRSPY_TEST_PLACES env var not set')

        # Populated places from Natural Earth project (~2017, 1200+ places)
        with open('populated-places.csv') as populated_places:
            places = [p for p in csv.reader(populated_places, delimiter='\t')]

        lineno = 1
        for place in places:
            name = place[0]
            if name == 'NAMEASCII' or name.startswith('#'):
                log.warning('#{0} skipping'.format(lineno))
                lineno += 1
                continue
            lat = float(place[1])
            lon = float(place[2])
            mgr = place[3]
            zone = int(place[4])
            hemi = place[5].upper()
            easting = float(place[6])
            northing = float(place[7])
            epsg = int(place[8])

            log.warning('#{0} {1} {2} {3} {4} {5} {6} {7} {8} {9}'.format(
                lineno, name, lat, lon, mgr, zone,
                hemi, easting, northing, epsg))

            # verify UTM zone/hemisphere, EPSG code
            hemi2, zone2, epsg2 = mgrs._epsgForWgs(lat, lon)
            self.assertEqual(hemi2, hemi)
            self.assertEqual(zone2, zone)
            self.assertEqual(epsg2, epsg)

            epsg3 = mgrs._epsgForUtm(0 if zone == 61 else zone, hemi)
            self.assertEqual(epsg3, epsg)

            # to MGRS
            self.assertEqual(mgrs.toMgrs(lat, lon).strip(), mgr)

            # # to WGS
            lat2, lon2 = mgrs.toWgs(mgr)
            # Test to only 4 places, as list generated by GeographicLib's
            #   GeoConvert, which may represent MGRS square coord by its center
            # TODO: Generate populated places MGRS using geotrans
            placement = 4
            if name.startswith('Amundsen'):
                # South Pole station that fails MGRS->WGS for placement > 1
                placement = 1
            self.assertAlmostEqual(lat2, lat, places=placement)
            self.assertAlmostEqual(lon2, lon, places=placement)

            lineno += 1
Beispiel #5
0
    def testNorthPoleCoordinates(self):
        self.assertEqual(mgrs.toMgrs(-88.52, -66.49), '  AYN4931665550')

        lat, lon = mgrs.toWgs('  AYN4931665550')
        self.assertAlmostEqual(lat, -88.51999757416547)
        self.assertAlmostEqual(lon, -66.49017323008184)

        lat, lon = mgrs.toWgs('    AYN4931665550')
        self.assertAlmostEqual(lat, -88.51999757416547)
        self.assertAlmostEqual(lon, -66.49017323008184)

        lat, lon = mgrs.toWgs('AYN4931665550')
        self.assertAlmostEqual(lat, -88.51999757416547)
        self.assertAlmostEqual(lon, -66.49017323008184)
Beispiel #6
0
    def testSouthPoleCoordinates(self):
        self.assertEqual(mgrs.toMgrs(86.598, -156.507), '  YYL4939146492')

        lat, lon = mgrs.toWgs('  YYL4939146492')
        self.assertAlmostEqual(lat, 86.59800323153932)
        self.assertAlmostEqual(lon, -156.50695504226658)

        lat, lon = mgrs.toWgs('    YYL4939146492')
        self.assertAlmostEqual(lat, 86.59800323153932)
        self.assertAlmostEqual(lon, -156.50695504226658)

        lat, lon = mgrs.toWgs('YYL4939146492')
        self.assertAlmostEqual(lat, 86.59800323153932)
        self.assertAlmostEqual(lon, -156.50695504226658)
def mgrs(easting, northing, epsg, feature, parent): 
	"""
	<i>Requires mgrspy from Boundless<br>
	pip install mgrspy</i><br><br>
	Find MGRS from X and Y coordinate in EPSG.<br>
	<br>
	<h2>Example:</h2><br>
	<code>
	mgrs( 495395, 6392411, 32633) -> '33VVD94574973545'<br><br>
	mgrs( 15.048564, 57.405484, 4326) -> '33VWD1453591543'<br><br>
	</code>
	"""
	crsSrc = QgsCoordinateReferenceSystem(epsg)
	crsDst = QgsCoordinateReferenceSystem(4326)
	xform = QgsCoordinateTransform(crsSrc, crsDst)
	pt = xform.transform(QgsPoint(easting,northing))
	from mgrspy import mgrs
	mgrs_out = mgrs.toMgrs(pt[1],pt[0],5) # Latitude first...
	return mgrs_out
Beispiel #8
0
 def testSpecialCases(self):
     self.assertEqual(mgrs.toMgrs(-90, 180), '  BAN0000000000')
     lat, lon = mgrs.toWgs('BAN0000000000')
     self.assertAlmostEqual(lat, -90.0)
     self.assertAlmostEqual(lon, 0.0)
Beispiel #9
0
 def testWgsCoordinatesCorners(self):
     mgrs_txt = mgrs.toMgrs(11.43995185735899, 23.601038987469863)
     self.assertEqual(mgrs_txt, '34PGT8380865904')