Skip to content

Commit

Permalink
multi-scale contour (tracyhenry#90)
Browse files Browse the repository at this point in the history
  • Loading branch information
tracyhenry committed Jul 11, 2019
1 parent bb23852 commit dc54a15
Show file tree
Hide file tree
Showing 15 changed files with 654 additions and 352 deletions.
50 changes: 36 additions & 14 deletions back-end/src/main/java/index/AutoDDInMemoryIndexer.java
Expand Up @@ -16,7 +16,8 @@
public class AutoDDInMemoryIndexer extends PsqlSpatialIndexer {

private static AutoDDInMemoryIndexer instance = null;
private final int objectNumLimit = 2000; // in a 1k by 1k region
private final int objectNumLimit = 4000; // in a 1k by 1k region
private final int virtualViewportSize = 1000;
private double overlappingThreshold = 1.0;

// One Rtree per level to store samples
Expand All @@ -38,20 +39,27 @@ public static synchronized AutoDDInMemoryIndexer getInstance() {
public void createMV(Canvas c, int layerId) throws Exception {

// create MV for all autoDD layers at once
int curLevel = Integer.valueOf(c.getId().substring(c.getId().indexOf("level") + 5));
if (curLevel > 0) return;
String autoDDId = c.getLayers().get(layerId).getAutoDDId();
int levelId = Integer.valueOf(autoDDId.substring(autoDDId.indexOf("_") + 1));
if (levelId > 0) return;

// get current AutoDD object
int autoDDIndex = Integer.valueOf(c.getId().substring(6, c.getId().indexOf("_")));
int autoDDIndex = Integer.valueOf(autoDDId.substring(0, autoDDId.indexOf("_")));
AutoDD autoDD = Main.getProject().getAutoDDs().get(autoDDIndex);
int numLevels = autoDD.getNumLevels();
int numRawColumns = autoDD.getColumnNames().size();

// calculate overlapping threshold
overlappingThreshold =
Math.max(
0.5,
Math.sqrt(4e6 / objectNumLimit / autoDD.getBboxH() / autoDD.getBboxW())
0.2,
Math.sqrt(
4
* (virtualViewportSize + autoDD.getBboxW() * 2)
* (virtualViewportSize + autoDD.getBboxH() * 2)
/ objectNumLimit
/ autoDD.getBboxH()
/ autoDD.getBboxW())
- 1);
if (!autoDD.getOverlap()) overlappingThreshold = Math.max(overlappingThreshold, 1);
System.out.println("Overlapping threshold: " + overlappingThreshold);
Expand All @@ -67,7 +75,8 @@ public void createMV(Canvas c, int layerId) throws Exception {
// compute cluster number
if (autoDD.getRenderingMode().equals("object+clusternum")
|| autoDD.getRenderingMode().equals("circle only")
|| autoDD.getRenderingMode().equals("circle+object")) {
|| autoDD.getRenderingMode().equals("circle+object")
|| autoDD.getRenderingMode().equals("contour")) {

// a fake bottom level for non-sampled objects
Rtrees.add(RTree.create());
Expand Down Expand Up @@ -273,6 +282,10 @@ private void createMVForLevel(int level, int autoDDIndex)
curRow.add(String.valueOf(miny));
curRow.add(String.valueOf(maxx));
curRow.add(String.valueOf(maxy));
minx = cx - autoDD.getBboxW() * overlappingThreshold / 2;
miny = cy - autoDD.getBboxH() * overlappingThreshold / 2;
maxx = cx + autoDD.getBboxW() * overlappingThreshold / 2;
maxy = cy + autoDD.getBboxH() * overlappingThreshold / 2;
Rtrees.set(
i, Rtrees.get(i).add(curRow, Geometries.rectangle(minx, miny, maxx, maxy)));
}
Expand All @@ -281,12 +294,21 @@ private void createMVForLevel(int level, int autoDDIndex)

private String getAutoDDBboxTableName(int autoDDIndex, int level) {

return "bbox_"
+ Main.getProject().getName()
+ "_autodd"
+ autoDDIndex
+ "_level"
+ level
+ "layer0";
String autoDDId = String.valueOf(autoDDIndex) + "_" + String.valueOf(level);
for (Canvas c : Main.getProject().getCanvases()) {
int numLayers = c.getLayers().size();
for (int layerId = 0; layerId < numLayers; layerId++) {
String curAutoDDId = c.getLayers().get(layerId).getAutoDDId();
if (curAutoDDId == null) continue;
if (curAutoDDId.equals(autoDDId))
return "bbox_"
+ Main.getProject().getName()
+ "_"
+ c.getId()
+ "layer"
+ layerId;
}
}
return "";
}
}
7 changes: 7 additions & 0 deletions back-end/src/main/java/project/Canvas.java
Expand Up @@ -9,6 +9,7 @@ public class Canvas implements Serializable {
private String id;
private int w;
private int h;
private int pyramidLevel;
private String wSql, hSql, wLayerId, hLayerId;
private double zoomInFactorX, zoomInFactorY;
private double zoomOutFactorX, zoomOutFactorY;
Expand Down Expand Up @@ -39,6 +40,10 @@ public void setH(int h) {
this.h = h;
}

public int getPyramidLevel() {
return pyramidLevel;
}

public String getId() {
return id;
}
Expand Down Expand Up @@ -106,6 +111,8 @@ public String toString() {
+ w
+ ", h="
+ h
+ ", pyramidLevel="
+ pyramidLevel
+ ", wSql='"
+ wSql
+ '\''
Expand Down
7 changes: 7 additions & 0 deletions back-end/src/main/java/project/Layer.java
Expand Up @@ -12,6 +12,7 @@ public class Layer implements Serializable {
private String rendering;
private Indexer indexer;
private boolean isAutoDDLayer;
private String autoDDId;
private boolean retainSizeZoom;

public Transform getTransform() {
Expand Down Expand Up @@ -42,6 +43,10 @@ public boolean isAutoDDLayer() {
return isAutoDDLayer;
}

public String getAutoDDId() {
return autoDDId;
}

public boolean isRetainSizeZoom() {
return retainSizeZoom;
}
Expand Down Expand Up @@ -70,6 +75,8 @@ public String toString() {
+ '\''
+ ", isAutoDDLayer="
+ isAutoDDLayer
+ ", autoDDId="
+ autoDDId
+ ", retainSizeZoom="
+ retainSizeZoom
+ '}';
Expand Down
2 changes: 1 addition & 1 deletion compiler/examples/flare/renderers.js
@@ -1,5 +1,5 @@
var renderingParams = {
textwrap: require("../../src/RendererTemplates").textwrap
textwrap: require("../../src/template-api/Renderers").textwrap
};

var flarePackRendering = function(svg, data, args) {
Expand Down
2 changes: 1 addition & 1 deletion compiler/examples/nba/renderers.js
Expand Up @@ -18,7 +18,7 @@ var renderingParams = {
teamlogoradius: 24,
avgcharwidth: 20,
shadowrectwidth: 5,
textwrap: require("../../src/RendererTemplates").textwrap
textwrap: require("../../src/template-api/Renderers").textwrap
};

var teamLogoRendering = function(svg, data) {
Expand Down
14 changes: 7 additions & 7 deletions compiler/examples/nba_autodd/nba_autodd.js
@@ -1,6 +1,6 @@
// libraries
const Project = require("../../src/index").Project;
const AutoDD = require("../../src/AutoDD").AutoDD;
const AutoDD = require("../../src/template-api/AutoDD").AutoDD;
const renderers = require("../nba/renderers");

// construct a project
Expand All @@ -14,7 +14,7 @@ var query =
"where games.home_team = team1.abbr and games.away_team = team2.abbr " +
"order by agg_rank;";

var args = {
var autoDD = {
query: query,
db: "nba",
xCol: "home_score",
Expand All @@ -23,15 +23,15 @@ var args = {
hiX: 149,
loY: 69,
hiY: 148,
bboxW: 162,
bboxH: 132,
// bboxW: 162,
// bboxH: 132,
axis: true,
numLevels: 9,
roughN: 999,
renderingMode: "object+clusternum",
rendering: renderers.teamTimelineRendering
renderingMode: "contour"
// rendering: renderers.teamTimelineRendering
};

p.addAutoDD(new AutoDD(args));
p.addAutoDD(new AutoDD(autoDD), {newPyramid: true, newView: true});

p.saveProject();

0 comments on commit dc54a15

Please sign in to comment.