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)
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)
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
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
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)
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
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)
def testWgsCoordinatesCorners(self): mgrs_txt = mgrs.toMgrs(11.43995185735899, 23.601038987469863) self.assertEqual(mgrs_txt, '34PGT8380865904')