Skip to content

LngLatTransfer

Source code in src/gotrackit/tools/coord_trans.py
24
25
26
27
28
def __init__(self):
    self.x_pi = 3.14159265358979324 * 3000.0 / 180.0
    self.pi = math.pi
    self.a = 6378245.0  # 长半轴
    self.es = 0.00669342162296594323  # 偏心率平方

LngLatTransfer类方法 - loc_convert:

  • 单点地理坐标坐标转换:支持百度、WGS-84、GCJ-02(高德、火星)坐标之间的相互转换 以及 任意投影坐标到经纬度的转换

Parameters:

Name Type Description Default
lng float or ndarray

经度

required
lat float or ndarray

纬度

required
con_type str

转换类型, gc-bd或者gc-84或者84-gc或者84-bd或者bd-84或者bd-gc或者p-g

'gc-bd'
proj str
None

Returns:

Type Description
tuple[float | ndarray, float | ndarray]

转换后的经度, 转换后的纬度

Source code in src/gotrackit/tools/coord_trans.py
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
def loc_convert(self, lng: float or np.ndarray, lat: float or np.ndarray,
                con_type: str = 'gc-bd', proj: str = None) -> tuple[float | np.ndarray, float | np.ndarray]:
    """LngLatTransfer类方法 - loc_convert:

    - 单点地理坐标坐标转换:支持百度、WGS-84、GCJ-02(高德、火星)坐标之间的相互转换 以及 任意投影坐标到经纬度的转换

    Args:
        lng: 经度
        lat: 纬度
        con_type: 转换类型, gc-bd或者gc-84或者84-gc或者84-bd或者bd-84或者bd-gc或者p-g
        proj:

    Returns:
        转换后的经度, 转换后的纬度
    """
    if con_type == 'gc-bd':
        return self.gcj_to_bd(lng, lat)
    elif con_type == 'gc-84':
        return self.gcj_to_wgs84(lng, lat)
    elif con_type == '84-bd':
        return self.wgs84_to_bd(lng, lat)
    elif con_type == '84-gc':
        return self.wgs84_to_gcj(lng, lat)
    elif con_type == 'bd-84':
        return self.bd_to_wgs84(lng, lat)
    elif con_type == 'bd-gc':
        return self.bd_to_gcj(lng, lat)
    elif con_type == 'p-g':
        return self.plane_to_geo(proj, lng, lat)
    else:
        return lng, lat

LngLatTransfer类方法 - obj_convert:

  • 几何对象的地理坐标坐标转换:支持几何对象在百度、WGS-84、GCJ-02(高德、火星)坐标之间的相互转换、投影坐标到经纬度的转换

Parameters:

Name Type Description Default
geo_obj geometry

几何对象(点, 线, 面)

required
con_type str

转换类型, gc-bd或者gc-84或者84-gc或者84-bd或者bd-84或者bd-gc或者p-g

None
ignore_z bool

是否忽略Z坐标

True
proj str

待转化坐标的投影参数

None

Returns:

Type Description
geometry

转换后的几何对象

Source code in src/gotrackit/tools/coord_trans.py
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
def obj_convert(self, geo_obj: shapely.geometry, con_type: str = None, ignore_z: bool = True,
                proj: str = None) -> shapely.geometry:
    """LngLatTransfer类方法 - obj_convert:

    - 几何对象的地理坐标坐标转换:支持几何对象在百度、WGS-84、GCJ-02(高德、火星)坐标之间的相互转换、投影坐标到经纬度的转换

    Args:
        geo_obj: 几何对象(点, 线, 面)
        con_type: 转换类型, gc-bd或者gc-84或者84-gc或者84-bd或者bd-84或者bd-gc或者p-g
        ignore_z: 是否忽略Z坐标
        proj: 待转化坐标的投影参数

    Returns:
        转换后的几何对象
    """
    if isinstance(geo_obj, (MultiPolygon, MultiLineString, MultiPoint)):
        convert_obj_list = [self.obj_convert(geo, con_type=con_type, proj=proj) for geo in geo_obj.geoms]
        if isinstance(geo_obj, MultiPolygon):
            return MultiPolygon(convert_obj_list) if len(convert_obj_list) > 1 else convert_obj_list[0]
        elif isinstance(geo_obj, MultiLineString):
            return MultiLineString(convert_obj_list) if len(convert_obj_list) > 1 else convert_obj_list[0]
        elif isinstance(geo_obj, MultiPoint):
            return MultiPoint(convert_obj_list) if len(convert_obj_list) > 1 else convert_obj_list[0]
        else:
            raise ValueError(r'MultiTypeGeoms only allow: MultiLineString or MultiPolygon')
    else:
        if isinstance(geo_obj, (LineString, LinearRing)):
            coords_list = self.get_coords(obj=geo_obj, ignore_z=ignore_z)
            return LineString(self.xfer_coords(coords_list=coords_list[0], con_type=con_type,
                                               ignore_z=ignore_z, proj=proj))
        elif isinstance(geo_obj, Polygon):
            coords_list = self.get_coords(obj=geo_obj, ignore_z=ignore_z)
            if len(coords_list) > 1:
                return Polygon(self.xfer_coords(coords_list=coords_list[0], con_type=con_type,
                                                ignore_z=ignore_z, proj=proj),
                               holes=[self.xfer_coords(coords_list=ring_coord, con_type=con_type,
                                                       ignore_z=ignore_z, proj=proj)
                                      for ring_coord in coords_list[1:]])
            else:
                return Polygon(self.xfer_coords(coords_list=coords_list[0], con_type=con_type,
                                                ignore_z=ignore_z, proj=proj))
        elif isinstance(geo_obj, Point):
            if ignore_z:
                return Point(self.loc_convert(geo_obj.x, geo_obj.y, con_type, proj))
            else:
                return Point(self.loc_convert(geo_obj.x, geo_obj.y, con_type, proj) + (geo_obj.z,))
        else:
            raise ValueError(r'Only LineString or Polygon or Point or LineRing are allowed')

LngLatTransfer类方法 - gdf_convert:

  • GeoDataFrame地理坐标转换:支持GeoDataFrame在百度、WGS-84、GCJ-02(高德、火星)坐标之间的相互转换

Parameters:

Name Type Description Default
gdf GeoDataFrame

GeoDataFrame

required
con_type str

转换类型, gc-bd或者gc-84或者84-gc或者84-bd或者bd-84或者bd-gc

'gc-84'
ignore_z bool

是否忽略Z坐标

True

Returns:

Type Description
GeoDataFrame

gdf

Source code in src/gotrackit/tools/coord_trans.py
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
def gdf_convert(self, gdf: gpd.GeoDataFrame, con_type: str = 'gc-84', ignore_z: bool = True) -> gpd.GeoDataFrame:
    """LngLatTransfer类方法 - gdf_convert:

    - GeoDataFrame地理坐标转换:支持GeoDataFrame在百度、WGS-84、GCJ-02(高德、火星)坐标之间的相互转换

    Args:
        gdf: GeoDataFrame
        con_type: 转换类型, gc-bd或者gc-84或者84-gc或者84-bd或者bd-84或者bd-gc
        ignore_z: 是否忽略Z坐标

    Returns:
        gdf
    """
    if gdf is None or gdf.empty:
        return gpd.GeoDataFrame()
    else:
        gdf = gdf.explode(ignore_index=True)
        if gdf.empty:
            return gpd.GeoDataFrame()
        g = gdf.at[0, geometry_field]
        if isinstance(g, Point):
            nx, ny = self.loc_convert(lng=gdf[geometry_field].x, lat=gdf[geometry_field].y,
                                      con_type=con_type)
            if ignore_z:
                gdf[geometry_field] = gpd.points_from_xy(nx, ny, crs=gdf.crs)
            else:
                try:
                    z = gdf[geometry_field].z
                except Exception as e:
                    z = 0
                gdf[geometry_field] = gpd.points_from_xy(nx, ny, z, crs=gdf.crs)
        elif isinstance(g, (LineString, LinearRing, Polygon)):
            gdf[geometry_field] = gdf[geometry_field].apply(
                lambda l: self.obj_convert(geo_obj=l, con_type=con_type, ignore_z=ignore_z))
        else:
            raise ValueError('Unknown Geo-Type')
        return gdf

LngLatTransfer类方法 - file_convert:

  • 文件-地理坐标转换:支持地理文件在百度、WGS-84、GCJ-02(高德、火星)坐标之间的相互转换

Parameters:

Name Type Description Default
file_path str

文件路径(能够被geopandas读取的文件)

None
con_type str

转换类型, gc-bd或者gc-84或者84-gc或者84-bd或者bd-84或者bd-gc

'gc-84'
out_fldr str

输出路径

'./'
out_file_name str

转换结束后输出文件的名称

'transfer'
file_type str

输出文件的存储类型, 支持shp或者geojson

'shp'
ignore_z bool

是否忽略Z坐标

True

Returns:

Type Description

None

Source code in src/gotrackit/tools/coord_trans.py
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
def file_convert(self, file_path: str = None, con_type: str = 'gc-84',
                 out_fldr: str = r'./', out_file_name: str = 'transfer', file_type: str = 'shp',
                 ignore_z: bool = True):
    """LngLatTransfer类方法 - file_convert:

    - 文件-地理坐标转换:支持地理文件在百度、WGS-84、GCJ-02(高德、火星)坐标之间的相互转换

    Args:
        file_path: 文件路径(能够被geopandas读取的文件)
        con_type: 转换类型, gc-bd或者gc-84或者84-gc或者84-bd或者bd-84或者bd-gc
        out_fldr: 输出路径
        out_file_name: 转换结束后输出文件的名称
        file_type: 输出文件的存储类型, 支持shp或者geojson
        ignore_z: 是否忽略Z坐标

    Returns:
        None
    """

    gdf = gpd.read_file(file_path)
    gdf = self.gdf_convert(gdf=gdf, con_type=con_type, ignore_z=ignore_z)
    if not os.path.exists(out_fldr):
        os.makedirs(out_fldr)
    if file_type == 'shp':
        gdf.to_file(os.path.join(out_fldr, out_file_name + '.shp'))
    else:
        gdf.to_file(os.path.join(out_fldr, out_file_name + '.geojson'), driver='GeoJSON')

Comments