def test_set_max_decimal_places_track(self): """Tests setting the number of decimal places for track data""" from pykml.helpers import set_max_decimal_places test_kml = ('<?xml version="1.0" encoding="UTF-8"?>' '<kml xmlns="http://www.opengis.net/kml/2.2" ' 'xmlns:gx="http://www.google.com/kml/ext/2.2">' '<Folder>' '<Placemark>' '<gx:Track>' '<when>2010-05-28T02:02:09Z</when>' '<when>2010-05-28T02:02:35Z</when>' '<when>2010-05-28T02:02:44Z</when>' '<gx:coord>-122.111111 37.111111 151.333333</gx:coord>' '<gx:coord>-122.222222 37.222222 152.222222</gx:coord>' '<gx:coord>-122.333333 37.333333 153.333333</gx:coord>' '</gx:Track>' '</Placemark>' '</Folder>' '</kml>') doc = fromstring(test_kml, schema=Schema("kml22gx.xsd")) set_max_decimal_places(doc, max_decimals={ 'longitude': 3, 'latitude': 2, 'altitude': 1, }) coords_list = doc.findall( ".//{http://www.google.com/kml/ext/2.2}coord") #import ipdb; ipdb.set_trace() self.assertEquals(coords_list[0], '-122.111 37.11 151.3')
def test_set_max_decimal_places_track(self): """Tests setting the number of decimal places for track data""" from pykml.helpers import set_max_decimal_places test_kml = ( '<?xml version="1.0" encoding="UTF-8"?>' '<kml xmlns="http://www.opengis.net/kml/2.2" ' 'xmlns:gx="http://www.google.com/kml/ext/2.2">' '<Folder>' '<Placemark>' '<gx:Track>' '<when>2010-05-28T02:02:09Z</when>' '<when>2010-05-28T02:02:35Z</when>' '<when>2010-05-28T02:02:44Z</when>' '<gx:coord>-122.111111 37.111111 151.333333</gx:coord>' '<gx:coord>-122.222222 37.222222 152.222222</gx:coord>' '<gx:coord>-122.333333 37.333333 153.333333</gx:coord>' '</gx:Track>' '</Placemark>' '</Folder>' '</kml>' ) doc = fromstring(test_kml, schema=Schema("kml22gx.xsd")) set_max_decimal_places( doc, max_decimals={ 'longitude': 3, 'latitude': 2, 'altitude': 1, } ) coords_list = doc.findall(".//{http://www.google.com/kml/ext/2.2}coord") #import ipdb; ipdb.set_trace() self.assertEquals( coords_list[0], '-122.111 37.11 151.3' )
from pykml import parser from pykml.parser import Schema from pykml.helpers import set_max_decimal_places import gpxpy import gpxpy.gpx from bs4 import BeautifulSoup as bs from tqdm import tqdm logging.basicConfig(level=logging.DEBUG) # parse kml root = parser.parse(sys.stdin).getroot() set_max_decimal_places(root, max_decimals={'longitude': 6, 'latitude': 6}) logging.info('kml22gx validation: %r', Schema('kml22gx.xsd').validate(root)) logging.info('ogckml22 validation: %r', Schema('ogckml22.xsd').validate(root)) # https://developer.mozilla.org/en-US/docs/Web/XPath/Functions # https://devhints.io/xpath placemarks = root.xpath('//k:Placemark', namespaces={'k': 'http://www.opengis.net/kml/2.2'}) logging.info(f'found {len(placemarks)} placemarks') # TODO read these fields from the kml file itself! # TODO make the mapping to their display names configurable # fields in KML file downloaded from FS
def test_set_max_decimal_places(self): """Tests setting the number of decimal places in a document""" from pykml.helpers import set_max_decimal_places test_kml = ( '<?xml version="1.0" encoding="UTF-8"?>' '<kml xmlns="http://www.opengis.net/kml/2.2" ' 'xmlns:gx="http://www.google.com/kml/ext/2.2" ' 'xmlns:kml="http://www.opengis.net/kml/2.2" ' 'xmlns:atom="http://www.w3.org/2005/Atom">' '<Document>' '<Placemark>' '<name>Spearhead</name>' '<LookAt>' '<longitude>-105.6381333137406</longitude>' '<latitude>40.25542364754504</latitude>' '<altitude>0.123456789</altitude>' '<heading>-75.2679217880259</heading>' '<tilt>23.33768008163944</tilt>' '<range>234.1234567890</range>' '<altitudeMode>relativeToGround</altitudeMode>' '</LookAt>' '<Point>' '<altitudeMode>absolute</altitudeMode>' '<coordinates>-105.6381333137406,40.25542364754504,3826.1234567890</coordinates>' '</Point>' '</Placemark>' '<Placemark>' '<name>North Ridge</name>' '<LineString>' '<tessellate>1</tessellate>' '<coordinates>' '-105.6400899274733,40.25778038346723,0 -105.6397083557171,40.25680995109639,0 -105.6389193178716,40.25606911151127,0 -105.6385344464865,40.25559941617504,0 ' '</coordinates>' '</LineString>' '</Placemark>' '<Placemark>' '<name>Black Lake</name>' '<Polygon>' '<tessellate>1</tessellate>' '<outerBoundaryIs>' '<LinearRing>' '<coordinates>' '-105.6411566922825,40.26642751482452,0 -105.6424707115566,40.26600581412304,0 -105.6428010853679,40.26549238687588,0 -105.6423465680717,40.26464873270425,0 -105.6414735029203,40.2645201246226,0 -105.6404885591011,40.2647647504581,0 -105.6402035173736,40.26539046743765,0 -105.6405618656529,40.26617884849238,0 -105.6411566922825,40.26642751482452,0 ' '</coordinates>' '</LinearRing>' '</outerBoundaryIs>' '</Polygon>' '</Placemark>' '</Document>' '</kml>' ) doc = fromstring(test_kml, schema=Schema("ogckml22.xsd")) set_max_decimal_places( doc, max_decimals={ 'longitude': 6, 'latitude': 5, 'altitude': 2, 'heading': 1, 'tilt': 0, #'range': 0, # range values will not be changed } ) longitude_list = doc.findall(".//{http://www.opengis.net/kml/2.2}longitude") self.assertAlmostEquals(longitude_list[0], -105.638133) latitude_list = doc.findall(".//{http://www.opengis.net/kml/2.2}latitude") self.assertAlmostEquals(latitude_list[0], 40.25542) altitude_list = doc.findall(".//{http://www.opengis.net/kml/2.2}altitude") self.assertAlmostEquals(altitude_list[0], 0.12) heading_list = doc.findall(".//{http://www.opengis.net/kml/2.2}heading") self.assertAlmostEquals(heading_list[0], -75.3) tilt_list = doc.findall(".//{http://www.opengis.net/kml/2.2}tilt") self.assertAlmostEquals(tilt_list[0], 23.0) # Note that the range value was not changed range_list = doc.findall(".//{http://www.opengis.net/kml/2.2}range") self.assertAlmostEquals(range_list[0], 234.1234567890) coords_list = doc.findall(".//{http://www.opengis.net/kml/2.2}coordinates") self.assertEquals( coords_list[0], "-105.638133,40.25542,3826.12" ) self.assertEquals( coords_list[1], '-105.64009,40.25778,0.0 ' '-105.639708,40.25681,0.0 ' '-105.638919,40.25607,0.0 ' '-105.638534,40.2556,0.0' ) #import ipdb; ipdb.set_trace() self.assertEquals( coords_list[2], '-105.641157,40.26643,0.0 ' '-105.642471,40.26601,0.0 ' '-105.642801,40.26549,0.0 ' '-105.642347,40.26465,0.0 ' '-105.641474,40.26452,0.0 ' '-105.640489,40.26476,0.0 ' '-105.640204,40.26539,0.0 ' '-105.640562,40.26618,0.0 ' '-105.641157,40.26643,0.0' )
def test_set_max_decimal_places(self): """Tests setting the number of decimal places in a document""" from pykml.helpers import set_max_decimal_places test_kml = ( '<?xml version="1.0" encoding="UTF-8"?>' '<kml xmlns="http://www.opengis.net/kml/2.2" ' 'xmlns:gx="http://www.google.com/kml/ext/2.2" ' 'xmlns:kml="http://www.opengis.net/kml/2.2" ' 'xmlns:atom="http://www.w3.org/2005/Atom">' '<Document>' '<Placemark>' '<name>Spearhead</name>' '<LookAt>' '<longitude>-105.6381333137406</longitude>' '<latitude>40.25542364754504</latitude>' '<altitude>0.123456789</altitude>' '<heading>-75.2679217880259</heading>' '<tilt>23.33768008163944</tilt>' '<range>234.1234567890</range>' '<altitudeMode>relativeToGround</altitudeMode>' '</LookAt>' '<Point>' '<altitudeMode>absolute</altitudeMode>' '<coordinates>-105.6381333137406,40.25542364754504,3826.1234567890</coordinates>' '</Point>' '</Placemark>' '<Placemark>' '<name>North Ridge</name>' '<LineString>' '<tessellate>1</tessellate>' '<coordinates>' '-105.6400899274733,40.25778038346723,0 -105.6397083557171,40.25680995109639,0 -105.6389193178716,40.25606911151127,0 -105.6385344464865,40.25559941617504,0 ' '</coordinates>' '</LineString>' '</Placemark>' '<Placemark>' '<name>Black Lake</name>' '<Polygon>' '<tessellate>1</tessellate>' '<outerBoundaryIs>' '<LinearRing>' '<coordinates>' '-105.6411566922825,40.26642751482452,0 -105.6424707115566,40.26600581412304,0 -105.6428010853679,40.26549238687588,0 -105.6423465680717,40.26464873270425,0 -105.6414735029203,40.2645201246226,0 -105.6404885591011,40.2647647504581,0 -105.6402035173736,40.26539046743765,0 -105.6405618656529,40.26617884849238,0 -105.6411566922825,40.26642751482452,0 ' '</coordinates>' '</LinearRing>' '</outerBoundaryIs>' '</Polygon>' '</Placemark>' '</Document>' '</kml>') doc = fromstring(test_kml, schema=Schema("ogckml22.xsd")) set_max_decimal_places( doc, max_decimals={ 'longitude': 6, 'latitude': 5, 'altitude': 2, 'heading': 1, 'tilt': 0, #'range': 0, # range values will not be changed }) longitude_list = doc.findall( ".//{http://www.opengis.net/kml/2.2}longitude") self.assertAlmostEquals(longitude_list[0], -105.638133) latitude_list = doc.findall( ".//{http://www.opengis.net/kml/2.2}latitude") self.assertAlmostEquals(latitude_list[0], 40.25542) altitude_list = doc.findall( ".//{http://www.opengis.net/kml/2.2}altitude") self.assertAlmostEquals(altitude_list[0], 0.12) heading_list = doc.findall( ".//{http://www.opengis.net/kml/2.2}heading") self.assertAlmostEquals(heading_list[0], -75.3) tilt_list = doc.findall(".//{http://www.opengis.net/kml/2.2}tilt") self.assertAlmostEquals(tilt_list[0], 23.0) # Note that the range value was not changed range_list = doc.findall(".//{http://www.opengis.net/kml/2.2}range") self.assertAlmostEquals(range_list[0], 234.1234567890) coords_list = doc.findall( ".//{http://www.opengis.net/kml/2.2}coordinates") self.assertEquals(coords_list[0], "-105.638133,40.25542,3826.12") self.assertEquals( coords_list[1], '-105.64009,40.25778,0.0 ' '-105.639708,40.25681,0.0 ' '-105.638919,40.25607,0.0 ' '-105.638534,40.2556,0.0') #import ipdb; ipdb.set_trace() self.assertEquals( coords_list[2], '-105.641157,40.26643,0.0 ' '-105.642471,40.26601,0.0 ' '-105.642801,40.26549,0.0 ' '-105.642347,40.26465,0.0 ' '-105.641474,40.26452,0.0 ' '-105.640489,40.26476,0.0 ' '-105.640204,40.26539,0.0 ' '-105.640562,40.26618,0.0 ' '-105.641157,40.26643,0.0')