From d69c18227e6c9f0fbacc43befb1f1a88441f9a06 Mon Sep 17 00:00:00 2001 From: ache051 Date: Thu, 16 Sep 2021 11:56:32 +1200 Subject: [PATCH 01/14] Added power facilities layer --- docker-compose.yml | 26 +- fast.sh | 18 ++ layers/power/README.md | 9 + layers/power/mapping.yaml | 146 +++++++++ layers/power/power.sql | 46 +++ layers/power/power.yaml | 39 +++ layers/power/power_point.sql | 7 + layers/power/power_polygon.sql | 7 + layers/skiing/README.md | 9 + layers/skiing/etl_diagram.png | Bin 0 -> 9277 bytes layers/skiing/mapping.yaml | 27 ++ layers/skiing/mapping_diagram.png | Bin 0 -> 12486 bytes layers/skiing/skiing.sql | 7 + layers/skiing/skiing.yaml | 32 ++ openmaptiles.yaml | 4 +- src/calculate-centerlines-new/Dockerfile | 16 + .../calculate_centerlines.py | 155 +++++++++ src/calculate-centerlines/Dockerfile | 30 ++ .../create_centerlines.py | 186 +++++++++++ .../src_create_centerlines.py | 304 ++++++++++++++++++ src/export-shapefile/Dockerfile | 4 + src/export-shapefile/export-shapefile.sh | 16 + src/export-shapefile/initdb-postgis.sh | 27 ++ 23 files changed, 1113 insertions(+), 2 deletions(-) create mode 100755 fast.sh create mode 100644 layers/power/README.md create mode 100644 layers/power/mapping.yaml create mode 100644 layers/power/power.sql create mode 100644 layers/power/power.yaml create mode 100644 layers/power/power_point.sql create mode 100644 layers/power/power_polygon.sql create mode 100644 layers/skiing/README.md create mode 100644 layers/skiing/etl_diagram.png create mode 100644 layers/skiing/mapping.yaml create mode 100644 layers/skiing/mapping_diagram.png create mode 100644 layers/skiing/skiing.sql create mode 100644 layers/skiing/skiing.yaml create mode 100644 src/calculate-centerlines-new/Dockerfile create mode 100755 src/calculate-centerlines-new/calculate_centerlines.py create mode 100644 src/calculate-centerlines/Dockerfile create mode 100755 src/calculate-centerlines/create_centerlines.py create mode 100644 src/calculate-centerlines/src_create_centerlines.py create mode 100644 src/export-shapefile/Dockerfile create mode 100755 src/export-shapefile/export-shapefile.sh create mode 100644 src/export-shapefile/initdb-postgis.sh diff --git a/docker-compose.yml b/docker-compose.yml index def41650..614bd4fe 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -22,7 +22,8 @@ services: env_file: .env-postgres import-data: - image: "openmaptiles/import-data:${TOOLS_VERSION}" + #image: "openmaptiles/import-data:${TOOLS_VERSION}" + image: "alanc/import-data" env_file: .env networks: - postgres @@ -103,3 +104,26 @@ services: - "${PPORT:-8090}:${PPORT:-8090}" volumes: - .:/tileset + +# export-shapefile and calculate-centerlines are for lake lines for labelling + export-shapefile: + build: src/export-shapefile + env_file: .env + networks: + - postgres + volumes: + - ./data:/data + + calculate-centerlines: + build: src/calculate-centerlines + networks: + - postgres + volumes: + - ./data:/data + + calculate-centerlines-new: + build: src/calculate-centerlines-new + networks: + - postgres + volumes: + - ./data:/data diff --git a/fast.sh b/fast.sh new file mode 100755 index 00000000..75893f57 --- /dev/null +++ b/fast.sh @@ -0,0 +1,18 @@ +#!/bin/bash + +chosen_area=estonia +make clean +make all +make destroy-db +make start-db +make import-data area=$chosen_area +make download area=$chosen_area +make import-osm area=$chosen_area +make import-borders area=$chosen_area +make import-wikidata area=$chosen_area +make import-sql +make analyze-db +make test-perf-null +make generate-tiles-pg area=$chosen_area + +docker ps -a diff --git a/layers/power/README.md b/layers/power/README.md new file mode 100644 index 00000000..604c5e60 --- /dev/null +++ b/layers/power/README.md @@ -0,0 +1,9 @@ +## power + +### Docs + +### Mapping Diagram +![Mapping diagram for transportation](mapping_diagram.png?raw=true) + +### ETL diagram +![ETL diagram for transportation](etl_diagram.png?raw=true) diff --git a/layers/power/mapping.yaml b/layers/power/mapping.yaml new file mode 100644 index 00000000..59e6473f --- /dev/null +++ b/layers/power/mapping.yaml @@ -0,0 +1,146 @@ + +tables: + # etldoc: imposm3 -> osm_power_linestring + power_linestring: + type: linestring + fields: + - name: osm_id + type: id + - name: geometry + type: geometry + - key: name + name: name + type: string + - key: power + name: class + type: string + mapping: + power: + - cable + - line + - minor_line + #~ # etldoc: imposm3 -> osm_power_point + power_point: + type: point + fields: + - name: osm_id + type: id + - name: geometry + type: geometry + - key: name + name: name + type: string + - key: power + name: class + type: string + mapping: + power: + - tower + - pole + - catenary_mast + - generator + - portal + - transformer + - switch + - insulator + # etldoc: imposm3 -> osm_power_polygon + power_polygon: + type: polygon + fields: + - name: osm_id + type: id + - name: geometry + type: geometry + - key: name + name: name + type: string + - key: power + name: class + type: string + mapping: + power: + - plant + - substation + - transformer + +#tables: + ## etldoc: imposm3 -> osm_power_linestring + #power_linestring: + #type: linestring + #fields: + #- name: osm_id + #type: id + #- name: geometry + #type: geometry + #- key: power + #name: class + #type: string + #- key: plant:source + #name: source + #type: string + #- key: plant:method + #name: method + #type: string + #- key: name + #name: name + #type: string + #mapping: + #power: + #- cable + #- line + #- minor_line + ##~ # etldoc: imposm3 -> osm_power_point + #power_point: + #type: point + #fields: + #- name: osm_id + #type: id + #- name: geometry + #type: geometry + #- key: power + #name: class + #type: string + #- key: plant:source + #name: source + #type: string + #- key: plant:method + #name: method + #type: string + #- key: power + #name: name + #type: string + #mapping: + #power: + #- tower + #- pole + #- catenary_mast + #- generator + #- portal + #- transformer + #- switch + #- insulator + ## etldoc: imposm3 -> osm_power_polygon + #power_polygon: + #type: polygon + #fields: + #- name: osm_id + #type: id + #- name: geometry + #type: geometry + #- key: power + #name: class + #type: string + #- key: plant:source + #name: source + #type: string + #- key: plant:method + #name: method + #type: string + #- key: name + #name: name + #type: string + #mapping: + #power: + #- plant + #- substation + #- transformer diff --git a/layers/power/power.sql b/layers/power/power.sql new file mode 100644 index 00000000..807d6675 --- /dev/null +++ b/layers/power/power.sql @@ -0,0 +1,46 @@ + +-- CREATE OR REPLACE FUNCTION layer_power(bbox geometry, zoom_level int) +-- RETURNS TABLE(geometry geometry, class text, source text, method text, name text) AS $$ +-- SELECT geometry, class, source, method, name +-- FROM( + -- SELECT geometry, class, source, method, name + -- FROM osm_power_point + -- WHERE zoom_level >= 10 AND geometry && bbox + -- UNION ALL + + -- SELECT geometry, class, source, method, name + -- FROM osm_power_linestring + -- WHERE zoom_level >= 10 AND geometry && bbox + -- UNION ALL + + -- SELECT geometry, class, source, method, name + -- FROM osm_power_polygon + -- WHERE zoom_level >= 10 AND geometry && bbox + -- ) AS zoom_levels +-- WHERE geometry && bbox; +-- $$ LANGUAGE SQL STABLE + -- -- STRICT + -- PARALLEL SAFE; + +CREATE OR REPLACE FUNCTION layer_power(bbox geometry, zoom_level int) +RETURNS TABLE(geometry geometry, name text, class text) AS $$ +SELECT geometry, name, class +FROM( + SELECT geometry, name, class + FROM osm_power_point + WHERE zoom_level >= 10 AND geometry && bbox + UNION ALL + + SELECT geometry, name, class + FROM osm_power_linestring + WHERE zoom_level >= 10 AND geometry && bbox + UNION ALL + + SELECT geometry, name, class + FROM osm_power_polygon + WHERE zoom_level >= 10 AND geometry && bbox + ) AS zoom_levels +WHERE geometry && bbox; +$$ LANGUAGE SQL STABLE + -- STRICT + PARALLEL SAFE; diff --git a/layers/power/power.yaml b/layers/power/power.yaml new file mode 100644 index 00000000..e05347d5 --- /dev/null +++ b/layers/power/power.yaml @@ -0,0 +1,39 @@ +layer: + id: "power" + description: | + **power** contains power cables and lines. + buffer_size: 4 + fields: + name: + description: | + Name of the feature. + class: + description: | + Class is derived from the value of the + [`power`](http://wiki.openstreetmap.org/wiki/Key:power) tag. + values: + - cable + - line + - minor_line + - tower + - pole + - catenary_mast + - plant + - generator + - substation + - portal + - transformer + - switch + - insulator + + datasource: + geometry_field: geometry + #query: (SELECT geometry, class, source, method, name FROM layer_power(!bbox!, z(!scale_denominator!))) AS t + query: (SELECT geometry, class, name FROM layer_power(!bbox!, z(!scale_denominator!))) AS t +schema: + - ./power.sql +# - ./power_point.sql +# - ./power_polygon.sql +datasources: + - type: imposm3 + mapping_file: ./mapping.yaml diff --git a/layers/power/power_point.sql b/layers/power/power_point.sql new file mode 100644 index 00000000..925bfd78 --- /dev/null +++ b/layers/power/power_point.sql @@ -0,0 +1,7 @@ + +CREATE OR REPLACE FUNCTION layer_power(bbox geometry, zoom_level int) +RETURNS TABLE(geometry geometry, class text, name text) AS $$ + SELECT geometry, class, name + FROM osm_power_point + WHERE zoom_level >= 10 AND geometry && bbox; +$$ LANGUAGE SQL IMMUTABLE; diff --git a/layers/power/power_polygon.sql b/layers/power/power_polygon.sql new file mode 100644 index 00000000..f3e51f8a --- /dev/null +++ b/layers/power/power_polygon.sql @@ -0,0 +1,7 @@ + +CREATE OR REPLACE FUNCTION layer_power(bbox geometry, zoom_level int) +RETURNS TABLE(geometry geometry, class text, name text) AS $$ + SELECT geometry, class, name + FROM osm_power_polygon + WHERE zoom_level >= 10 AND geometry && bbox; +$$ LANGUAGE SQL IMMUTABLE; diff --git a/layers/skiing/README.md b/layers/skiing/README.md new file mode 100644 index 00000000..17891461 --- /dev/null +++ b/layers/skiing/README.md @@ -0,0 +1,9 @@ +## skiing + +### Docs + +### Mapping Diagram +![Mapping diagram for transportation](mapping_diagram.png?raw=true) + +### ETL diagram +![ETL diagram for transportation](etl_diagram.png?raw=true) diff --git a/layers/skiing/etl_diagram.png b/layers/skiing/etl_diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..3a9b844257c8f0d441137df802dd38b70fca5a64 GIT binary patch literal 9277 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 E0Lcyi)&Kwi literal 0 HcmV?d00001 diff --git a/layers/skiing/mapping.yaml b/layers/skiing/mapping.yaml new file mode 100644 index 00000000..ebfb4e9e --- /dev/null +++ b/layers/skiing/mapping.yaml @@ -0,0 +1,27 @@ + +tables: + # etldoc: imposm3 -> osm_skiing_linestring + skiing_linestring: + type: linestring + fields: + - name: osm_id + type: id + - name: geometry + type: geometry + - key: aerialway + name: class + type: string + - key: name + name: name + type: string + mapping: + aerialway: + - cable_car + - gondola + - chair_lift + - mixed_lift + - drag_lift + - t-bar + - j-bar + - platter + - magic_carpet diff --git a/layers/skiing/mapping_diagram.png b/layers/skiing/mapping_diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..8100fef3d2ad227ad87f2a88531ef90648a306c0 GIT binary patch literal 12486 zcmb_@c|4Wt`uAJ|m;&^IFk0PSZiSOoJaYYQ~tlxir>(7^IdsF7Vd39sH*SFMZ+W7lx+2xg$ z>ZUmEe7B!>6GYs*QgW3tBrGkje7Mc-;o)(Di7D(5At_1EehB^bcaD>ChYuhA)Y?kM zs+oPm%q*>Dg_oC?SxAV!t*vc&V?#<^{S=?=0M_5%pLv~{CQdX<{Yty$ojV~KS(-Pq zI$tzkvGtNquoh7tii;Z~l|?Vpg-C5I^j|!F{P_2_Hs*^;3E@3G+B4p=_-F3jyXUyO zVUwAY6aD)2IlMCl9xHwt{m5aT*RNmKYZ-W+Usza3X`eYKEUfq8c1}k}M^Cn0?yFZf zjg5`Zv9T#U4GKz2O_gY9XgGJ_f>gR<`~@2u8{6J#xYlJ3j+n(oTLI_!SdDlLhR2e0 zg-8LDdUviX2mi*#;-FRG(pYT}ABE!2*Cp@Yt0FSS#wndEI84EtH}xqV2m5>YH@fl+ z>s0P|AU16bP_3LN(`Fqs$4GhA5{II}aFgNnL zbvv(D9hQ=myqVW6k=K2eh2^vQ(D(0;!^2NBC5g}*c<&XeafV4HmzR}|%+1Z+@5f+X zmxy2JhR3S-_|ai$NMzunJ2jce+BcsE#|aJ%dF|SqqNIG4n@gIQm`Js|Yfxr=z7hG> z-hPOQiRn$J%g^Iw1XfB>Tbl+M z>B`ad?NU@$miF=z<>KPHrK?L!?ry~MPCTdkQbdK05SMZyyjgn#5iR3JXzzpG|>UQ|x{^4X7=&?dF2?FTnGd1-{o=?O*5xVElteA5eF zc^#^f>Oytuf*_QO~j;_XX7kqoPjXoe>Za_}ZbdowDG`AZm{1 ztE-MPKYoNidv-Dqi?w$x3hytrYh0UYKhMGS>dL(n^!)jAJd>gh@79(p1Hb*J(eXfReeDx$y`o;Zvm*YX zL+81;RORI4UPH<&B?_JoqGCUZd_Q>hV6KZjj?3(6rkA^WIh_A7GO`#*zIzrH@7~y1 zkDH6_#;L2TW2+6r=jW~Q&cwyV`QlbPwG3qC+;(X_Y+jwV~ynp3OZcitB+j7%-&ZNaycMVs0S0Ul>@H$cS{g>F; zd80c!I*uZN!NK=0Jx@ttku;eh^8wU~)z{M0Btm2r6h6F_$6#!y!{wehiIYdTA0;D` zHZeInJ2yv8OMCCibsCaymW2pgMt)Fm@D~V)?Ah+_?z6D7Dk>^(va-0N=>t$yl}K$v zkjmXfA>p-e61Otdf6UF%^E{uLy8Fc6{|Z&3Va&+TkUr%3VM4;x(o(liWsua4ehRsP z^)~SC+QvpoMg}1q7S*ox`P4sPKw~c{>Gamt)~Cis;$hFtK_8nQRu@S&0$)74sy)7^ zPoLh>(h6v4Q40FG3V|`PL9~72EO}`NKos(>Ou}j@bYbFaBw@DQK%Oa^%i;iSzV`R_ z_K4)7CFW5#5B_w>meEFi? z^i4%ol?AG)QtP+2ssT+lxbl0~l`*&!KLuo7=!e2WS$X*&>%p>4+X1+sGr#Up^3s^b z7>>sGW{sv$B2(HdCT22{pTjNi&QM%Xc=vYr+qX0Ed^XSO>t$53I#1HlUZ%fp`ysw* zLs@+xdNZuHwN)7&WfCIUd5-M*a~w`er`R@8AxT&VVA-rITgP#EgcMdp%?{Ps0|vi`3C_epcPNI#JQl(Rj%7t9NFfhC|*m;3i&R2U?!9 z>n<-852s{h5yPIjE);f;EG>mqR0wMYNWmq}pj)a53H0mNuki42pHH7|Wa|_V5L2;z zg4%!0X-YvWKpOpAD1E2g`d3%*m!&5`$zTFI3mn5dt=T0hn>v znAeG~8>n!jXcgUMX8-KH+6O+&In0 z!;zPpi+ih)^|I5F((|4DOQ+4e0+Tw@^4<6E-=7K$0O}QnZVg6Snh>6QrAyZ?PSe!d z))rU3R2lUCJr|o^$+sy7C@|=+nw^~uPf7|^7TrD!wWRoMOjOj9K#GegZ{HFPd;B~u zE-wD=ZZlmL;h}}&IoCK^TUu~{HLtqo9OirSjn?}11?HoJj$#hGZ_MYHFZq&*-eQAe zqC1VAR!mQk4gLOh@&T>;=3;FlN0oK{()ToZY*<*a%()O3Yk7J3l@2v!JOl+0M#d0` z(~j`DUtR;3K*EAD;r<0)mv1o!#{Is$t?hU88aW|D*Hr&q=bXd=qQh zR;xFFj>=PVp|`{a237+LwBOr#0C`1ndpP!1(LWH!_1aapu`hvuH@=}Ni+?6IHbpiZ z)eEz;kMr{KOc?3Ud7(ALgbqE)?ve*{RLB`&;epKY;6PqPA$ED>WS7`i9vYJR=4MH2 zYxLCAuTXZ(5^{(2(Itz-j$Y`3X!SxPFXkvQ@uB7JbGouKGc)zAtF3HT6>m-#+^j36Q+A`-T(gEUL8hs#~a1_uX^9y{jX0Hx0K z3mRN392{f?cbh+RcyG(k_ZO3egoONMu(A?sXlP)Af+TL<#Jk%R%lWzoizPJnkkG^v%<#!e) z)pwOx=<=_IVl6z-TF!G=;RO^_DpF$R-!O0#wvXjvCUAGY+jYahAA#6>IU6R7UwB(2 z`zHl?TRr-%)8{!k+l)!AwP+T@!yknfcURphcQ)Ew9PD{#bO@M|ik_ZuHVtrKQ~M@f za<{0;N>QzVYbo>VOC#03h!0fUt(_ef0fAo2Hrmib7g-!duChqLZ>dqVNEGpcaDv)Z zppy*g7STV#!iB*k8DdMc>&24mzX1>TItEs}HHA%#oiNV^^Qry{@FC{f~bYUUn&6`Ws11033 zKs56WN*#{?>IWnzGvVXoqiScM#6e=zrQYixcyezJva)8eGCMn)JP;6#;S2_oiufSm zg;w2il9GNjBm}+h&4Q3{N>~y>WXf;a}E+7Cbr*`VymJ;j)ueg z$rF&YDJn(`m4NG{AyS7%s`p9xI?T8s>hdKv zwlA+`BbUEkOdfHm+D()kgkr9cEXt@`WL-U46VL|I58}gPqu0E?sp(6Sh&$UX0Re$= zT__{J*DroSAt8sIwR;oO(_zlkgs1+DLo3Aibo}`qFw$hY zB{5dWC0B!FDyFQci0{{|R+TuMI#jO{r%pX_`#HsY{W>*}hIjmn5ZA8jomwiIngl>h zo;*2R@v}w9bw0n&x@ZAAx>0^0z@b;-lby|`uA#wv^(yI+BS&I6P5jk3p^C7ega%fG z_&;B${?q38hpU0Z*Bwu>8I=(RCnN+-d;C})ut7c z*AszQ8KZ=0pinPXa&t2D-_F-oS+ubrH{9GxCAT{=)l_tKL5@%zK5|5$g9^muaTJ;s zo7*Ym%*R37v+V5bSa)r%Z9c|YF#N`*#n*Xxt)0wpu-ASQBYRMFYzCDKUS3{D|E*}^ zA2c(a%KjI_$T_|LH%#Qw&DJGgaiCN|n*`TOL~r!*c-stA{fmYK0hUKqy8&mPe4CZE zQp2==0(jI`d-6VdSfgNG^prTHHt(<)%kdQy6hy?t1fUcI!c@D`qcl@rRrMt3np+wg zeqe)`nwc3jzu*ON0m_Yb`Pad2)q$0R*ZBbB*gCtsii2%}KFGdBUla6pp!frZ5B4{= zw#LIy<)gNpk?i#}npF$`ozkU{z$t)(ccx!Y#xJ~8zXIaMaJC~8@yXK4W8veY0))H7 z%1XcX3u3kADJ83Q(y+?LN#j4#+x8I|&&h~6zkq<${Cx8D^>u7;Fi-S#a71``PWkMe z`v4Rd9+EUM15(2= z;C^}jCNJP~NEjNPah~saG+q~$3bY_YIa$ifYd^f7=PG+rax$53wNF=<=ET&LpvS&i zhSKQA%^~{LZE0~mJqBb1yb}J0YnQ05>irmls{Td{WrW3O$W`pjX2CA|%B2Ch#2<2- zW<-%HT@cq8{qf#>6PR^>Pc5c6r>2vy8Q~{AoW1;OqqwRTs{P|*6c=6=7kAHyu7|bj z{|eoh1HYxdp+Q_jgA!={ty{NzXu0q5Gg1St(4gjnX_$VVG&q14l#_x1ptS-dAaKIq zT*>js7U>Miotsmd_^CI5rrsexNlxyD$`j0i9jLXfjea}unf$eX#Y>O#$}HWNttn^(vgeB%-6R1hsP#>KYyQ)-`5GaFj8k%MU#tSgI%o zqN8XE@TCa|fE*F%#Qm)Ssv(l76wuM3Zc%s}6!IBS(bI&a4DVY#$^?I{gn56d4WiBm6aoS>n1Uwh1*HV++qYLd zel}kRVp{!z*Xov@p7r%~U{2P!MK^bM_g9)(X;*a3+(&#S zCQQ|Ifb1iN;3pm>BEm=3*49V_?gAOtMfqba`JbxeQ$J#A!3Q2d|L%_;l5c6UH z5eKMP-`L3A3HA(6Coc_&g^i7*t!=Kc=NT53RvaNbVN;3yC_ZRI6irJ?_)ncWWrz!= zJ#^Y+|K&K~;&KCP-UxVzC&=0KD`={=o9#}}(_6i5@9224&|jQdQbGgx#eKKw6TMx< zBd|l%68FjEUW}iQ!CEMc116!12n8o}$)Vr|>+g*?^l$#K{IoceuY^%tg!n({3PlbV z_2mnuU7W+$2<;BYjVD56t3d_RV?-%|i5|uui{l;tc0!*B$|4^6M_4kbX0T`iNtfQN zbKQ0THRZ@poIt>)%+}7w2RlM@{co%}!%x~!lkzP)uUHiJG1o!qNP2|wHrg86zI=yq zsfyJGRaQ-)M-+sP6?BNUM5o%S`*48?keEo|s zX08L9b1@9+k%fYTGf82-7jPA*X9|-*Hc(OoIw0Tsz$<76&@NW+!4+g=wlfPG5+Z4A z%mV!Y>mtvwFUQz)-kV~72dZj401WPw?$^Q`BO2Tu&a=6>8RP`t0w`AL`}cVum|u3! zEhOdrx$qRx$^*p&cRZj6vSIZMD(`Tj(A})&R&sD=StHr<{3*;BA)Hbk$4+?guOWl10T1fG^21He#-7E0z)_olt~FNQJ*Jce!pN_)3rytk=M z&CSaN*&vlO_@`d{j#gR*z;!e?P8DVyI>Vy+V*7*3uW`6e$b})Gyqp2YpdgeIp(rmz zp!>@&sOAK@iZ{CZuugr35P&7ajNWpAHo)MG`V}BwBN<|Qmw)Z;jZRMofU0}>{{8pS zqQ43HPg4TB$zrUmjiYB61k zW@i3vq=LKY>onbBw9r@hV`iorssZPNS@o=)Jr0K}(L~Vs=qa{i0{svX9qq?a_3I>b z#Ez({s#+(t51Bc>+yey_E9Nb_2(%c~9TbdXCHH4eqKpmd_y~}~qa-9BELksKKIZ1; z27Lc2D3*MWZAa0UvX}`0qBvkQ($_8|qwEY^&;QJ(tev7~bKqI1v3RY|YJ9=rSU5S! zp}E1=DiAgC@aI&s>(a+fG%}29{Ew%vrlhcB-!3F7EiLW&=w7U$`$v75uOx$F)rGPr zbGR2^AFTA%zm%1?`-U+ke>SOmrvw6?=}G?|60%T3_s*R=%j@fm*8txgbzR0E@^weQcmUiyJHQeA_1_1wl^5hABg%~^g zapczR+m@Y+U<%~hkAA*64sEB_8i-5b2Gm*v4)_XaVqF-Mw2~4j^k!FAR|!P;;1H1T zKhwp&9Hu|jHOuG|WFN%9#%j+{u7kv~-&!^T1N3ET>Y-%M4O%cq^37XMo0o&1dfEqN z_-ASA&UJTmj7*Ci2%r`NXlbLBvD&R>J1<|b3bV?jaE*FuY7|9w!(iTx z6#{4gX3ye(fo$OKt6|moE`0ZuYL;y1MjU>sbbII9I|WM~sFl+`!?heSCy? z9@j5M3IIyeMaDA(MiWGzgq>Yp)?=0eW^riLtcaU!9Q6@{7dc9xpH3 zw;N!ZwJ&yqVNng(F3rJ3r_w5RAiTdEAXXwsl41m~G7(1*FAz|#ww|0edqDYiH-^R= z**Y?{4NPL2`Y1$6W{r%w7lNFyLuUct?8m{Cl2KN6d2k8yRN(%P@Y-;3CluBPlD1<_ zb;nU(alo$=YA1_JP1S3ttr;WeA7K3lX9Qo^Mlleui03VePPiw(jjxdv{y}E)wq@uV zrEtE2&_Kl^xr6pmfI8r*C?)Yhn`Z5E>)Ib5@`CmG*w;7TYwsZx2g2?=18Hc<0~C>; zJ{<~-4mLjP?~%wY?{C_1ev-mP#`8=6ms#G+{PAMThZ&3H=G|NWYS`aiYphU$Zl2dp zd-CVuVJ1+s+WE#uuCTJ^^x6E4jn-x=h6kTwE?Hr zuTHHZ)3etsNMHcN6i`l8MTMEb_hylGFAHK?`;_uM7;b8A&dx)~dH+n0`z&umc*S`wF%yGVlGl(zb0f>tUkpAc(f?%T3=b9SHtWG&a z#gI(fe>9S0w6$ZwQjwRI4uEb9P{LrapcMQ1`UpJ90{w}77=&HFbsC+xZ0X~%eIjy> zGx#g-<=WW$(a)d1XaE=9=J{}in;Igct{&Cw+!R^W&>)9*21GH{I`lqSk%{pzv7$={ zzkaqR%H^4P;ug_iR=Ak+srRM~3Ccq{tI<&R~=@UO05fOnP zANB1XRA5n&p56@rL5M)f)9%<^ZREg1#CF=k*c!kIOLz*fUW532_`s9p3FV3Ldp1o= z5gI4WU@d;*->IS&+y1JIAO}Ci4ot2Hfi6W1!3d>#K+U0Vou3R=1&U$}>1`GY2T9kA zKKo4WMJj;29T?Dq6A@2syOE}PGso+ikqY$SBnLrBAU9-Wu##?Y#%e1=We7o2?)_TZ|k-9x?fY z5`6tvyzcqvWUa6tEL)^<(CvHdcMsu-_Av;2h2%uDCF*CuGO}QVKv!{^Zy4&psX)Ja zN?fDMrt8eKHrIt`bECOU=^ZhQhe~^y#IcBYs>6`J~W~cZ_g#4D$+Zb+1U#P_n|$iU1I-AGHxYw`wua* z9&?Drg)3^w)_wc2P~NiOEwMoX+w-oL2RMx5V0U+2XD@ajVFf?#FW8?Q4^|H}`M{_? zgjNb*f6xv0+Z=Ll&2*ZYoHT;ICa3CyIIsLcTt(2_Q>NOFP2I$hb9M&>9{W7bxPsq5XmOFSW;m!c7o>m;S+0??aAbGj*KDO_nda!Q6t}wSDWg16qfoiu`;PU@8|QFDg^n+1bVMT0Nh6 zXfijwv^v@N-ny3y9gKi(iQCRhMp{|fZKVFmF$#vKDj2li4~@yos3%q1->(ahd0s$3 z2Ux!UuO$9Hc$mduLig^oN&~Hnow$+2bY6<}g=wqZ&RamG|1j*K(u1LYb!2tmg zX`bXJg)(i8%~tRI0vL>v2AXdMcEf5+)i1O9CGrSzDf^=E{H;Nopo<&r6eiBN8wGxE zFl+}y_CLNco0^&im%loR8_vb4R)K?rC%mN)h{OM=9|oNU=>O6JPs=5(JC7SHd@5W6 zMt~2Hb5!bBb!Ed%h#AVbGgUL~p*!5}^6VL|vDNpFn;_ecuZ(NN6Lj2~<0xwqbn>nF zIoHjHa^=!Kng~fA-uQNF7fncM*A@Y$}sd)PX|E=FBDjIlQU3>Cz1F7!;*jSpzyx4^HZga z$R*Du_pzlV4iKriq^)N2cb2eHeP9Dmyb3t|o~CR9#&eK~Hfg44XjsW=Xhe59*gI<1 z7qp66?JO?L&qu-aOCPSk&DJaZKEeR4*Mv?aY=#_SJ?GhOJ({B27drUO@e^aVIMFOw4}-l=)_EQtbs#g+=kocKsR;V?ng_>Tt<-8d+EfC+hkXhPiUcfafKd_5 zm+gtZ;b8+r#>nWEWT}IOw$qdtF>s0)X(mr~=cOT=;)PciGN-b>b^S4;^5Kn8RJ0i* z?=uIX$e82n1+;IJC7PG?_DV}kn;zKNadcSnLM*UPrH4Fy`dB|N0DM0T=1FD+KmvHE zu_Eq#mHRtZYNacho?2QlgMO3@jNK+27u;=7FBEDIShqL`z-6$J&q8lub7{Ell|%px zkOhGqYBKXZ4Y+kJ%m)U7G5`yg?6Uvk$M~jq?~bk1G1b8r5d`3^j>BsuhpjMu~Bp7h%a6BVXi5sha)eZgq{fa?mF#Y1<`r}mq z*j8+J-~W3?N0GG?pNuNq~Gg(JFcK`C~+FtcPVfn123J2?(Syr`y97d&D{3Z zyN~!(zyK2P<*9hPhT*-z;p43S5Uh|BClHW=V7vLJqf>8(Hina?liZaaKYq+m$yx`_ zrR_k;@ejxEPnR8_I{d(S!+pMLf3C_D+NUX1eQIRgU&yfeuj ztAT^gA?wm99$?Mjf3mcgzOlfMMmisd(?)?qk+R&T-D}YpawaNc2I&f`?yJDqIHUWC z1fk7{$XHorN!XCBH@jR&f7Aedp)<%ih}nH;FzCX}g(PMI8tXyGi4du?px)4#x<*hB z{*=DhdLXJte86TB2QLYYb5Om6^Hm~{>)>C}T5DrDUu~?eo{W||56Tk_bE0c&nOm?~ zY1!Edun~uSg!i|`sdhuAMLf3N{enA|BjHdOOWl5^H*ZLB$sQ*rra)8;4D3|Az>+Lh z%1vx;3})D~o~O;3cnDAQ=$Vz|U1Ep3lw9UoB=jM%1gl>tlntSLmU!;+@!1UpQ|r6p zA=gZBBu&X;Oi%`U${w&noq%?}GKr8sP@|geZdA?GK#&rHe>`fpKV_E?8V{z&2N<+M zK7lE?LUyoBhMHk8jI#`^OK9*p`1W`1Fd~MZpB$4>Q1}8tvt}2|En2>=v=#}snAf}O-@C|qZfQx) zEy0sQM&<0Az++>Ji;H2Sf&bHN>>95%Umr$E!vqZJ6_*aHpvI5P<#Oi*E>9QeIW=bG zRa)}4bWxc{&VkbY3KpUn(BiSl$@5@PaGAF-^n#6X|G|T}*(1O`J(8)YsQQ}d_kT@` z#gExvAha*i`%;PmCY^)Oix`2OUMxw)*qr^Ukju7SiFj(j%-oy=Sc#~Ob%dCTq?9oi zoz;{RaGD}PHS0*}bW#nO_m)He^$^WhN;(ldt>+JvYxeXAUa(_wWS+c!1L~GREnR_D z(->T?*RLT@u59RaXs5w64;aq?;~na_XtO(ZAH=9@pNnOTs${D3yKk_8I9Ud$7=w!L z@&KI?&~XO&kC!VXFX&;UL9=2pM2h4eZl_RQeXg+g= 10 AND geometry && bbox; +$$ LANGUAGE SQL IMMUTABLE; diff --git a/layers/skiing/skiing.yaml b/layers/skiing/skiing.yaml new file mode 100644 index 00000000..b30bf55b --- /dev/null +++ b/layers/skiing/skiing.yaml @@ -0,0 +1,32 @@ +layer: + id: "skiing" + description: | + **skiing** contains skiing transportation for passengers. + buffer_size: 4 + fields: + name: + description: | + Name of the feature. + class: + description: | + Distinguish between aerialway values. + Class is derived from the value of the + [`aerialway`](http://wiki.openstreetmap.org/wiki/Key:aerialway) tag. + values: + - cable_car + - gondola + - chair_lift + - mixed_lift + - drag_lift + - t-bar + - j-bar + - platter + - magic_carpet + datasource: + geometry_field: geometry + query: (SELECT geometry, class, name FROM layer_skiing(!bbox!, z(!scale_denominator!))) AS t +schema: + - ./skiing.sql +datasources: + - type: imposm3 + mapping_file: ./mapping.yaml diff --git a/openmaptiles.yaml b/openmaptiles.yaml index 21df9e13..abdd1b9f 100644 --- a/openmaptiles.yaml +++ b/openmaptiles.yaml @@ -1,5 +1,7 @@ tileset: layers: + - layers/power/power.yaml + - layers/skiing/skiing.yaml - layers/water/water.yaml - layers/waterway/waterway.yaml - layers/landcover/landcover.yaml @@ -17,7 +19,7 @@ tileset: - layers/poi/poi.yaml - layers/aerodrome_label/aerodrome_label.yaml name: OpenMapTiles - version: 3.12.1 + version: 3.12.2 id: openmaptiles description: "A tileset showcasing all layers in OpenMapTiles. https://openmaptiles.org" attribution: '© OpenMapTiles © OpenStreetMap contributors' diff --git a/src/calculate-centerlines-new/Dockerfile b/src/calculate-centerlines-new/Dockerfile new file mode 100644 index 00000000..7460a81f --- /dev/null +++ b/src/calculate-centerlines-new/Dockerfile @@ -0,0 +1,16 @@ +FROM python:3.8-slim-buster + +RUN apt-get update && apt-get install -y --no-install-recommends \ + ca-certificates \ + git \ + && rm -rf /var/lib/apt/lists/* + +RUN git clone https://github.com/ungarj/label_centerlines.git +COPY *.py ./label_centerlines + +WORKDIR ./label_centerlines +RUN pip install -r requirements.txt +RUN python setup.py install + +CMD ["./calculate_centerlines.py", "--output_driver", "GeoJSON", "/data/osm_lake_polygon.shp", "/data/osm_lake_centerline.geojson"] +#CMD ["./create_centerlines.py", "--output_driver", "GeoJSON", "/data/osm_lake_polygon.shp", "/data/osm_lake_centerline.geojson"] diff --git a/src/calculate-centerlines-new/calculate_centerlines.py b/src/calculate-centerlines-new/calculate_centerlines.py new file mode 100755 index 00000000..f7959674 --- /dev/null +++ b/src/calculate-centerlines-new/calculate_centerlines.py @@ -0,0 +1,155 @@ +#!/usr/bin/env python3 + +import os +import sys +import argparse +import fiona +import multiprocessing +from shapely.geometry import shape, mapping +from functools import partial + +from label_centerlines import get_centerline + +def main(args): + + parser = argparse.ArgumentParser() + parser.add_argument( + "input_shp", + type=str, + help="input polygons" + ) + parser.add_argument( + "output_geojson", + type=str, + help="output centerlines" + ) + parser.add_argument( + "--segmentize_maxlen", + type=float, + help="maximum length used when segmentizing polygon borders", + default=0.5 + ) + parser.add_argument( + "--max_points", + type=int, + help="number of points per geometry allowed before simplifying", + default=3000 + ) + parser.add_argument( + "--simplification", + type=float, + help="value which increases simplification when necessary", + default=0.05 + ) + parser.add_argument( + "--smooth", + type=int, + help="smoothness of the output centerlines", + default=5 + ) + parser.add_argument( + "--output_driver", + type=str, + help="write to 'ESRI Shapefile' or 'GeoJSON' (default)", + default="GeoJSON" + ) + parsed = parser.parse_args(args) + input_shp = parsed.input_shp + output_geojson = parsed.output_geojson + segmentize_maxlen = parsed.segmentize_maxlen + max_points = parsed.max_points + simplification = parsed.simplification + smooth_sigma = parsed.smooth + driver = parsed.output_driver + + with fiona.open(input_shp, "r") as inp_polygons: + out_schema = inp_polygons.schema.copy() + out_schema['geometry'] = "LineString" + with fiona.open( + output_geojson, + "w", + schema=out_schema, + crs=inp_polygons.crs, + driver=driver + ) as out_centerlines: + pool = multiprocessing.Pool() + func = partial( + worker, + segmentize_maxlen, + max_points, + simplification, + smooth_sigma + ) + try: + feature_count = 0 + for feature_name, output in pool.imap_unordered( + func, + inp_polygons + ): + feature_count += 1 + if output: + output["properties"]['NAME'] = output["properties"]['NAME'] + out_centerlines.write(output) + print( "Written Feature %s: %s" %( + feature_count, + feature_name + )) + else: + print("Invalid output for feature", feature_name) + except KeyboardInterrupt: + print("Caught KeyboardInterrupt, terminating workers") + pool.terminate() + except Exception as e: + if feature_name: + print ("%s: FAILED (%s)" %(feature_name, e)) + else: + print ("feature: FAILED (%s)" %(e)) + raise + finally: + pool.close() + pool.join() + +def worker( + segmentize_maxlen, + max_points, + simplification, + smooth_sigma, + feature + ): + + geom = shape(feature['geometry']) + for name_field in ["name", "Name", "NAME"]: + if name_field in feature["properties"]: + feature_name = feature["properties"][name_field] + feature_id = feature["properties"]["OSM_ID"] + break + else: + feature_name = None + if feature_name: + print ("Processing: ", feature_name) + + try: + centerlines_geom = get_centerline( + geom, + segmentize_maxlen=segmentize_maxlen, + max_points=max_points, + simplification=simplification, + smooth_sigma=smooth_sigma + ) + except TypeError as e: + print (e) + except: + raise + if centerlines_geom: + return ( + feature_name, + { + 'properties': feature['properties'], + 'geometry': mapping(centerlines_geom) + } + ) + else: + return (None, None) + +if __name__ == "__main__": + main(sys.argv[1:]) diff --git a/src/calculate-centerlines/Dockerfile b/src/calculate-centerlines/Dockerfile new file mode 100644 index 00000000..1442cb89 --- /dev/null +++ b/src/calculate-centerlines/Dockerfile @@ -0,0 +1,30 @@ +FROM debian:buster-slim + +RUN apt-get update && apt-get install -y --no-install-recommends \ + gdal-bin \ + libgdal-dev \ + python \ + python-pip \ + python-dev \ + python-gdal \ + git \ + && rm -rf /var/lib/apt/lists/* + +RUN apt-get update && apt-get install -y --no-install-recommends \ + build-essential \ + && rm -rf /var/lib/apt/lists/* + +RUN apt-get update && apt-get install -y --no-install-recommends \ + python-scipy \ + python-setuptools \ + python-shapely \ + && rm -rf /var/lib/apt/lists/* + +#WORKDIR /usr/src/app +#RUN git clone https://github.com/ungarj/label_centerlines.git /usr/src/app + +RUN pip install wheel +RUN pip install networkx Fiona + +COPY *.py / +CMD ["./create_centerlines.py", "--output_driver", "GeoJSON", "/data/osm_lake_polygon.shp", "/data/osm_lake_centerline.geojson"] diff --git a/src/calculate-centerlines/create_centerlines.py b/src/calculate-centerlines/create_centerlines.py new file mode 100755 index 00000000..09160e81 --- /dev/null +++ b/src/calculate-centerlines/create_centerlines.py @@ -0,0 +1,186 @@ +#!/usr/bin/env python + +# Author: Joachim Ungar +# +#------------------------------------------------------------------------------- +# Copyright (C) 2015 EOX IT Services GmbH +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies of this Software or works derived from this Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +#------------------------------------------------------------------------------- + +import os +import sys +import argparse +import fiona +import multiprocessing +from shapely.geometry import shape, mapping +from functools import partial + +from src_create_centerlines import get_centerlines_from_geom + +reload(sys) +sys.setdefaultencoding("utf-8") +print sys.version_info + +def main(args): + + parser = argparse.ArgumentParser() + parser.add_argument( + "input_shp", + type=str, + help="input polygons" + ) + parser.add_argument( + "output_geojson", + type=str, + help="output centerlines" + ) + parser.add_argument( + "--segmentize_maxlen", + type=float, + help="maximum length used when segmentizing polygon borders", + default=0.5 + ) + parser.add_argument( + "--max_points", + type=int, + help="number of points per geometry allowed before simplifying", + default=3000 + ) + parser.add_argument( + "--simplification", + type=float, + help="value which increases simplification when necessary", + default=0.05 + ) + parser.add_argument( + "--smooth", + type=int, + help="smoothness of the output centerlines", + default=5 + ) + parser.add_argument( + "--output_driver", + type=str, + help="write to 'ESRI Shapefile' or 'GeoJSON' (default)", + default="GeoJSON" + ) + parsed = parser.parse_args(args) + input_shp = parsed.input_shp + output_geojson = parsed.output_geojson + segmentize_maxlen = parsed.segmentize_maxlen + max_points = parsed.max_points + simplification = parsed.simplification + smooth_sigma = parsed.smooth + driver = parsed.output_driver + + with fiona.open(input_shp, "r") as inp_polygons: + out_schema = inp_polygons.schema.copy() + out_schema['geometry'] = "LineString" + with fiona.open( + output_geojson, + "w", + schema=out_schema, + crs=inp_polygons.crs, + driver=driver + ) as out_centerlines: + pool = multiprocessing.Pool(1) + func = partial( + worker, + segmentize_maxlen, + max_points, + simplification, + smooth_sigma + ) + try: + feature_count = 0 + for feature_name, output in pool.imap_unordered( + func, + inp_polygons + ): + feature_count += 1 + feature_name = feature_name.encode("utf-8").strip() + if output: + output["properties"]['NAME'] = output["properties"]['NAME'].encode("utf-8").strip() + out_centerlines.write(output) + print "written feature %s: %s" %( + feature_count, + feature_name + ) + else: + print "Invalid output for feature", feature_name + except KeyboardInterrupt: + print "Caught KeyboardInterrupt, terminating workers" + pool.terminate() + except Exception as e: + if feature_name: + print ("%s: FAILED (%s)" %(feature_name, e)) + else: + print ("feature: FAILED (%s)" %(e)) + raise + finally: + pool.close() + pool.join() + +def worker( + segmentize_maxlen, + max_points, + simplification, + smooth_sigma, + feature + ): + + geom = shape(feature['geometry']) + for name_field in ["NAME"]: + #for name_field in ["name", "Name", "NAME"]: + if name_field in feature["properties"]: + feature_name = feature["properties"][name_field].encode('utf-8') + feature_id = feature["properties"]["OSM_ID"] + break + else: + feature_name = None + if feature_name: + print "processing", feature_name + + try: + centerlines_geom = get_centerlines_from_geom( + geom, + segmentize_maxlen=segmentize_maxlen, + max_points=max_points, + simplification=simplification, + smooth_sigma=smooth_sigma + ) + except TypeError as e: + print e + except: + raise + if centerlines_geom: + return ( + feature_name, + { + 'properties': feature['properties'], + 'geometry': mapping(centerlines_geom) + } + ) + else: + return (None, None) + + +if __name__ == "__main__": + main(sys.argv[1:]) diff --git a/src/calculate-centerlines/src_create_centerlines.py b/src/calculate-centerlines/src_create_centerlines.py new file mode 100644 index 00000000..bce1771a --- /dev/null +++ b/src/calculate-centerlines/src_create_centerlines.py @@ -0,0 +1,304 @@ +#!/usr/bin/env python + +# Author: Joachim Ungar +# +#------------------------------------------------------------------------------- +# Copyright (C) 2015 EOX IT Services GmbH +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies of this Software or works derived from this Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +#------------------------------------------------------------------------------- + +from shapely.geometry import ( + shape, + LineString, + MultiLineString, + Point, + MultiPoint, + mapping + ) +from shapely.wkt import loads +import ogr +from scipy.spatial import Voronoi +import networkx as nx +from itertools import combinations +import numpy as np +from scipy.ndimage import filters +from math import * + +debug_output = {} + +def get_centerlines_from_geom( + geometry, + segmentize_maxlen=0.5, + max_points=3000, + simplification=0.05, + smooth_sigma=5, + debug=False + ): + """ + Returns centerline (for Polygon) or centerlines (for MultiPolygons) as + LineString or MultiLineString geometries. + """ + + if geometry.geom_type not in ["MultiPolygon", "Polygon"]: + raise TypeError( + "Geometry type must be Polygon or MultiPolygon, not %s" %( + geometry.geom_type + ) + ) + + if geometry.geom_type == "MultiPolygon": + out_centerlines = MultiLineString([ + get_centerlines_from_geom(subgeom, segmentize_maxlen) + for subgeom in geometry + if get_centerlines_from_geom(subgeom, segmentize_maxlen) != None + ]) + return out_centerlines + else: + + # Convert Polygon to Linestring. + if len(geometry.interiors) > 0: + boundary = geometry.exterior + else: + boundary = geometry.boundary + + #print list(boundary.coords) + if debug: + debug_output['original_points'] = MultiPoint([ + point + for point in list(boundary.coords) + ]) + + # Convert to OGR object and segmentize. + ogr_boundary = ogr.CreateGeometryFromWkb(boundary.wkb) + ogr_boundary.Segmentize(segmentize_maxlen) + segmentized = loads(ogr_boundary.ExportToWkt()) + + # Get points. + points = segmentized.coords + + # Simplify segmentized geometry if necessary. This step is required + # as huge geometries slow down the centerline extraction significantly. + tolerance = simplification + while len(points) > max_points: + # If geometry is too large, apply simplification until geometry + # is simplified enough (indicated by the "max_points" value) + tolerance += simplification + simplified = boundary.simplify(tolerance) + points = simplified.coords + if debug: + debug_output['segmentized_points'] = MultiPoint([ + point + for point in points + ]) + + # Calculate Voronoi diagram. + vor = Voronoi(points) + if debug: + debug_output['voronoi'] = multilinestring_from_voronoi( + vor, + geometry + ) + + # The next three steps are the most processing intensive and probably + # not the most efficient method to get the skeleton centerline. If you + # have any recommendations, I would be very happy to know. + + # Convert to networkx graph. + graph = graph_from_voronoi(vor, geometry) + graph.edges(18,21) + # Get end nodes from graph. + end_nodes = get_end_nodes(graph) + if len(end_nodes) < 2: + return None + + # Get longest path. + longest_paths = get_longest_paths( + end_nodes, + graph + ) + + # get least curved path. + best_path = get_least_curved_path(longest_paths[:5], vor.vertices) + + #print (best_path == longest_paths[0]) + + #best_path = longest_paths[0] + + centerline = LineString(vor.vertices[best_path]) + + if debug: + debug_output['centerline'] = centerline + + # Simplify again to reduce number of points. + # simplified = centerline.simplify(tolerance) + # centerline = simplified + + + # Smooth out geometry. + centerline_smoothed = smooth_linestring(centerline, smooth_sigma) + out_centerline = centerline_smoothed + #print out_centerline + return out_centerline + + +def smooth_linestring(linestring, smooth_sigma): + """ + Uses a gauss filter to smooth out the LineString coordinates. + """ + smooth_x = np.array(filters.gaussian_filter1d( + linestring.xy[0], + smooth_sigma) + ) + smooth_y = np.array(filters.gaussian_filter1d( + linestring.xy[1], + smooth_sigma) + ) + smoothed_coords = np.hstack((smooth_x, smooth_y)) + smoothed_coords = zip(smooth_x, smooth_y) + linestring_smoothed = LineString(smoothed_coords) + return linestring_smoothed + + +def get_longest_paths(nodes, graph): + """ + Returns longest path of all possible paths between a list of nodes. + """ + paths = [] + distances = [] + possible_paths = list(combinations(nodes, r=2)) + for node1, node2 in possible_paths: + try: + path = nx.shortest_path(graph, node1, node2, "weight") + except Exception,e: + path = [] + if len(path)>1: + distance = get_path_distance(path, graph) + paths.append(path) + distances.append(distance) + paths_sorted = [x for (y,x) in sorted(zip(distances, paths), reverse=True)] + # longest_path = paths_sorted[0] + # return longest_path + return paths_sorted + + +def get_least_curved_path(paths, vertices): + + angle_sums = [] + for path in paths: + path_angles = get_path_angles(path, vertices) + angle_sum = abs(sum(path_angles)) + angle_sums.append(angle_sum) + paths_sorted = [x for (y,x) in sorted(zip(angle_sums, paths))] + return paths_sorted[0] + + +def get_path_angles(path, vertices): + angles = [] + prior_line = None + next_line = None + for index, point in enumerate(path): + if index > 0 and index < len(path)-1: + prior_point = vertices[path[index-1]] + current_point = vertices[point] + next_point = vertices[path[index+1]] + angles.append( + get_angle( + (prior_point, current_point), (current_point, next_point) + ) + ) + + return angles + + +def get_angle(line1, line2): + v1 = line1[0] - line1[1] + v2 = line2[0] - line2[1] + angle = np.math.atan2(np.linalg.det([v1,v2]),np.dot(v1,v2)) + return np.degrees(angle) + +def get_path_distance(path, graph): + """ + Returns weighted path distance. + """ + distance = 0 + for i,w in enumerate(path): + j=i+1 + if j-1 and i[1]>-1: + point1 = Point(vor.vertices[i][0]) + point2 = Point(vor.vertices[i][1]) + # Eliminate all points outside our geometry. + if point1.within(geometry) and point2.within(geometry): + dist = point1.distance(point2) + graph.add_nodes_from([i[0], i[1]]) + graph.add_edge(i[0], i[1], weight=dist) + return graph + + +def multilinestring_from_voronoi(vor, geometry): + """ + Creates a MultiLineString geometry out of all Voronoi ridge vertices which + are inside the original geometry. + """ + linestrings = [] + for i in vor.ridge_vertices: + if i[0]>-1 and i[1]>-1: + point1 = Point(vor.vertices[i][0]) + point2 = Point(vor.vertices[i][1]) + # Eliminate all points outside our geometry. + if point1.within(geometry) and point2.within(geometry): + linestring = LineString([point1, point2]) + linestrings.append(linestring) + multilinestring = MultiLineString(linestrings) + return multilinestring + + + +if __name__ == "__main__": + main(sys.argv[1:]) diff --git a/src/export-shapefile/Dockerfile b/src/export-shapefile/Dockerfile new file mode 100644 index 00000000..5c46ed4c --- /dev/null +++ b/src/export-shapefile/Dockerfile @@ -0,0 +1,4 @@ +FROM postgis/postgis:9.6-2.5-alpine +RUN apk add libintl +COPY export-shapefile.sh / +CMD ["./export-shapefile.sh"] diff --git a/src/export-shapefile/export-shapefile.sh b/src/export-shapefile/export-shapefile.sh new file mode 100755 index 00000000..fce710a1 --- /dev/null +++ b/src/export-shapefile/export-shapefile.sh @@ -0,0 +1,16 @@ +#!/bin/bash +set -o errexit +set -o pipefail +set -o nounset + +function export_shp() { + local lake_shapefile="/data/osm_lake_polygon.shp" + local query="SELECT osm_id, name, name_en, ST_SimplifyPreserveTopology(geometry, 100) AS geometry FROM osm_water_polygon WHERE area > 2 * 1000 * 1000 AND ST_GeometryType(geometry)='ST_Polygon' AND name <> '' ORDER BY area DESC" + pgsql2shp -f "$lake_shapefile" \ + -h "$PGHOST" \ + -u "$PGUSER" \ + -P "$PGPASSWORD" \ + "$PGDATABASE" "$query" +} + +export_shp diff --git a/src/export-shapefile/initdb-postgis.sh b/src/export-shapefile/initdb-postgis.sh new file mode 100644 index 00000000..b7d30886 --- /dev/null +++ b/src/export-shapefile/initdb-postgis.sh @@ -0,0 +1,27 @@ +#!/usr/bin/env bash +set -o errexit +set -o pipefail +set -o nounset + +echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" +echo " Loading OMT postgis extensions" +echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" + +for db in template_postgis "$POSTGRES_DB"; do +echo "Loading extensions into $db" +PGUSER="$POSTGRES_USER" psql --dbname="$db" <<-'EOSQL' + -- Cleanup. Ideally parent container shouldn't pre-install those. + DROP EXTENSION IF EXISTS postgis_tiger_geocoder; + DROP EXTENSION IF EXISTS postgis_topology; + + -- These extensions are already loaded by the parent docker + CREATE EXTENSION IF NOT EXISTS postgis; + CREATE EXTENSION IF NOT EXISTS fuzzystrmatch; + + -- Extensions needed for OpenMapTiles + CREATE EXTENSION IF NOT EXISTS hstore; + CREATE EXTENSION IF NOT EXISTS unaccent; + CREATE EXTENSION IF NOT EXISTS osml10n; + CREATE EXTENSION IF NOT EXISTS gzip; +EOSQL +done From b6e93147b87d2043ec38e25c5d15dc041691840a Mon Sep 17 00:00:00 2001 From: ache051 Date: Sat, 18 Sep 2021 15:27:04 +1200 Subject: [PATCH 02/14] Delete fast.sh --- fast.sh | 18 ------------------ 1 file changed, 18 deletions(-) delete mode 100755 fast.sh diff --git a/fast.sh b/fast.sh deleted file mode 100755 index 75893f57..00000000 --- a/fast.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/bash - -chosen_area=estonia -make clean -make all -make destroy-db -make start-db -make import-data area=$chosen_area -make download area=$chosen_area -make import-osm area=$chosen_area -make import-borders area=$chosen_area -make import-wikidata area=$chosen_area -make import-sql -make analyze-db -make test-perf-null -make generate-tiles-pg area=$chosen_area - -docker ps -a From 7bbca699c5e1e9ac2c3859f8dc0219ac8b7806da Mon Sep 17 00:00:00 2001 From: ache051 Date: Sat, 18 Sep 2021 15:28:13 +1200 Subject: [PATCH 03/14] Remove skiiing layer to avoid confusion --- layers/skiing/README.md | 9 --------- layers/skiing/etl_diagram.png | Bin 9277 -> 0 bytes layers/skiing/mapping.yaml | 27 ------------------------- layers/skiing/mapping_diagram.png | Bin 12486 -> 0 bytes layers/skiing/skiing.sql | 7 ------- layers/skiing/skiing.yaml | 32 ------------------------------ 6 files changed, 75 deletions(-) delete mode 100644 layers/skiing/README.md delete mode 100644 layers/skiing/etl_diagram.png delete mode 100644 layers/skiing/mapping.yaml delete mode 100644 layers/skiing/mapping_diagram.png delete mode 100644 layers/skiing/skiing.sql delete mode 100644 layers/skiing/skiing.yaml diff --git a/layers/skiing/README.md b/layers/skiing/README.md deleted file mode 100644 index 17891461..00000000 --- a/layers/skiing/README.md +++ /dev/null @@ -1,9 +0,0 @@ -## skiing - -### Docs - -### Mapping Diagram -![Mapping diagram for transportation](mapping_diagram.png?raw=true) - -### ETL diagram -![ETL diagram for transportation](etl_diagram.png?raw=true) diff --git a/layers/skiing/etl_diagram.png b/layers/skiing/etl_diagram.png deleted file mode 100644 index 3a9b844257c8f0d441137df802dd38b70fca5a64..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9277 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 E0Lcyi)&Kwi diff --git a/layers/skiing/mapping.yaml b/layers/skiing/mapping.yaml deleted file mode 100644 index ebfb4e9e..00000000 --- a/layers/skiing/mapping.yaml +++ /dev/null @@ -1,27 +0,0 @@ - -tables: - # etldoc: imposm3 -> osm_skiing_linestring - skiing_linestring: - type: linestring - fields: - - name: osm_id - type: id - - name: geometry - type: geometry - - key: aerialway - name: class - type: string - - key: name - name: name - type: string - mapping: - aerialway: - - cable_car - - gondola - - chair_lift - - mixed_lift - - drag_lift - - t-bar - - j-bar - - platter - - magic_carpet diff --git a/layers/skiing/mapping_diagram.png b/layers/skiing/mapping_diagram.png deleted file mode 100644 index 8100fef3d2ad227ad87f2a88531ef90648a306c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12486 zcmb_@c|4Wt`uAJ|m;&^IFk0PSZiSOoJaYYQ~tlxir>(7^IdsF7Vd39sH*SFMZ+W7lx+2xg$ z>ZUmEe7B!>6GYs*QgW3tBrGkje7Mc-;o)(Di7D(5At_1EehB^bcaD>ChYuhA)Y?kM zs+oPm%q*>Dg_oC?SxAV!t*vc&V?#<^{S=?=0M_5%pLv~{CQdX<{Yty$ojV~KS(-Pq zI$tzkvGtNquoh7tii;Z~l|?Vpg-C5I^j|!F{P_2_Hs*^;3E@3G+B4p=_-F3jyXUyO zVUwAY6aD)2IlMCl9xHwt{m5aT*RNmKYZ-W+Usza3X`eYKEUfq8c1}k}M^Cn0?yFZf zjg5`Zv9T#U4GKz2O_gY9XgGJ_f>gR<`~@2u8{6J#xYlJ3j+n(oTLI_!SdDlLhR2e0 zg-8LDdUviX2mi*#;-FRG(pYT}ABE!2*Cp@Yt0FSS#wndEI84EtH}xqV2m5>YH@fl+ z>s0P|AU16bP_3LN(`Fqs$4GhA5{II}aFgNnL zbvv(D9hQ=myqVW6k=K2eh2^vQ(D(0;!^2NBC5g}*c<&XeafV4HmzR}|%+1Z+@5f+X zmxy2JhR3S-_|ai$NMzunJ2jce+BcsE#|aJ%dF|SqqNIG4n@gIQm`Js|Yfxr=z7hG> z-hPOQiRn$J%g^Iw1XfB>Tbl+M z>B`ad?NU@$miF=z<>KPHrK?L!?ry~MPCTdkQbdK05SMZyyjgn#5iR3JXzzpG|>UQ|x{^4X7=&?dF2?FTnGd1-{o=?O*5xVElteA5eF zc^#^f>Oytuf*_QO~j;_XX7kqoPjXoe>Za_}ZbdowDG`AZm{1 ztE-MPKYoNidv-Dqi?w$x3hytrYh0UYKhMGS>dL(n^!)jAJd>gh@79(p1Hb*J(eXfReeDx$y`o;Zvm*YX zL+81;RORI4UPH<&B?_JoqGCUZd_Q>hV6KZjj?3(6rkA^WIh_A7GO`#*zIzrH@7~y1 zkDH6_#;L2TW2+6r=jW~Q&cwyV`QlbPwG3qC+;(X_Y+jwV~ynp3OZcitB+j7%-&ZNaycMVs0S0Ul>@H$cS{g>F; zd80c!I*uZN!NK=0Jx@ttku;eh^8wU~)z{M0Btm2r6h6F_$6#!y!{wehiIYdTA0;D` zHZeInJ2yv8OMCCibsCaymW2pgMt)Fm@D~V)?Ah+_?z6D7Dk>^(va-0N=>t$yl}K$v zkjmXfA>p-e61Otdf6UF%^E{uLy8Fc6{|Z&3Va&+TkUr%3VM4;x(o(liWsua4ehRsP z^)~SC+QvpoMg}1q7S*ox`P4sPKw~c{>Gamt)~Cis;$hFtK_8nQRu@S&0$)74sy)7^ zPoLh>(h6v4Q40FG3V|`PL9~72EO}`NKos(>Ou}j@bYbFaBw@DQK%Oa^%i;iSzV`R_ z_K4)7CFW5#5B_w>meEFi? z^i4%ol?AG)QtP+2ssT+lxbl0~l`*&!KLuo7=!e2WS$X*&>%p>4+X1+sGr#Up^3s^b z7>>sGW{sv$B2(HdCT22{pTjNi&QM%Xc=vYr+qX0Ed^XSO>t$53I#1HlUZ%fp`ysw* zLs@+xdNZuHwN)7&WfCIUd5-M*a~w`er`R@8AxT&VVA-rITgP#EgcMdp%?{Ps0|vi`3C_epcPNI#JQl(Rj%7t9NFfhC|*m;3i&R2U?!9 z>n<-852s{h5yPIjE);f;EG>mqR0wMYNWmq}pj)a53H0mNuki42pHH7|Wa|_V5L2;z zg4%!0X-YvWKpOpAD1E2g`d3%*m!&5`$zTFI3mn5dt=T0hn>v znAeG~8>n!jXcgUMX8-KH+6O+&In0 z!;zPpi+ih)^|I5F((|4DOQ+4e0+Tw@^4<6E-=7K$0O}QnZVg6Snh>6QrAyZ?PSe!d z))rU3R2lUCJr|o^$+sy7C@|=+nw^~uPf7|^7TrD!wWRoMOjOj9K#GegZ{HFPd;B~u zE-wD=ZZlmL;h}}&IoCK^TUu~{HLtqo9OirSjn?}11?HoJj$#hGZ_MYHFZq&*-eQAe zqC1VAR!mQk4gLOh@&T>;=3;FlN0oK{()ToZY*<*a%()O3Yk7J3l@2v!JOl+0M#d0` z(~j`DUtR;3K*EAD;r<0)mv1o!#{Is$t?hU88aW|D*Hr&q=bXd=qQh zR;xFFj>=PVp|`{a237+LwBOr#0C`1ndpP!1(LWH!_1aapu`hvuH@=}Ni+?6IHbpiZ z)eEz;kMr{KOc?3Ud7(ALgbqE)?ve*{RLB`&;epKY;6PqPA$ED>WS7`i9vYJR=4MH2 zYxLCAuTXZ(5^{(2(Itz-j$Y`3X!SxPFXkvQ@uB7JbGouKGc)zAtF3HT6>m-#+^j36Q+A`-T(gEUL8hs#~a1_uX^9y{jX0Hx0K z3mRN392{f?cbh+RcyG(k_ZO3egoONMu(A?sXlP)Af+TL<#Jk%R%lWzoizPJnkkG^v%<#!e) z)pwOx=<=_IVl6z-TF!G=;RO^_DpF$R-!O0#wvXjvCUAGY+jYahAA#6>IU6R7UwB(2 z`zHl?TRr-%)8{!k+l)!AwP+T@!yknfcURphcQ)Ew9PD{#bO@M|ik_ZuHVtrKQ~M@f za<{0;N>QzVYbo>VOC#03h!0fUt(_ef0fAo2Hrmib7g-!duChqLZ>dqVNEGpcaDv)Z zppy*g7STV#!iB*k8DdMc>&24mzX1>TItEs}HHA%#oiNV^^Qry{@FC{f~bYUUn&6`Ws11033 zKs56WN*#{?>IWnzGvVXoqiScM#6e=zrQYixcyezJva)8eGCMn)JP;6#;S2_oiufSm zg;w2il9GNjBm}+h&4Q3{N>~y>WXf;a}E+7Cbr*`VymJ;j)ueg z$rF&YDJn(`m4NG{AyS7%s`p9xI?T8s>hdKv zwlA+`BbUEkOdfHm+D()kgkr9cEXt@`WL-U46VL|I58}gPqu0E?sp(6Sh&$UX0Re$= zT__{J*DroSAt8sIwR;oO(_zlkgs1+DLo3Aibo}`qFw$hY zB{5dWC0B!FDyFQci0{{|R+TuMI#jO{r%pX_`#HsY{W>*}hIjmn5ZA8jomwiIngl>h zo;*2R@v}w9bw0n&x@ZAAx>0^0z@b;-lby|`uA#wv^(yI+BS&I6P5jk3p^C7ega%fG z_&;B${?q38hpU0Z*Bwu>8I=(RCnN+-d;C})ut7c z*AszQ8KZ=0pinPXa&t2D-_F-oS+ubrH{9GxCAT{=)l_tKL5@%zK5|5$g9^muaTJ;s zo7*Ym%*R37v+V5bSa)r%Z9c|YF#N`*#n*Xxt)0wpu-ASQBYRMFYzCDKUS3{D|E*}^ zA2c(a%KjI_$T_|LH%#Qw&DJGgaiCN|n*`TOL~r!*c-stA{fmYK0hUKqy8&mPe4CZE zQp2==0(jI`d-6VdSfgNG^prTHHt(<)%kdQy6hy?t1fUcI!c@D`qcl@rRrMt3np+wg zeqe)`nwc3jzu*ON0m_Yb`Pad2)q$0R*ZBbB*gCtsii2%}KFGdBUla6pp!frZ5B4{= zw#LIy<)gNpk?i#}npF$`ozkU{z$t)(ccx!Y#xJ~8zXIaMaJC~8@yXK4W8veY0))H7 z%1XcX3u3kADJ83Q(y+?LN#j4#+x8I|&&h~6zkq<${Cx8D^>u7;Fi-S#a71``PWkMe z`v4Rd9+EUM15(2= z;C^}jCNJP~NEjNPah~saG+q~$3bY_YIa$ifYd^f7=PG+rax$53wNF=<=ET&LpvS&i zhSKQA%^~{LZE0~mJqBb1yb}J0YnQ05>irmls{Td{WrW3O$W`pjX2CA|%B2Ch#2<2- zW<-%HT@cq8{qf#>6PR^>Pc5c6r>2vy8Q~{AoW1;OqqwRTs{P|*6c=6=7kAHyu7|bj z{|eoh1HYxdp+Q_jgA!={ty{NzXu0q5Gg1St(4gjnX_$VVG&q14l#_x1ptS-dAaKIq zT*>js7U>Miotsmd_^CI5rrsexNlxyD$`j0i9jLXfjea}unf$eX#Y>O#$}HWNttn^(vgeB%-6R1hsP#>KYyQ)-`5GaFj8k%MU#tSgI%o zqN8XE@TCa|fE*F%#Qm)Ssv(l76wuM3Zc%s}6!IBS(bI&a4DVY#$^?I{gn56d4WiBm6aoS>n1Uwh1*HV++qYLd zel}kRVp{!z*Xov@p7r%~U{2P!MK^bM_g9)(X;*a3+(&#S zCQQ|Ifb1iN;3pm>BEm=3*49V_?gAOtMfqba`JbxeQ$J#A!3Q2d|L%_;l5c6UH z5eKMP-`L3A3HA(6Coc_&g^i7*t!=Kc=NT53RvaNbVN;3yC_ZRI6irJ?_)ncWWrz!= zJ#^Y+|K&K~;&KCP-UxVzC&=0KD`={=o9#}}(_6i5@9224&|jQdQbGgx#eKKw6TMx< zBd|l%68FjEUW}iQ!CEMc116!12n8o}$)Vr|>+g*?^l$#K{IoceuY^%tg!n({3PlbV z_2mnuU7W+$2<;BYjVD56t3d_RV?-%|i5|uui{l;tc0!*B$|4^6M_4kbX0T`iNtfQN zbKQ0THRZ@poIt>)%+}7w2RlM@{co%}!%x~!lkzP)uUHiJG1o!qNP2|wHrg86zI=yq zsfyJGRaQ-)M-+sP6?BNUM5o%S`*48?keEo|s zX08L9b1@9+k%fYTGf82-7jPA*X9|-*Hc(OoIw0Tsz$<76&@NW+!4+g=wlfPG5+Z4A z%mV!Y>mtvwFUQz)-kV~72dZj401WPw?$^Q`BO2Tu&a=6>8RP`t0w`AL`}cVum|u3! zEhOdrx$qRx$^*p&cRZj6vSIZMD(`Tj(A})&R&sD=StHr<{3*;BA)Hbk$4+?guOWl10T1fG^21He#-7E0z)_olt~FNQJ*Jce!pN_)3rytk=M z&CSaN*&vlO_@`d{j#gR*z;!e?P8DVyI>Vy+V*7*3uW`6e$b})Gyqp2YpdgeIp(rmz zp!>@&sOAK@iZ{CZuugr35P&7ajNWpAHo)MG`V}BwBN<|Qmw)Z;jZRMofU0}>{{8pS zqQ43HPg4TB$zrUmjiYB61k zW@i3vq=LKY>onbBw9r@hV`iorssZPNS@o=)Jr0K}(L~Vs=qa{i0{svX9qq?a_3I>b z#Ez({s#+(t51Bc>+yey_E9Nb_2(%c~9TbdXCHH4eqKpmd_y~}~qa-9BELksKKIZ1; z27Lc2D3*MWZAa0UvX}`0qBvkQ($_8|qwEY^&;QJ(tev7~bKqI1v3RY|YJ9=rSU5S! zp}E1=DiAgC@aI&s>(a+fG%}29{Ew%vrlhcB-!3F7EiLW&=w7U$`$v75uOx$F)rGPr zbGR2^AFTA%zm%1?`-U+ke>SOmrvw6?=}G?|60%T3_s*R=%j@fm*8txgbzR0E@^weQcmUiyJHQeA_1_1wl^5hABg%~^g zapczR+m@Y+U<%~hkAA*64sEB_8i-5b2Gm*v4)_XaVqF-Mw2~4j^k!FAR|!P;;1H1T zKhwp&9Hu|jHOuG|WFN%9#%j+{u7kv~-&!^T1N3ET>Y-%M4O%cq^37XMo0o&1dfEqN z_-ASA&UJTmj7*Ci2%r`NXlbLBvD&R>J1<|b3bV?jaE*FuY7|9w!(iTx z6#{4gX3ye(fo$OKt6|moE`0ZuYL;y1MjU>sbbII9I|WM~sFl+`!?heSCy? z9@j5M3IIyeMaDA(MiWGzgq>Yp)?=0eW^riLtcaU!9Q6@{7dc9xpH3 zw;N!ZwJ&yqVNng(F3rJ3r_w5RAiTdEAXXwsl41m~G7(1*FAz|#ww|0edqDYiH-^R= z**Y?{4NPL2`Y1$6W{r%w7lNFyLuUct?8m{Cl2KN6d2k8yRN(%P@Y-;3CluBPlD1<_ zb;nU(alo$=YA1_JP1S3ttr;WeA7K3lX9Qo^Mlleui03VePPiw(jjxdv{y}E)wq@uV zrEtE2&_Kl^xr6pmfI8r*C?)Yhn`Z5E>)Ib5@`CmG*w;7TYwsZx2g2?=18Hc<0~C>; zJ{<~-4mLjP?~%wY?{C_1ev-mP#`8=6ms#G+{PAMThZ&3H=G|NWYS`aiYphU$Zl2dp zd-CVuVJ1+s+WE#uuCTJ^^x6E4jn-x=h6kTwE?Hr zuTHHZ)3etsNMHcN6i`l8MTMEb_hylGFAHK?`;_uM7;b8A&dx)~dH+n0`z&umc*S`wF%yGVlGl(zb0f>tUkpAc(f?%T3=b9SHtWG&a z#gI(fe>9S0w6$ZwQjwRI4uEb9P{LrapcMQ1`UpJ90{w}77=&HFbsC+xZ0X~%eIjy> zGx#g-<=WW$(a)d1XaE=9=J{}in;Igct{&Cw+!R^W&>)9*21GH{I`lqSk%{pzv7$={ zzkaqR%H^4P;ug_iR=Ak+srRM~3Ccq{tI<&R~=@UO05fOnP zANB1XRA5n&p56@rL5M)f)9%<^ZREg1#CF=k*c!kIOLz*fUW532_`s9p3FV3Ldp1o= z5gI4WU@d;*->IS&+y1JIAO}Ci4ot2Hfi6W1!3d>#K+U0Vou3R=1&U$}>1`GY2T9kA zKKo4WMJj;29T?Dq6A@2syOE}PGso+ikqY$SBnLrBAU9-Wu##?Y#%e1=We7o2?)_TZ|k-9x?fY z5`6tvyzcqvWUa6tEL)^<(CvHdcMsu-_Av;2h2%uDCF*CuGO}QVKv!{^Zy4&psX)Ja zN?fDMrt8eKHrIt`bECOU=^ZhQhe~^y#IcBYs>6`J~W~cZ_g#4D$+Zb+1U#P_n|$iU1I-AGHxYw`wua* z9&?Drg)3^w)_wc2P~NiOEwMoX+w-oL2RMx5V0U+2XD@ajVFf?#FW8?Q4^|H}`M{_? zgjNb*f6xv0+Z=Ll&2*ZYoHT;ICa3CyIIsLcTt(2_Q>NOFP2I$hb9M&>9{W7bxPsq5XmOFSW;m!c7o>m;S+0??aAbGj*KDO_nda!Q6t}wSDWg16qfoiu`;PU@8|QFDg^n+1bVMT0Nh6 zXfijwv^v@N-ny3y9gKi(iQCRhMp{|fZKVFmF$#vKDj2li4~@yos3%q1->(ahd0s$3 z2Ux!UuO$9Hc$mduLig^oN&~Hnow$+2bY6<}g=wqZ&RamG|1j*K(u1LYb!2tmg zX`bXJg)(i8%~tRI0vL>v2AXdMcEf5+)i1O9CGrSzDf^=E{H;Nopo<&r6eiBN8wGxE zFl+}y_CLNco0^&im%loR8_vb4R)K?rC%mN)h{OM=9|oNU=>O6JPs=5(JC7SHd@5W6 zMt~2Hb5!bBb!Ed%h#AVbGgUL~p*!5}^6VL|vDNpFn;_ecuZ(NN6Lj2~<0xwqbn>nF zIoHjHa^=!Kng~fA-uQNF7fncM*A@Y$}sd)PX|E=FBDjIlQU3>Cz1F7!;*jSpzyx4^HZga z$R*Du_pzlV4iKriq^)N2cb2eHeP9Dmyb3t|o~CR9#&eK~Hfg44XjsW=Xhe59*gI<1 z7qp66?JO?L&qu-aOCPSk&DJaZKEeR4*Mv?aY=#_SJ?GhOJ({B27drUO@e^aVIMFOw4}-l=)_EQtbs#g+=kocKsR;V?ng_>Tt<-8d+EfC+hkXhPiUcfafKd_5 zm+gtZ;b8+r#>nWEWT}IOw$qdtF>s0)X(mr~=cOT=;)PciGN-b>b^S4;^5Kn8RJ0i* z?=uIX$e82n1+;IJC7PG?_DV}kn;zKNadcSnLM*UPrH4Fy`dB|N0DM0T=1FD+KmvHE zu_Eq#mHRtZYNacho?2QlgMO3@jNK+27u;=7FBEDIShqL`z-6$J&q8lub7{Ell|%px zkOhGqYBKXZ4Y+kJ%m)U7G5`yg?6Uvk$M~jq?~bk1G1b8r5d`3^j>BsuhpjMu~Bp7h%a6BVXi5sha)eZgq{fa?mF#Y1<`r}mq z*j8+J-~W3?N0GG?pNuNq~Gg(JFcK`C~+FtcPVfn123J2?(Syr`y97d&D{3Z zyN~!(zyK2P<*9hPhT*-z;p43S5Uh|BClHW=V7vLJqf>8(Hina?liZaaKYq+m$yx`_ zrR_k;@ejxEPnR8_I{d(S!+pMLf3C_D+NUX1eQIRgU&yfeuj ztAT^gA?wm99$?Mjf3mcgzOlfMMmisd(?)?qk+R&T-D}YpawaNc2I&f`?yJDqIHUWC z1fk7{$XHorN!XCBH@jR&f7Aedp)<%ih}nH;FzCX}g(PMI8tXyGi4du?px)4#x<*hB z{*=DhdLXJte86TB2QLYYb5Om6^Hm~{>)>C}T5DrDUu~?eo{W||56Tk_bE0c&nOm?~ zY1!Edun~uSg!i|`sdhuAMLf3N{enA|BjHdOOWl5^H*ZLB$sQ*rra)8;4D3|Az>+Lh z%1vx;3})D~o~O;3cnDAQ=$Vz|U1Ep3lw9UoB=jM%1gl>tlntSLmU!;+@!1UpQ|r6p zA=gZBBu&X;Oi%`U${w&noq%?}GKr8sP@|geZdA?GK#&rHe>`fpKV_E?8V{z&2N<+M zK7lE?LUyoBhMHk8jI#`^OK9*p`1W`1Fd~MZpB$4>Q1}8tvt}2|En2>=v=#}snAf}O-@C|qZfQx) zEy0sQM&<0Az++>Ji;H2Sf&bHN>>95%Umr$E!vqZJ6_*aHpvI5P<#Oi*E>9QeIW=bG zRa)}4bWxc{&VkbY3KpUn(BiSl$@5@PaGAF-^n#6X|G|T}*(1O`J(8)YsQQ}d_kT@` z#gExvAha*i`%;PmCY^)Oix`2OUMxw)*qr^Ukju7SiFj(j%-oy=Sc#~Ob%dCTq?9oi zoz;{RaGD}PHS0*}bW#nO_m)He^$^WhN;(ldt>+JvYxeXAUa(_wWS+c!1L~GREnR_D z(->T?*RLT@u59RaXs5w64;aq?;~na_XtO(ZAH=9@pNnOTs${D3yKk_8I9Ud$7=w!L z@&KI?&~XO&kC!VXFX&;UL9=2pM2h4eZl_RQeXg+g= 10 AND geometry && bbox; -$$ LANGUAGE SQL IMMUTABLE; diff --git a/layers/skiing/skiing.yaml b/layers/skiing/skiing.yaml deleted file mode 100644 index b30bf55b..00000000 --- a/layers/skiing/skiing.yaml +++ /dev/null @@ -1,32 +0,0 @@ -layer: - id: "skiing" - description: | - **skiing** contains skiing transportation for passengers. - buffer_size: 4 - fields: - name: - description: | - Name of the feature. - class: - description: | - Distinguish between aerialway values. - Class is derived from the value of the - [`aerialway`](http://wiki.openstreetmap.org/wiki/Key:aerialway) tag. - values: - - cable_car - - gondola - - chair_lift - - mixed_lift - - drag_lift - - t-bar - - j-bar - - platter - - magic_carpet - datasource: - geometry_field: geometry - query: (SELECT geometry, class, name FROM layer_skiing(!bbox!, z(!scale_denominator!))) AS t -schema: - - ./skiing.sql -datasources: - - type: imposm3 - mapping_file: ./mapping.yaml From 90495aaf28d25bb0a0a745032677f6ceea41c995 Mon Sep 17 00:00:00 2001 From: ache051 Date: Sat, 18 Sep 2021 15:29:31 +1200 Subject: [PATCH 04/14] Delete generating new lake centerlines Delete parts for generating new lake centerlines to avoid confusion. --- src/calculate-centerlines-new/Dockerfile | 16 - .../calculate_centerlines.py | 155 --------- src/calculate-centerlines/Dockerfile | 30 -- .../create_centerlines.py | 186 ----------- .../src_create_centerlines.py | 304 ------------------ src/export-shapefile/Dockerfile | 4 - src/export-shapefile/export-shapefile.sh | 16 - src/export-shapefile/initdb-postgis.sh | 27 -- 8 files changed, 738 deletions(-) delete mode 100644 src/calculate-centerlines-new/Dockerfile delete mode 100755 src/calculate-centerlines-new/calculate_centerlines.py delete mode 100644 src/calculate-centerlines/Dockerfile delete mode 100755 src/calculate-centerlines/create_centerlines.py delete mode 100644 src/calculate-centerlines/src_create_centerlines.py delete mode 100644 src/export-shapefile/Dockerfile delete mode 100755 src/export-shapefile/export-shapefile.sh delete mode 100644 src/export-shapefile/initdb-postgis.sh diff --git a/src/calculate-centerlines-new/Dockerfile b/src/calculate-centerlines-new/Dockerfile deleted file mode 100644 index 7460a81f..00000000 --- a/src/calculate-centerlines-new/Dockerfile +++ /dev/null @@ -1,16 +0,0 @@ -FROM python:3.8-slim-buster - -RUN apt-get update && apt-get install -y --no-install-recommends \ - ca-certificates \ - git \ - && rm -rf /var/lib/apt/lists/* - -RUN git clone https://github.com/ungarj/label_centerlines.git -COPY *.py ./label_centerlines - -WORKDIR ./label_centerlines -RUN pip install -r requirements.txt -RUN python setup.py install - -CMD ["./calculate_centerlines.py", "--output_driver", "GeoJSON", "/data/osm_lake_polygon.shp", "/data/osm_lake_centerline.geojson"] -#CMD ["./create_centerlines.py", "--output_driver", "GeoJSON", "/data/osm_lake_polygon.shp", "/data/osm_lake_centerline.geojson"] diff --git a/src/calculate-centerlines-new/calculate_centerlines.py b/src/calculate-centerlines-new/calculate_centerlines.py deleted file mode 100755 index f7959674..00000000 --- a/src/calculate-centerlines-new/calculate_centerlines.py +++ /dev/null @@ -1,155 +0,0 @@ -#!/usr/bin/env python3 - -import os -import sys -import argparse -import fiona -import multiprocessing -from shapely.geometry import shape, mapping -from functools import partial - -from label_centerlines import get_centerline - -def main(args): - - parser = argparse.ArgumentParser() - parser.add_argument( - "input_shp", - type=str, - help="input polygons" - ) - parser.add_argument( - "output_geojson", - type=str, - help="output centerlines" - ) - parser.add_argument( - "--segmentize_maxlen", - type=float, - help="maximum length used when segmentizing polygon borders", - default=0.5 - ) - parser.add_argument( - "--max_points", - type=int, - help="number of points per geometry allowed before simplifying", - default=3000 - ) - parser.add_argument( - "--simplification", - type=float, - help="value which increases simplification when necessary", - default=0.05 - ) - parser.add_argument( - "--smooth", - type=int, - help="smoothness of the output centerlines", - default=5 - ) - parser.add_argument( - "--output_driver", - type=str, - help="write to 'ESRI Shapefile' or 'GeoJSON' (default)", - default="GeoJSON" - ) - parsed = parser.parse_args(args) - input_shp = parsed.input_shp - output_geojson = parsed.output_geojson - segmentize_maxlen = parsed.segmentize_maxlen - max_points = parsed.max_points - simplification = parsed.simplification - smooth_sigma = parsed.smooth - driver = parsed.output_driver - - with fiona.open(input_shp, "r") as inp_polygons: - out_schema = inp_polygons.schema.copy() - out_schema['geometry'] = "LineString" - with fiona.open( - output_geojson, - "w", - schema=out_schema, - crs=inp_polygons.crs, - driver=driver - ) as out_centerlines: - pool = multiprocessing.Pool() - func = partial( - worker, - segmentize_maxlen, - max_points, - simplification, - smooth_sigma - ) - try: - feature_count = 0 - for feature_name, output in pool.imap_unordered( - func, - inp_polygons - ): - feature_count += 1 - if output: - output["properties"]['NAME'] = output["properties"]['NAME'] - out_centerlines.write(output) - print( "Written Feature %s: %s" %( - feature_count, - feature_name - )) - else: - print("Invalid output for feature", feature_name) - except KeyboardInterrupt: - print("Caught KeyboardInterrupt, terminating workers") - pool.terminate() - except Exception as e: - if feature_name: - print ("%s: FAILED (%s)" %(feature_name, e)) - else: - print ("feature: FAILED (%s)" %(e)) - raise - finally: - pool.close() - pool.join() - -def worker( - segmentize_maxlen, - max_points, - simplification, - smooth_sigma, - feature - ): - - geom = shape(feature['geometry']) - for name_field in ["name", "Name", "NAME"]: - if name_field in feature["properties"]: - feature_name = feature["properties"][name_field] - feature_id = feature["properties"]["OSM_ID"] - break - else: - feature_name = None - if feature_name: - print ("Processing: ", feature_name) - - try: - centerlines_geom = get_centerline( - geom, - segmentize_maxlen=segmentize_maxlen, - max_points=max_points, - simplification=simplification, - smooth_sigma=smooth_sigma - ) - except TypeError as e: - print (e) - except: - raise - if centerlines_geom: - return ( - feature_name, - { - 'properties': feature['properties'], - 'geometry': mapping(centerlines_geom) - } - ) - else: - return (None, None) - -if __name__ == "__main__": - main(sys.argv[1:]) diff --git a/src/calculate-centerlines/Dockerfile b/src/calculate-centerlines/Dockerfile deleted file mode 100644 index 1442cb89..00000000 --- a/src/calculate-centerlines/Dockerfile +++ /dev/null @@ -1,30 +0,0 @@ -FROM debian:buster-slim - -RUN apt-get update && apt-get install -y --no-install-recommends \ - gdal-bin \ - libgdal-dev \ - python \ - python-pip \ - python-dev \ - python-gdal \ - git \ - && rm -rf /var/lib/apt/lists/* - -RUN apt-get update && apt-get install -y --no-install-recommends \ - build-essential \ - && rm -rf /var/lib/apt/lists/* - -RUN apt-get update && apt-get install -y --no-install-recommends \ - python-scipy \ - python-setuptools \ - python-shapely \ - && rm -rf /var/lib/apt/lists/* - -#WORKDIR /usr/src/app -#RUN git clone https://github.com/ungarj/label_centerlines.git /usr/src/app - -RUN pip install wheel -RUN pip install networkx Fiona - -COPY *.py / -CMD ["./create_centerlines.py", "--output_driver", "GeoJSON", "/data/osm_lake_polygon.shp", "/data/osm_lake_centerline.geojson"] diff --git a/src/calculate-centerlines/create_centerlines.py b/src/calculate-centerlines/create_centerlines.py deleted file mode 100755 index 09160e81..00000000 --- a/src/calculate-centerlines/create_centerlines.py +++ /dev/null @@ -1,186 +0,0 @@ -#!/usr/bin/env python - -# Author: Joachim Ungar -# -#------------------------------------------------------------------------------- -# Copyright (C) 2015 EOX IT Services GmbH -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies of this Software or works derived from this Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. -#------------------------------------------------------------------------------- - -import os -import sys -import argparse -import fiona -import multiprocessing -from shapely.geometry import shape, mapping -from functools import partial - -from src_create_centerlines import get_centerlines_from_geom - -reload(sys) -sys.setdefaultencoding("utf-8") -print sys.version_info - -def main(args): - - parser = argparse.ArgumentParser() - parser.add_argument( - "input_shp", - type=str, - help="input polygons" - ) - parser.add_argument( - "output_geojson", - type=str, - help="output centerlines" - ) - parser.add_argument( - "--segmentize_maxlen", - type=float, - help="maximum length used when segmentizing polygon borders", - default=0.5 - ) - parser.add_argument( - "--max_points", - type=int, - help="number of points per geometry allowed before simplifying", - default=3000 - ) - parser.add_argument( - "--simplification", - type=float, - help="value which increases simplification when necessary", - default=0.05 - ) - parser.add_argument( - "--smooth", - type=int, - help="smoothness of the output centerlines", - default=5 - ) - parser.add_argument( - "--output_driver", - type=str, - help="write to 'ESRI Shapefile' or 'GeoJSON' (default)", - default="GeoJSON" - ) - parsed = parser.parse_args(args) - input_shp = parsed.input_shp - output_geojson = parsed.output_geojson - segmentize_maxlen = parsed.segmentize_maxlen - max_points = parsed.max_points - simplification = parsed.simplification - smooth_sigma = parsed.smooth - driver = parsed.output_driver - - with fiona.open(input_shp, "r") as inp_polygons: - out_schema = inp_polygons.schema.copy() - out_schema['geometry'] = "LineString" - with fiona.open( - output_geojson, - "w", - schema=out_schema, - crs=inp_polygons.crs, - driver=driver - ) as out_centerlines: - pool = multiprocessing.Pool(1) - func = partial( - worker, - segmentize_maxlen, - max_points, - simplification, - smooth_sigma - ) - try: - feature_count = 0 - for feature_name, output in pool.imap_unordered( - func, - inp_polygons - ): - feature_count += 1 - feature_name = feature_name.encode("utf-8").strip() - if output: - output["properties"]['NAME'] = output["properties"]['NAME'].encode("utf-8").strip() - out_centerlines.write(output) - print "written feature %s: %s" %( - feature_count, - feature_name - ) - else: - print "Invalid output for feature", feature_name - except KeyboardInterrupt: - print "Caught KeyboardInterrupt, terminating workers" - pool.terminate() - except Exception as e: - if feature_name: - print ("%s: FAILED (%s)" %(feature_name, e)) - else: - print ("feature: FAILED (%s)" %(e)) - raise - finally: - pool.close() - pool.join() - -def worker( - segmentize_maxlen, - max_points, - simplification, - smooth_sigma, - feature - ): - - geom = shape(feature['geometry']) - for name_field in ["NAME"]: - #for name_field in ["name", "Name", "NAME"]: - if name_field in feature["properties"]: - feature_name = feature["properties"][name_field].encode('utf-8') - feature_id = feature["properties"]["OSM_ID"] - break - else: - feature_name = None - if feature_name: - print "processing", feature_name - - try: - centerlines_geom = get_centerlines_from_geom( - geom, - segmentize_maxlen=segmentize_maxlen, - max_points=max_points, - simplification=simplification, - smooth_sigma=smooth_sigma - ) - except TypeError as e: - print e - except: - raise - if centerlines_geom: - return ( - feature_name, - { - 'properties': feature['properties'], - 'geometry': mapping(centerlines_geom) - } - ) - else: - return (None, None) - - -if __name__ == "__main__": - main(sys.argv[1:]) diff --git a/src/calculate-centerlines/src_create_centerlines.py b/src/calculate-centerlines/src_create_centerlines.py deleted file mode 100644 index bce1771a..00000000 --- a/src/calculate-centerlines/src_create_centerlines.py +++ /dev/null @@ -1,304 +0,0 @@ -#!/usr/bin/env python - -# Author: Joachim Ungar -# -#------------------------------------------------------------------------------- -# Copyright (C) 2015 EOX IT Services GmbH -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies of this Software or works derived from this Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. -#------------------------------------------------------------------------------- - -from shapely.geometry import ( - shape, - LineString, - MultiLineString, - Point, - MultiPoint, - mapping - ) -from shapely.wkt import loads -import ogr -from scipy.spatial import Voronoi -import networkx as nx -from itertools import combinations -import numpy as np -from scipy.ndimage import filters -from math import * - -debug_output = {} - -def get_centerlines_from_geom( - geometry, - segmentize_maxlen=0.5, - max_points=3000, - simplification=0.05, - smooth_sigma=5, - debug=False - ): - """ - Returns centerline (for Polygon) or centerlines (for MultiPolygons) as - LineString or MultiLineString geometries. - """ - - if geometry.geom_type not in ["MultiPolygon", "Polygon"]: - raise TypeError( - "Geometry type must be Polygon or MultiPolygon, not %s" %( - geometry.geom_type - ) - ) - - if geometry.geom_type == "MultiPolygon": - out_centerlines = MultiLineString([ - get_centerlines_from_geom(subgeom, segmentize_maxlen) - for subgeom in geometry - if get_centerlines_from_geom(subgeom, segmentize_maxlen) != None - ]) - return out_centerlines - else: - - # Convert Polygon to Linestring. - if len(geometry.interiors) > 0: - boundary = geometry.exterior - else: - boundary = geometry.boundary - - #print list(boundary.coords) - if debug: - debug_output['original_points'] = MultiPoint([ - point - for point in list(boundary.coords) - ]) - - # Convert to OGR object and segmentize. - ogr_boundary = ogr.CreateGeometryFromWkb(boundary.wkb) - ogr_boundary.Segmentize(segmentize_maxlen) - segmentized = loads(ogr_boundary.ExportToWkt()) - - # Get points. - points = segmentized.coords - - # Simplify segmentized geometry if necessary. This step is required - # as huge geometries slow down the centerline extraction significantly. - tolerance = simplification - while len(points) > max_points: - # If geometry is too large, apply simplification until geometry - # is simplified enough (indicated by the "max_points" value) - tolerance += simplification - simplified = boundary.simplify(tolerance) - points = simplified.coords - if debug: - debug_output['segmentized_points'] = MultiPoint([ - point - for point in points - ]) - - # Calculate Voronoi diagram. - vor = Voronoi(points) - if debug: - debug_output['voronoi'] = multilinestring_from_voronoi( - vor, - geometry - ) - - # The next three steps are the most processing intensive and probably - # not the most efficient method to get the skeleton centerline. If you - # have any recommendations, I would be very happy to know. - - # Convert to networkx graph. - graph = graph_from_voronoi(vor, geometry) - graph.edges(18,21) - # Get end nodes from graph. - end_nodes = get_end_nodes(graph) - if len(end_nodes) < 2: - return None - - # Get longest path. - longest_paths = get_longest_paths( - end_nodes, - graph - ) - - # get least curved path. - best_path = get_least_curved_path(longest_paths[:5], vor.vertices) - - #print (best_path == longest_paths[0]) - - #best_path = longest_paths[0] - - centerline = LineString(vor.vertices[best_path]) - - if debug: - debug_output['centerline'] = centerline - - # Simplify again to reduce number of points. - # simplified = centerline.simplify(tolerance) - # centerline = simplified - - - # Smooth out geometry. - centerline_smoothed = smooth_linestring(centerline, smooth_sigma) - out_centerline = centerline_smoothed - #print out_centerline - return out_centerline - - -def smooth_linestring(linestring, smooth_sigma): - """ - Uses a gauss filter to smooth out the LineString coordinates. - """ - smooth_x = np.array(filters.gaussian_filter1d( - linestring.xy[0], - smooth_sigma) - ) - smooth_y = np.array(filters.gaussian_filter1d( - linestring.xy[1], - smooth_sigma) - ) - smoothed_coords = np.hstack((smooth_x, smooth_y)) - smoothed_coords = zip(smooth_x, smooth_y) - linestring_smoothed = LineString(smoothed_coords) - return linestring_smoothed - - -def get_longest_paths(nodes, graph): - """ - Returns longest path of all possible paths between a list of nodes. - """ - paths = [] - distances = [] - possible_paths = list(combinations(nodes, r=2)) - for node1, node2 in possible_paths: - try: - path = nx.shortest_path(graph, node1, node2, "weight") - except Exception,e: - path = [] - if len(path)>1: - distance = get_path_distance(path, graph) - paths.append(path) - distances.append(distance) - paths_sorted = [x for (y,x) in sorted(zip(distances, paths), reverse=True)] - # longest_path = paths_sorted[0] - # return longest_path - return paths_sorted - - -def get_least_curved_path(paths, vertices): - - angle_sums = [] - for path in paths: - path_angles = get_path_angles(path, vertices) - angle_sum = abs(sum(path_angles)) - angle_sums.append(angle_sum) - paths_sorted = [x for (y,x) in sorted(zip(angle_sums, paths))] - return paths_sorted[0] - - -def get_path_angles(path, vertices): - angles = [] - prior_line = None - next_line = None - for index, point in enumerate(path): - if index > 0 and index < len(path)-1: - prior_point = vertices[path[index-1]] - current_point = vertices[point] - next_point = vertices[path[index+1]] - angles.append( - get_angle( - (prior_point, current_point), (current_point, next_point) - ) - ) - - return angles - - -def get_angle(line1, line2): - v1 = line1[0] - line1[1] - v2 = line2[0] - line2[1] - angle = np.math.atan2(np.linalg.det([v1,v2]),np.dot(v1,v2)) - return np.degrees(angle) - -def get_path_distance(path, graph): - """ - Returns weighted path distance. - """ - distance = 0 - for i,w in enumerate(path): - j=i+1 - if j-1 and i[1]>-1: - point1 = Point(vor.vertices[i][0]) - point2 = Point(vor.vertices[i][1]) - # Eliminate all points outside our geometry. - if point1.within(geometry) and point2.within(geometry): - dist = point1.distance(point2) - graph.add_nodes_from([i[0], i[1]]) - graph.add_edge(i[0], i[1], weight=dist) - return graph - - -def multilinestring_from_voronoi(vor, geometry): - """ - Creates a MultiLineString geometry out of all Voronoi ridge vertices which - are inside the original geometry. - """ - linestrings = [] - for i in vor.ridge_vertices: - if i[0]>-1 and i[1]>-1: - point1 = Point(vor.vertices[i][0]) - point2 = Point(vor.vertices[i][1]) - # Eliminate all points outside our geometry. - if point1.within(geometry) and point2.within(geometry): - linestring = LineString([point1, point2]) - linestrings.append(linestring) - multilinestring = MultiLineString(linestrings) - return multilinestring - - - -if __name__ == "__main__": - main(sys.argv[1:]) diff --git a/src/export-shapefile/Dockerfile b/src/export-shapefile/Dockerfile deleted file mode 100644 index 5c46ed4c..00000000 --- a/src/export-shapefile/Dockerfile +++ /dev/null @@ -1,4 +0,0 @@ -FROM postgis/postgis:9.6-2.5-alpine -RUN apk add libintl -COPY export-shapefile.sh / -CMD ["./export-shapefile.sh"] diff --git a/src/export-shapefile/export-shapefile.sh b/src/export-shapefile/export-shapefile.sh deleted file mode 100755 index fce710a1..00000000 --- a/src/export-shapefile/export-shapefile.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash -set -o errexit -set -o pipefail -set -o nounset - -function export_shp() { - local lake_shapefile="/data/osm_lake_polygon.shp" - local query="SELECT osm_id, name, name_en, ST_SimplifyPreserveTopology(geometry, 100) AS geometry FROM osm_water_polygon WHERE area > 2 * 1000 * 1000 AND ST_GeometryType(geometry)='ST_Polygon' AND name <> '' ORDER BY area DESC" - pgsql2shp -f "$lake_shapefile" \ - -h "$PGHOST" \ - -u "$PGUSER" \ - -P "$PGPASSWORD" \ - "$PGDATABASE" "$query" -} - -export_shp diff --git a/src/export-shapefile/initdb-postgis.sh b/src/export-shapefile/initdb-postgis.sh deleted file mode 100644 index b7d30886..00000000 --- a/src/export-shapefile/initdb-postgis.sh +++ /dev/null @@ -1,27 +0,0 @@ -#!/usr/bin/env bash -set -o errexit -set -o pipefail -set -o nounset - -echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" -echo " Loading OMT postgis extensions" -echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" - -for db in template_postgis "$POSTGRES_DB"; do -echo "Loading extensions into $db" -PGUSER="$POSTGRES_USER" psql --dbname="$db" <<-'EOSQL' - -- Cleanup. Ideally parent container shouldn't pre-install those. - DROP EXTENSION IF EXISTS postgis_tiger_geocoder; - DROP EXTENSION IF EXISTS postgis_topology; - - -- These extensions are already loaded by the parent docker - CREATE EXTENSION IF NOT EXISTS postgis; - CREATE EXTENSION IF NOT EXISTS fuzzystrmatch; - - -- Extensions needed for OpenMapTiles - CREATE EXTENSION IF NOT EXISTS hstore; - CREATE EXTENSION IF NOT EXISTS unaccent; - CREATE EXTENSION IF NOT EXISTS osml10n; - CREATE EXTENSION IF NOT EXISTS gzip; -EOSQL -done From 933f1183960429e49c619d2c60a5a806993f4dff Mon Sep 17 00:00:00 2001 From: ache051 Date: Sat, 18 Sep 2021 15:30:12 +1200 Subject: [PATCH 05/14] Remove generation of skiing layer Remove generation of skiing layer to avoid confusion --- openmaptiles.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/openmaptiles.yaml b/openmaptiles.yaml index abdd1b9f..afbf5e37 100644 --- a/openmaptiles.yaml +++ b/openmaptiles.yaml @@ -1,7 +1,6 @@ tileset: layers: - layers/power/power.yaml - - layers/skiing/skiing.yaml - layers/water/water.yaml - layers/waterway/waterway.yaml - layers/landcover/landcover.yaml From cc0729eff8ae3519fec6ebd5147be9a3c515129c Mon Sep 17 00:00:00 2001 From: ache051 Date: Sat, 18 Sep 2021 15:30:22 +1200 Subject: [PATCH 06/14] Update openmaptiles.yaml --- openmaptiles.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openmaptiles.yaml b/openmaptiles.yaml index afbf5e37..40633e34 100644 --- a/openmaptiles.yaml +++ b/openmaptiles.yaml @@ -18,7 +18,7 @@ tileset: - layers/poi/poi.yaml - layers/aerodrome_label/aerodrome_label.yaml name: OpenMapTiles - version: 3.12.2 + version: 3.12.1 id: openmaptiles description: "A tileset showcasing all layers in OpenMapTiles. https://openmaptiles.org" attribution: '© OpenMapTiles © OpenStreetMap contributors' From 4cf98ed27df4b8be28a22aa1c9feb180def13479 Mon Sep 17 00:00:00 2001 From: ache051 Date: Sat, 18 Sep 2021 15:31:31 +1200 Subject: [PATCH 07/14] Remove parts for new lake centerlines --- docker-compose.yml | 26 +------------------------- 1 file changed, 1 insertion(+), 25 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 614bd4fe..def41650 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -22,8 +22,7 @@ services: env_file: .env-postgres import-data: - #image: "openmaptiles/import-data:${TOOLS_VERSION}" - image: "alanc/import-data" + image: "openmaptiles/import-data:${TOOLS_VERSION}" env_file: .env networks: - postgres @@ -104,26 +103,3 @@ services: - "${PPORT:-8090}:${PPORT:-8090}" volumes: - .:/tileset - -# export-shapefile and calculate-centerlines are for lake lines for labelling - export-shapefile: - build: src/export-shapefile - env_file: .env - networks: - - postgres - volumes: - - ./data:/data - - calculate-centerlines: - build: src/calculate-centerlines - networks: - - postgres - volumes: - - ./data:/data - - calculate-centerlines-new: - build: src/calculate-centerlines-new - networks: - - postgres - volumes: - - ./data:/data From 24eec53839cf23a82c6c9eb5d94db3d7c4fdc329 Mon Sep 17 00:00:00 2001 From: ache051 Date: Sat, 18 Sep 2021 15:32:56 +1200 Subject: [PATCH 08/14] Update mapping.yaml Clean-up old stuff --- layers/power/mapping.yaml | 83 --------------------------------------- 1 file changed, 83 deletions(-) diff --git a/layers/power/mapping.yaml b/layers/power/mapping.yaml index 59e6473f..a1dc4b99 100644 --- a/layers/power/mapping.yaml +++ b/layers/power/mapping.yaml @@ -1,4 +1,3 @@ - tables: # etldoc: imposm3 -> osm_power_linestring power_linestring: @@ -62,85 +61,3 @@ tables: - plant - substation - transformer - -#tables: - ## etldoc: imposm3 -> osm_power_linestring - #power_linestring: - #type: linestring - #fields: - #- name: osm_id - #type: id - #- name: geometry - #type: geometry - #- key: power - #name: class - #type: string - #- key: plant:source - #name: source - #type: string - #- key: plant:method - #name: method - #type: string - #- key: name - #name: name - #type: string - #mapping: - #power: - #- cable - #- line - #- minor_line - ##~ # etldoc: imposm3 -> osm_power_point - #power_point: - #type: point - #fields: - #- name: osm_id - #type: id - #- name: geometry - #type: geometry - #- key: power - #name: class - #type: string - #- key: plant:source - #name: source - #type: string - #- key: plant:method - #name: method - #type: string - #- key: power - #name: name - #type: string - #mapping: - #power: - #- tower - #- pole - #- catenary_mast - #- generator - #- portal - #- transformer - #- switch - #- insulator - ## etldoc: imposm3 -> osm_power_polygon - #power_polygon: - #type: polygon - #fields: - #- name: osm_id - #type: id - #- name: geometry - #type: geometry - #- key: power - #name: class - #type: string - #- key: plant:source - #name: source - #type: string - #- key: plant:method - #name: method - #type: string - #- key: name - #name: name - #type: string - #mapping: - #power: - #- plant - #- substation - #- transformer From 1bc93cee6443f723b145c804cab0dd5c435aee30 Mon Sep 17 00:00:00 2001 From: ache051 Date: Sat, 18 Sep 2021 15:33:20 +1200 Subject: [PATCH 09/14] Update power.sql Clean-up old stuff. --- layers/power/power.sql | 24 ------------------------ 1 file changed, 24 deletions(-) diff --git a/layers/power/power.sql b/layers/power/power.sql index 807d6675..050aa511 100644 --- a/layers/power/power.sql +++ b/layers/power/power.sql @@ -1,27 +1,3 @@ - --- CREATE OR REPLACE FUNCTION layer_power(bbox geometry, zoom_level int) --- RETURNS TABLE(geometry geometry, class text, source text, method text, name text) AS $$ --- SELECT geometry, class, source, method, name --- FROM( - -- SELECT geometry, class, source, method, name - -- FROM osm_power_point - -- WHERE zoom_level >= 10 AND geometry && bbox - -- UNION ALL - - -- SELECT geometry, class, source, method, name - -- FROM osm_power_linestring - -- WHERE zoom_level >= 10 AND geometry && bbox - -- UNION ALL - - -- SELECT geometry, class, source, method, name - -- FROM osm_power_polygon - -- WHERE zoom_level >= 10 AND geometry && bbox - -- ) AS zoom_levels --- WHERE geometry && bbox; --- $$ LANGUAGE SQL STABLE - -- -- STRICT - -- PARALLEL SAFE; - CREATE OR REPLACE FUNCTION layer_power(bbox geometry, zoom_level int) RETURNS TABLE(geometry geometry, name text, class text) AS $$ SELECT geometry, name, class From f24308be36b036aa594009ac4a2570a9fd5906f6 Mon Sep 17 00:00:00 2001 From: ache051 Date: Sat, 18 Sep 2021 15:33:44 +1200 Subject: [PATCH 10/14] Update power.yaml Clean-up old stuff --- layers/power/power.yaml | 3 --- 1 file changed, 3 deletions(-) diff --git a/layers/power/power.yaml b/layers/power/power.yaml index e05347d5..5343c94d 100644 --- a/layers/power/power.yaml +++ b/layers/power/power.yaml @@ -28,12 +28,9 @@ layer: datasource: geometry_field: geometry - #query: (SELECT geometry, class, source, method, name FROM layer_power(!bbox!, z(!scale_denominator!))) AS t query: (SELECT geometry, class, name FROM layer_power(!bbox!, z(!scale_denominator!))) AS t schema: - ./power.sql -# - ./power_point.sql -# - ./power_polygon.sql datasources: - type: imposm3 mapping_file: ./mapping.yaml From b6554d535c77421ca608b341a2268688ead71525 Mon Sep 17 00:00:00 2001 From: ache051 Date: Sat, 18 Sep 2021 15:34:03 +1200 Subject: [PATCH 11/14] Delete power_point.sql Clean-up old stuff. --- layers/power/power_point.sql | 7 ------- 1 file changed, 7 deletions(-) delete mode 100644 layers/power/power_point.sql diff --git a/layers/power/power_point.sql b/layers/power/power_point.sql deleted file mode 100644 index 925bfd78..00000000 --- a/layers/power/power_point.sql +++ /dev/null @@ -1,7 +0,0 @@ - -CREATE OR REPLACE FUNCTION layer_power(bbox geometry, zoom_level int) -RETURNS TABLE(geometry geometry, class text, name text) AS $$ - SELECT geometry, class, name - FROM osm_power_point - WHERE zoom_level >= 10 AND geometry && bbox; -$$ LANGUAGE SQL IMMUTABLE; From 08554e43b87d2d826b828b561616ff4be9c49c8c Mon Sep 17 00:00:00 2001 From: ache051 Date: Sat, 18 Sep 2021 15:34:22 +1200 Subject: [PATCH 12/14] Delete power_polygon.sql Clean-up old stuff. --- layers/power/power_polygon.sql | 7 ------- 1 file changed, 7 deletions(-) delete mode 100644 layers/power/power_polygon.sql diff --git a/layers/power/power_polygon.sql b/layers/power/power_polygon.sql deleted file mode 100644 index f3e51f8a..00000000 --- a/layers/power/power_polygon.sql +++ /dev/null @@ -1,7 +0,0 @@ - -CREATE OR REPLACE FUNCTION layer_power(bbox geometry, zoom_level int) -RETURNS TABLE(geometry geometry, class text, name text) AS $$ - SELECT geometry, class, name - FROM osm_power_polygon - WHERE zoom_level >= 10 AND geometry && bbox; -$$ LANGUAGE SQL IMMUTABLE; From d2b589d691341396fe63c585a211155ae2f1856b Mon Sep 17 00:00:00 2001 From: ache051 Date: Sat, 18 Sep 2021 15:35:07 +1200 Subject: [PATCH 13/14] Generated mapping and etl diagram --- layers/power/etl_diagram.png | Bin 0 -> 24587 bytes layers/power/mapping_diagram.png | Bin 0 -> 30519 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 layers/power/etl_diagram.png create mode 100644 layers/power/mapping_diagram.png diff --git a/layers/power/etl_diagram.png b/layers/power/etl_diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..29c669e52e40d38b0700025b12a1da41b7cf6e90 GIT binary patch literal 24587 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 rWzOu`O0)m{@f@(i>;L|acO9ZW7G8OB`;NB@Z Date: Wed, 13 Oct 2021 14:29:37 +1300 Subject: [PATCH 14/14] Updated rendering zoom level and etl diagrams https://github.com/openmaptiles/openmaptiles/pull/1235#issuecomment-928976474 https://github.com/openmaptiles/openmaptiles/pull/1235#issuecomment-938699373 --- layers/power/etl_diagram.png | Bin 24587 -> 35981 bytes layers/power/mapping.yaml | 90 +++++++++++++++++++++---------- layers/power/mapping_diagram.png | Bin 30519 -> 33225 bytes layers/power/power.sql | 39 ++++++++++---- layers/power/power.yaml | 42 ++++++++++++++- 5 files changed, 132 insertions(+), 39 deletions(-) diff --git a/layers/power/etl_diagram.png b/layers/power/etl_diagram.png index 29c669e52e40d38b0700025b12a1da41b7cf6e90..6ecefc135173c266059ec33491c53ff1fa6ebdec 100644 GIT binary patch literal 35981 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 A#{d8T literal 24587 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 osm_power_linestring - power_linestring: - type: linestring - fields: - - name: osm_id - type: id - - name: geometry - type: geometry - - key: name - name: name - type: string - - key: power - name: class - type: string - mapping: - power: - - cable - - line - - minor_line - #~ # etldoc: imposm3 -> osm_power_point + # etldoc: imposm3 -> osm_power_point power_point: type: point fields: @@ -26,11 +7,23 @@ tables: type: id - name: geometry type: geometry - - key: name - name: name - type: string - key: power name: class + type: string + - key: plant:source + name: source + type: string + - key: plant:method + name: method + type: string + - key: generator:source + name: gen_source + type: string + - key: generator:method + name: gen_method + type: string + - key: power + name: name type: string mapping: power: @@ -42,6 +35,36 @@ tables: - transformer - switch - insulator + # etldoc: imposm3 -> osm_power_linestring + power_linestring: + type: linestring + fields: + - name: osm_id + type: id + - name: geometry + type: geometry + - key: power + name: class + type: string + - key: plant:source + name: source + type: string + - key: plant:method + name: method + type: string + - key: generator:source + name: gen_source + type: string + - key: generator:method + name: gen_method + type: string + - key: name + name: name + type: string + mapping: + power: + - line + - minor_line # etldoc: imposm3 -> osm_power_polygon power_polygon: type: polygon @@ -50,14 +73,27 @@ tables: type: id - name: geometry type: geometry - - key: name - name: name - type: string - key: power name: class - type: string + type: string + - key: plant:source + name: source + type: string + - key: plant:method + name: method + type: string + - key: generator:source + name: gen_source + type: string + - key: generator:method + name: gen_method + type: string + - key: name + name: name + type: string mapping: power: + - generator - plant - substation - transformer diff --git a/layers/power/mapping_diagram.png b/layers/power/mapping_diagram.png index 877b14b4f4ed11a01bab0aeb3c4dedec594681e8..e63790589bd536d3da6a2bdfd813993c8ad0e149 100644 GIT binary patch literal 33225 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 literal 30519 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 rWzOu`O0)m{@f@(i>;L|acO9ZW7G8OB`;NB@Z layer_power:z13 + SELECT geometry, class, source, gen_source, method, name FROM osm_power_point - WHERE zoom_level >= 10 AND geometry && bbox + WHERE zoom_level >= 13 AND class = 'tower' AND geometry && bbox UNION ALL - - SELECT geometry, name, class + -- etldoc: osm_power_point -> layer_power:z14 + SELECT geometry, class, source, gen_source, method, name + FROM osm_power_point + WHERE zoom_level >= 14 AND class = 'pole' AND geometry && bbox + UNION ALL + -- etldoc: osm_power_linestring -> layer_power:z13 + SELECT geometry, class, source, gen_source, method, name FROM osm_power_linestring - WHERE zoom_level >= 10 AND geometry && bbox + WHERE zoom_level >= 13 AND class = 'line' AND geometry && bbox UNION ALL - - SELECT geometry, name, class + -- etldoc: osm_power_linestring -> layer_power:z14 + SELECT geometry, class, source, gen_source, method, name + FROM osm_power_linestring + WHERE zoom_level >= 14 AND class = 'minor_line' AND geometry && bbox + UNION ALL + -- etldoc: osm_power_polygon -> layer_power:z13 + SELECT geometry, class, source, gen_source, method, name FROM osm_power_polygon - WHERE zoom_level >= 10 AND geometry && bbox + WHERE zoom_level >= 13 AND class = 'plant' AND geometry && bbox + UNION ALL + -- etldoc: osm_power_polygon -> layer_power:z14 + SELECT geometry, class, source, gen_source, method, name + FROM osm_power_polygon + WHERE zoom_level >= 14 AND class IN ('substation', 'generator', 'transformer') AND geometry && bbox ) AS zoom_levels WHERE geometry && bbox; $$ LANGUAGE SQL STABLE diff --git a/layers/power/power.yaml b/layers/power/power.yaml index 5343c94d..1ee85bff 100644 --- a/layers/power/power.yaml +++ b/layers/power/power.yaml @@ -12,7 +12,6 @@ layer: Class is derived from the value of the [`power`](http://wiki.openstreetmap.org/wiki/Key:power) tag. values: - - cable - line - minor_line - tower @@ -25,10 +24,49 @@ layer: - transformer - switch - insulator + source: + description: | + Class is derived from the value of the + [`plant:source`](http://wiki.openstreetmap.org/wiki/Key:plant:source) tag. + values: + - battery + - biogas + - biomass + - coal + - combustion + - diesel + - gas + - geothermal + - hydro + - nuclear + - oil + - solar + - solar_thermal + - waste + - wind + - wind_turbine + - wood + method: + description: | + Class is derived from the value of the + [`plant:method`](http://wiki.openstreetmap.org/wiki/Key:plant:method) tag. + values: + - anaerobic_digestion + - combustion + - dam + - fission + - gasification + - photovoltaic + - run-of-the-river + - thermal + - water-pumpted-storage + - water-storage + - wind_turbine datasource: geometry_field: geometry - query: (SELECT geometry, class, name FROM layer_power(!bbox!, z(!scale_denominator!))) AS t + query: (SELECT geometry, class, source, method, name FROM layer_power(!bbox!, z(!scale_denominator!))) AS t + schema: - ./power.sql datasources: