#!/usr/bin/env python3 from osgeo import gdal, ogr, osr import glob import hashlib import os import json import subprocess cdn_url = 'https://cdn.proj.org' agency_list = json.loads(open('agency.json','rt').read()) agencies = {} for item in agency_list: agencies[item['id']] = item area_list = json.loads(open('area.json','rt').read()) area_dict = {} for item in area_list: area_dict[item['code']] = item files_list = json.loads(open('files.json','rt').read()) files_dict = {} for item in files_list: files_dict[item['name']] = item dirnames = [] links = [] for dirname in glob.glob('*'): if not os.path.isdir(dirname): continue dirnames.append(dirname) gj_ds = ogr.GetDriverByName('GeoJSON').CreateDataSource('files.geojson') sr = osr.SpatialReference() sr.SetAxisMappingStrategy(osr.OAMS_TRADITIONAL_GIS_ORDER) sr.ImportFromEPSG(4326) lyr = gj_ds.CreateLayer('files', srs = sr, options = ['RFC7946=YES']) lyr.CreateField(ogr.FieldDefn('url', ogr.OFTString)) lyr.CreateField(ogr.FieldDefn('name', ogr.OFTString)) lyr.CreateField(ogr.FieldDefn('area_of_use', ogr.OFTString)) lyr.CreateField(ogr.FieldDefn('type', ogr.OFTString)) lyr.CreateField(ogr.FieldDefn('source_crs_code', ogr.OFTString)) lyr.CreateField(ogr.FieldDefn('source_crs_name', ogr.OFTString)) lyr.CreateField(ogr.FieldDefn('target_crs_code', ogr.OFTString)) lyr.CreateField(ogr.FieldDefn('target_crs_name', ogr.OFTString)) lyr.CreateField(ogr.FieldDefn('source', ogr.OFTString)) lyr.CreateField(ogr.FieldDefn('source_country', ogr.OFTString)) lyr.CreateField(ogr.FieldDefn('source_id', ogr.OFTString)) lyr.CreateField(ogr.FieldDefn('source_url', ogr.OFTString)) lyr.CreateField(ogr.FieldDefn('description', ogr.OFTString)) lyr.CreateField(ogr.FieldDefn('full_bbox', ogr.OFTRealList)) lyr.CreateField(ogr.FieldDefn('file_size', ogr.OFTInteger64)) lyr.CreateField(ogr.FieldDefn('sha256sum', ogr.OFTString)) def polygon_from_bbox(xmin, ymin, xmax, ymax): geom = ogr.Geometry(ogr.wkbPolygon) ring = ogr.Geometry(ogr.wkbLinearRing) # Add small epsilon to help unioning polygons touching by edge eps = 1e-12 ring.AddPoint_2D(xmin-eps, ymin-eps) ring.AddPoint_2D(xmin-eps, ymax+eps) ring.AddPoint_2D(xmax+eps, ymax+eps) ring.AddPoint_2D(xmax+eps, ymin+eps) ring.AddPoint_2D(xmin-eps, ymin-eps) geom.AddGeometry(ring) return geom def normalize_lon(xmin, xmax): if xmin > 180: xmin -= 360 xmax -= 360 elif xmax < -180: xmin += 360 xmax += 360 return xmin, xmax total_size = 0 set_files = set() for dirname in sorted(dirnames): if '_' not in dirname or dirname == 'grid_tools': continue filenames = [] readme_filename = None for f in glob.glob(dirname + '/*'): f = os.path.basename(f) if f.endswith('.sh') or f.endswith('.py'): continue if f.endswith('README.txt'): assert not readme_filename readme_filename = f else: filenames.append(f) agency = agencies[dirname] title = '%s' % (agency['url'].replace('&', "&"), agency['agency']) links.append('

%s