| 526 | def parse_glider_goto_ma(lines, glider): |
---|
| 527 | data = [] |
---|
| 528 | m = re.search(r'\<start\:waypoints\>(.*)\<end\:waypoints\>', ''.join(lines), re.MULTILINE|re.S) |
---|
| 529 | latlonstr = m.group(1) |
---|
| 530 | latlons = re.split(r'\n', latlonstr) |
---|
| 531 | for ll in latlons: |
---|
| 532 | m = re.search(r'^\s*(-?\d{2})(\d{2}\.\d+)\s*(-?\d{2})(\d{2}\.\d+).*$', ll, re.MULTILINE) |
---|
| 533 | if m: |
---|
| 534 | # |
---|
| 535 | lat_deg = float(m.group(3)) |
---|
| 536 | lat_min = float(m.group(4)) |
---|
| 537 | # lat_hem = m.group(4).upper() |
---|
| 538 | # |
---|
| 539 | lon_deg = float(m.group(1)) |
---|
| 540 | lon_min = float(m.group(2)) |
---|
| 541 | # lon_hem = m.group(7).upper() |
---|
| 542 | if lat_deg<0: |
---|
| 543 | lat = lat_deg - lat_min/60. |
---|
| 544 | else: |
---|
| 545 | lat = lat_deg + lat_min/60. |
---|
| 546 | if lon_deg<0: |
---|
| 547 | lon = lon_deg - lon_min/60. |
---|
| 548 | else: |
---|
| 549 | lon = lon_deg + lon_min/60. |
---|
| 550 | else: |
---|
| 551 | lat = None |
---|
| 552 | lon = None |
---|
| 553 | if lat and lon: |
---|
| 554 | data.append({'glider': glider, |
---|
| 555 | 'name': '', |
---|
| 556 | 'description': '<div><code>'+ll+'</code></div>', |
---|
| 557 | 'lon': lon, |
---|
| 558 | 'lat': lat}) |
---|
| 559 | # close for-loop |
---|
| 560 | return data |
---|
| 561 | |
---|
| 562 | def generate_waypoint_kml(data, glider): |
---|
| 563 | """ |
---|
| 564 | Use pykml |
---|
| 565 | |
---|
| 566 | Usage: kml_doc_str = generate_waypoint_kml(data, glider) |
---|
| 567 | """ |
---|
| 568 | from pykml.factory import KML_ElementMaker as KML |
---|
| 569 | import lxml.etree |
---|
| 570 | |
---|
| 571 | doc = KML.kml( |
---|
| 572 | KML.Document( |
---|
| 573 | KML.Name(glider + "_waypoint"), |
---|
| 574 | KML.Style( |
---|
| 575 | KML.IconStyle( |
---|
| 576 | KML.scale(0.7), |
---|
| 577 | KML.color("ff00ff00"), |
---|
| 578 | KML.Icon(KML.href("icons/square.png")) |
---|
| 579 | ), |
---|
| 580 | KML.LabelStyle( |
---|
| 581 | KML.color("ff00ff00"), |
---|
| 582 | KML.scale(0.8)), |
---|
| 583 | id="lastPosnIcon") |
---|
| 584 | ) |
---|
| 585 | ) |
---|
| 586 | doc.Document.append( |
---|
| 587 | KML.Style( |
---|
| 588 | KML.IconStyle( |
---|
| 589 | KML.scale(0.7), |
---|
| 590 | KML.color("7dff00ff"), |
---|
| 591 | KML.Icon(KML.href("icons/square.png")) |
---|
| 592 | ), |
---|
| 593 | KML.LabelStyle( |
---|
| 594 | KML.scale(0.7) |
---|
| 595 | ), |
---|
| 596 | id="gotoPosnIcon") |
---|
| 597 | ) |
---|
| 598 | |
---|
| 599 | |
---|
| 600 | doc.Document.append( |
---|
| 601 | KML.Style( |
---|
| 602 | KML.LineStyle( |
---|
| 603 | KML.color("7dff0000"), |
---|
| 604 | KML.width(2) |
---|
| 605 | ), |
---|
| 606 | id="transBlueLine") |
---|
| 607 | ) |
---|
| 608 | doc.Document.append( |
---|
| 609 | KML.Style( |
---|
| 610 | KML.LineStyle( |
---|
| 611 | KML.color("7d00ff00"), |
---|
| 612 | KML.width(2) |
---|
| 613 | ), |
---|
| 614 | id="transGreenLine") |
---|
| 615 | ) |
---|
| 616 | |
---|
| 617 | if glider == 'ramses': |
---|
| 618 | linestyle = "#transBlueLine" |
---|
| 619 | elif glider == 'pelagia': |
---|
| 620 | linestyle = "#transGreenLine" |
---|
| 621 | else: |
---|
| 622 | linestyle = "" |
---|
| 623 | |
---|
| 624 | coord_str = "" |
---|
| 625 | for d in data: |
---|
| 626 | if d['lat'] and d['lon']: |
---|
| 627 | coord_str = coord_str + "%f,%f,%f\n" % (d['lon'], d['lat'], 0.) |
---|
| 628 | |
---|
| 629 | waypoint_line = KML.Placemark( |
---|
| 630 | KML.name(glider), |
---|
| 631 | KML.description(glider+' goto'), |
---|
| 632 | KML.styleUrl(linestyle), |
---|
| 633 | KML.LineString( |
---|
| 634 | KML.altitudeMode("absolute"), |
---|
| 635 | KML.coordinates(coord_str) |
---|
| 636 | ) |
---|
| 637 | ) |
---|
| 638 | # glider placemarks (pms) |
---|
| 639 | pms = [] |
---|
| 640 | for d in data[:-1]: |
---|
| 641 | pms.append( |
---|
| 642 | KML.Placemark( |
---|
| 643 | # short time stamp |
---|
| 644 | KML.description(d['description']), |
---|
| 645 | KML.styleUrl("#gotoPosnIcon"), |
---|
| 646 | KML.Point( |
---|
| 647 | KML.altitudeMode("absolute"), |
---|
| 648 | KML.coordinates("%f,%f,%f" % (d['lon'], d['lat'], 0.)) |
---|
| 649 | ) |
---|
| 650 | ) |
---|
| 651 | ) |
---|
| 652 | |
---|
| 653 | d = data[-1] |
---|
| 654 | wp_folder = KML.Folder( |
---|
| 655 | KML.name(d['glider']), |
---|
| 656 | waypoint_line, |
---|
| 657 | ) |
---|
| 658 | for pm in pms: |
---|
| 659 | wp_folder.append(pm) |
---|
| 660 | doc.Document.append( |
---|
| 661 | wp_folder |
---|
| 662 | ) |
---|
| 663 | track_kml = lxml.etree.tostring(doc, pretty_print=True) |
---|
| 664 | return track_kml |
---|
| 665 | |
---|