diff --git a/Makefile b/Makefile index 2d048df..b5695e1 100644 --- a/Makefile +++ b/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/layer2img.py b/layer2img.py index 6fbea75..2a3bdfe 100644 --- a/layer2img.py +++ b/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='') 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/mj-msc.tex b/mj-msc.tex index 9b1f1e8..d26083d 100644 --- a/mj-msc.tex +++ b/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/wm.sql b/wm.sql index 5c2e343..edbfe68 100644 --- a/wm.sql +++ b/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);