Created
February 8, 2017 18:00
-
-
Save AsgerPetersen/a1c86769eaf0f2da5345cc540fb452c1 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| { | |
| "cells": [ | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "# Constructing \"Wedge buffer" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 58, | |
| "metadata": { | |
| "collapsed": true | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "import math\n", | |
| "RAD2DEGREE = 180 / math.pi\n", | |
| "DEGREE2RAD = math.pi / 180" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 68, | |
| "metadata": { | |
| "collapsed": true | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "def polar_to_cartesian(centre, angle, radius):\n", | |
| " x = math.cos(angle) * radius + centre[0]\n", | |
| " y = math.sin(angle) * radius + centre[1]\n", | |
| " return (x,y)\n", | |
| " " | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 75, | |
| "metadata": { | |
| "collapsed": true | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "def make_arc(centre, radius, rad_from_azimuth, rad_to_azimuth, rad_angle_resolution):\n", | |
| " cartesian = []\n", | |
| " rad_az = rad_from_azimuth\n", | |
| " if rad_from_azimuth < rad_to_azimuth:\n", | |
| " while rad_az < rad_to_azimuth:\n", | |
| " cartesian.append(polar_to_cartesian(centre, rad_az, radius))\n", | |
| " rad_az = rad_az + rad_angle_resolution\n", | |
| " else:\n", | |
| " while rad_az > rad_to_azimuth:\n", | |
| " cartesian.append(polar_to_cartesian(centre, rad_az, radius))\n", | |
| " rad_az = rad_az - rad_angle_resolution\n", | |
| " cartesian.append(polar_to_cartesian(centre, rad_to_azimuth, radius))\n", | |
| " return cartesian" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 126, | |
| "metadata": { | |
| "collapsed": true | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "def wedge_buffer(centre, radius, azimuth, opening_angle, inner_radius = 0, angle_resolution = 10):\n", | |
| " # make Azimuth 0 north and positive clockwise\n", | |
| " azimuth = -1 * azimuth + 90\n", | |
| " rad_from_azimuth = (azimuth - opening_angle * 0.5) * DEGREE2RAD\n", | |
| " rad_to_azimuth = (azimuth + opening_angle * 0.5) * DEGREE2RAD\n", | |
| " rad_angle_res = angle_resolution * DEGREE2RAD\n", | |
| " \n", | |
| " cartesian_coords = make_arc(centre, radius, rad_from_azimuth, rad_to_azimuth, rad_angle_res)\n", | |
| " \n", | |
| " if inner_radius <= 0:\n", | |
| " cartesian_coords.append(centre)\n", | |
| " else:\n", | |
| " # Reverse arc at inner radius\n", | |
| " cartesian_coords += make_arc(centre, inner_radius, rad_to_azimuth, rad_from_azimuth, rad_angle_res)\n", | |
| " \n", | |
| " # Close ring\n", | |
| " cartesian_coords.append(cartesian_coords[0])\n", | |
| " return cartesian_coords" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "## Demonstrate" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 127, | |
| "metadata": { | |
| "collapsed": true | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "from shapely.geometry import Polygon, Point, GeometryCollection" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 128, | |
| "metadata": { | |
| "collapsed": true | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "import matplotlib as ml\n", | |
| "from matplotlib import pyplot\n", | |
| "# For ipython to display pyplots inline\n", | |
| "%matplotlib inline\n", | |
| "# Default figure size\n", | |
| "pyplot.rcParams['figure.figsize'] = (10.0, 10.0)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "Simplest case" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 129, | |
| "metadata": { | |
| "collapsed": true | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "centre = (5,10)\n", | |
| "radius = 1\n", | |
| "azimuth = 45\n", | |
| "opening_angle = 120\n", | |
| "poly = wedge_buffer(centre, radius, azimuth, opening_angle)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "`poly` is just a list of coordinates forming the polygon" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 130, | |
| "metadata": { | |
| "collapsed": false | |
| }, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "[(5.965925826289069, 9.74118095489748),\n", | |
| " (5.996194698091745, 9.912844257252342),\n", | |
| " (5.996194698091745, 10.087155742747658),\n", | |
| " (5.965925826289069, 10.258819045102522),\n", | |
| " (5.90630778703665, 10.4226182617407),\n", | |
| " (5.819152044288992, 10.573576436351047),\n", | |
| " (5.707106781186548, 10.707106781186548),\n", | |
| " (5.573576436351046, 10.819152044288991),\n", | |
| " (5.422618261740699, 10.90630778703665),\n", | |
| " (5.258819045102521, 10.965925826289068),\n", | |
| " (5.087155742747658, 10.996194698091745),\n", | |
| " (4.912844257252342, 10.996194698091745),\n", | |
| " (4.741180954897479, 10.965925826289068),\n", | |
| " (5, 10),\n", | |
| " (5.965925826289069, 9.74118095489748)]" | |
| ] | |
| }, | |
| "execution_count": 130, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "poly" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "Using shapely it can be visualized in iPython" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 131, | |
| "metadata": { | |
| "collapsed": false | |
| }, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "image/svg+xml": [ | |
| "<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"100.0\" height=\"100.0\" viewBox=\"4.69098040517 9.69098040517 1.35541484265 1.35541484265\" preserveAspectRatio=\"xMinYMin meet\"><g transform=\"matrix(1,0,0,-1,0,20.737375653)\"><path fill-rule=\"evenodd\" fill=\"#66cc99\" stroke=\"#555555\" stroke-width=\"0.027108296853\" opacity=\"0.6\" d=\"M 5.96592582629,9.7411809549 L 5.99619469809,9.91284425725 L 5.99619469809,10.0871557427 L 5.96592582629,10.2588190451 L 5.90630778704,10.4226182617 L 5.81915204429,10.5735764364 L 5.70710678119,10.7071067812 L 5.57357643635,10.8191520443 L 5.42261826174,10.906307787 L 5.2588190451,10.9659258263 L 5.08715574275,10.9961946981 L 4.91284425725,10.9961946981 L 4.7411809549,10.9659258263 L 5.0,10.0 L 5.96592582629,9.7411809549 z\" /></g></svg>" | |
| ], | |
| "text/plain": [ | |
| "<shapely.geometry.polygon.Polygon at 0x144d7e3d0>" | |
| ] | |
| }, | |
| "execution_count": 131, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "Polygon(poly)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "The `inner_radius` will cut away the inner part" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 132, | |
| "metadata": { | |
| "collapsed": false | |
| }, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "image/svg+xml": [ | |
| "<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"100.0\" height=\"100.0\" viewBox=\"-0.30901959483 -0.30901959483 1.35541484265 1.35541484265\" preserveAspectRatio=\"xMinYMin meet\"><g transform=\"matrix(1,0,0,-1,0,0.737375652989)\"><path fill-rule=\"evenodd\" fill=\"#66cc99\" stroke=\"#555555\" stroke-width=\"0.027108296853\" opacity=\"0.6\" d=\"M 0.965925826289,-0.258819045103 L 0.996194698092,-0.0871557427477 L 0.996194698092,0.0871557427477 L 0.965925826289,0.258819045103 L 0.906307787037,0.422618261741 L 0.819152044289,0.573576436351 L 0.707106781187,0.707106781187 L 0.573576436351,0.819152044289 L 0.422618261741,0.906307787037 L 0.258819045103,0.965925826289 L 0.0871557427477,0.996194698092 L -0.0871557427477,0.996194698092 L -0.258819045103,0.965925826289 L -0.129409522551,0.482962913145 L -0.0435778713738,0.498097349046 L 0.0435778713738,0.498097349046 L 0.129409522551,0.482962913145 L 0.21130913087,0.453153893518 L 0.286788218176,0.409576022144 L 0.353553390593,0.353553390593 L 0.409576022144,0.286788218176 L 0.453153893518,0.21130913087 L 0.482962913145,0.129409522551 L 0.498097349046,0.0435778713738 L 0.498097349046,-0.0435778713738 L 0.482962913145,-0.129409522551 L 0.965925826289,-0.258819045103 z\" /></g></svg>" | |
| ], | |
| "text/plain": [ | |
| "<shapely.geometry.polygon.Polygon at 0x144d7e090>" | |
| ] | |
| }, | |
| "execution_count": 132, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "inner_radius = 0.5\n", | |
| "poly = wedge_buffer(pnt, radius, azimuth, opening_angle, inner_radius)\n", | |
| "Polygon(poly)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "`angle_resolution` defines the density of points used to approximate the arc" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 133, | |
| "metadata": { | |
| "collapsed": false | |
| }, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "image/svg+xml": [ | |
| "<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"100.0\" height=\"100.0\" viewBox=\"-0.30901959483 -0.30901959483 1.35541484265 1.35541484265\" preserveAspectRatio=\"xMinYMin meet\"><g transform=\"matrix(1,0,0,-1,0,0.737375652989)\"><path fill-rule=\"evenodd\" fill=\"#66cc99\" stroke=\"#555555\" stroke-width=\"0.027108296853\" opacity=\"0.6\" d=\"M 0.965925826289,-0.258819045103 L 0.996194698092,0.0871557427477 L 0.906307787037,0.422618261741 L 0.707106781187,0.707106781187 L 0.422618261741,0.906307787037 L 0.0871557427477,0.996194698092 L -0.258819045103,0.965925826289 L -0.129409522551,0.482962913145 L 0.0435778713738,0.498097349046 L 0.21130913087,0.453153893518 L 0.353553390593,0.353553390593 L 0.453153893518,0.21130913087 L 0.498097349046,0.0435778713738 L 0.482962913145,-0.129409522551 L 0.965925826289,-0.258819045103 z\" /></g></svg>" | |
| ], | |
| "text/plain": [ | |
| "<shapely.geometry.polygon.Polygon at 0x10e354950>" | |
| ] | |
| }, | |
| "execution_count": 133, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "angle_resolution = 20\n", | |
| "Polygon(wedge_buffer(pnt, radius, azimuth, opening_angle, inner_radius, angle_resolution))" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 134, | |
| "metadata": { | |
| "collapsed": false | |
| }, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "image/svg+xml": [ | |
| "<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"100.0\" height=\"100.0\" viewBox=\"-0.309171806907 -0.309171806907 1.35952456871 1.35952456871\" preserveAspectRatio=\"xMinYMin meet\"><g transform=\"matrix(1,0,0,-1,0,0.741180954897)\"><path fill-rule=\"evenodd\" fill=\"#66cc99\" stroke=\"#555555\" stroke-width=\"0.0271904913742\" opacity=\"0.6\" d=\"M 0.965925826289,-0.258819045103 L 0.984807753012,-0.173648177667 L 0.996194698092,-0.0871557427477 L 1.0,2.77555756156e-17 L 0.996194698092,0.0871557427477 L 0.984807753012,0.173648177667 L 0.965925826289,0.258819045103 L 0.939692620786,0.342020143326 L 0.906307787037,0.422618261741 L 0.866025403784,0.5 L 0.819152044289,0.573576436351 L 0.766044443119,0.642787609687 L 0.707106781187,0.707106781187 L 0.642787609687,0.766044443119 L 0.573576436351,0.819152044289 L 0.5,0.866025403784 L 0.422618261741,0.906307787037 L 0.342020143326,0.939692620786 L 0.258819045103,0.965925826289 L 0.173648177667,0.984807753012 L 0.0871557427477,0.996194698092 L 5.05321549807e-16,1.0 L -0.0871557427477,0.996194698092 L -0.173648177667,0.984807753012 L -0.258819045103,0.965925826289 L -0.258819045103,0.965925826289 L -0.129409522551,0.482962913145 L -0.0868240888335,0.492403876506 L -0.0435778713738,0.498097349046 L -1.91428434946e-16,0.5 L 0.0435778713738,0.498097349046 L 0.0868240888335,0.492403876506 L 0.129409522551,0.482962913145 L 0.171010071663,0.469846310393 L 0.21130913087,0.453153893518 L 0.25,0.433012701892 L 0.286788218176,0.409576022144 L 0.321393804843,0.383022221559 L 0.353553390593,0.353553390593 L 0.383022221559,0.321393804843 L 0.409576022144,0.286788218176 L 0.433012701892,0.25 L 0.453153893518,0.21130913087 L 0.469846310393,0.171010071663 L 0.482962913145,0.129409522551 L 0.492403876506,0.0868240888335 L 0.498097349046,0.0435778713738 L 0.5,4.57966997658e-16 L 0.498097349046,-0.0435778713738 L 0.492403876506,-0.0868240888335 L 0.482962913145,-0.129409522551 L 0.482962913145,-0.129409522551 L 0.965925826289,-0.258819045103 z\" /></g></svg>" | |
| ], | |
| "text/plain": [ | |
| "<shapely.geometry.polygon.Polygon at 0x10e3546d0>" | |
| ] | |
| }, | |
| "execution_count": 134, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "angle_resolution = 5\n", | |
| "Polygon(wedge_buffer(pnt, radius, azimuth, opening_angle, inner_radius, angle_resolution))" | |
| ] | |
| } | |
| ], | |
| "metadata": { | |
| "celltoolbar": "Raw Cell Format", | |
| "kernelspec": { | |
| "display_name": "Python 2", | |
| "language": "python", | |
| "name": "python2" | |
| }, | |
| "language_info": { | |
| "codemirror_mode": { | |
| "name": "ipython", | |
| "version": 2 | |
| }, | |
| "file_extension": ".py", | |
| "mimetype": "text/x-python", | |
| "name": "python", | |
| "nbconvert_exporter": "python", | |
| "pygments_lexer": "ipython2", | |
| "version": "2.7.10" | |
| } | |
| }, | |
| "nbformat": 4, | |
| "nbformat_minor": 0 | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment