从LineString Z提取坐标遇科学计数法,Nominatim逆地理编码报错求助
解决LineString科学计数法坐标导致逆地理编码失败的问题
方案1:解析LineString并处理科学计数法坐标
通过正则提取坐标字符串,转换为浮点数自动处理科学计数法,再组合成Nominatim可识别的格式:
import re from geopy.geocoders import Nominatim # 全局初始化定位器,避免重复创建 geolocator = Nominatim(user_agent="osm") def parse_linestring(linestring_str): # 匹配所有数字(含科学计数法格式) coords = re.findall(r'[-+]?\d*\.\d+e?[-+]?\d*|\d+', linestring_str) # 提取(x,y)坐标对(忽略Z值),并转换为(lat,lng)顺序适配Nominatim coord_pairs = [] for i in range(0, len(coords), 3): lng = float(coords[i]) lat = float(coords[i+1]) coord_pairs.append((lat, lng)) return coord_pairs def get_address_from_linestring(linestring_str): coord_pairs = parse_linestring(linestring_str) if not coord_pairs: return None # 取LineString的第一个点进行逆编码,也可改用centroid中心点 coor_str = f"{coord_pairs[0][0]}, {coord_pairs[0][1]}" try: location = geolocator.reverse(coor_str) return location.address.split(',')[:3] except Exception as e: print(f"逆编码失败: {e}") return None
方案2:用GeoPandas读取LineString(推荐)
借助GeoPandas自动解析地理数据,将LineString转为Shapely对象,直接获取浮点坐标:
import geopandas as gpd from geopy.geocoders import Nominatim geolocator = Nominatim(user_agent="osm") # 读取地理数据(支持shp/geojson等格式) gdf = gpd.read_file("your_geo_data.geojson") def get_address_from_line(line_geom): # 取LineString的第一个坐标点,或用line_geom.centroid获取中心点 lng, lat, _ = line_geom.coords[0] coor_str = f"{lat}, {lng}" try: location = geolocator.reverse(coor_str) return location.address.split(',')[:3] except Exception as e: print(f"逆编码失败: {e}") return None # 批量处理数据框中的Line Geom列 gdf['address'] = gdf['Line Geom'].apply(get_address_from_line)
方案3:单独转换科学计数法字符串
如果仅需将科学计数法字符串转为普通小数格式,可使用以下工具函数:
def sci_to_decimal(sci_str, decimal_places=8): # 转换为指定小数位数的字符串 return f"{float(sci_str):.{decimal_places}f}" # 示例:转换"1.16e-6"为"0.00000116" print(sci_to_decimal("1.16e-6"))
注意:调用Nominatim接口时建议添加1-2秒延迟,避免因请求频繁被限制访问。
内容的提问来源于stack exchange,提问作者Learning
相关产品推荐
相关产品推荐

