Source code for transformations_of_crs_values

# -*- coding: utf-8 -*-
"""
Created on Wed Feb 21 10:40:53 2018

@author: jpelda
"""

from shapely.geometry import Point, LineString, Polygon
import shapely.ops as ops
from functools import partial
import pyproj as pp
import pandas as pd


[docs]def transform_coords(geo, from_coord='epsg:3035', into_coord='epsg:4326'): '''Transforms coordinates from given to requested coordinate system. Args: geo: [[x]], x is either Polygon, LineString, Point or (f,f)*i) from_coord: str, coordinate system given into_coord: str, coordinate system requested Returns: type(geo) transformed to into_coord ''' import time stime = time.time() if type(geo[0]) == pd.core.series.Series: geo = geo[0].tolist() geo_as_tuples = [0]*len(geo) geo_type = type(geo[0]) ''' pp.transform needs tuples of floats to convert, here input is converted into tuples ''' if isinstance(geo[0], Polygon): for i, poly in enumerate(geo): geo_as_tuples[i] = [(x, y) for x, y in zip(poly.exterior.coords.xy[0], poly.exterior.coords.xy[1])] elif geo_type == LineString: for i, line in enumerate(geo): geo_as_tuples[i] = [(x, y) for x, y in list(line.coords)] elif geo_type == Point: for i, point in enumerate(geo): geo_as_tuples[i] = [(point.coords[0][0], point.coords[0][1])] else: for i, item in enumerate(geo): geo_as_tuples[i] = [(x,y) for x, y in item] # conversion of coordinates geo_convert = [0]*len(geo) for i, tuples in enumerate(geo_as_tuples): x = [x[0] for x in tuples] y = [x[1] for x in tuples] geo_convert[i] = pp.transform(pp.Proj(init=from_coord), pp.Proj(init=into_coord), x, y) geo_convert[i] = [(x, y) for x, y in zip(geo_convert[i][0], geo_convert[i][1])] # type(geo) shall be the output type ret = [0]*len(geo) if geo_type == Polygon: for i, item in enumerate(geo_convert): ret[i] = Polygon(item) elif geo_type == LineString: for i, item in enumerate(geo_convert): ret[i] = LineString(item) elif geo_type == Point: for i, item in enumerate(geo_convert): ret[i] = Point(item) else: ret = geo_convert print("transform_coords | {}".format(time.time() - stime)) return ret
[docs]def transform_length(length, crs_from="EPSG:32633", crs_into="EPSG:4326"): """Transforms length into length based on crs. It is a little bit imprecise. For better results use method crs_length_to_meter. ARGS: ----- length: float [meter] KWARGS: ------ crs_from: str coord system of length crs_into: str coord system in which length shall be converted RETURNS: -------- length: float [crs based] """ length = LineString([(0, 0), (length, 0)]) project = partial(pp.transform, pp.Proj(init=crs_from), pp.Proj(init=crs_into)) length = ops.transform(project, length) length = length.length return length
[docs]def crs_length_to_meter(linestring, crs='WGS84'): """Transforms crs_length into meters. ARGS: ----- linestring: shapely.geometry.LineString RETURNS: ------- length: float [m] """ geod = pp.Geod(ellps=crs) angle1, angle2, distance = geod.inv(linestring.xy[0][0], linestring.xy[1][0], linestring.xy[0][1], linestring.xy[1][1]) return distance
[docs]def transform_area(geom, crs_from="EPSG:4326"): """Transforms area into are based on crs. ARGS: ---- geom: list List contains geometric objects. KWARGS: ------ crs_from: str coord system of geom crs_into: str coord system defining the unit of return RETURNS: ------- area: [floats] [crs based] EPSG:3035 returns area [m] """ geom_area = [0] * len(geom) for index, geo in enumerate(geom): g = ops.transform(partial(pp.transform, pp.Proj(init=crs_from), pp.Proj(proj='aea', lat1=geo.bounds[1], lat2=geo.bounds[3])), geo) geom_area[index] = g.area return geom_area