Пример #1
0
 def test_fromstring_kml_document(self):
     "Tests the parsing of an valid KML string"
     test_kml = '<kml xmlns="http://www.opengis.net/kml/2.2"/>'
     tree = fromstring(test_kml, schema=Schema("ogckml22.xsd"))
     self.assertEquals(etree.tostring(tree), test_kml)
     tree = fromstring(test_kml)
     self.assertEquals(etree.tostring(tree), test_kml)
Пример #2
0
def load_sat_from_net():
    """
    Program to load the satllite track prediction from the internet
    Checks at the avdc website
    """
    from datetime import datetime, timedelta
    from urllib2 import urlopen
    from pykml import parser
    today = datetime.now().strftime('%Y%m%d')
    site = 'http://avdc.gsfc.nasa.gov/download_2.php?site=98675770&id=25&go=download&path=%2FSubsatellite%2Fkml&file=A-Train_subsatellite_prediction_' + today + 'T000000Z.kml'
    print 'Satellite tracks url: %s' % site
    try:
        response = urlopen(site)
        print 'Getting the kml prediction file from avdc.gsfc.nasa.gov'
        r = response.read()
        kml = parser.fromstring(r)
    except:
        print 'Problem with day, trying previous day...'
        try:
            yesterday = (datetime.now() - timedelta(days=1)).strftime('%Y%m%d')
            site = 'http://avdc.gsfc.nasa.gov/download_2.php?site=98675770&id=25&go=download&path=%2FSubsatellite%2Fkml&file=A-Train_subsatellite_prediction_' + yesterday + 'T000000Z.kml'
            response = urlopen(site)
            print 'Getting the kml prediction file from avdc.gsfc.nasa.gov'
            r = response.read()
            kml = parser.fromstring(r)
        except:
            import tkMessageBox
            tkMessageBox.showerror(
                'No sat',
                'There was an error communicating with avdc.gsfc.nasa.gov')
            return None
    print 'Kml file read...'
    return kml
Пример #3
0
def load_sat_from_net():
    """
    Program to load the satllite track prediction from the internet
    Checks at the avdc website
    """
    from datetime import datetime,timedelta
    from urllib2 import urlopen
    from pykml import parser
    today = datetime.now().strftime('%Y%m%d')
    site = 'http://avdc.gsfc.nasa.gov/download_2.php?site=98675770&id=25&go=download&path=%2FSubsatellite%2Fkml&file=A-Train_subsatellite_prediction_'+today+'T000000Z.kml'
    print 'Satellite tracks url: %s' %site
    try:
        response = urlopen(site)
        print 'Getting the kml prediction file from avdc.gsfc.nasa.gov'
        r = response.read()
        kml = parser.fromstring(r)
    except:
        print 'Problem with day, trying previous day...'
        try:
            yesterday = (datetime.now()-timedelta(days=1)).strftime('%Y%m%d')
            site = 'http://avdc.gsfc.nasa.gov/download_2.php?site=98675770&id=25&go=download&path=%2FSubsatellite%2Fkml&file=A-Train_subsatellite_prediction_'+yesterday+'T000000Z.kml'
            response = urlopen(site)
            print 'Getting the kml prediction file from avdc.gsfc.nasa.gov'
            r = response.read()
            kml = parser.fromstring(r)
        except:
            import tkMessageBox
            tkMessageBox.showerror('No sat','There was an error communicating with avdc.gsfc.nasa.gov')
            return None
    print 'Kml file read...'
    return kml
Пример #4
0
 def test_fromstring_kml_document(self):
     "Tests the parsing of an valid KML string"
     test_kml = '<kml xmlns="http://www.opengis.net/kml/2.2"/>'
     tree = fromstring(test_kml, schema=Schema("ogckml22.xsd"))
     self.assertEquals(etree.tostring(tree), test_kml)
     tree = fromstring(test_kml)
     self.assertEquals(etree.tostring(tree), test_kml)
Пример #5
0
 def test_fromstring_kml_document(self):
     """Tests the parsing of an valid KML string"""
     test_kml = b'<kml xmlns="http://www.opengis.net/kml/2.2"/>'
     tree = fromstring(test_kml, schema=Schema('ogckml22.xsd'))
     self.assertEqual(etree.tostring(tree, encoding='ascii'), test_kml)
     tree = fromstring(test_kml)
     self.assertEqual(etree.tostring(tree, encoding='ascii'), test_kml)
Пример #6
0
def parse_london_metro(basepath):
    with open(basepath + 'stations.kml', 'rb') as x:
        xml = etree.parse(x)
    k = parser.fromstring(etree.tostring(xml))
    places = (k.findall('.//{http://www.opengis.net/kml/2.2}Placemark'))

    stations = []
    count = 0
    for p in places:
        station = {'mode': 'metro'}
        station['city'] = 'London'
        station['name'] = p.name.text.strip()

        coords = [
            float(c.strip()) for c in p.Point.coordinates.text.split(',')
        ]

        # London inserts a trailing 0 coordinate too? Why!?
        coords.pop()

        loc = {'type': 'Point'}
        loc['coordinates'] = coords
        station['loc'] = loc

        stations.append(station)

    return stations
Пример #7
0
def parse_madrid_metro(basepath):
    files = ['Metro.kml', 'MetroLigero.kml']
    places = []
    for f in files:
        with open(basepath + f, 'rb') as x:
            xml = etree.parse(x)
        k = parser.fromstring(etree.tostring(xml))
        places.extend(
            k.findall('.//{http://www.opengis.net/kml/2.2}Placemark'))

    stations = []
    count = 0
    for p in places:
        station = {'mode': 'metro'}
        station['city'] = 'Madrid'
        station['name'] = p.name.text

        coords = [
            float(c.strip()) for c in p.Point.coordinates.text.split(',')
        ]

        loc = {'type': 'Point'}
        loc['coordinates'] = coords
        station['loc'] = loc

        stations.append(station)

    return stations
Пример #8
0
def parse(input_file):
    with input_file.open("r") as f:
        contents = f.read().encode("UTF-8")
        root = parser.fromstring(contents)

    locations = []
    for folder in root.Document.Folder:
        for place in folder.Placemark:
            location = {"_folder_name": folder.name.text}
            for item in place.getchildren():
                key = etree.QName(item).localname
                if key in element_parsers:
                    location[key] = element_parsers[key](item)
                else:
                    # if key starts with an uppercase letter, there's probably
                    # a element to be parsed more that just '.text'
                    if key[0].isupper():
                        logger.warn(
                            f"WARNING: {key} should probably have a parser")
                    location[key] = item.text
            if "description" in location:
                location["description"] = [
                    x.strip() for x in location["description"].split("<br>")
                ]
            locations.append(location)

    return locations
Пример #9
0
def get_sonde():
    sonde_data = {}
    sonde_data["valid"] = False
    sonde_data["lat"] = "0.00000"
    sonde_data["lon"] = "0.00000"
    sonde_data["alt"] = "00000"
    sonde_data["id"] = "Unknown"
    sonde_data["temp"] = "0.0"
    sonde_data["freq"] = "XX.XXMHz"
    sm_f = urllib2.urlopen(sm_url)
    sm_data = sm_f.read()
    if len(sm_data) == 0:
        print "No data from SM."
    else:
        try:
            root = parser.fromstring(sm_data)
            if (root.Document.Placemark[0].description == "Sonde"):
                # We have something...
                sm_name = str(root.Document.Placemark[0].name).split(" ")
                sm_coords = str(
                    root.Document.Placemark[0].Point.coordinates).split(",")
                sonde_data["freq"] = sm_name[2][1:-1]
                sonde_data["lon"] = sm_coords[0]
                sonde_data["lat"] = sm_coords[1]
                sonde_data["alt"] = sm_coords[2]
                sonde_data["id"] = sm_name[1]
                sonde_data["temp"] = sm_name[-1]  # Last field is temp.
                sonde_data["valid"] = True
                return sonde_data
            else:
                print "Fail"
        except:
            print "Something didn't parse right"
            return sonde_data
Пример #10
0
    def __init__(self, isc_coords_file, fdsn_inventory, our_picks,
                 event_folder, output_path):

        self.event_folder = event_folder
        self.output_path = output_path
        self.comm = MPI.COMM_WORLD
        self.nproc = self.comm.Get_size()
        self.rank = self.comm.Get_rank()
        self.counter = 0

        self.isc_coords_file = isc_coords_file
        k = parser.fromstring(open(self.isc_coords_file).read())

        ns = k.nsmap.values()[0]
        elist = k.findall('.//{%s}Placemark' % (ns))
        self.isc_coords_dict = defaultdict(list)

        for e in elist:
            self.isc_coords_dict[e['name']] = map(float, (str(
                e['Point']['coordinates'])).split(','))
        # end for

        # retrieve list of all event xml files
        self.event_folder = event_folder

        # retrieve list of all csv files
        self.csv_files = sorted(recursive_glob(self.event_folder, '*.csv'))

        self.fdsn_inventory = fdsn_inventory
        self.our_picks = our_picks
        self._load_events()
Пример #11
0
    def kmlBigFileRead(self):
        # # 初始化生成shape文件的类
        # self.newMap = CreateMapFeature(self.outputPath)

        # 获取kml文件的 声明前缀
        self.kmlPrefix = self.getKmlPrefix()

        # 获取kml文件中的表头
        self.kmlTableTitle = self.getTableTitle()

        # 循环读取 kml文件 每次读取 self.readBlockSize 大小
        while not self.isEnd:
            xmlTag = self.kmlFileBlockRead(self.readBlockSize,
                                           self.startPostion, '</Placemark>')
            self.startPostion = xmlTag['offset']
            self.isEnd = xmlTag['isEnd']
            xmlTagStr = self.tagComplement(
                xmlTag['content']).encode(encoding='utf-8')
            kmlTag = parser.fromstring(xmlTagStr)
            placemarkTags = kmlTag.findall(
                './/{http://www.opengis.net/kml/2.2}Placemark')
            featureDatas = self.getTab(placemarkTags)

            # 生成 shape文件 字段名及类型  # 如: (("index", (4, 254)), ("name", (4, 254)), ("lon", 2), ("lat", 2))
            fieldList = [(title[:8], (4, 254)) for title in self.kmlTableTitle]

            # 添加到shape文件
            self.addFeatureToFile(fieldList, featureDatas)
Пример #12
0
    def getTableTitle(self):
        """
        :param placemarks: 为 placemarks 标签的列表
        :return: [属性  point坐标 polygon坐标列表] 的 列表
        """

        # 读取文件 的第一个 <Placemark> 标签的内容
        placemark = self.kmlFileBlockRead(32,
                                          startPost=0,
                                          tagStr='</Placemark>')

        # 检查 kml文件是否完整
        kmlStr = self.tagComplement(
            placemark['content']).encode(encoding='utf-8')

        # 将kml字符串生成 kml 对象
        kml = parser.fromstring(kmlStr)
        placemarkTag = kml.findall(
            './/{http://www.opengis.net/kml/2.2}Placemark')[0]

        # 查找key的正则表达式
        keyReStr = r'class="atr-name">(.+?)</span>'

        attribStr = placemarkTag.description.text
        # keysReObj = re.finditer(keyReStr, attribStr)
        keyReObj = re.finditer(keyReStr, attribStr)
        keyList = []
        for keys in keyReObj:
            key = keys.group().replace('class="atr-name">',
                                       '').replace('</span>', '')
            keyList.append(key)

        # 保存 表头
        # self.kmlTableTitle = list(keyList)
        return list(keyList)
Пример #13
0
def parse_valencia_bus(basepath):
    with open(basepath + 'Emt_paradas.KML', 'rb') as f:
        xml = etree.parse(f)

    k = parser.fromstring(etree.tostring(xml))
    places = k.findall('.//{http://www.opengis.net/kml/2.2}Placemark')

    stations = []
    count = 0
    for p in places:
        station = { 'mode': 'bus' }
        station['city'] = 'Valencia'

        data = p.findall('.//{http://www.opengis.net/kml/2.2}Data')
        for d in data:
            if d.attrib['name'] == 'numportal':
                station['name'] = str(d.value)

        coords = [float(c.strip()) for c in p.Point.coordinates.text.split(',')]

        loc = { 'type' : 'Point' }
        loc['coordinates'] = coords
        station['loc'] = loc

        stations.append(station)

    return stations
Пример #14
0
def getCountryNodes(Placemarks, hostname):
    """ extrahiert für in der Karte verwendete Länder die Country-Placemarks (Polygone) aus countryKMLPath aus, passt sie an und liefert sie als Liste zurück """
    countryNames = countrySet(Placemarks)

    fileobj = open(countryKMLPath, "r")
    countryText = fileobj.read()
    fileobj.close()
    del fileobj

    countryNodeList = []

    countryRoot = parser.fromstring(countryText)
    countryPlacemarks = countryRoot.Document.findall(
        "{http://www.opengis.net/kml/2.2}Placemark")

    for countryPlacemark in countryPlacemarks:
        if countryPlacemark.name.text in countryNames:
            point = countryPlacemark.MultiGeometry.find(
                "{http://www.opengis.net/kml/2.2}Point")
            countryPlacemark.MultiGeometry.remove(point)
            newStyleUrl = KML.styleUrl(hostname + "/UserMap/" + "styles.kml" +
                                       "#country")
            countryPlacemark.append(newStyleUrl)
            typeNode = KML.type("country")
            countryPlacemark.append(typeNode)

            countryNodeList.append(countryPlacemark)

    return countryNodeList
Пример #15
0
def parse_madrid_metro(basepath):
    files = ['Metro.kml', 'MetroLigero.kml']
    places = []
    for f in files:
        with open(basepath + f, 'rb') as x:
            xml = etree.parse(x)
        k = parser.fromstring(etree.tostring(xml))
        places.extend(k.findall('.//{http://www.opengis.net/kml/2.2}Placemark'))

    stations = []
    count = 0
    for p in places:
        station = { 'mode' : 'metro' }
        station['city'] = 'Madrid'
        station['name'] = p.name.text

        coords = [float(c.strip()) for c in p.Point.coordinates.text.split(',')]

        loc = { 'type' : 'Point' }
        loc['coordinates'] = coords
        station['loc'] = loc

        stations.append(station)

    return stations
Пример #16
0
def stop_read(filename):

    kmz = ZipFile(filename, 'r')
    files = kmz.namelist()
    # there must be just one file

    kmltext = kmz.open(files[0], 'r').read().decode('iso-8859-1')
    kmltext = kmltext.replace(' encoding="UTF-8"', '')

    k = parser.fromstring(kmltext)

    compania = k.Document.Folder[0]
    compania_nombre = compania.name

    coche = compania.Folder[0]
    coche_nombre = coche.name

    puntos = recuperar_paradas(coche)


    resultado = {
        'compania': compania_nombre,
        'coche': coche_nombre,
        'puntos': puntos
    }

    return resultado
Пример #17
0
    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')
Пример #18
0
def parse_bcn_metro(basepath):
    files = ['TMB_EST.kml', 'TRAM_EST.kml']
    places = []
    for f in files:
        with open(basepath + f, 'rb') as x:
            xml = etree.parse(x)
        k = parser.fromstring(etree.tostring(xml))
        places.extend(k.findall('.//{http://www.opengis.net/kml/2.2}Placemark'))

    stations = []
    count = 0
    for p in places:
        station = { 'mode' : 'metro' }
        station['city'] = 'Barcelona'
        station['name'] = p.name.text

        coords = [float(c.strip()) for c in p.Point.coordinates.text.split(',')]

        # BCN inserts a trailing 0 coordinate? Why!?
        coords.pop()

        loc = { 'type' : 'Point' }
        loc['coordinates'] = coords
        station['loc'] = loc

        stations.append(station)

    return stations
Пример #19
0
    def convertFolder(self, inputPath, outputName, outputDir):
        kmzPaths = self.getKMZs(inputPath)
        colors = self.getColors()
        root = KML.kml(KML.Document())
        folders = []
        for index, kmzPath in enumerate(kmzPaths):
            folder = KML.Folder()

            folder.append(KML.name(os.path.basename(kmzPath)))
            color = colors[index % len(colors)]
            folder.append(self.getStyle(color))
            kml_str = self.getKmlStrFromPath(os.path.join(inputPath, kmzPath))
            if kml_str is None:
                return
            root = parser.fromstring(kml_str)
            for style in root.Document.Style:
                root.Document.remove(style)
            for placemark in root.Document.Placemark:
                placemark.Point.altitudeMode = 'absolute'
                lon, lat, alt = str(placemark.Point.coordinates).split(',')
                placemark.styleUrl = "#{}".format(color)
                folder.append(placemark)
            folders.append(folder)
        root.Document.remove(root.Document.name)
        root.Document.append(KML.name(outputName))
        for folder in folders:
            root.Document.append(folder)
        outputPath = os.path.join(outputDir, outputName + ".kmz")
        kml_str = '<?xml version="1.0" encoding="UTF-8"?>\n'
        kml_str += etree.tostring(root, pretty_print=True).decode('UTF-8')
        with ZipFile(outputPath, 'w') as zip:
            zip.writestr('doc.kml', kml_str)
Пример #20
0
def retrieve_sites_info_waverider_kml(kml_url=WAVERIDER_KML_URL):
    """
    downloads a kml from dept_of_transport WA. retrieve information to create a dictionary of site info(lat, lon, data url ...
    :param kml_url: string url kml to parse
    :return: dictionary
    """
    logger.info('Parsing {url}'.format(url=kml_url))
    try:
        fileobject = requests.get(kml_url).content
    except:
        logger.error('{url} not reachable. Retry'.format(url=kml_url))
        raise requests.ConnectionError

    root = kml_parser.fromstring(fileobject)

    # this kml has two 'sub-folders'. One for current, one for historical data.
    current_data = root.Document.Folder[0]
    historic_data = root.Document.Folder[1]

    current_site_info = placemark_info_folder(current_data)
    historic_site_info = placemark_info_folder(historic_data)

    # merging dicts
    sites_info = current_site_info.copy()
    sites_info.update(historic_site_info)

    return sites_info
Пример #21
0
def stop_read(filename):

    kmz = ZipFile(filename, 'r')
    files = kmz.namelist()
    # there must be just one file

    kmltext = kmz.open(files[0], 'r').read().decode('iso-8859-1')
    kmltext = kmltext.replace(' encoding="UTF-8"', '')

    k = parser.fromstring(kmltext)

    compania = k.Document.Folder[0]
    compania_nombre = compania.name

    coche = compania.Folder[0]
    coche_nombre = coche.name

    puntos = recuperar_paradas(coche)

    resultado = {
        'compania': compania_nombre,
        'coche': coche_nombre,
        'puntos': puntos
    }

    return resultado
Пример #22
0
def parse_london_metro(basepath):
    with open(basepath + 'stations.kml', 'rb') as x:
        xml = etree.parse(x)
    k = parser.fromstring(etree.tostring(xml))
    places = (k.findall('.//{http://www.opengis.net/kml/2.2}Placemark'))

    stations = []
    count = 0
    for p in places:
        station = { 'mode' : 'metro' }
        station['city'] = 'London'
        station['name'] = p.name.text.strip()

        coords = [float(c.strip()) for c in p.Point.coordinates.text.split(',')]

        # London inserts a trailing 0 coordinate too? Why!?
        coords.pop()

        loc = { 'type' : 'Point' }
        loc['coordinates'] = coords
        station['loc'] = loc

        stations.append(station)

    return stations
Пример #23
0
def parse_bcn_train(basepath):
    files = ['FGC_EST.kml', 'RENFE_EST.kml']
    places = []
    for f in files:
        with open(basepath + f, 'rb') as x:
            xml = etree.parse(x)
        k = parser.fromstring(etree.tostring(xml))
        places.extend(k.findall('.//{http://www.opengis.net/kml/2.2}Placemark'))

    stations = []
    count = 0
    for p in places:
        station = { 'mode' : 'train' }
        station['city'] = 'Barcelona'
        station['name'] = p.name.text

        coords = [float(c.strip()) for c in p.Point.coordinates.text.split(',')]

        # BCN inserts a trailing 0 coordinate? Why!?
        coords.pop()

        loc = { 'type' : 'Point' }
        loc['coordinates'] = coords
        station['loc'] = loc

        stations.append(station)

    return stations
Пример #24
0
def extract_tracks(f):
    from pykml import parser

    root = parser.fromstring(f.read())
    tracks = find_tracks(root.Document.Placemark)

    return tracks
Пример #25
0
 def loadKML( self, fileName ):
     """
     return a pykml object that is saved in the kml file fileName
     """
     with open( fileName, 'rb' ) as f:
         kml_str = f.read()
     return parser.fromstring( kml_str )
    def load_grid_from_file(self, kml_file):
        """ parse kml file and add grid to grid_cache """

        file = open(kml_file, "r")
        data = str.encode(file.read())

        root = parser.fromstring(data)
        pms = root.Document.Folder.Placemark

        for pm in pms:
            id = str(pm.ExtendedData.SchemaData.SimpleData[0])
            print(id)

            coords = None

            try:
                coords = pm.MultiGeometry.Polygon.outerBoundaryIs.LinearRing.coordinates
            except:
                try:
                    coords = pm.Polygon.outerBoundaryIs.LinearRing.coordinates
                except:
                    raise

            self.grid_cache[id] = Grid(id, parse_coords(str(coords)))

        print(len(self.grid_cache.keys()))
Пример #27
0
def import_cord():
    file = parser.fromstring(open('C:\\Users\\Prathvi\\Desktop\\prj\\repo\\prathvi\\output_pics\\85.kml', 'r').read())
    cords = [[0.0 for x in range(num)] for y in range(cor)] # create empty 4*3 matrix
    for x in range(cor):
	    for y in range(num):
		    cords[x][y]=float(str(file.Document.Placemark.Point[x].coordinates).split(',')[y]);
    return cords
Пример #28
0
def retrieve_sites_info_awac_kml(kml_url=AWAC_KML_URL):
    """
    downloads a kml from dept_of_transport WA. retrieve informations to create a dictionary of site info(lat, lon, data url ...
    :param kml_url: string url kml to parse
    :return: dictionary
    """

    logger.info('Parsing {url}'.format(url=kml_url))
    try:
        fileobject = requests.get(kml_url).content
    except:
        logger.error('{url} not reachable. Retry'.format(url=kml_url))
        raise requests.ConnectionError

    root = kml_parser.fromstring(fileobject)
    doc = root.Document.Folder

    sites_info = dict()
    for pm in doc.Placemark:

        coordinates = pm.Point.coordinates.pyval
        latitude = float(coordinates.split(',')[1])
        longitude = float(coordinates.split(',')[0])
        water_depth = float(coordinates.split(',')[2])

        description = pm.description.text

        snippet = pm.snippet.pyval
        time_start = snippet.split(' - ')[0]
        time_end = snippet.split(' - ')[1]
        time_start = datetime.datetime.strptime(time_start, '%Y-%m-%d')
        time_end = datetime.datetime.strptime(time_end, '%Y-%m-%d')

        name = pm.name.text
        soup = BeautifulSoup(description)
        text_zip_url = soup.findAll('a',
                                    attrs={
                                        'href':
                                        re.compile("^http(s|)://.*_Text.zip")
                                    })[0].attrMap['href']

        m = re.search('<b>AWAC LOCATION ID:</b>(.*)<br>', description)
        site_code = m.group(1).lstrip()
        logger.info('{site} available for download'.format(site=site_code))
        site_info = {
            'site_name': name,
            'lat_lon': [latitude, longitude],
            'timezone': 8,
            'latitude': latitude,
            'longitude': longitude,
            'water_depth': water_depth,
            'time_start': time_start,
            'time_end': time_end,
            'text_zip_url': text_zip_url,
            'site_code': site_code
        }
        sites_info[site_code] = site_info

    return sites_info
Пример #29
0
def parseKml(kmlFilePath):
    """ liest *.kml-Datei aus und liefert geparsten KML-tree zurück """
    fileobj = open(kmlFilePath + ".kml", "r")
    KMLText = fileobj.read()
    fileobj.close()
    del fileobj

    return parser.fromstring(KMLText)
Пример #30
0
def load_kml_string(kml_string, schema_type = "kml22gx.xsd"):
    schema_gx = Schema(schema_type)
    doc = parser.fromstring(kml_string, schema_gx)
    
    if (schema_gx.validate(doc)):
        return doc
    else:
        print "Invalid kml format for string passed in"
        return None
Пример #31
0
def load_sat_from_file(filename):
    """
    Program to load the satellite track prediction from a saved file
    """
    from pykml import parser
    f = open(filename, 'r')
    r = f.read()
    kml = parser.fromstring(r)
    return kml
Пример #32
0
    def _lines_from_kml(self, tracks_file):
        lines = []

        contents = tracks_file.tracks_file.read().split["\n"]
        for content in contents:
            root = parser.fromstring(content)
            lines = self._load_kml_str(root)

        return lines
Пример #33
0
def _kml2polygon(kml_file):
    polystring = parser.fromstring(
        kml_file
    ).Document.Placemark.MultiGeometry.Polygon.outerBoundaryIs.LinearRing.coordinates.text
    #polystring.split(" ")
    polygon = Polygon(
        np.array([p.split(",")
                  for p in polystring.split(" ")])[:, :2].astype(float))
    return polygon
Пример #34
0
def load_sat_from_file(filename):
    """
    Program to load the satellite track prediction from a saved file
    """
    from pykml import parser
    f = open(filename,'r')
    r = f.read()
    kml = parser.fromstring(r)
    return kml
 def download_and_parse_data(self):
     """
     Downloads the data using the get_no_fly_zones class and then parses it usign the general method
     Input: none
     Output: bool from parsing
     """
     downloader_module = get_no_fly_zones(self.debug)
     downloader_module.download_zones()
     file = parser.fromstring(downloader_module.get_data())
     return self.parse_data(file)
Пример #36
0
    def openKML(self,kmlfile):
        if os.path.splitext(kmlfile)[1]=='.kmz':
            kmlfile     =zipfile.ZipFile(kmlfile)
            kmlfilename =kmlfile.namelist()[0]
            coordfile   =kmlfile.read(kmlfilename)
        else:
            coordfile   =open(kmlfile).read()

        self.kmlfile    =coordfile
        self.doc        =parser.fromstring(coordfile)
Пример #37
0
    def openKML(self, kmlfile):
        if os.path.splitext(kmlfile)[1] == '.kmz':
            kmlfile = zipfile.ZipFile(kmlfile)
            kmlfilename = kmlfile.namelist()[0]
            coordfile = kmlfile.read(kmlfilename)
        else:
            coordfile = open(kmlfile).read()

        self.kmlfile = coordfile
        self.doc = parser.fromstring(coordfile)
Пример #38
0
def import_cord(file_name):
    file = parser.fromstring(open(file_name, 'r').read())
    cords = [[0.0 for x in range(num)]
             for y in range(cor)]  # create empty 4*3 matrix
    for x in range(cor):
        for y in range(num):
            cords[x][y] = float(
                str(file.Document.Placemark.Point[x].coordinates).split(',')
                [y])
    return cords
Пример #39
0
 def test_fromstring_invalid_kml_document(self):
     "Tests the parsing of an invalid KML string"
     test_kml = '<bad_element />'
     try:
         tree = fromstring(test_kml, schema=Schema("ogckml22.xsd"))
         self.assertTrue(False)
     except etree.XMLSyntaxError:
         self.assertTrue(True)
     except:
         self.assertTrue(False)
Пример #40
0
 def test_fromstring_invalid_kml_document(self):
     "Tests the parsing of an invalid KML string"
     test_kml = '<bad_element />'
     try:
         tree = fromstring(test_kml, schema=Schema("ogckml22.xsd"))
         self.assertTrue(False)
     except etree.XMLSyntaxError:
         self.assertTrue(True)
     except:
         self.assertTrue(False)
Пример #41
0
def __get_all_coords(data):
        doc = parser.fromstring(data) 
        coords = {}     
        for folder in doc.Document.getchildren():
            try:
               	dataPoints = folder.Placemark.LineString.coordinates.text.split(" ") 
                section_id = folder.Placemark.name.text
                coords[section_id] = [[float(i) for i in x.split(",")[:2]] for x in dataPoints]
            except (Exception):
                continue
        return coords
Пример #42
0
def __get_all_coords(data):
        doc = parser.fromstring(data) 
        coords = {}     
        for folder in doc.Document.getchildren():
            try:
               	dataPoints = folder.Placemark.LineString.coordinates.text.split(" ") 
                section_id = folder.Placemark.name.text
                coords[section_id] = [[float(i) for i in x.split(",")[:2]] for x in dataPoints]
            except (Exception):
                continue
        return coords
Пример #43
0
    def __init__(self, docFile, city_id, chk_delete, action_title):
        root = parser.fromstring(docFile)
        self.city_id = int(city_id)
        self.chk_delete = chk_delete
        self.folders = []
        self.action_title = action_title
        try:
            self.folders = root.Document.Folder
        except:
            self.folders = root.Folder.Document.Folder

        self.parent_model = get_model('master', action_title)
Пример #44
0
    def _lines_from_kmz(self, tracks_file):
        lines = []

        zf = zipfile.ZipFile(tracks_file.tracks_file)
        contents = []
        for info in zf.infolist():
            contents.append(zf.read(info.filename))

        for content in contents:
            root = parser.fromstring(content)
            lines = self._load_kml_str(root)
        return lines
Пример #45
0
def validate_kml(filepath, schema = "https://developers.google.com/kml/schema/kml21.xsd"):
        """
        Validates kml located at filepath.
        TODO: Even imported kml files do not validate against default xml
        """
        schema_gomaps = Schema(schema)
	data = ""
	with open(filepath, "r") as temp:
		data = temp.read()
	assert(data != "")
	doc = parser.fromstring(data)
        return schema_ogc.assertValid(doc)
Пример #46
0
 def __init__(self, docFile):
     self.root = parser.fromstring(docFile.read())
     self.components = []
     self.folders = None
     self.elements = {}
     self.data = {}
     self.city_id = 0
     self.parser_component = {
         "admin": self.parse_admin,
         "electoral": self.parse_electoral,
         "slum": self.parse_slum
     }
Пример #47
0
def retrieve_sites_info_awac_kml(kml_url=AWAC_KML_URL):
    """
    downloads a kml from dept_of_transport WA. retrieve informations to create a dictionary of site info(lat, lon, data url ...
    :param kml_url: string url kml to parse
    :return: dictionary
    """

    logger.info('Parsing {url}'.format(url=kml_url))
    try:
        fileobject = requests.get(kml_url).content
    except:
        logger.error('{url} not reachable. Retry'.format(url=kml_url))
        raise requests.ConnectionError

    root = kml_parser.fromstring(fileobject)
    doc = root.Document.Folder

    sites_info = dict()
    for pm in doc.Placemark:

        coordinates = pm.Point.coordinates.pyval
        latitude = float(coordinates.split(',')[1])
        longitude = float(coordinates.split(',')[0])
        water_depth = float(coordinates.split(',')[2])

        description = pm.description.text

        snippet = pm.snippet.pyval
        time_start = snippet.split(' - ')[0]
        time_end = snippet.split(' - ')[1]
        time_start = datetime.datetime.strptime(time_start, '%Y-%m-%d')
        time_end = datetime.datetime.strptime(time_end, '%Y-%m-%d')

        name = pm.name.text
        soup = BeautifulSoup(description)
        text_zip_url = soup.findAll('a', attrs={'href': re.compile("^http(s|)://.*_Text.zip")})[0].attrMap['href']

        m = re.search('<b>AWAC LOCATION ID:</b>(.*)<br>', description)
        site_code = m.group(1).lstrip()
        logger.info('{site} available for download'.format(site=site_code))
        site_info = {'site_name': name,
                     'lat_lon': [latitude, longitude],
                     'timezone': 8,
                     'latitude': latitude,
                     'longitude': longitude,
                     'water_depth': water_depth,
                     'time_start': time_start,
                     'time_end': time_end,
                     'text_zip_url': text_zip_url,
                     'site_code': site_code}
        sites_info[site_code] = site_info

    return sites_info
Пример #48
0
def handle_uploaded_kmlfile(filename,objectid):
    from pykml import parser
    from pykml.util import to_wkt_list
    
    # check if the file is too large
    if filename.size >= filename.DEFAULT_CHUNK_SIZE:
        raise IOError
    # parse the incoming file
    doc = parser.fromstring(filename.read())
    # look for geometries
    wkt_list = [{'geom':wkt} for wkt in to_wkt_list(doc)]
    
    return(wkt_list)
Пример #49
0
def load_route():
    try:
        data = json.loads(request.data)
        url = data['url']
    except Exception as e:
        logging.error(0)
        abort(400)

    obj = urllib2.urlopen(url)
    str = obj.read()
    kml_str = ""
    for line in iter(str.splitlines()):
        if not 'atom:link' in line:
            kml_str += line
            kml_str += '\n'

    Point.objects(type='route').delete()

    root = parser.fromstring(kml_str)

    pointid = 1000
    for placemark in root.Document.Folder.Placemark:
        coordinates = placemark.MultiGeometry.Point.coordinates.text.split(',')
        try:
            point = Point(
                title=placemark.name.text,
                type='route',
                latitude=float(coordinates[1]),
                longitude=float(coordinates[0]),
                pointid=pointid,
                timestamp=datetime.now()
            )
        except TypeError:
            abort(500)
        except Exception as e:
            logging.error(0)
            abort(500)
        try:
            point.save()
        except TypeError:
            abort(400)
        except BadRequest as e:
            logging.error(e)
            abort(400)
        except Exception as e:
            logging.error(e)
            abort(500)

        pointid += 1

    return Response(json.dumps({'status': 'ok'}), status=200, mimetype='application/json')
Пример #50
0
def parse_map_user(user):

    kml = os.path.join(os.getcwd(), 'data.kml')
    with open(kml) as f:
        doc = parser.fromstring(f.read())
        coords = doc.Document.Folder.Placemark.LineString.coordinates[0].text.strip().split()
        points = [(x.split(',')[0], x.split(',')[1]) for x in coords]

    for p in points:
        d = Data(0, 0, 0, p[1], p[0], datetime.now(), user)
        db.session.add(d)


    db.session.commit()
Пример #51
0
def kml_to_geoJSON():
	"""Converts all kml files to geoJSON formated json files"""
	folders = os.listdir('data/' + my.DATA_FOLDER + '/kml/')
	if '.DS_Store' in folders:
		folders.remove('.DS_Store')
	#print folders
	for folder in folders:
		print '\n' + folder + '\n'
		path = 'data/' + my.DATA_FOLDER + 'kml/' + folder + '/'
		json_path = 'data/' + my.DATA_FOLDER + 'json/' + \
					folder.replace(' Division Gangs', '') + '/'
		if not os.path.exists(json_path):
			os.makedirs(json_path)

		files = os.listdir(path)
		if '.DS_Store' in files:
			files.remove('.DS_Store')
		files_ = []
		for file in files:
			file = file.split('.')
			files_.append(file[0])
		files_ = list(set(files_))
		#pprint(files_)

		for file in files_:
			kml = path + file + '.kml'
			json = json_path + file + '.json'
			#print json
			if 'Crips' in file or 'Bloods' in file:
				print file
			raw = open(kml, 'rb').read()
			root = parser.fromstring(raw)
			try:
				cord = root.Document.Folder.Placemark.Polygon.outerBoundaryIs.LinearRing.coordinates
			except:
				cord = root.Document.Folder.Placemark.MultiGeometry.Polygon.outerBoundaryIs.LinearRing.coordinates
			cord = str(cord)
			cord = cord.split(' ')
			pol = []
			for ll in cord:
				ll = ll.split(',')
				lng = float(ll[0])
				lat = float(ll[1])
				pol.append([lat, lng])
			geo = {
				"type"			: "Polygon",
				"coordinates"	:	[pol]
				}
			open(json, 'wb').write(anyjson.dumps(geo))
Пример #52
0
def load_route():
    try:
        data = json.loads(request.data)
        url = data['url']
    except Exception as e:
        logging.error(e.args[0])
        abort(400)

    obj = urllib2.urlopen(url)
    str = obj.read()
    kml_str = ""
    for line in iter(str.splitlines()):
        if not 'atom:link' in line:
            kml_str+=line
            kml_str+='\n'

    Point.delete_all('route')

    root = parser.fromstring(kml_str)

    pointid = 1000
    for placemark in root.Document.Folder.Placemark:
        coordinates = placemark.MultiGeometry.Point.coordinates.text.split(',')
        try:
            point = Point(
                title = placemark.name.text,
                type = 'route',
                latitude = float(coordinates[1]),
                longitude = float(coordinates[0]),
                pointid = pointid,
                timestamp = datetime.now()
            )
        except TypeError:
            abort(500)
        except Exception as e:
            logging.error(e.args[0])
            abort(500)
        try:
            point.put()
        except CapabilityDisabledError:
            logging.error(u'App Engine Datastore is currently in read-only mode.')
            abort(500)
        except Exception as e:
            logging.error(e.args[0])
            abort(500)

        pointid += 1

    return list_point('route')
Пример #53
0
    def get_geometry_in_kml(self, full=True, placemark=False):
        geometry = self.geometry
        if geometry:
            if full:
                line_color, geometry_color = convert_color_hex_to_kml(self.color)
                id = 'geo_object_%s' % self.id
                kml = KML.kml(KML.Document(
                    KML.Style(
                        KML.PolyStyle(KML.color(geometry_color)),
                        KML.LineStyle(KML.color(line_color), KML.width(2)),
                        id=id
                    ),
                    KML.Placemark(KML.name(self.title),  KML.styleUrl('#' + id), parser.fromstring(self.geometry.kml))
                ))
                geometry = etree.tostring(kml, pretty_print=True)

            elif placemark:
                kml = KML.Placemark(KML.name(self.title), parser.fromstring(self.geometry.kml))
                geometry = etree.tostring(kml, pretty_print=True)

            else:
                geometry = self.geometry.kml

        return geometry
Пример #54
0
def get_kml_by_title(request):
    if request.GET or request.is_ajax():
        query = request.GET['title']
        result = nominatim.geocode(query=query, geometry='kml')
        polygon = result.raw['geokml'] if result else None
        if polygon:
            polygon = result.raw['geokml']
            kml = KML.kml(KML.Document(KML.Placemark(KML.name(query), parser.fromstring(polygon))))
            polygon = etree.tostring(kml)
            response = get_file_response(polygon, query)
        else:
            response = HttpResponseBadRequest('Not found')
    else:
        response = HttpResponseBadRequest('Request is not GET')

    return response
Пример #55
0
    def route_from_file(self, filepath, max_vertices=100):
        contents = []
        if filepath.endswith(".kmz"):
            contents = self._load_kmz_content(filepath)
        if filepath.endswith(".kml"):
            contents = self._load_kml_content(filepath)

        geo_line = []
        for content in contents:
            root = parser.fromstring(content)
            line_tuples = self._load_kml_str(root)
            nth_vertex = max(1, int(len(line_tuples) / max_vertices))
            for (lat, lng, alt) in line_tuples[0::nth_vertex]:
                geo_line.append((lat, lng))
        line = LineString(geo_line)
        lines = MultiLineString([line])
        name = filepath.split("/")[-1].split(".")[0]
        return self.create(lines=lines, name=name)
Пример #56
0
 def assertKmlValid(self, response):
     self.assertEqual(response.status_code, 200)
     self.assert_(response['Content-Type'].startswith('application/vnd.google-earth.kml+xml'))
     if 0 and pykml:
         # real validation against KML schema -- disabled for now because it seems to reject
         # some valid kml files.
         doc = kmlparser.fromstring(response.content)
         schema = kmlparser.Schema("kml22gx.xsd")
         try:
             schema.assertValid(doc)
         except lxml.etree.DocumentInvalid:
             fd, path = tempfile.mkstemp('-TestGeocamTrackViews.kml')
             with os.fdopen(fd, 'w') as f:
                 f.write(response.content)
             logging.warning('kml contents written to %s for debugging', path)
             raise
     else:
         # superficial check that it looks like KML
         self.assert_(response.content.startswith('<?xml'))
         self.assert_('<kml' in response.content)
         self.assert_('</kml>' in response.content)
Пример #57
0
def get_kml_for_queryset(queryset, filename=_('Geographical objects')):
    """
    :param queryset: GeoObject queryset
    :return: KML file from GeoObject queryset
    """
    kml = KML.kml(KML.Document(KML.open(1)))

    geo_objects = queryset.values_list('color', 'title', 'lat', 'lon', 'geometry', 'short_description')
    colors = set(items[0] for items in sorted(geo_objects))
    colors_dict = {color: convert_color_hex_to_kml(color) for color in colors}

    for line_color, polygon_color in colors_dict.values():
        kml.Document.append(KML.Style(
            KML.PolyStyle(KML.color(polygon_color)),
            KML.LineStyle(KML.color(line_color), KML.width(2)),
            id=line_color,
        ))
        print(line_color, polygon_color)

    for (color, title, lat, lon, polygon, short_description) in geo_objects:
            style_id = colors_dict[color][0]
            fld = KML.Folder(
                KML.name(title),
                KML.Placemark(
                    KML.name(title),
                    KML.styleUrl('#' + style_id),
                    KML.description(short_description),
                    KML.Point(KML.coordinates("{},{},0".format(lon, lat)))
                )
            )

            if polygon:
                polygon = parser.fromstring(polygon.kml)
                fld.append(KML.Placemark(KML.name(title), KML.styleUrl('#' + style_id),
                                         KML.description(short_description), polygon))

            kml.Document.append(fld)

    kml_str = '<?xml version="1.0" encoding="UTF-8"?>\n' + etree.tostring(kml, pretty_print=True).decode()
    return get_file_response(kml_str, filename)
Пример #58
0
 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'
     )
Пример #59
0
    def procesar_kml(self):
        tup_colectivo = self.env['tup.colectivo']
        tup_recorrido = self.env['tup.recorrido']
        for obj in self:
            archivo = base64.b64decode(obj.archivo_kml_zip)
            if archivo:
                file_like_object = io.BytesIO(archivo)
                zf = zipfile.ZipFile(file_like_object, 'a')                
                for filename in zf.namelist():
                    data = zf.read(filename)
                    try:
                        k = parser.fromstring(data)
                        recorrido = str(k.Document.Placemark.name)
                        if recorrido:
                            linea = recorrido.replace(" Ida", "").replace(" Vuelta", "")
                            if linea:
                                kml_data = base64.b64encode(data)

                                tup_col_id = tup_colectivo.search([('name','=', linea)])
                                if not tup_col_id:
                                    tup_col_id = tup_colectivo.create({'name':linea})

                                tup_rec_id = tup_recorrido.search([('name','=', linea)])
                                if not tup_rec_id:
                                    tup_rec_id = tup_recorrido.create({'name':linea, 'colectivo_id':tup_col_id.id})

                                tup_col_id.write({'recorrido_id':tup_rec_id.id})

                                if "Ida" in recorrido:
                                    tup_rec_id.write({'kml_ida':kml_data})
                                elif "Vuelta" in recorrido:
                                    tup_rec_id.write({'kml_vuelta':kml_data})
                    except Exception, e:
                        print e
                        print "No se pudo importar: ",filename
                        pass
                tup_colectivo.search([]).procesar_kml()
Пример #60
0
 def test_fromstring_invalid_kml_document(self):
     """Tests the parsing of an invalid KML string"""
     test_kml = b'<bad_element />'
     with self.assertRaises(etree.XMLSyntaxError):
         # tree =
         fromstring(test_kml, schema=Schema('ogckml22.xsd'))