OSGeoLive-Notebooks/Shapely/shapely-pyplot-multilines.i...

139 lines
19 KiB
Plaintext
Raw Permalink Normal View History

2021-05-11 12:38:26 -07:00
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"from matplotlib import pyplot\n",
"from shapely.geometry import MultiLineString\n",
"\n",
"%matplotlib inline"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"\n",
"COLOR = {\n",
" True: '#6699cc',\n",
" False: '#ffcc33'\n",
" }\n",
"\n",
"def v_color(ob):\n",
" return COLOR[ob.is_simple]\n",
"\n",
"def plot_coords(ax, ob):\n",
" for line in ob:\n",
" x, y = line.xy\n",
" ax.plot(x, y, 'o', color='#999999', zorder=1)\n",
"\n",
"def plot_bounds(ax, ob):\n",
" x, y = zip(*list((p.x, p.y) for p in ob.boundary))\n",
" ax.plot(x, y, 'o', color='#000000', zorder=1)\n",
"\n",
"def plot_lines(ax, ob):\n",
" for line in ob:\n",
" x, y = line.xy\n",
" ax.plot(x, y, color=v_color(ob), alpha=0.7, linewidth=3, solid_capstyle='round', zorder=2)\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 1080x1800 with 2 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"fig = pyplot.figure(1, figsize=(12,20), dpi=90)\n",
"\n",
"# 1: disconnected multilinestring\n",
"ax = fig.add_subplot(121)\n",
"\n",
"mline1 = MultiLineString([((0, 0), (1, 1)), ((0, 2), (1, 1.5), (1.5, 1), (2, 0))])\n",
"\n",
"plot_coords(ax, mline1)\n",
"plot_bounds(ax, mline1)\n",
"plot_lines(ax, mline1)\n",
"\n",
"ax.set_title('a) simple')\n",
"\n",
"xrange = [-1, 3]\n",
"yrange = [-1, 3]\n",
"ax.set_xlim(*xrange)\n",
"ax.set_xticks([-1, 0, 1, 2, 3])\n",
"ax.set_ylim(*yrange)\n",
"ax.set_yticks([-1, 0, 1, 2, 3])\n",
"ax.set_aspect(1)\n",
"\n",
"#2: invalid self-touching ring\n",
"ax = fig.add_subplot(122)\n",
"\n",
"mline2 = MultiLineString([((0, 0), (1, 1), (1.5, 1)), ((0, 2), (1, 1.5), (1.5, 1), (2, 0))])\n",
"\n",
"plot_coords(ax, mline2)\n",
"plot_bounds(ax, mline2)\n",
"plot_lines(ax, mline2)\n",
"\n",
"ax.set_title('b) complex')\n",
"\n",
"xrange = [-1, 3]\n",
"yrange = [-1, 3]\n",
"ax.set_xlim(*xrange)\n",
"ax.set_xticks([-1, 0, 1, 2, 3])\n",
"ax.set_ylim(*yrange)\n",
"ax.set_yticks([-1, 0, 1, 2, 3])\n",
"ax.set_aspect(1)\n",
"\n",
"pyplot.show()\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.5"
}
},
"nbformat": 4,
"nbformat_minor": 2
}