Source code for pyensae.datasource.geodata

"""
Geographic datasets.


:githublink:`%|py|5`
"""
import math
import os
import pandas
from pyquickhelper.filehelper import un7zip_files
from .http_retrieve import download_data


[docs]def lambert932WGPS(lambertE, lambertN): """ Converts Lambert coordinates into longitude, latitude. Does not use :epkg:`pyproj`. :param lambertE: lambertE :param lambertN: lambertN :return: longitude, latitude :githublink:`%|py|20` """ class constantes: GRS80E = 0.081819191042816 LONG_0 = 3 XS = 700000 YS = 12655612.0499 n = 0.7256077650532670 C = 11754255.4261 delX = lambertE - constantes.XS delY = lambertN - constantes.YS gamma = math.atan(-delX / delY) R = math.sqrt(delX * delX + delY * delY) latiso = math.log(constantes.C / R) / constantes.n sinPhiit0 = math.tanh(latiso + constantes.GRS80E * math.atanh(constantes.GRS80E * math.sin(1))) sinPhiit1 = math.tanh(latiso + constantes.GRS80E * math.atanh(constantes.GRS80E * sinPhiit0)) sinPhiit2 = math.tanh(latiso + constantes.GRS80E * math.atanh(constantes.GRS80E * sinPhiit1)) sinPhiit3 = math.tanh(latiso + constantes.GRS80E * math.atanh(constantes.GRS80E * sinPhiit2)) sinPhiit4 = math.tanh(latiso + constantes.GRS80E * math.atanh(constantes.GRS80E * sinPhiit3)) sinPhiit5 = math.tanh(latiso + constantes.GRS80E * math.atanh(constantes.GRS80E * sinPhiit4)) sinPhiit6 = math.tanh(latiso + constantes.GRS80E * math.atanh(constantes.GRS80E * sinPhiit5)) longRad = math.asin(sinPhiit6) latRad = gamma / constantes.n + constantes.LONG_0 / 180 * math.pi longitude = latRad / math.pi * 180 latitude = longRad / math.pi * 180 return longitude, latitude
[docs]def load_french_departements(cache=None): """ Returns the definition of French departments. :param cache: cache folder :return: French departments as a :epkg:`GeoDataFrame` .. exref:: :title: Loads French departments polygons Simple example to retrieve French departements. .. runpython:: :showcode: from pyensae.datasource import load_french_departements df = load_french_departements() print(df.head(2).T) :githublink:`%|py|77` """ if cache is None: cache = '.' # delayed import import shapefile import geopandas from shapely.geometry import Polygon from shapely.ops import unary_union name = "GEOFLA_2-1_DEPARTEMENT_SHP_LAMB93_FXX_2015-12-01.7z" try: download_data(name, whereTo=cache, website="https://wxs-telechargement.ign.fr/oikr5jryiph0iwhw36053ptm/telechargement/inspire/" "GEOFLA_THEME-DEPARTEMENTS_2015_2$GEOFLA_2-1_DEPARTEMENT_SHP_LAMB93_FXX_2015-12-01/file/") except Exception as e: # au cas le site n'est pas accessible download_data(name, website="xd", whereTo=cache) full_name = os.path.join(cache, name) un7zip_files(full_name, where_to=os.path.join(cache, "shapefiles")) departements = os.path.join(cache, 'shapefiles/GEOFLA_2-1_DEPARTEMENT_SHP_LAMB93_FXX_2015-12-01/GEOFLA/1_DONNEES_LIVRAISON_2015/' 'GEOFLA_2-1_SHP_LAMB93_FR-ED152/DEPARTEMENT/DEPARTEMENT.shp') r = shapefile.Reader(departements) shapes = r.shapes() records = r.records() polys = [] datas = [] for i, (record, shape) in enumerate(zip(records, shapes)): # coordinates in Lambert 93 geo_points = [lambert932WGPS(x, y) for x, y in shape.points] rec = {} for k in ['CODE_DEPT', 'CODE_REG', 'CODE_CHF', 'ID_GEOFLA', 'NOM_CHF', 'NOM_DEPT', 'NOM_REG', 'X_CENTROID', 'X_CHF_LIEU', 'Y_CENTROID', 'Y_CHF_LIEU']: rec[k] = getattr(record, k, None) if len(shape.parts) == 1: # only one polygon poly = Polygon(geo_points) else: # merge them ind = list(shape.parts) + [len(shape.points)] pols = [Polygon(geo_points[ind[i]:ind[i + 1]]) for i in range(0, len(shape.parts))] try: poly = unary_union(pols) except Exception as e: poly = Polygon(geo_points) polys.append(poly) datas.append(rec) geom = geopandas.GeoDataFrame(geometry=polys) data = pandas.DataFrame(datas) return pandas.concat([geom, data], axis=1)