[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-72831":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":17,"stars7d":17,"stars30d":18,"stars90d":16,"forks30d":16,"starsTrendScore":19,"compositeScore":20,"rankGlobal":10,"rankLanguage":10,"license":21,"archived":22,"fork":22,"defaultBranch":23,"hasWiki":24,"hasPages":24,"topics":25,"createdAt":10,"pushedAt":10,"updatedAt":33,"readmeContent":34,"aiSummary":35,"trendingCount":16,"starSnapshotCount":16,"syncStatus":36,"lastSyncTime":37,"discoverSource":38},72831,"prettymaps","marceloprates\u002Fprettymaps","marceloprates","Draw pretty maps from OpenStreetMap data! Built with osmnx +matplotlib + shapely","https:\u002F\u002Fprettymaps.streamlit.app\u002F",null,"Jupyter Notebook",12279,599,79,52,0,5,22,15,83.03,"GNU Affero General Public License v3.0",false,"main",true,[26,27,28,29,30,31,32],"cartography","generative-art","jupyter-notebook","maps","matplotlib","openstreetmap","python","2026-06-12 04:01:07","# prettymaps\n\nA minimal Python library to draw customized maps from [OpenStreetMap](https:\u002F\u002Fwww.openstreetmap.org\u002F#map=12\u002F11.0733\u002F106.3078) created using the [osmnx](https:\u002F\u002Fgithub.com\u002Fgboeing\u002Fosmnx), [matplotlib](https:\u002F\u002Fmatplotlib.org\u002F), [shapely](https:\u002F\u002Fshapely.readthedocs.io\u002Fen\u002Fstable\u002Findex.html) and [vsketch](https:\u002F\u002Fgithub.com\u002Fabey79\u002Fvsketch) packages.\n\n![](https:\u002F\u002Fgithub.com\u002Fmarceloprates\u002Fprettymaps\u002Fraw\u002Fmain\u002Fpictures\u002Fheerhugowaard.png)\n\n# [![Docs](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fdocs-GitHub%20Pages-blue?logo=github)](https:\u002F\u002Fmarceloprates.github.io\u002Fprettymaps\u002F) [![PyPI](https:\u002F\u002Fimg.shields.io\u002Fpypi\u002Fv\u002Fprettymaps)](https:\u002F\u002Fpypi.org\u002Fproject\u002Fprettymaps\u002F) [![Python](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fpython-3.12%2B-blue)](https:\u002F\u002Fwww.python.org\u002F) [![License](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Flicense-AGPL%20v3.0-green)](LICENSE)\n\n\nThis work is [licensed](LICENSE) under a GNU Affero General Public License v3.0 (you can make commercial use, distribute and modify this project, but must **disclose** the source code with the license and copyright notice)\n\n## Note about crediting and NFTs:\n- Please keep the printed message on the figures crediting my repository and OpenStreetMap ([mandatory by their license](https:\u002F\u002Fwww.openstreetmap.org\u002Fcopyright)).\n- I am personally **against** NFTs for their [environmental impact](https:\u002F\u002Fearth.org\u002Fnfts-environmental-impact\u002F), the fact that they're a [giant money-laundering pyramid scheme](https:\u002F\u002Ftwitter.com\u002Fsmdiehl\u002Fstatus\u002F1445795667826208770) and the structural incentives they create for [theft](https:\u002F\u002Ftwitter.com\u002FNFTtheft) in the open source and generative art communities.\n- **I do not authorize in any way this project to be used for selling NFTs**, although I cannot legally enforce it. **Respect the creator**.\n- The [AeternaCivitas](https:\u002F\u002Fmagiceden.io\u002Fmarketplace\u002Faeterna_civitas) and [geoartnft](https:\u002F\u002Fwww.geo-nft.com\u002F) projects have used this work to sell NFTs and refused to credit it. See how they reacted after being exposed: [AeternaCivitas](https:\u002F\u002Fgithub.com\u002Fmarceloprates\u002Fprettymaps\u002Fraw\u002Fmain\u002Fpictures\u002FNFT_theft_AeternaCivitas.jpg), [geoartnft](https:\u002F\u002Fgithub.com\u002Fmarceloprates\u002Fprettymaps\u002Fraw\u002Fmain\u002Fpictures\u002FNFT_theft_geoart.jpg).\n- **I have closed my other generative art projects on Github and won't be sharing new ones as open source to protect me from the NFT community**.\n\n\u003Ca href='https:\u002F\u002Fko-fi.com\u002Fmarceloprates_' target='_blank'>\u003Cimg height='36' style='border:0px;height:36px;' src='https:\u002F\u002Fcdn.ko-fi.com\u002Fcdn\u002Fkofi1.png?v=3' border='0' alt='Buy Me a Coffee at ko-fi.com' \u002F>\u003C\u002Fa>\n\n## As seen on [Hacker News](https:\u002F\u002Fweb.archive.org\u002Fweb\u002F20210825160918\u002Fhttps:\u002F\u002Fnews.ycombinator.com\u002Fnews):\n![](https:\u002F\u002Fgithub.com\u002Fmarceloprates\u002Fprettymaps\u002Fraw\u002Fmain\u002Fpictures\u002Fhackernews-prettymaps.png)\n## [prettymaps subreddit](https:\u002F\u002Fwww.reddit.com\u002Fr\u002Fprettymaps_\u002F)\n## [Google Colaboratory Demo](https:\u002F\u002Fcolab.research.google.com\u002Fgithub\u002Fmarceloprates\u002Fprettymaps\u002Fblob\u002Fmaster\u002Fnotebooks\u002Fexamples.ipynb)\n\n# Installation\n\n### Install locally:\nInstall prettymaps with:\n\n```\npip install prettymaps\n```\n\n### Install on Google Colaboratory:\n\nInstall prettymaps with:\n\n```\n!pip install -e \"git+https:\u002F\u002Fgithub.com\u002Fmarceloprates\u002Fprettymaps#egg=prettymaps\"\n```\n\nThen **restart the runtime** (Runtime -> Restart Runtime) before importing prettymaps\n\n# Run front-end\n\nAfter prettymaps is installed, you can run the front-end (streamlit) application from the prettymaps repository using:\n```\nstreamlit run app.py\n```\n\n# Tutorial\n\nPlotting with prettymaps is very simple. Run:\n```python\nprettymaps.plot(your_query)\n```\n\n**your_query** can be:\n1. An address (Example: \"Porto Alegre\"),\n2. Latitude \u002F Longitude coordinates (Example: (-30.0324999, -51.2303767))\n3. A custom boundary in GeoDataFrame format\n\n\n```python\n%reload_ext autoreload\n%autoreload 2\n\nimport prettymaps\n\nplot = prettymaps.plot('Stad van de Zon, Heerhugowaard, Netherlands')\n```\n\n    Fetching geodataframes took 14.43 seconds\n\n\n\n    \n![png](pictures\u002FREADME\u002Ftemp_readme_files\u002Ftemp_readme_7_1.png)\n    \n\n\nYou can also choose from different \"presets\" (parameter combinations saved in JSON files)\n\nSee below an example using the \"minimal\" preset\n\n\n```python\nimport prettymaps\n\nplot = prettymaps.plot(\n    'Stad van de Zon, Heerhugowaard, Netherlands',\n    preset = 'minimal'\n)\n```\n\n    Fetching geodataframes took 5.48 seconds\n\n\n\n    \n![png](pictures\u002FREADME\u002Ftemp_readme_files\u002Ftemp_readme_9_1.png)\n    \n\n\nRun\n\n```python\nprettymaps.presets()\n```\n\nto list all available presets:\n\n\n```python\nimport prettymaps\n\nprettymaps.presets()\n```\n\n\n\n\n\u003Cdiv>\n\u003Cstyle scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n\u003C\u002Fstyle>\n\u003Ctable border=\"1\" class=\"dataframe\">\n  \u003Cthead>\n    \u003Ctr style=\"text-align: right;\">\n      \u003Cth>\u003C\u002Fth>\n      \u003Cth>preset\u003C\u002Fth>\n      \u003Cth>params\u003C\u002Fth>\n    \u003C\u002Ftr>\n  \u003C\u002Fthead>\n  \u003Ctbody>\n    \u003Ctr>\n      \u003Cth>0\u003C\u002Fth>\n      \u003Ctd>abraca-redencao\u003C\u002Ftd>\n      \u003Ctd>{'layers': {'perimeter': {}, 'streets': {'widt...\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\n      \u003Cth>1\u003C\u002Fth>\n      \u003Ctd>barcelona\u003C\u002Ftd>\n      \u003Ctd>{'layers': {'perimeter': {'circle': False}, 's...\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\n      \u003Cth>2\u003C\u002Fth>\n      \u003Ctd>barcelona-plotter\u003C\u002Ftd>\n      \u003Ctd>{'layers': {'streets': {'width': {'primary': 5...\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\n      \u003Cth>3\u003C\u002Fth>\n      \u003Ctd>cb-bf-f\u003C\u002Ftd>\n      \u003Ctd>{'layers': {'streets': {'width': {'trunk': 6, ...\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\n      \u003Cth>4\u003C\u002Fth>\n      \u003Ctd>default\u003C\u002Ftd>\n      \u003Ctd>{'layers': {'perimeter': {}, 'streets': {'widt...\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\n      \u003Cth>5\u003C\u002Fth>\n      \u003Ctd>heerhugowaard\u003C\u002Ftd>\n      \u003Ctd>{'layers': {'perimeter': {}, 'streets': {'widt...\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\n      \u003Cth>6\u003C\u002Fth>\n      \u003Ctd>macao\u003C\u002Ftd>\n      \u003Ctd>{'layers': {'perimeter': {}, 'streets': {'cust...\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\n      \u003Cth>7\u003C\u002Fth>\n      \u003Ctd>minimal\u003C\u002Ftd>\n      \u003Ctd>{'layers': {'perimeter': {}, 'streets': {'widt...\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\n      \u003Cth>8\u003C\u002Fth>\n      \u003Ctd>plotter\u003C\u002Ftd>\n      \u003Ctd>{'layers': {'perimeter': {}, 'streets': {'widt...\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\n      \u003Cth>9\u003C\u002Fth>\n      \u003Ctd>tijuca\u003C\u002Ftd>\n      \u003Ctd>{'layers': {'perimeter': {}, 'streets': {'widt...\u003C\u002Ftd>\n    \u003C\u002Ftr>\n  \u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003C\u002Fdiv>\n\n\n\nTo examine a specific preset, run:\n\n\n```python\nimport prettymaps\n\nprettymaps.preset('default')\n```\n\n\n\n\n    Preset(params={'layers': {'perimeter': {}, 'streets': {'width': {'motorway': 5, 'trunk': 5, 'primary': 4.5, 'secondary': 4, 'tertiary': 3.5, 'cycleway': 3.5, 'residential': 3, 'service': 2, 'unclassified': 2, 'pedestrian': 2, 'footway': 1}}, 'waterway': {'tags': {'waterway': ['river', 'stream']}, 'width': {'river': 20, 'stream': 10}}, 'building': {'tags': {'building': True, 'landuse': 'construction'}}, 'water': {'tags': {'natural': ['water', 'bay']}}, 'sea': {}, 'forest': {'tags': {'landuse': 'forest'}}, 'green': {'tags': {'landuse': ['grass', 'orchard'], 'natural': ['island', 'wood', 'wetland'], 'leisure': ['dog_park', 'disc_golf_course', 'garden', 'golf_course', 'park', 'pitch', 'sports_centre', 'track']}}, 'rock': {'tags': {'natural': 'bare_rock'}}, 'beach': {'tags': {'natural': 'beach'}}, 'parking': {'tags': {'amenity': 'parking', 'highway': 'pedestrian', 'man_made': 'pier'}}}, 'style': {'perimeter': {'fill': False, 'lw': 0, 'zorder': 0}, 'background': {'fc': '#F2F4CB', 'zorder': -1}, 'green': {'fc': '#8BB174', 'ec': '#2F3737', 'hatch_c': '#A7C497', 'hatch': 'ooo...', 'lw': 1, 'zorder': 1}, 'forest': {'fc': '#64B96A', 'ec': '#2F3737', 'lw': 1, 'zorder': 2}, 'water': {'fc': '#a8e1e6', 'ec': '#2F3737', 'hatch_c': '#9bc3d4', 'hatch': 'ooo...', 'lw': 1, 'zorder': 99}, 'sea': {'fc': '#a8e1e6', 'ec': '#2F3737', 'hatch_c': '#9bc3d4', 'hatch': 'ooo...', 'lw': 1, 'zorder': 99}, 'waterway': {'fc': '#a8e1e6', 'ec': '#2F3737', 'hatch_c': '#9bc3d4', 'hatch': 'ooo...', 'lw': 1, 'zorder': 200}, 'beach': {'fc': '#FCE19C', 'ec': '#2F3737', 'hatch_c': '#d4d196', 'hatch': 'ooo...', 'lw': 1, 'zorder': 3}, 'parking': {'fc': '#F2F4CB', 'ec': '#2F3737', 'lw': 1, 'zorder': 3}, 'streets': {'fc': '#2F3737', 'ec': '#475657', 'alpha': 1, 'lw': 0, 'zorder': 4}, 'building': {'palette': ['#433633', '#FF5E5B'], 'ec': '#2F3737', 'lw': 0.5, 'zorder': 5}, 'rock': {'fc': '#BDC0BA', 'ec': '#2F3737', 'lw': 1, 'zorder': 6}}, 'circle': None, 'radius': 500})\n\n\n\n\nInsted of using the default configuration you can customize several parameters. The most important are:\n\n- layers: A dictionary of OpenStreetMap layers to fetch.\n    - Keys: layer names (arbitrary)\n    - Values: dicts representing OpenStreetMap queries\n- style: Matplotlib style parameters\n    - Keys: layer names (the same as before)\n    - Values: dicts representing Matplotlib style parameters\n\n```python\nplot = prettymaps.plot(\n    # Your query. Example: \"Porto Alegre\" or (-30.0324999, -51.2303767) (GPS coords)\n    your_query,\n    # Dict of OpenStreetMap Layers to plot. Example:\n    # {'building': {'tags': {'building': True}}, 'water': {'tags': {'natural': 'water'}}}\n    # Check the \u002Fpresets folder for more examples\n    layers,\n    # Dict of style parameters for matplotlib. Example:\n    # {'building': {'palette': ['#f00','#0f0','#00f'], 'edge_color': '#333'}}\n    style,\n    # Preset to load. Options include:\n    # ['default', 'minimal', 'macao', 'tijuca']\n    preset,\n    # Save current parameters to a preset file.\n    # Example: \"my-preset\" will save to \"presets\u002Fmy-preset.json\"\n    save_preset,\n    # Whether to update loaded preset with additional provided parameters. Boolean\n    update_preset,\n    # Plot with circular boundary. Boolean\n    circle,\n    # Plot area radius. Float\n    radius,\n    # Dilate the boundary by this amount. Float\n    dilate\n)\n```\n\n**plot** is a python dataclass containing:\n\n```python\n@dataclass\nclass Plot:\n    # A dictionary of GeoDataFrames (one for each plot layer)\n    geodataframes: Dict[str, gp.GeoDataFrame]\n    # A matplotlib figure\n    fig: matplotlib.figure.Figure\n    # A matplotlib axis object\n    ax: matplotlib.axes.Axes\n```\n\nHere's an example of running prettymaps.plot() with customized parameters:\n\n\n```python\nimport prettymaps\n\nplot = prettymaps.plot(\n    'Praça Ferreira do Amaral, Macau',\n    circle = True,\n    radius = 1100,\n    layers = {\n        \"green\": {\n            \"tags\": {\n                \"landuse\": \"grass\",\n                \"natural\": [\"island\", \"wood\"],\n                \"leisure\": \"park\"\n            }\n        },\n        \"forest\": {\n            \"tags\": {\n                \"landuse\": \"forest\"\n            }\n        },\n        \"water\": {\n            \"tags\": {\n                \"natural\": [\"water\", \"bay\"]\n            }\n        },\n        \"parking\": {\n            \"tags\": {\n                \"amenity\": \"parking\",\n                \"highway\": \"pedestrian\",\n                \"man_made\": \"pier\"\n            }\n        },\n        \"streets\": {\n            \"width\": {\n                \"motorway\": 5,\n                \"trunk\": 5,\n                \"primary\": 4.5,\n                \"secondary\": 4,\n                \"tertiary\": 3.5,\n                \"residential\": 3,\n            }\n        },\n        \"building\": {\n            \"tags\": {\"building\": True},\n        },\n    },\n    style = {\n        \"background\": {\n            \"fc\": \"#F2F4CB\",\n            \"ec\": \"#dadbc1\",\n            \"hatch\": \"ooo...\",\n        },\n        \"perimeter\": {\n            \"fc\": \"#F2F4CB\",\n            \"ec\": \"#dadbc1\",\n            \"lw\": 0,\n            \"hatch\": \"ooo...\",\n        },\n        \"green\": {\n            \"fc\": \"#D0F1BF\",\n            \"ec\": \"#2F3737\",\n            \"lw\": 1,\n        },\n        \"forest\": {\n            \"fc\": \"#64B96A\",\n            \"ec\": \"#2F3737\",\n            \"lw\": 1,\n        },\n        \"water\": {\n            \"fc\": \"#a1e3ff\",\n            \"ec\": \"#2F3737\",\n            \"hatch\": \"ooo...\",\n            \"hatch_c\": \"#85c9e6\",\n            \"lw\": 1,\n        },\n        \"parking\": {\n            \"fc\": \"#F2F4CB\",\n            \"ec\": \"#2F3737\",\n            \"lw\": 1,\n        },\n        \"streets\": {\n            \"fc\": \"#2F3737\",\n            \"ec\": \"#475657\",\n            \"alpha\": 1,\n            \"lw\": 0,\n        },\n        \"building\": {\n            \"palette\": [\n                \"#FFC857\",\n                \"#E9724C\",\n                \"#C5283D\"\n            ],\n            \"ec\": \"#2F3737\",\n            \"lw\": 0.5,\n        }\n    }\n)\n```\n\n    Fetching geodataframes took 20.74 seconds\n\n\n\n    \n![png](pictures\u002FREADME\u002Ftemp_readme_files\u002Ftemp_readme_15_1.png)\n    \n\n\nIn order to plot an entire region and not just a rectangular or circular area, set\n\n```python\nradius = False\n```\n\n\n```python\nimport prettymaps\n\nplot = prettymaps.plot(\n    'Bom Fim, Porto Alegre, Brasil', radius = False,\n)\n```\n\n    Fetching geodataframes took 14.80 seconds\n\n\n\n    \n![png](pictures\u002FREADME\u002Ftemp_readme_files\u002Ftemp_readme_17_1.png)\n    \n\n\nYou can access layers's GeoDataFrames directly like this:\n\n\n```python\nimport prettymaps\n\n# Run prettymaps in show = False mode (we're only interested in obtaining the GeoDataFrames)\nplot = prettymaps.plot('Centro Histórico, Porto Alegre', show = False)\nplot.geodataframes['building']\n```\n\n    Fetching geodataframes took 14.56 seconds\n\n\n\n\n\n\u003Cdiv>\n\u003Cstyle scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n\u003C\u002Fstyle>\n\u003Ctable border=\"1\" class=\"dataframe\">\n  \u003Cthead>\n    \u003Ctr style=\"text-align: right;\">\n      \u003Cth>\u003C\u002Fth>\n      \u003Cth>geometry\u003C\u002Fth>\n      \u003Cth>bicycle\u003C\u002Fth>\n      \u003Cth>highway\u003C\u002Fth>\n      \u003Cth>leisure\u003C\u002Fth>\n      \u003Cth>addr:housenumber\u003C\u002Fth>\n      \u003Cth>addr:street\u003C\u002Fth>\n      \u003Cth>amenity\u003C\u002Fth>\n      \u003Cth>operator\u003C\u002Fth>\n      \u003Cth>website\u003C\u002Fth>\n      \u003Cth>check_date\u003C\u002Fth>\n      \u003Cth>...\u003C\u002Fth>\n      \u003Cth>payment:lightning_contactless\u003C\u002Fth>\n      \u003Cth>payment:onchain\u003C\u002Fth>\n      \u003Cth>bus\u003C\u002Fth>\n      \u003Cth>smoothness\u003C\u002Fth>\n      \u003Cth>inscription\u003C\u002Fth>\n      \u003Cth>type\u003C\u002Fth>\n      \u003Cth>boat\u003C\u002Fth>\n      \u003Cth>name:fr\u003C\u002Fth>\n      \u003Cth>building:part\u003C\u002Fth>\n      \u003Cth>architect\u003C\u002Fth>\n    \u003C\u002Ftr>\n  \u003C\u002Fthead>\n  \u003Ctbody>\n    \u003Ctr>\n      \u003Cth>(node, 2407915698)\u003C\u002Fth>\n      \u003Ctd>POINT (-51.23212 -30.0367)\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>820\u003C\u002Ftd>\n      \u003Ctd>Rua Washington Luiz\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>...\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\n      \u003Cth>(relation, 2798271)\u003C\u002Fth>\n      \u003Ctd>POLYGON ((-51.23097 -30.03377, -51.2309 -30.03...\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>Praça Marechal Deodoro\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>https:\u002F\u002Fwww.estado.rs.gov.br\u002F\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>...\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>multipolygon\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>Palais Piratini\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\n      \u003Cth>(relation, 2895718)\u003C\u002Fth>\n      \u003Ctd>POLYGON ((-51.23445 -30.03076, -51.23441 -30.0...\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>736\u003C\u002Ftd>\n      \u003Ctd>Rua dos Andradas\u003C\u002Ftd>\n      \u003Ctd>arts_centre\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>https:\u002F\u002Fwww.ccmq.com.br\u002F\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>...\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>multipolygon\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>no\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\n      \u003Cth>(relation, 3532262)\u003C\u002Fth>\n      \u003Ctd>POLYGON ((-51.22935 -30.03693, -51.22923 -30.0...\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>...\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>multipolygon\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\n      \u003Cth>(relation, 3532263)\u003C\u002Fth>\n      \u003Ctd>POLYGON ((-51.22916 -30.037, -51.22903 -30.036...\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>parking\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>...\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>multipolygon\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\n      \u003Cth>...\u003C\u002Fth>\n      \u003Ctd>...\u003C\u002Ftd>\n      \u003Ctd>...\u003C\u002Ftd>\n      \u003Ctd>...\u003C\u002Ftd>\n      \u003Ctd>...\u003C\u002Ftd>\n      \u003Ctd>...\u003C\u002Ftd>\n      \u003Ctd>...\u003C\u002Ftd>\n      \u003Ctd>...\u003C\u002Ftd>\n      \u003Ctd>...\u003C\u002Ftd>\n      \u003Ctd>...\u003C\u002Ftd>\n      \u003Ctd>...\u003C\u002Ftd>\n      \u003Ctd>...\u003C\u002Ftd>\n      \u003Ctd>...\u003C\u002Ftd>\n      \u003Ctd>...\u003C\u002Ftd>\n      \u003Ctd>...\u003C\u002Ftd>\n      \u003Ctd>...\u003C\u002Ftd>\n      \u003Ctd>...\u003C\u002Ftd>\n      \u003Ctd>...\u003C\u002Ftd>\n      \u003Ctd>...\u003C\u002Ftd>\n      \u003Ctd>...\u003C\u002Ftd>\n      \u003Ctd>...\u003C\u002Ftd>\n      \u003Ctd>...\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\n      \u003Cth>(way, 1082776706)\u003C\u002Fth>\n      \u003Ctd>POLYGON ((-51.22975 -30.02912, -51.22974 -30.0...\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>...\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\n      \u003Cth>(way, 1082776707)\u003C\u002Fth>\n      \u003Ctd>POLYGON ((-51.22992 -30.02954, -51.22987 -30.0...\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>...\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\n      \u003Cth>(way, 1082787655)\u003C\u002Fth>\n      \u003Ctd>POLYGON ((-51.22601 -30.03038, -51.22602 -30.0...\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>...\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\n      \u003Cth>(way, 1354523569)\u003C\u002Fth>\n      \u003Ctd>POLYGON ((-51.23248 -30.03341, -51.23244 -30.0...\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>pharmacy\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>...\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n    \u003C\u002Ftr>\n    \u003Ctr>\n      \u003Cth>(way, 1423336172)\u003C\u002Fth>\n      \u003Ctd>POLYGON ((-51.23399 -30.03092, -51.23389 -30.0...\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>788\u003C\u002Ftd>\n      \u003Ctd>Rua dos Andradas\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>...\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n      \u003Ctd>NaN\u003C\u002Ftd>\n    \u003C\u002Ftr>\n  \u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>2415 rows × 137 columns\u003C\u002Fp>\n\u003C\u002Fdiv>\n\n\n\nSearch a building by name and display it:\n\n\n```python\nplot.geodataframes['building'][\n        plot.geodataframes['building'].name == 'Catedral Metropolitana Nossa Senhora Mãe de Deus'\n].geometry[0]\n```\n\n    \u002Fopt\u002Fhostedtoolcache\u002FPython\u002F3.12.11\u002Fx64\u002Flib\u002Fpython3.12\u002Fsite-packages\u002Fgeopandas\u002Fgeoseries.py:772: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`\n      val = getattr(super(), mtd)(*args, **kwargs)\n\n\n\n\n\n    \n![svg](pictures\u002FREADME\u002Ftemp_readme_files\u002Ftemp_readme_21_1.svg)\n    \n\n\n\nPlot mosaic of building footprints\n\n\n```python\nimport prettymaps\nimport numpy as np\nimport osmnx as ox\nfrom matplotlib import pyplot as plt\n\n# Run prettymaps in show = False mode (we're only interested in obtaining the GeoDataFrames)\nplot = prettymaps.plot('Porto Alegre', show = False)\n# Get list of buildings from plot's geodataframes dict\nbuildings = plot.geodataframes['building']\n# Project from lat \u002F long\nbuildings = ox.projection.project_gdf(buildings)\nbuildings = [b for b in buildings.geometry if b.area > 0]\n\n# Draw Matplotlib mosaic of n x n building footprints\nn = 6\nfig,axes = plt.subplots(n,n, figsize = (7,6))\n# Set background color\nfig.patch.set_facecolor('#5cc0eb')\n# Figure title\nfig.suptitle(\n    'Buildings of Porto Alegre',\n    size = 25,\n    color = '#fff'\n)\n# Draw each building footprint on a separate axis\nfor ax,building in zip(np.concatenate(axes),buildings):\n    ax.plot(*building.exterior.xy, c = '#ffffff')\n    ax.autoscale(); ax.axis('off'); ax.axis('equal')\n```\n\n    Fetching geodataframes took 16.54 seconds\n\n\n\n    \n![png](pictures\u002FREADME\u002Ftemp_readme_files\u002Ftemp_readme_23_1.png)\n    \n\n\nAccess plot.ax or plot.fig to add new elements to the matplotlib plot: \n\n\n```python\nimport prettymaps\n\nplot = prettymaps.plot(\n    (41.39491,2.17557),\n    preset = 'barcelona',\n    show = False # We don't want to render the map yet\n)\n\n# Change background color\nplot.fig.patch.set_facecolor('#F2F4CB')\n# Add title\n_ = plot.ax.set_title(\n    'Barcelona',\n    font = 'serif',\n    size = 50\n)\n```\n\n    Fetching geodataframes took 12.52 seconds\n\n\nUse **plotter** mode to export a pen plotter-compatible SVG (thanks to abey79's amazing [vsketch](https:\u002F\u002Fgithub.com\u002Fabey79\u002Fvsketch) library)\n\n\n```python\nimport prettymaps\n\nplot = prettymaps.plot(\n    (41.39491,2.17557),\n    mode = 'plotter',\n    layers = dict(perimeter = {}),\n    preset = 'barcelona-plotter',\n    scale_x = .6,\n    scale_y = -.6,\n)\n```\n\n    Fetching geodataframes took 4.82 seconds\n\n\n\n    \n![png](pictures\u002FREADME\u002Ftemp_readme_files\u002Ftemp_readme_27_1.png)\n    \n\n\nSome other examples\n\n\n```python\nimport prettymaps\n\nplot = prettymaps.plot(\n    'Barra da Tijuca',\n    dilate = 0,\n    figsize = (22,10),\n    preset = 'tijuca',\n    adjust_aspect_ratio = False\n)\n```\n\n    Fetching geodataframes took 23.53 seconds\n\n\n\n    \n![png](pictures\u002FREADME\u002Ftemp_readme_files\u002Ftemp_readme_29_1.png)\n    \n\n\nUse prettymaps.create_preset() to create a preset:\n\n\n```python\nimport prettymaps\n\nprettymaps.create_preset(\n    \"my-preset\",\n    layers = {\n        \"building\": {\n            \"tags\": {\n                \"building\": True,\n                \"leisure\": [\n                    \"track\",\n                    \"pitch\"\n                ]\n            }\n        },\n        \"streets\": {\n            \"width\": {\n                \"trunk\": 6,\n                \"primary\": 6,\n                \"secondary\": 5,\n                \"tertiary\": 4,\n                \"residential\": 3.5,\n                \"pedestrian\": 3,\n                \"footway\": 3,\n                \"path\": 3\n            }\n        },\n    },\n    style = {\n        \"perimeter\": {\n            \"fill\": False,\n            \"lw\": 0,\n            \"zorder\": 0\n        },\n        \"streets\": {\n            \"fc\": \"#F1E6D0\",\n            \"ec\": \"#2F3737\",\n            \"lw\": 1.5,\n            \"zorder\": 3\n        },\n        \"building\": {\n            \"palette\": [\n                \"#fff\"\n            ],\n            \"ec\": \"#2F3737\",\n            \"lw\": 1,\n            \"zorder\": 4\n        }\n    }\n)\n\nprettymaps.preset('my-preset')\n```\n\n\n\n\n    Preset(params={'layers': {'building': {'tags': {'building': True, 'leisure': ['track', 'pitch']}}, 'streets': {'width': {'trunk': 6, 'primary': 6, 'secondary': 5, 'tertiary': 4, 'residential': 3.5, 'pedestrian': 3, 'footway': 3, 'path': 3}}}, 'style': {'perimeter': {'fill': False, 'lw': 0, 'zorder': 0}, 'streets': {'fc': '#F1E6D0', 'ec': '#2F3737', 'lw': 1.5, 'zorder': 3}, 'building': {'palette': ['#fff'], 'ec': '#2F3737', 'lw': 1, 'zorder': 4}}, 'circle': None, 'radius': None, 'dilate': None})\n\n\n\nUse **prettymaps.multiplot** and **prettymaps.Subplot** to draw multiple regions on the same canvas\n\n\n```python\nimport prettymaps\n\n# Draw several regions on the same canvas\nplot = prettymaps.multiplot(\n    prettymaps.Subplot(\n        'Cidade Baixa, Porto Alegre',\n        style={'building': {'palette': ['#49392C', '#E1F2FE', '#98D2EB']}}\n    ),\n    prettymaps.Subplot(\n        'Bom Fim, Porto Alegre',\n        style={'building': {'palette': ['#BA2D0B', '#D5F2E3', '#73BA9B', '#F79D5C']}}\n    ),\n    prettymaps.Subplot(\n        'Farroupilha, Porto Alegre',\n        layers = {'building': {'tags': {'building': True}}},\n        style={'building': {'palette': ['#EEE4E1', '#E7D8C9', '#E6BEAE']}}\n    ),\n    # Load a global preset\n    preset='cb-bf-f',\n    # Figure size\n    figsize=(12, 12)\n)\n```\n\n    Fetching geodataframes took 8.95 seconds\n\n\n    Fetching geodataframes took 7.03 seconds\n\n\n    Fetching geodataframes took 8.45 seconds\n\n\n\n    \n![png](pictures\u002FREADME\u002Ftemp_readme_files\u002Ftemp_readme_33_3.png)\n    \n\n\n# Add hillshade\n\n\n```python\nplot = prettymaps.plot(\n    'Honolulu',\n    radius = 5500,\n    figsize = 'a4',\n    layers = {'hillshade': {\n        'azdeg': 315,\n        'altdeg': 45,\n        'vert_exag': 1,\n        'dx': 1,\n        'dy': 1,\n        'alpha': 0.75,\n    }},\n)\n```\n\n    Fetching geodataframes took 37.53 seconds\n\n\n    make: Entering directory '\u002Fhome\u002Frunner\u002Fwork\u002Fprettymaps\u002Fprettymaps\u002Fnotebooks\u002FSRTM1'\n    curl -s -o spool\u002FN21\u002FN21W158.hgt.gz.temp https:\u002F\u002Fs3.amazonaws.com\u002Felevation-tiles-prod\u002Fskadi\u002FN21\u002FN21W158.hgt.gz && mv spool\u002FN21\u002FN21W158.hgt.gz.temp spool\u002FN21\u002FN21W158.hgt.gz\n\n\n    gunzip spool\u002FN21\u002FN21W158.hgt.gz 2>\u002Fdev\u002Fnull || touch spool\u002FN21\u002FN21W158.hgt\n    gdal_translate -q -co TILED=YES -co COMPRESS=DEFLATE -co ZLEVEL=9 -co PREDICTOR=2 spool\u002FN21\u002FN21W158.hgt cache\u002FN21\u002FN21W158.tif 2>\u002Fdev\u002Fnull || touch cache\u002FN21\u002FN21W158.tif\n\n\n    rm spool\u002FN21\u002FN21W158.hgt\n    make: Leaving directory '\u002Fhome\u002Frunner\u002Fwork\u002Fprettymaps\u002Fprettymaps\u002Fnotebooks\u002FSRTM1'\n    make: Entering directory '\u002Fhome\u002Frunner\u002Fwork\u002Fprettymaps\u002Fprettymaps\u002Fnotebooks\u002FSRTM1'\n    gdalbuildvrt -q -overwrite SRTM1.vrt cache\u002FN21\u002FN21W158.tif\n    make: Leaving directory '\u002Fhome\u002Frunner\u002Fwork\u002Fprettymaps\u002Fprettymaps\u002Fnotebooks\u002FSRTM1'\n    make: Entering directory '\u002Fhome\u002Frunner\u002Fwork\u002Fprettymaps\u002Fprettymaps\u002Fnotebooks\u002FSRTM1'\n    cp SRTM1.vrt SRTM1.3faa36cc8cab4dfda9edabe3b5a4ddc1.vrt\n    make: Leaving directory '\u002Fhome\u002Frunner\u002Fwork\u002Fprettymaps\u002Fprettymaps\u002Fnotebooks\u002FSRTM1'\n    make: Entering directory '\u002Fhome\u002Frunner\u002Fwork\u002Fprettymaps\u002Fprettymaps\u002Fnotebooks\u002FSRTM1'\n    gdal_translate -q -co TILED=YES -co COMPRESS=DEFLATE -co ZLEVEL=9 -co PREDICTOR=2 -projwin -157.90125854957773 21.364471426268267 -157.81006761682832 21.244615177105388 SRTM1.3faa36cc8cab4dfda9edabe3b5a4ddc1.vrt \u002Fhome\u002Frunner\u002Fwork\u002Fprettymaps\u002Fprettymaps\u002Fnotebooks\u002Felevation.tif\n    rm -f SRTM1.3faa36cc8cab4dfda9edabe3b5a4ddc1.vrt\n    make: Leaving directory '\u002Fhome\u002Frunner\u002Fwork\u002Fprettymaps\u002Fprettymaps\u002Fnotebooks\u002FSRTM1'\n\n\n    WARNING:matplotlib.axes._base:Ignoring fixed y limits to fulfill fixed data aspect with adjustable data limits.\n\n\n\n    \n![png](pictures\u002FREADME\u002Ftemp_readme_files\u002Ftemp_readme_35_5.png)\n    \n\n\n# Add keypoints\n\n\n```python\nplot = prettymaps.plot(\n    'Garopaba',\n    radius = 5000,\n    figsize = 'a4',\n    layers = {'building': False},\n    keypoints = {\n        # Search for general keypoints specified by OSM tags\n        'tags': {'natural': ['beach']},\n        # Or, search by specific name or free-text search\n        # pretymaps will use a fuzzy string matching to search for the specified name\n        'specific': {\n            'pedra branca': {'tags': {'natural': ['peak']}},\n        }\n    },\n)\n```\n\n    Fetching geodataframes took 17.09 seconds\n\n\n\n    \n![png](pictures\u002FREADME\u002Ftemp_readme_files\u002Ftemp_readme_37_1.png)\n    \n\n","prettymaps 是一个用于从 OpenStreetMap 数据生成美观地图的 Python 库。它基于 osmnx、matplotlib 和 shapely 等工具包构建，允许用户自定义地图样式和内容。项目支持多种地理要素的绘制，并且可以灵活调整视觉效果以满足不同需求。适用于需要可视化地理位置信息或创建个性化地图的场景，如城市规划、数据分析展示等。该项目遵循 AGPL v3.0 许可证，鼓励使用者开放源代码并尊重创作者权益。",2,"2026-06-11 03:43:44","high_star"]