{"id":914,"date":"2016-09-07T20:00:08","date_gmt":"2016-09-07T18:00:08","guid":{"rendered":"http:\/\/morony.pl\/?p=914"},"modified":"2016-09-28T16:32:50","modified_gmt":"2016-09-28T14:32:50","slug":"mapa-google-w-duzym-formacie","status":"publish","type":"post","link":"https:\/\/morony.pl\/?p=914","title":{"rendered":"Mapa Google w du\u017cym formacie"},"content":{"rendered":"<p>Bardzo lubi\u0119 mapy. Pewnego dnia wcze\u015bniej w tym roku wpad\u0142em na pomys\u0142, aby ozdobi\u0107 \u015bcian\u0119 drogow\u0105 map\u0105 Polski. W pomy\u015ble by\u0142 jeden ma\u0142y haczyk: nie chcia\u0142em byle jakiej mapy, chcia\u0142em map\u0119 Google. Szybki przegl\u0105d internetu nie przyni\u00f3s\u0142 \u017cadnych konkretnych rozwi\u0105za\u0144 &#8211; super, b\u0119d\u0119 pierwszy!<\/p>\n<p>Mapy Google wy\u015bwietlaj\u0105 r\u00f3\u017cn\u0105 ilo\u015b\u0107 szczeg\u00f3\u0142\u00f3w w zale\u017cno\u015bci od stopnia przybli\u017cenia. Gdy na ekranie mie\u015bci si\u0119 ca\u0142a Polska, szczeg\u00f3\u0142\u00f3w nie ma wcale. Moja mapa \u015bcienna mia\u0142a by\u0107 du\u017ca (planowa\u0142em co\u015b w okolicach metr na metr), wi\u0119c potrzebowa\u0142em szczeg\u00f3\u0142\u00f3w. Zdecydowa\u0142em si\u0119 na napisanie aplikacji w C#, kt\u00f3rej zadaniem by\u0142o wy\u015bwietlanie kolejnych fragment\u00f3w mapy i robienie screenshota. Rozw\u00f3j aplikacji zako\u0144czy\u0142 si\u0119 w momencie, gdy zadzia\u0142a\u0142a, wi\u0119c nawet guziki nie by\u0142y podpisane:<\/p>\n<p><center><a href=\"http:\/\/morony.pl\/wp-content\/uploads\/2016\/09\/screenshot_30.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"591\" src=\"http:\/\/morony.pl\/wp-content\/uploads\/2016\/09\/screenshot_30-1024x591.png\" style=\"width:600px;height:auto;\" class=\"alignnone size-large wp-image-915\" srcset=\"https:\/\/morony.pl\/wp-content\/uploads\/2016\/09\/screenshot_30-1024x591.png 1024w, https:\/\/morony.pl\/wp-content\/uploads\/2016\/09\/screenshot_30-300x173.png 300w, https:\/\/morony.pl\/wp-content\/uploads\/2016\/09\/screenshot_30-768x443.png 768w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/center><\/p>\n<p>Dla \u015bredniej szczeg\u00f3\u0142owo\u015bci wystarczy\u0142o pokrycie Polski za pomoc\u0105 ~120 screen\u00f3w, a dla wysokiej zrobi\u0142em ich ponad 1200. <\/p>\n<p>Samo robienie screen\u00f3w to \u0142atwy fragment. Trudniej by\u0142o sklei\u0107 je w ca\u0142o\u015b\u0107. Pami\u0119tajmy, \u017ce ziemia jest kul\u0105, wi\u0119c samo sklejenie obrazk\u00f3w spowoduje powstanie dziur, poniewa\u017c relacja pomi\u0119dzy stopniami d\u0142ugo\u015bci geograficznej a kilometrami zale\u017cy od szeroko\u015bci geograficznej. W sieci \u0142atwo znalaz\u0142em relacj\u0119 pomi\u0119dzy pixelami mapy a fizycznymi odleg\u0142o\u015bciami w zale\u017cno\u015bci od szeroko\u015bci geograficznej:<br \/>\n<center><\/p>\n<pre style=\"overflow:auto;\">Meters per pixel = 156543.03392 * Math.cos(latLng.lat() * Math.PI \/ 180) \/ Math.pow(2, zoom)<\/pre>\n<p><\/center><\/p>\n<p>W kolejnym kroku wycina\u0142em z moich screen\u00f3w fragment mapy bez element\u00f3w interfejsu &#8211; dla u\u0142atwienia zawsze taki sam prostok\u0105t na \u015brodku ekranu. Robi\u0142em to oczywi\u015bcie automatycznie za pomoc\u0105 polecenia <span style=\"font-family:Courier New\">convert<\/span>. Przy okazji przycinania konwertowa\u0142em wyci\u0119ty fragment na format tiff. Maj\u0105c obliczone z wcze\u015bniejszego wzoru wsp\u00f3\u0142rz\u0119dne geograficzne rog\u00f3w fragmentu mapy konwertowa\u0142em plik graficzny tiff do formatu geotiff za pomoc\u0105 polecenia <span style=\"font-family:Courier New\">gdal_translate<\/span>. Geotiff to nic innego jak zwyk\u0142y tiff z dodatkowymi informacjami dotycz\u0105cymi jego orientacji w przestrzeni. Ten proces by\u0142 sterowany skryptem w MATLABie:<\/p>\n<pre style=\"width:780px; overflow:auto;\">\r\nlat_min = 48.7;\r\nlat_max = 55;\r\nlon_min = 13.8;\r\nlon_max = 24.6;\r\n\r\nlat_step = .6;\r\nlon_step = 1.2;\r\n\r\n\r\nxof = 100;\r\nyof = 100;\r\nx = 1920 - 2*xof;\r\ny = 982 - 2*yof;\r\n\r\nfor lat = lat_min:lat_step:lat_max\r\n\tfor lon = lon_min:lon_step:lon_max\r\n\t\tim_width = 1720;\r\n\t\tim_height = 782;\r\n\t\tzoom = 10;\r\n\r\n\t\tmeters_vertical = (156543.03392 * cos(deg2rad(lat))  \/ (2^zoom));\r\n\r\n\t\t[lat_tm, lon_tm] = reckon(lat, lon, km2deg(meters_vertical*(im_height\/2)\/1000), 0); \r\n\t\t[lat_bm, lon_bm] = reckon(lat, lon, km2deg(meters_vertical*(im_height\/2)\/1000), 180); \r\n\r\n\t\tmeters_horizontal_top = 156543.03392 * cos(deg2rad(lat_tm)) \/ (2^zoom);\r\n\t\tmeters_horizontal_bottom = 156543.03392 * cos(deg2rad(lat_bm)) \/ (2^zoom);\r\n\r\n\t\t[lat_tr, lon_tr] = reckon(lat_tm, lon_tm, km2deg(meters_horizontal_top*(im_width\/2 - .5)\/1000), 90); \r\n\t\t[lat_tl, lon_tl] = reckon(lat_tm, lon_tm, km2deg(meters_horizontal_top*(im_width\/2 - .5)\/1000), 270); \r\n\r\n\t\t[lat_br, lon_br] = reckon(lat_bm, lon_bm, km2deg(meters_horizontal_bottom*(im_width\/2 - .5)\/1000), 90); \r\n\t\t[lat_bl, lon_bl] = reckon(lat_bm, lon_bm, km2deg(meters_horizontal_bottom*(im_width\/2 - .5)\/1000), 270); \r\n\r\n\t\tsystem(sprintf('convert source\/mapa_%8.5f_%8.5f.png -crop %dx%d+%d+%d -resize %dx%d -transparent white crop\/mapa_%8.5f_%8.5f.tiff', lat, lon, x, y, xof, yof, 2*x, 2*y, lat, lon));\r\n\t\tsystem(sprintf('gdal_translate -of GTiff -a_srs WGS84 -a_ullr  %8.5f %8.5f %8.5f %8.5f crop\/mapa_%8.5f_%8.5f.tiff crop\/geomapa_%8.5f_%8.5f.tiff', lon_tl, lat_tl, lon_br, lat_br, lat, lon, lat, lon));\r\n\tend\r\nend\r\n<\/pre>\n<p>Nast\u0119pnie za pomoc\u0105 skryptu <span style=\"font-family:Courier New\">gdal_merge.py<\/span> po\u0142\u0105czy\u0142em wszystkie geotiffy w jednego wielkiego geotiffa. Tutaj praca mog\u0142aby si\u0119 zako\u0144czy\u0107, ale chcia\u0142em, \u017ceby moja mapa mia\u0142a jakie\u015b fajne odwzorowanie, ramk\u0119 itp. Najlepszym znanym mi programem do rysowania map jest pakiet GMT (<a href=\"http:\/\/gmt.soest.hawaii.edu\/\">http:\/\/gmt.soest.hawaii.edu\/<\/a>). Za pomoc\u0105 prostego skryptu przygotowa\u0142em pdf (ps to prawie pdf) z map\u0105 do wydruku:<\/p>\n<pre style=\"overflow:auto;\">gmt gmtset PS_MEDIA=Custom_60ix80i\r\ngmt gmtset MAP_FRAME_WIDTH=.25i\r\ngmt gmtset FONT_ANNOT_PRIMARY=32p,Helvetica,black\r\ngmt gmtset COLOR_NAN=white\r\ngmt psbasemap -R13.8\/24.5\/48.7\/55 -Jl19.20\/19.30\/52\/60\/1:600000 -B1g.5:.\"\": -K -P > mapa_all.ps\r\ngmt grdimage ALL.tiff -D -R13.8\/24.5\/48.7\/55 -Jl19.20\/19.30\/52\/60\/1:600000 -Gf -Q -P -O -K >> mapa_all.ps\r\ngmt pscoast -R -Df -J -N1\/3p,- -A0\/0\/1  -O -P >> mapa_all.ps<\/pre>\n<p>Tak wygl\u0105da\u0142 efekt ko\u0144cowy po wydrukowaniu:<\/p>\n<p><center><a href=\"http:\/\/morony.pl\/wp-content\/uploads\/2016\/09\/IMG_0276.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"768\" src=\"http:\/\/morony.pl\/wp-content\/uploads\/2016\/09\/IMG_0276-1024x768.jpg\" style=\"width:600px;height:auto;\"  class=\"alignnone size-large wp-image-927\" srcset=\"https:\/\/morony.pl\/wp-content\/uploads\/2016\/09\/IMG_0276-1024x768.jpg 1024w, https:\/\/morony.pl\/wp-content\/uploads\/2016\/09\/IMG_0276-300x225.jpg 300w, https:\/\/morony.pl\/wp-content\/uploads\/2016\/09\/IMG_0276-768x576.jpg 768w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/center><\/p>\n<p><center><a href=\"http:\/\/morony.pl\/wp-content\/uploads\/2016\/09\/IMG_0277.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"768\" src=\"http:\/\/morony.pl\/wp-content\/uploads\/2016\/09\/IMG_0277-1024x768.jpg\" style=\"width:600px;height:auto;\" class=\"alignnone size-large wp-image-928\" srcset=\"https:\/\/morony.pl\/wp-content\/uploads\/2016\/09\/IMG_0277-1024x768.jpg 1024w, https:\/\/morony.pl\/wp-content\/uploads\/2016\/09\/IMG_0277-300x225.jpg 300w, https:\/\/morony.pl\/wp-content\/uploads\/2016\/09\/IMG_0277-768x576.jpg 768w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/center><\/p>\n<p>Nie dziel\u0119 si\u0119 plikiem z map\u0105, bo jest bardzo du\u017cy i nie jestem pewnie czy google nie chcia\u0142oby mi urwa\u0107 za to g\u0142owy. <\/p>\n","protected":false},"excerpt":{"rendered":"<p>Bardzo lubi\u0119 mapy. Pewnego dnia wcze\u015bniej w tym roku wpad\u0142em na pomys\u0142, aby ozdobi\u0107 \u015bcian\u0119 drogow\u0105 map\u0105 Polski. W pomy\u015ble by\u0142 jeden ma\u0142y haczyk: nie chcia\u0142em byle jakiej mapy, chcia\u0142em map\u0119 Google. Szybki przegl\u0105d internetu nie przyni\u00f3s\u0142 \u017cadnych konkretnych rozwi\u0105za\u0144 &#8211; super, b\u0119d\u0119 pierwszy! Mapy Google wy\u015bwietlaj\u0105 r\u00f3\u017cn\u0105 ilo\u015b\u0107 szczeg\u00f3\u0142\u00f3w w zale\u017cno\u015bci od stopnia przybli\u017cenia. [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"_links":{"self":[{"href":"https:\/\/morony.pl\/index.php?rest_route=\/wp\/v2\/posts\/914"}],"collection":[{"href":"https:\/\/morony.pl\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/morony.pl\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/morony.pl\/index.php?rest_route=\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/morony.pl\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=914"}],"version-history":[{"count":14,"href":"https:\/\/morony.pl\/index.php?rest_route=\/wp\/v2\/posts\/914\/revisions"}],"predecessor-version":[{"id":978,"href":"https:\/\/morony.pl\/index.php?rest_route=\/wp\/v2\/posts\/914\/revisions\/978"}],"wp:attachment":[{"href":"https:\/\/morony.pl\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=914"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/morony.pl\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=914"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/morony.pl\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=914"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}