import oracle.spatial.geometry.JGeometry; //导入方法依赖的package包/类
private void internalRender(DOM pRequestDOM, UCon pUCon, Renderer pRenderer) {
int lHeight, lWidth;
lHeight = Integer.parseInt(pRequestDOM.get1SNoEx("/INTERNAL_MAP_REQUEST/HEIGHT"));
lWidth = Integer.parseInt(pRequestDOM.get1SNoEx("/INTERNAL_MAP_REQUEST/WIDTH"));
//Transform for pixel output
double lCentreX = Double.parseDouble(pRequestDOM.get1SNoEx("/INTERNAL_MAP_REQUEST/CENTRE/X"));
double lCentreY = Double.parseDouble(pRequestDOM.get1SNoEx("/INTERNAL_MAP_REQUEST/CENTRE/Y"));
double lScaledWidth = Double.parseDouble(pRequestDOM.get1SNoEx("/INTERNAL_MAP_REQUEST/SCALED_WIDTH"));
double lScaledHeight = Double.parseDouble(pRequestDOM.get1SNoEx("/INTERNAL_MAP_REQUEST/SCALED_HEIGHT"));
double lScaleFactorX = (lWidth/lScaledWidth);
double lScaleFactorY = (lHeight/lScaledHeight);
AffineTransform lOrdinateTransform = new AffineTransform();
lOrdinateTransform.scale(1, -1); // Flip the Y about X=0
lOrdinateTransform.translate(0, -lHeight); // Move back onto the visible area
lOrdinateTransform.translate(((lWidth/2)-lCentreX), (((lHeight/2))-lCentreY)); // Initial centering
lOrdinateTransform.scale(lScaleFactorX, lScaleFactorY); // Scale
lOrdinateTransform.translate(-(lCentreX*(lScaleFactorX-1))/lScaleFactorX, -(lCentreY*(lScaleFactorY-1))/lScaleFactorY); // Second pass centering
Track.pushInfo("AddingRenderableObjects", "Internal rendering: Adding renderable objects to renderer");
try {
DOMList lRenderNodes = pRequestDOM.getUL("/INTERNAL_MAP_REQUEST/RENDER_LIST/RENDER");
ParsedStatement lDataQuery;
for (int lNodeID = 0; lNodeID < lRenderNodes.getLength(); ++lNodeID) {
DOM lRenderNode = lRenderNodes.item(lNodeID);
try {
lDataQuery = StatementParser.parse(lRenderNode.get1SNoEx("DATA_QUERY"), "Data Query");
java.util.List lDataRows = pUCon.queryMultipleRows(lDataQuery);
for (UConStatementResult lRow : lDataRows) {
int lGeoID = lRow.getInteger("ID");
int lParentGeoID = lRow.getInteger("PARENT_SID_ID");
STRUCT st = (oracle.sql.STRUCT)lRow.getObject("GEO_DATA");
JGeometry lGeometry = JGeometry.load(st);
//Parse geometry
if (lGeometry.getType() == JGeometry.GTYPE_POINT) {
drawSpatialMarker(pRenderer, lRenderNode, lGeoID, lParentGeoID, lGeometry, lOrdinateTransform, lRow, lScaleFactorX, lScaleFactorY);
}
else if (lGeometry.getType() == JGeometry.GTYPE_MULTIPOINT) {
drawSpatialNodes(pRenderer, lRenderNode, lGeoID, lParentGeoID, lGeometry, lOrdinateTransform);
}
else if (lGeometry.getType() == JGeometry.GTYPE_CURVE) {
drawSpatialLine(pRenderer, lRenderNode, lGeoID, lParentGeoID, lGeometry, lOrdinateTransform, lRow);
}
else if (lGeometry.getType() == JGeometry.GTYPE_POLYGON) {
drawSpatialArea(pRenderer, lRenderNode, lGeoID, lParentGeoID, lGeometry, lOrdinateTransform, lRow);
}
}
}
catch (ExParser | ExDB | SQLException e) {
throw new ExInternal("Fox Internal Spatial Renderer failed when attempting to query the spatial data for rendering", e);
}
}
}
finally {
Track.pop("AddingRenderableObjects");
}
// Get the renderer to generate the image (goes to the output stream given to the pRenderer constructor)
Track.pushInfo("GeneratingImage", "Getting the renderer to generate the image");
try {
pRenderer.generate();
}
finally {
Track.pop("GeneratingImage");
}
}