Skip to content

Commit c675b0f

Browse files
committed
merge: improv GDAL import by cliping the source
1 parent 13a5df0 commit c675b0f

File tree

2 files changed

+29
-8
lines changed

2 files changed

+29
-8
lines changed

analysers/Analyser_Merge.py

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import re
3737
import fnmatch
3838
import shutil
39+
import subprocess
3940
from typing import Optional, Dict, Union, Callable
4041
from collections import defaultdict
4142
from .Analyser_Osmosis import Analyser_Osmosis
@@ -731,15 +732,25 @@ def import_(self, table, osmosis):
731732
if info:
732733
self.zip = info.filename
733734

735+
source_layer = [
736+
('/vsizip/' if self.zip else '' ) + tmp_file.name + (('/' + self.zip) if self.zip else ''),
737+
]
738+
if self.layer:
739+
source_layer.append(f"'{self.layer}'")
740+
741+
s_src = re.search('EPSG:([0-9]+)', subprocess.run(["gdalsrsinfo", "-e", *source_layer], stdout=subprocess.PIPE).stdout.decode('utf-8')).group(1)
742+
wkt = PointInPolygon.PointInPolygon(self.polygon_id).polygon.as_wkt(s_src) if self.polygon_id else None
743+
734744
select = "-select '{}'".format(','.join(self.fields)) if self.fields else ''
735-
gdal = "ogr2ogr -f PostgreSQL 'PG:{}' -lco SCHEMA={} -nln '{}' -lco OVERWRITE=yes -lco GEOMETRY_NAME=geom -lco OVERWRITE=YES -lco LAUNDER=NO -skipfailures {} -t_srs EPSG:{} '{}' {}".format(
745+
gdal = "ogr2ogr -f PostgreSQL 'PG:{}' -lco SCHEMA={} -nln '{}' {} -lco OVERWRITE=yes -lco GEOMETRY_NAME=geom -lco OVERWRITE=YES -lco LAUNDER=NO -skipfailures {} -t_srs EPSG:{} '{}' {}".format(
736746
osmosis.config.osmosis_manager.db_string,
737747
osmosis.config.osmosis_manager.db_user,
738748
table,
749+
f"-clipsrc '{wkt}'" if wkt else '',
739750
select,
740751
self.proj,
741-
('/vsizip/' if self.zip else '' ) + tmp_file.name + (('/' + self.zip) if self.zip else ''),
742-
f"'{self.layer}'" if self.layer else '',
752+
source_layer[0],
753+
source_layer[1] if len(source_layer) >= 2 else '',
743754
)
744755
print(gdal)
745756
if os.system(gdal):
@@ -1168,6 +1179,7 @@ def init(self, url, name, parser, load = Load(), conflate = Conflate()):
11681179
self.conflate.select.tags = [self.conflate.select.tags]
11691180
self.conflate.mapping.eval_static(self)
11701181

1182+
self.parser.polygon_id = self.config.polygon_id
11711183
self.load.osmosis = self
11721184
self.load.polygon_id = self.config.polygon_id
11731185
if "proj" in self.config.options:

modules/Polygon.py

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
from shapely.wkt import loads
2323
from shapely.geometry import MultiPolygon
2424
from modules import downloader
25+
import pyproj
26+
from shapely.ops import transform
2527

2628

2729
class Polygon:
@@ -34,12 +36,19 @@ def __init__(self, polygon_id, cache_delay=60):
3436
polygon_url = u"http://polygons.openstreetmap.fr/"
3537
for id in polygon_id:
3638
url = polygon_url + "index.py?id="+str(id)
37-
s = downloader.urlread(url, cache_delay)
39+
downloader.urlread(url, cache_delay)
3840
url = polygon_url + "get_wkt.py?params=0&id=" + ",".join(map(str, polygon_id))
39-
s = downloader.urlread(url, cache_delay)
40-
if s.startswith("SRID="):
41-
s = s.split(";", 1)[1]
42-
self.polygon = loads(s)
41+
self.wkt = wkt = downloader.urlread(url, cache_delay)
42+
if wkt.startswith("SRID="):
43+
wkt = wkt.split(";", 1)[1]
44+
self.polygon = loads(wkt)
45+
46+
def as_wkt(self, srid) -> str:
47+
wgs84 = pyproj.CRS('EPSG:4326')
48+
t_src = pyproj.CRS(f'EPSG:{srid}')
49+
project = pyproj.Transformer.from_crs(wgs84, t_src, always_xy=True).transform
50+
t_poly = transform(project, self.polygon)
51+
return t_poly
4352

4453
def bboxes(self):
4554
bbox = self.polygon.bounds

0 commit comments

Comments
 (0)