Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save jrjames83/3b95f48cc82e6b9116c520eaa68a0bf3 to your computer and use it in GitHub Desktop.
Save jrjames83/3b95f48cc82e6b9116c520eaa68a0bf3 to your computer and use it in GitHub Desktop.
{
"cells": [
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"201\n",
"218\n",
" "
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x112db5390>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"%%prun\n",
"\n",
"import random\n",
"from geopy.distance import distance\n",
"import matplotlib.pyplot as plt\n",
"%matplotlib inline\n",
"\n",
"\n",
"# This function does a few things, it takes a min distance threshold, but also\n",
"# Mutates an external variable which is constantly passed into it - not always a good practice\n",
"# But you could have written it a multitude of ways\n",
"\n",
"def generate_random_points(current_pairs, min_distance):\n",
" rlat, rlng = random.uniform(0,90), random.uniform(0,180)\n",
" if not current_pairs:\n",
" current_pairs.append((rlat, rlng))\n",
" return \n",
" else:\n",
" for pair in current_pairs:\n",
" _dist = distance((rlat, rlng), pair).km\n",
" if _dist < min_distance:\n",
" return False\n",
" return (rlat, rlng)\n",
" \n",
" \n",
" \n",
"# Get 200 points, which are at least 100km apart from one another\n",
"required_points = 200\n",
"tries = 0\n",
"points = []\n",
"\n",
"while required_points:\n",
" tries += 1\n",
" result = generate_random_points(points, 100)\n",
" if result:\n",
" points.append(result)\n",
" required_points -= 1 \n",
" \n",
"print(len(points))\n",
"print(tries)\n",
"\n",
"xs, ys = zip(*points) # https://stackoverflow.com/a/7558990/3182843\n",
"plt.scatter(xs,ys)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"# Check validity of point distances\n",
"\n",
"from itertools import combinations\n",
"\n",
"for x in combinations(points, 2):\n",
" p1, p2 = x\n",
" assert(distance(p1,p2).km > 100)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"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.6.8"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment