commit b51952abb591cf8ce876ddc30d179813ea5d95c5 (tree)
parent 3115957aebab8abeb1a0838f53db4c22a6f94cf3
Author: Motiejus Jakštys <motiejus@uber.com>
Date: Sat, 10 Apr 2021 19:40:04 +0300
visualizations
Diffstat:
4 files changed, 65 insertions(+), 41 deletions(-)
diff --git a/IV/Makefile b/IV/Makefile
@@ -44,7 +44,15 @@ mj-msc-full.pdf: mj-msc.pdf version.tex $(ARCHIVABLES)
mv .tmp-$@ $@
test-figures.pdf: layer2img.py .faux_test
- python ./layer2img.py --group1-table=wm_figures --group1-arrows=yes --outfile=$@
+ python ./layer2img.py --group1-table=wm_figures --outfile=$@
+
+fig-definition-of-a-bend.pdf: layer2img.py Makefile .faux_test
+ python ./layer2img.py \
+ --group1-cmap=True \
+ --group1-table=wm_debug \
+ --group1-where="name='fig6' AND stage='bbends-polygon' AND gen=1" \
+ --group2-table=wm_debug --group2-where="name='fig6' AND stage='bbends' AND gen=1" \
+ --outfile=$@
.faux_test: tests.sql wm.sql .faux_db
./db -f tests.sql
diff --git a/IV/layer2img.py b/IV/layer2img.py
@@ -111,20 +111,17 @@ def plt_size(string):
def parse_args():
parser = argparse.ArgumentParser(
description='Convert geopackage to an image')
- group1 = parser.add_mutually_exclusive_group()
- group1.add_argument('--group1-infile')
- group1.add_argument('--group1-table')
- parser.add_argument('--group1-arrows', type=bool)
+ parser.add_argument('--group1-table')
+ parser.add_argument('--group1-where')
+ parser.add_argument('--group1-cmap', type=bool)
- group2 = parser.add_mutually_exclusive_group()
- group2.add_argument('--group2-infile', type=str)
- group2.add_argument('--group2-table', type=str)
- parser.add_argument('--group2-arrows', type=bool)
+ parser.add_argument('--group2-table')
+ parser.add_argument('--group2-where')
+ parser.add_argument('--group2-cmap', type=bool)
- group3 = parser.add_mutually_exclusive_group()
- group3.add_argument('--group3-infile', type=str)
- group3.add_argument('--group3-table', type=str)
- parser.add_argument('--group3-arrows', type=bool)
+ parser.add_argument('--group3-table')
+ parser.add_argument('--group3-where')
+ parser.add_argument('--group3-cmap', type=bool)
parser.add_argument('-o', '--outfile', metavar='<file>')
parser.add_argument(
@@ -133,13 +130,14 @@ def parse_args():
return parser.parse_args()
-def read_layer(maybe_table, maybe_file):
- if maybe_table:
- conn = psycopg2.connect(PSQL_CREDS)
- sql = "SELECT way FROM %s" % maybe_table
- return geopandas.read_postgis(sql, con=conn, geom_col='way')
- elif maybe_file:
- return geopandas.read_file(maybe_file)
+def read_layer(table, maybe_where=None):
+ if not table:
+ return
+ conn = psycopg2.connect(PSQL_CREDS)
+ sql = "SELECT way FROM %s" % table
+ if maybe_where:
+ sql += " WHERE %s" % maybe_where
+ return geopandas.read_postgis(sql, con=conn, geom_col='way')
def add_lines(ax, group):
for g in group.to_dict()['way'].values():
@@ -150,9 +148,9 @@ def add_lines(ax, group):
def main():
args = parse_args()
- group1 = read_layer(args.group1_table, args.group1_infile)
- group2 = read_layer(args.group2_table, args.group2_infile)
- group3 = read_layer(args.group3_table, args.group3_infile)
+ group1 = read_layer(args.group1_table, args.group1_where)
+ group2 = read_layer(args.group2_table, args.group2_where)
+ group3 = read_layer(args.group3_table, args.group3_where)
rc('text', usetex=True)
fig, ax = plt.subplots()
@@ -162,15 +160,17 @@ def main():
ax.set_xlim(left=c[0], right=c[2])
ax.set_ylim(bottom=c[1], top=c[3])
+ c1 = {'cmap': 'coolwarm'} if args.group1_cmap else {'color': ORANGE}
+ c2 = {'cmap': 'coolwarm'} if args.group2_cmap else {'color': PURPLE}
+ c3 = {'cmap': 'coolwarm'} if args.group3_cmap else {'color': GREEN}
+
if group1 is not None:
- group1.plot(ax=ax, color=ORANGE)
- args.group1_arrows and add_lines(ax, group1)
+ group1.plot(ax=ax, **c1)
+ #args.group1_arrows and add_lines(ax, group1)
if group2 is not None:
- group2.plot(ax=ax, color=PURPLE)
- args.group2_arrows and add_lines(ax, group1)
+ group2.plot(ax=ax, **c2)
if group3 is not None:
- group3.plot(ax=ax, color=GREEN)
- args.group3_arrows and add_lines(ax, group1)
+ group3.plot(ax=ax, **c3)
ax.axis('off')
ax.margins(0, 0)
diff --git a/IV/mj-msc.tex b/IV/mj-msc.tex
@@ -214,6 +214,8 @@ unexpected bugs have snug in while modifying the algorithm.
\section{Definition of a Bend}
+
+
\section{Gentle Inflection at End of a Bend}
\section{Self-line Crossing When Cutting a Bend}
diff --git a/IV/wm.sql b/IV/wm.sql
@@ -3,7 +3,12 @@ SET plpgsql.extra_errors TO 'all';
-- detect_bends detects bends using the inflection angles. No corrections.
drop function if exists detect_bends;
-create function detect_bends(line geometry, dbgname text default null, OUT bends geometry[]) as $$
+create function detect_bends(
+ line geometry,
+ dbgname text default null,
+ dbgstagenum integer default null,
+ OUT bends geometry[]
+) as $$
declare
pi constant real default radians(180);
p geometry;
@@ -67,6 +72,25 @@ begin
if (select count(1) >= 2 from st_dumppoints(bend)) then
bends = bends || bend;
end if;
+
+ if dbgname is not null then
+ for i in 1..array_length(bends, 1) loop
+ insert into wm_debug(stage, name, gen, nbend, way) values(
+ 'bbends',
+ dbgname,
+ dbgstagenum,
+ i,
+ bends[i]
+ );
+ insert into wm_debug(stage, name, gen, nbend, way) values(
+ 'bbends-polygon',
+ dbgname,
+ dbgstagenum,
+ i,
+ st_makepolygon(st_addpoint(bends[i], st_startpoint(bends[i])))
+ );
+ end loop;
+ end if;
end
$$ language plpgsql;
@@ -403,17 +427,7 @@ begin
);
end if;
- bends = detect_bends(lines[i]);
-
- if dbgname is not null then
- insert into wm_debug(stage, name, gen, nbend, way) values(
- 'bbends',
- dbgname,
- stagenum,
- generate_subscripts(bends, 1),
- unnest(bends)
- );
- end if;
+ bends = detect_bends(lines[i], dbgname, stagenum);
bends = fix_gentle_inflections(bends);