From 1ab75afe263c4d17a79eeaf4204cdc099fd3b9fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=88=AA=E5=B7=B4=E6=80=AA?= Date: Wed, 14 May 2025 09:21:26 +0800 Subject: [PATCH 1/2] update latlon2utm & convert_proj_txt --- imap/lib/convertor.py | 3 ++- imap/lib/proj_helper.py | 13 +++++++------ 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/imap/lib/convertor.py b/imap/lib/convertor.py index e69a630..1619b35 100644 --- a/imap/lib/convertor.py +++ b/imap/lib/convertor.py @@ -167,7 +167,8 @@ def convert_proj_txt(self, proj_txt): self.pb_map.header.projection.proj = "+proj=utm +zone={} +ellps=WGS84 " \ "+datum=WGS84 +units=m +no_defs".format(0) else: - self.origin_x, self.origin_y, zone_id = latlon2utm(lat, lon) + # use projTxt run latlon2utm + self.origin_x, self.origin_y, zone_id = latlon2utm(lat, lon, self.xodr_map.header.geo_reference.text) if x_0: self.origin_x = self.origin_x - x_0 if y_0: diff --git a/imap/lib/proj_helper.py b/imap/lib/proj_helper.py index b9795eb..f2da49b 100644 --- a/imap/lib/proj_helper.py +++ b/imap/lib/proj_helper.py @@ -41,12 +41,13 @@ def utm2latlon(x, y, zone): return lat, lon -def latlon2utm(lat, lon): - """latlon to utm""" - zone = latlon2utmzone(lat, lon) - projector2 = pyproj.Proj(proj='utm', zone=zone, ellps='WGS84') - x, y = projector2(lon, lat) - return x, y, zone +def latlon2utm(lat, lon, projTxt): + """latlon to utm use proj info""" + zone = latlon2utmzone(lat, lon) + print(f"origin_lat: {lat} | origin_lon: {lon}") + projector2 = pyproj.Proj(projTxt) + x, y = projector2(lon, lat) + return x, y, zone def latlon2utmzone(lat, lon): From dd01082683e1fa792af5bd21d3b2e11f3fdcc3c9 Mon Sep 17 00:00:00 2001 From: daohu527 Date: Wed, 14 May 2025 15:47:33 +0800 Subject: [PATCH 2/2] chore: Modify latlon2utm to support multiple coordinates --- imap/lib/convertor.py | 7 ++++--- imap/lib/proj_helper.py | 28 +++++++++++++++++++--------- 2 files changed, 23 insertions(+), 12 deletions(-) diff --git a/imap/lib/convertor.py b/imap/lib/convertor.py index 1619b35..d2ac582 100644 --- a/imap/lib/convertor.py +++ b/imap/lib/convertor.py @@ -32,7 +32,7 @@ from imap.lib.draw import draw_line, show from imap.lib.convex_hull import convex_hull, aabb_box -from imap.lib.proj_helper import latlon2utm +from imap.lib.proj_helper import latlon2projected # Distance between stop line and pedestrian crossing @@ -167,8 +167,9 @@ def convert_proj_txt(self, proj_txt): self.pb_map.header.projection.proj = "+proj=utm +zone={} +ellps=WGS84 " \ "+datum=WGS84 +units=m +no_defs".format(0) else: - # use projTxt run latlon2utm - self.origin_x, self.origin_y, zone_id = latlon2utm(lat, lon, self.xodr_map.header.geo_reference.text) + # use projTxt run latlon2projected + self.origin_x, self.origin_y, zone_id = latlon2projected( + lat, lon, self.xodr_map.header.geo_reference.text) if x_0: self.origin_x = self.origin_x - x_0 if y_0: diff --git a/imap/lib/proj_helper.py b/imap/lib/proj_helper.py index f2da49b..ed2d12c 100644 --- a/imap/lib/proj_helper.py +++ b/imap/lib/proj_helper.py @@ -34,20 +34,30 @@ import math -def utm2latlon(x, y, zone): +def projected2latlon(x, y, zone_id=None, proj_txt=None): """utm to latlon""" - proj = pyproj.Proj(proj='utm', zone=zone, ellps='WGS84') + if proj_txt is None: + # Default: Inverse Standard UTM + if zone_id is None: + raise ValueError( + "For default inverse UTM, 'zone_id' parameter is required.") + proj = pyproj.Proj(proj='utm', zone=zone_id, ellps='WGS84') + else: + proj = pyproj.Proj(proj_txt) lon, lat = proj(x, y, inverse=True) return lat, lon -def latlon2utm(lat, lon, projTxt): - """latlon to utm use proj info""" - zone = latlon2utmzone(lat, lon) - print(f"origin_lat: {lat} | origin_lon: {lon}") - projector2 = pyproj.Proj(projTxt) - x, y = projector2(lon, lat) - return x, y, zone +def latlon2projected(lat, lon, proj_txt=None): + """latlon to utm use proj info""" + zone_id = latlon2utmzone(lat, lon) + if proj_txt is None: + # Default: Standard UTM + proj = pyproj.Proj(proj='utm', zone=zone_id, ellps='WGS84') + else: + proj = pyproj.Proj(proj_txt) + x, y = proj(lon, lat) + return x, y, zone_id def latlon2utmzone(lat, lon):