This is an automated email from the git hooks/post-receive script. sebastic pushed a commit to branch master in repository python-geojson.
commit 5fbf19b8c29fdebbe8754e2efc095b3ab8d58572 Author: Bas Couwenberg <sebas...@xs4all.nl> Date: Sat Aug 15 21:49:37 2015 +0200 Imported Upstream version 1.3.0 --- CHANGELOG.rst | 7 +++++ README.rst | 12 +++++++ geojson/utils.py | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ setup.py | 2 +- 4 files changed, 116 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 41141eb..81095d2 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -1,6 +1,13 @@ Changes ======= +1.3.0 (2015-08-11) +------------------ + +- Add utility to generate geometries with random data + + - https://github.com/frewsxcv/python-geojson/pull/60 + 1.2.2 (2015-07-13) ------------------ diff --git a/README.rst b/README.rst index b08b9a0..5f0a370 100644 --- a/README.rst +++ b/README.rst @@ -293,6 +293,18 @@ validation >>> validation['message'] 'the "coordinates" member must be a single position' +generate_random +~~~~~~~~~~~~~~~ + +:code:`geojson.utils.generate_random` yields a geometry type with random data + +.. code:: python + + >>> import geojson + + >>> geojson.utils.generate_random("LineString") # doctest: +ELLIPSIS + {"coordinates": [...], "type": "LineString"} + Development ----------- diff --git a/geojson/utils.py b/geojson/utils.py index 2639e45..718606f 100644 --- a/geojson/utils.py +++ b/geojson/utils.py @@ -54,3 +54,99 @@ def map_coords(func, obj): else: raise ValueError("Invalid geometry object %s" % repr(obj)) return {'type': obj['type'], 'coordinates': coordinates} + + +def generate_random(featureType, numberVertices=3, + boundingBox=[-180.0, -90.0, 180.0, 90.0]): + """ + Generates random geojson features depending on the parameters + passed through. + + :param featureType: A geometry type + :type string: Point, LineString, Polygon + :param numberVertices: The number vertices that + a linestring or polygon will have + :type int: defaults to 3 + :param boundingBox: A bounding box in which features will be restricted to + :type list: defaults to the world - [-180.0, -90.0, 180.0, 90.0] + :return: The resulting random geojson object or geometry collection. + :rtype: object + :raises ValueError: if there is no featureType provided. + """ + from geojson import Point, LineString, Polygon + import random + import math + + lonMin = boundingBox[0] + lonMax = boundingBox[2] + + def randomLon(): + return random.uniform(lonMin, lonMax) + + latMin = boundingBox[1] + latMax = boundingBox[3] + + def randomLat(): + return random.uniform(latMin, latMax) + + def createPoint(): + return Point((randomLon(), randomLat())) + + def createLine(): + coords = [] + for i in range(0, numberVertices): + coords.append((randomLon(), randomLat())) + return LineString(coords) + + def createPoly(): + aveRadius = 60 + ctrX = 0.1 + ctrY = 0.2 + irregularity = clip(0.1, 0, 1) * 2 * math.pi / numberVertices + spikeyness = clip(0.5, 0, 1) * aveRadius + + angleSteps = [] + lower = (2 * math.pi / numberVertices) - irregularity + upper = (2 * math.pi / numberVertices) + irregularity + sum = 0 + for i in range(numberVertices): + tmp = random.uniform(lower, upper) + angleSteps.append(tmp) + sum = sum + tmp + + k = sum / (2 * math.pi) + for i in range(numberVertices): + angleSteps[i] = angleSteps[i] / k + + points = [] + angle = random.uniform(0, 2 * math.pi) + + for i in range(numberVertices): + r_i = clip(random.gauss(aveRadius, spikeyness), 0, 2 * aveRadius) + x = ctrX + r_i * math.cos(angle) + y = ctrY + r_i * math.sin(angle) + points.append((int(x), int(y))) + angle = angle + angleSteps[i] + + firstVal = points[0] + points.append(firstVal) + return Polygon([points]) + + def clip(x, min, max): + if(min > max): + return x + elif(x < min): + return min + elif(x > max): + return max + else: + return x + + if featureType == 'Point': + return createPoint() + + if featureType == 'LineString': + return createLine() + + if featureType == 'Polygon': + return createPoly() diff --git a/setup.py b/setup.py index 081b6ab..cf3fddd 100644 --- a/setup.py +++ b/setup.py @@ -30,7 +30,7 @@ import multiprocessing # NOQA setup( name="geojson", - version="1.2.2", + version="1.3.0", description="Python bindings and utilities for GeoJSON", license="BSD", keywords="gis geography json", -- Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-grass/python-geojson.git _______________________________________________ Pkg-grass-devel mailing list Pkg-grass-devel@lists.alioth.debian.org http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-grass-devel