From 3df60c985f066e6f0bb04ad785312c4967331b66 Mon Sep 17 00:00:00 2001 From: Peter Date: Fri, 2 Oct 2020 12:34:52 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E8=BD=AC=E6=8D=A2.gpx?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E5=86=85=E5=9D=90=E6=A0=87=E7=B3=BB=E7=9A=84?= =?UTF-8?q?=E6=96=B9=E6=B3=95=EF=BC=8C=E5=B9=B6=E6=9B=B4=E6=96=B0=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 19 +++++++++++-------- coord_converter.py | 39 ++++++++++++++++++++++++++++++++------- 2 files changed, 43 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index aaa3257..2e6baa0 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,7 @@ $ python coordTransform_utils.py # 查看使用帮助 $ python coord_converter.py -h -usage: coord_converter.py [-h] -i INPUT -o OUTPUT -t TYPE [-n LNG_COLUMN] [-a LAT_COLUMN] [-s SKIP_INVALID_ROW] +usage: coord_converter.py [-h] -T csv -i INPUT -o OUTPUT -t TYPE [-n LNG_COLUMN] [-a LAT_COLUMN] [-s SKIP_INVALID_ROW] Convert coordinates in csv files. @@ -48,10 +48,10 @@ optional arguments: -h, --help show this help message and exit arguments: - -i , --input Location of input file - -o , --output Location of output file - -t , --type Convert type, must be one of: g2b, b2g, w2g, g2w, b2w, - w2b + -T , --target Convert target, must be one of: csv, gpx (default: None) + -i , --input Location of input file (default: None) + -o , --output Location of output file (default: None) + -t , --type Convert type, must be one of: g2b, b2g, w2g, g2w, b2w, w2b (default: None) -n , --lng_column Column name for longitude (default: lng) -a , --lat_column Column name for latitude (default: lat) -s , --skip_invalid_row @@ -62,11 +62,14 @@ arguments: ```bash # 不指定经纬度列名(默认为'lng', 'lat') -$ python coord_converter.py -i test_input.csv -o test_output.csv -t b2g +$ python coord_converter.py -i test_input.csv -o test_output.csv -t b2g -T CSV # 指定经纬度列名 -$ python coord_converter.py -i test_input.csv -o test_output.csv -t b2g -n 经度 -a 纬度 +$ python coord_converter.py -i test_input.csv -o test_output.csv -t b2g -n 经度 -a 纬度 -T CSV # 跳过无效经纬度的行(默认不跳过) -$ python coord_converter.py -i test_input.csv -o test_output.csv -t b2g -n 经度 -a 纬度 -s True +$ python coord_converter.py -i test_input.csv -o test_output.csv -t b2g -n 经度 -a 纬度 -s True -T CSV + +# 转换gpx文件,-n为gpx文件内经度对应标签,-a为gpx文件内纬度对应标签 +$ python coord_converter.py -i COURSE_43368335.gpx -o COURSE_43368335_NEW.gpx -t g2w -n "lon" -a "lat" -T gpx ``` diff --git a/coord_converter.py b/coord_converter.py index e1f8a26..59c97b4 100644 --- a/coord_converter.py +++ b/coord_converter.py @@ -3,6 +3,7 @@ import csv import sys +import codecs import argparse from coordTransform_utils import gcj02_to_bd09 from coordTransform_utils import bd09_to_gcj02 @@ -10,6 +11,7 @@ from coordTransform_utils import gcj02_to_wgs84 from coordTransform_utils import bd09_to_wgs84 from coordTransform_utils import wgs84_to_bd09 +from xml.dom.minidom import parse # Configuration # Input file name @@ -25,7 +27,23 @@ # Skip invalid row SKIP_INVALID_ROW = False -def convert(): +def convert_gpx(): + domTree = parse(INPUT) + # 文档根元素 + gpxNode = domTree.documentElement + trkptNode = gpxNode.getElementsByTagName("trkpt") + + for trkpt in trkptNode: + result = convert_by_type(float(trkpt.attributes[LNG_COLUMN].value), float(trkpt.attributes[LAT_COLUMN].value), TYPE) + trkpt.attributes[LNG_COLUMN].value=str(result[0]) + trkpt.attributes[LAT_COLUMN].value=str(result[1]) + + with open(OUTPUT, 'wb+') as f: + #解决写入中文乱码问题 + f = codecs.lookup("utf-8")[3](f) + domTree.writexml(f, encoding='utf-8') + +def convert_csv(): with open(INPUT, 'r') as input_file: input_file_reader = csv.reader(input_file) headers = next(input_file_reader) @@ -94,13 +112,14 @@ def convert_by_type(lng, lat, type): sys.exit() if __name__ == '__main__': - parser = argparse.ArgumentParser(description='Convert coordinates in csv files.', usage='%(prog)s [-h] -i INPUT -o OUTPUT -t TYPE [-n LNG_COLUMN] [-a LAT_COLUMN] [-s SKIP_INVALID_ROW]', formatter_class=argparse.ArgumentDefaultsHelpFormatter) + parser = argparse.ArgumentParser(description='Convert coordinates in csv files.', usage='%(prog)s [-h] -T csv -i INPUT -o OUTPUT -t TYPE [-n LNG_COLUMN] [-a LAT_COLUMN] [-s SKIP_INVALID_ROW]', formatter_class=argparse.ArgumentDefaultsHelpFormatter) group = parser.add_argument_group('arguments') - group.add_argument('-i', '--input', help='Location of input file', default=argparse.SUPPRESS, metavar='') - group.add_argument('-o', '--output', help='Location of output file', default=argparse.SUPPRESS, metavar='') - group.add_argument('-t', '--type', help='Convert type, must be one of: g2b, b2g, w2g, g2w, b2w, w2b', default=argparse.SUPPRESS, metavar='') + group.add_argument('-T', '--target', help='Convert target, must be one of: csv, gpx', metavar='') + group.add_argument('-i', '--input', help='Location of input file', metavar='') + group.add_argument('-o', '--output', help='Location of output file', metavar='') + group.add_argument('-t', '--type', help='Convert type, must be one of: g2b, b2g, w2g, g2w, b2w, w2b', metavar='') group.add_argument('-n', '--lng_column', help='Column name for longitude', default='lng', metavar='') group.add_argument('-a', '--lat_column', help='Column name for latitude', default='lat', metavar='') group.add_argument('-s', '--skip_invalid_row', help='Whether to skip invalid row', default=False, type=bool, metavar='') @@ -111,7 +130,7 @@ def convert_by_type(lng, lat, type): # print '{0:20} {1}'.format(arg, str(getattr(args, arg))) # Get arguments - if not args.input or not args.output or not args.type: + if not args.input or not args.output or not args.type or not args.target: parser.print_help() else: INPUT = args.input @@ -124,4 +143,10 @@ def convert_by_type(lng, lat, type): if args.skip_invalid_row: SKIP_INVALID_ROW = args.skip_invalid_row - convert() + if args.target=='csv': + convert_csv() + elif args.target=='gpx': + convert_gpx() + else: + print('Usage: Convert target must be one of: csv, gpx') + sys.exit()