feat(generator/biomes): generate input for biome models
This commit is contained in:
parent
0d348b6276
commit
f79c63abf8
@ -1,11 +1,14 @@
|
|||||||
import numpy as np
|
import numpy as np
|
||||||
import matplotlib.pyplot as plt
|
import matplotlib.pyplot as plt
|
||||||
from matplotlib import colors, cm
|
from matplotlib import colors, cm
|
||||||
|
from matplotlib.collections import PatchCollection
|
||||||
import scipy.interpolate as interpolate
|
import scipy.interpolate as interpolate
|
||||||
from scipy import ndimage
|
from scipy import ndimage
|
||||||
import math
|
import math
|
||||||
from io import BytesIO
|
from io import BytesIO
|
||||||
import base64
|
import pandas as pd
|
||||||
|
from shapely.geometry import Point, MultiPoint
|
||||||
|
from descartes import PolygonPatch
|
||||||
|
|
||||||
parameters = {
|
parameters = {
|
||||||
'width': {
|
'width': {
|
||||||
@ -102,6 +105,10 @@ parameters = {
|
|||||||
'max': 1,
|
'max': 1,
|
||||||
'step': 0.1
|
'step': 0.1
|
||||||
},
|
},
|
||||||
|
'biomes': {
|
||||||
|
'default': False,
|
||||||
|
'type': 'bool'
|
||||||
|
},
|
||||||
'seed': {
|
'seed': {
|
||||||
'default': '',
|
'default': '',
|
||||||
'type': 'int',
|
'type': 'int',
|
||||||
@ -244,7 +251,7 @@ def constant_filter(a):
|
|||||||
return max(1, a[0])
|
return max(1, a[0])
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
def generate_map(**kwargs):
|
def generate_map(biomes=False, **kwargs):
|
||||||
plt.clf()
|
plt.clf()
|
||||||
|
|
||||||
p.update(kwargs)
|
p.update(kwargs)
|
||||||
@ -291,14 +298,74 @@ def generate_map(**kwargs):
|
|||||||
|
|
||||||
print(np.count_nonzero(ground) / ground.size)
|
print(np.count_nonzero(ground) / ground.size)
|
||||||
|
|
||||||
|
plt.gca().invert_yaxis()
|
||||||
plt.imshow(ground.T, cmap=greys, norm=norm)
|
plt.imshow(ground.T, cmap=greys, norm=norm)
|
||||||
|
plt.gca().invert_yaxis()
|
||||||
|
|
||||||
figfile = BytesIO()
|
figfile = BytesIO()
|
||||||
plt.savefig(figfile, format='png')
|
plt.savefig(figfile, format='png')
|
||||||
figfile.seek(0)
|
figfile.seek(0)
|
||||||
|
|
||||||
|
if biomes:
|
||||||
|
generate_biomes(ground)
|
||||||
|
|
||||||
return figfile
|
return figfile
|
||||||
|
|
||||||
|
def to_range(omin, omax, nmin, nmax):
|
||||||
|
orange = omax - omin
|
||||||
|
nrange = nmax - nmin
|
||||||
|
|
||||||
|
return lambda x: ((x - omin) * nrange / orange) + nmin
|
||||||
|
|
||||||
|
|
||||||
|
def generate_biomes(ground):
|
||||||
|
width, height = p['width'], p['height']
|
||||||
|
|
||||||
|
height_to_latitude = to_range(0, height, -90, 90)
|
||||||
|
width_to_longitude = to_range(0, width, -180, 180)
|
||||||
|
|
||||||
|
print('generate_biomes')
|
||||||
|
INPUTS = ['elevation', 'distance_to_water', 'latitude']
|
||||||
|
|
||||||
|
data = {}
|
||||||
|
for col in ['longitude', 'latitude', 'elevation', 'distance_to_water']:
|
||||||
|
data[col] = []
|
||||||
|
|
||||||
|
points = []
|
||||||
|
for x, y in np.ndindex(ground.shape):
|
||||||
|
v = ground[x,y]
|
||||||
|
if v > p['water_level']:
|
||||||
|
points.append((x, y))
|
||||||
|
|
||||||
|
data['longitude'].append(width_to_longitude(x))
|
||||||
|
data['latitude'].append(height_to_latitude(y))
|
||||||
|
data['elevation'].append(v)
|
||||||
|
|
||||||
|
points = MultiPoint(points)
|
||||||
|
boundary = points.buffer(1e-0).boundary
|
||||||
|
|
||||||
|
for x, y in np.ndindex(ground.shape):
|
||||||
|
if ground[x,y] > p['water_level']:
|
||||||
|
# print(x,y, Point(x,y).distance(boundary))
|
||||||
|
data['distance_to_water'].append(Point(x, y).distance(boundary))
|
||||||
|
|
||||||
|
|
||||||
|
df = pd.DataFrame(data)
|
||||||
|
print(df)
|
||||||
|
|
||||||
|
# fig = plt.figure()
|
||||||
|
# ax = fig.add_subplot(111)
|
||||||
|
# minx, miny, maxx, maxy = boundary.bounds
|
||||||
|
# w, h = maxx - minx, maxy - miny
|
||||||
|
# ax.set_xlim(minx - 0.2 * w, maxx + 0.2 * w)
|
||||||
|
# ax.set_ylim(miny - 0.2 * h, maxy + 0.2 * h)
|
||||||
|
# ax.set_aspect(1)
|
||||||
|
|
||||||
|
# ax.add_collection(PatchCollection([PolygonPatch(boundary.buffer(0.1), fc='red', ec='black', zorder=1)], match_original=True))
|
||||||
|
|
||||||
|
# plt.show()
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
generate_map()
|
generate_map()
|
||||||
plt.show()
|
plt.show()
|
||||||
|
@ -26,10 +26,16 @@
|
|||||||
{% for k, v in parameters.items() %}
|
{% for k, v in parameters.items() %}
|
||||||
<div class='form-group'>
|
<div class='form-group'>
|
||||||
<label name='{{ k }}'>{{ k | replace('_', ' ') | title }}</label>
|
<label name='{{ k }}'>{{ k | replace('_', ' ') | title }}</label>
|
||||||
<input id='{{ k }}' name='{{ k }}'
|
{% if v["type"] == "bool" %}
|
||||||
type="number"
|
<input id='{{ k }}' name='{{ k }}'
|
||||||
class='form-control'
|
type='checkbox'
|
||||||
min='{{ v["min"] }}' value='{{ v["default"] }}' max='{{ v["max"] }}' step='{{ v["step"] }}'>
|
class='form-control'>
|
||||||
|
{% else %}
|
||||||
|
<input id='{{ k }}' name='{{ k }}'
|
||||||
|
type="number"
|
||||||
|
class='form-control'
|
||||||
|
min='{{ v["min"] }}' value='{{ v["default"] }}' max='{{ v["max"] }}' step='{{ v["step"] }}'>
|
||||||
|
{% endif %}
|
||||||
{% if v["description"] %}
|
{% if v["description"] %}
|
||||||
<small class="form-text text-muted">{{ v["description"] }}</small>
|
<small class="form-text text-muted">{{ v["description"] }}</small>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
@ -13,6 +13,8 @@ def parse(key, value):
|
|||||||
return int(value)
|
return int(value)
|
||||||
elif t == 'float':
|
elif t == 'float':
|
||||||
return float(value)
|
return float(value)
|
||||||
|
elif t == 'bool':
|
||||||
|
return value == 'on'
|
||||||
else:
|
else:
|
||||||
return value
|
return value
|
||||||
|
|
||||||
@ -21,3 +23,4 @@ def get_map():
|
|||||||
params = { key: parse(key, request.args[key]) for key in request.args }
|
params = { key: parse(key, request.args[key]) for key in request.args }
|
||||||
res = send_file(generate_map(**params), mimetype='image/png')
|
res = send_file(generate_map(**params), mimetype='image/png')
|
||||||
return res
|
return res
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user