摘要:邻近度描述了地理空间中两个地物距离相近的程度,是空间分析的一个重要手段。
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>ToolTitle</title>
<script language="javascript"src="ToolsCommon65.js"></script>
<link rel="StyleSheet"href="Style.css"type="text/css">
<style>.MenuButton
{height:78px;width:65px;margin:5px;white-space:normal;
}.MenuButtonHighlight
{color:Red;font-weight:bold;
}
</style>
</head>
<body leftmargin="0"topmargin="0"marginwidth="0"marginheight="0"style="border: 0;
overflow: auto; background-color: #ffffff"id="Body"onload="Init()"onunload="Reset(0,0);DeleteTarget();">
<!--oncontextmenu="return false;" onclick="bHide=true;HideOptionsNow()" > -->
<table border="0"width="100%"cellspacing="0"cellpadding="2">
<tr>
<td id="TopAreaTD"height="50px"width="100%"valign="middle"style="background-color: #CAD8E2">
<table border="0"width="100%"cellspacing="0"cellpadding="0">
<tr>
<td width="12px"></td>
<td width="55px"><img src="images/ProximityIcon.gif"align="absmiddle" /></td>
<td id="TitleTD"align="center"class="s12b i18n">ToolName</td>
<!--<td valign="top" id="CloseHelpTd"><img src="http://t.zoukankan.com/CommonImg/help.gif" border="0" alt="help" title="help" onclick="DisplayHelpPopup6 (SGLang.i18nFile('help.html'),SGLang.i18n('help'))" style="cursor: pointer;"></td>-->
</tr>
</table>
</td>
</tr>
<tr height="1px">
<td style="background-repeat: repeat-x;"background="../CommonImg/separator.gif">
</td>
</tr>
<tr>
<td>
<br />
</td>
</tr>
</table>
<table border="0"cellspacing="1"cellpadding="3"bgcolor="#ffffff"class="s8"width="100%">
<tr >
<td class="s8b">
<label for="createAs"class="i18n">Text30</label>
</td>
<td align="left">
<input id="targetID"type="text"value=""style="100px"readonly="readonly"/>
<!-- <button type="button" onclick="SetTargetFromSelectedPress()"><span class="i18n">Text31</span></button>
<button type="button" onclick="CreateTargetPress()"><span class="i18n">Text43</span></button>-->
<br />
<a id="SetTargetFromSelected"class="link i18n"onclick="SetTargetFromSelectedPress();">Text31</a>|
<a id="CreateTarget"class="link i18n"class="link"onclick="CreateTargetPress();">Text43</a></div>
</td>
</tr>
<tr class='TableOtherLine'>
<td class="s8b">
<label for="createAs"class="i18n">Text32</label>
</td>
<td align="left">
<input id="trackedGroupID"type="text"value=""style="100px"readonly="readonly"/>
<!-- <button type="button" onclick="SetGroupFromSelectedPress()"><span class="i18n">Text31</span></button>-->
<br />
<a id="SetGroupFromSelected"class="link i18n"onclick="SetGroupFromSelectedPress();">Text31</a> <span id="Span1" >
</td>
</tr>
<tr >
<td align="top"class="s8b i18n">
<label for="createAs"class="i18n">Text33</label>
</td>
<td align="left">
<input id="warningRadiusID"type="text"value="700"style="100px; background-color:#FFD7C1"/><label for="createAs"class="i18n">Text35</label>
</td>
</tr>
<tr class='TableOtherLine'>
<td class="s8b">
<label for="createAs"class="i18n">Text34</label>
</td>
<td align="left">
<input id="dangerRadiusID"type="text"value="300"style="100px; background-color:#FFD7D7;"/><label for="createAs"class="i18n">Text35</label>
</td>
</tr>
<tr >
<td class="s8b">
<label for="createAs"class="i18n">Text42</label>
</td>
<td align="left">
<input id="chkTint"type="checkbox"style="20px;"onclick="bTint = document.getElementById('chkTint').checked;"checked="checked"/>
</td>
</tr>
<tr>
<td colspan="2"valign="top"class="s8b i18n"align="center">
<button id="startStopButton"class="MenuButton"onclick="StartStop()"><img src="images/startCursor.gif" /><br /> <span id="startstopSpan"class="i18n">Text36</span></button>
</td>
</tr>
</table>
<object id="SGWorld"classid="CLSID:3a4f9197-65a8-11d5-85c1-0001023952c1"> </object>
<script language="JavaScript">
functionDetectTEMode()
{
varvMode =document.documentMode;
varrMode = 'IE5 Quirks Mode';
if(vMode == 8){
rMode = 'IE8 Standards Mode';
} else if(vMode == 7){
rMode = 'IE7 Strict Mode';
} else if(vMode == 9){
rMode = 'IE9 Strict Mode';
}
//alert('Rendering in: ' + rMode);
}
DetectTEMode();
//***delete the uneeded ones at the end
vargDisplayHeadingSlope ;
vargDisplayMinMaxSlope ;
vargDisplayCoordinateInfo;
vargLastClickMouseX;
vargLastClickMouseY;
///var popupMsg;
vartimeoutID;
varmeasureDistance;
varwarningSlope;
varalertSlope;
vararrowMaxPositive;
vararrowMaxNegative;
vararrowHeading;
varlabelMaxPositive;
varlabelMaxNegative;
varlabelHeading;
varlabelCoordinateInfo;
vargroupID;
varcolorNormalPositive ;
varcolorNormalNegative;
varcolorHeading;
varcolorLinewarning ;
varcolorLineAlert;
varcolorLabel;
varcolorTextNormal;
varcolorTextWarning;
varcolorTextAlert;
vargNameIndex = 1;
varcameraClickPos;
varrootId;
//Proximity globals
varisStart = false;
varwarningRadius;
vardangerRadius;
vartargetObj;
vartrackedObjArray =[];
varcolorLineWarning;
varcolorLineDanger;
varbTint = true;
vartmpGroup;
varbInPlaceTarget = false;
varmanualTargetLabel;
//--------------//Init
functionInit() {
targetObj = null;
manualTargetLabel = null;
SGWorld.AttachEvent("onFrame", onFrame);
colorLineWarning =SGWorld.Creator.CreateColor(238, 173, 23, 255);
colorLineDanger =SGWorld.Creator.CreateColor(255, 117, 117, 255);
Reset(true, false);
TargetPathNameParam =GetParamValue("TargetPathName", "");
if(TargetPathNameParam != "")
SetTargetFromPathName(TargetPathNameParam);
else{
if(SGWorld.ProjectTree.FindItem("Target") != 0)
SetTargetFromPathName("Target");
}
TrackedGroupPathNameParam =GetParamValue("TrackedGroupPathName", "");
if(TrackedGroupPathNameParam != "")
SetTrackedGroupFromPathName(TrackedGroupPathNameParam);
else{
if(SGWorld.ProjectTree.FindItem("Tracked Group") != 0)
SetTrackedGroupFromPathName("Tracked Group");
}
if(document.getElementById("targetID").value != "" &&document.getElementById("trackedGroupID").value != "")
StartStop();
}
//------------//onFrame
functiononFrame() {
if(isStart == false ||targetObj == null)
return;
displayProximityInfo();
}
//--------------//SetTargetFromSelectedPress
functionSetTargetFromSelectedPress() {
varnode =SGWorld.ProjectTree.GetNextItem("", 10);
if(node == 0 ||SGWorld.ProjectTree.IsGroup(node)) {
alert(SGLang.i18n("Text38"));
return;
}
SetTarget(node);
}
//--------------//SetTargetFromPathName
functionSetTargetFromPathName(pathName) {
varnode =SGWorld.ProjectTree.FindItem(pathName);
if(node == 0 ||SGWorld.ProjectTree.IsGroup(node)) {
alert(SGLang.i18n("Text38"));
return;
}
SetTarget(node);
}
//--------------//SetTarget
functionSetTarget(node) {
try{
varobject =SGWorld.ProjectTree.GetObject(node);
vartargetPosition =object.Position;
if(!targetPosition) {
alert(SGLang.i18n("Text38"));
return;
}
document.getElementById("targetID").value =object.TreeItem.Name;
DeleteTarget();
targetObj =object;
}
catch(err) {
alert(SGLang.i18n("Text38"));
return;
}
}
//--------------//CreateTargetPress
functionCreateTargetPress() {
if(!bInPlaceTarget) {
bInPlaceTarget = true;
SGWorld.AttachEvent("OnLButtonUp", CreateTarget);
SGWorld.AttachEvent("OnRButtonUp", CreateTargetRButtonUp);
SGWorld.AttachEvent("OnInputModeChanged", ResetCreateTarget);
document.getElementById("CreateTarget").innerText =SGLang.i18n("Text46");
SGWorld.Window.SetInputMode(1, abspath() + "/cursor_m.cur");
SGWorld.Window.ShowMessageBarText(SGLang.i18n("Text44"));
}
else{
ResetCreateTarget();
}
}
//--------------//CreateTargetRButtonUp
functionCreateTargetRButtonUp(Flags, X, Y) {
ResetCreateTarget();
}
//--------------//ResetCreateTarget
functionResetCreateTarget() {
document.getElementById("CreateTarget").innerText =SGLang.i18n("Text43");
SGWorld.DetachEvent("OnLButtonUp", CreateTarget);
SGWorld.DetachEvent("OnInputModeChanged", ResetCreateTarget);
bInPlaceTarget = false;
SGWorld.Window.SetInputMode(0);
}
//--------------//CreateTarget
functionCreateTarget(Flags, X, Y) {
varCursorCoord =SGWorld.Window.pixelToWorld(X, Y);
if(CursorCoord == null)
ResetCreateTarget();
varimageLabelStyle =SGWorld.Creator.CreateLabelStyle(0);
imageLabelStyle.Scale = 1.0;
DeleteTarget();
manualTargetLabel =SGWorld.Creator.CreateImageLabel(CursorCoord.Position, abspath() + "/Images/icon.png", imageLabelStyle, SGWorld.ProjectTree.HiddenGroupID, SGLang.i18n("Text45"));
manualTargetLabel.SaveInFlyFile = false;
document.getElementById("targetID").value =manualTargetLabel.TreeItem.Name;
targetObj =manualTargetLabel;
ResetCreateTarget();
}
//--------------//DeleteTarget
functionDeleteTarget() {
if(manualTargetLabel != null) {
SGWorld.Creator.DeleteObject(manualTargetLabel.ID);
manualTargetLabel = null;
}
}
//--------------//SetGroupFromSelectedPress
functionSetGroupFromSelectedPress() {
varnode =SGWorld.ProjectTree.GetNextItem("", 10);
SetTargetGroup(node);
}
//--------------//SetTrackedGroupFromPathName
functionSetTrackedGroupFromPathName(pathName) {
varnode =SGWorld.ProjectTree.FindItem(pathName);
SetTargetGroup(node);
}
//--------------//SetGroupFromSelectedPress
functionSetTargetGroup(nodeID) {
varnode =nodeID;
/*To allow layers as well ViewshedQuery tool uses: if (node == 0 || !(SGWorld.ProjectTree.IsGroup(node) || SGWorld.ProjectTree.IsLayer(node))) { */
if(node == 0 ||SGWorld.ProjectTree.IsLayer(node)) {
alert(SGLang.i18n("Text39"));
return;
}
if(SGWorld.ProjectTree.IsGroup(node)) {//group
EmptytrackedObjArray();
searchObjects2(node, AddObjectToArray);
document.getElementById("trackedGroupID").value =SGWorld.ProjectTree.GetItemName(node);
}
else{//object
varobject =SGWorld.ProjectTree.GetObject(node);
vartrackedPosition =object.Position;
if(!trackedPosition) {
alert(SGLang.i18n("Text38"));
return;
}
EmptytrackedObjArray();
PushtrackedObj2Array(object);
document.getElementById("trackedGroupID").value =object.TreeItem.Name;
}
}
//--------------//StartStop
functionStartStop() {
if(!isStart) {
isStart = true;
document.getElementById("targetID").disabled = true;
document.getElementById("SetTargetFromSelected").disabled = true;
document.getElementById("CreateTarget").disabled = true;
document.getElementById("trackedGroupID").disabled = true;
document.getElementById("SetGroupFromSelected").disabled = true;
document.getElementById("warningRadiusID").disabled = true;
document.getElementById("dangerRadiusID").disabled = true;
document.getElementById("chkTint").disabled = true;
startstopSpan.innerHTML =SGLang.i18n("Text37");
warningRadius =document.getElementById("warningRadiusID").value;
dangerRadius =document.getElementById("dangerRadiusID").value;
}
else{
Reset(false, false);
}
}
//------------------//Reset//------------------
functionReset(FirstTime, FromMouseInputMode) {
try{
startstopSpan.innerHTML =SGLang.i18n("Text36");
if(isStart &&SGWorld.Project.Name != "") {
isStart = false;
deleteObjs();
}
isStart = false;
document.getElementById("targetID").disabled = false;
document.getElementById("SetTargetFromSelected").disabled = false;
document.getElementById("trackedGroupID").disabled = false;
document.getElementById("SetGroupFromSelected").disabled = false;
document.getElementById("warningRadiusID").disabled = false;
document.getElementById("dangerRadiusID").disabled = false;
document.getElementById("chkTint").disabled = false;
document.getElementById("CreateTarget").disabled = false;
}
catch(err) { isStart = false; }
}
//-------------//AddObjectToArray
functionAddObjectToArray(object, type, altitudeType) {
SGWorld.Window.ShowMessageBarText(SGLang.i18n("Text40"));
SGWorld.ProjectTree.EnableRedraw(0);
if(type == 1) {
//In the future may want to work on the pivot of the polyline. was: if (!DrawOnPolyline(geometry, type, altitudeType))
return false;
}
else if(type == 2)
{
//In the future may want to work on the pivot of the polyline. was: if (!DrawOnPolygon(geometry, type, altitudeType))
return false;
}
else //Selected points
{
PushtrackedObj2Array(object);
}
return true;
}
//-------------------//searchObjects2 - modified from ToolsCommon65 searchGeometries
functionsearchObjects2(parentNode, callbackFunc) {
SGWorld.ProjectTree.EnableRedraw(0);
searchObjectsLeaf2(parentNode, callbackFunc);
SGWorld.ProjectTree.EnableRedraw(1);
}
//-------------------//searchObjectsLeaf2 - modified from ToolsCommon65 searchGeometriesLeaf2
functionsearchObjectsLeaf2(parentNode, callbackFunc) {
if(SGWorld.ProjectTree.IsLayer(parentNode)) //Layer
{
varlayer =SGWorld.ProjectTree.GetLayer(parentNode);
varfeatureGroups =layer.FeatureGroups;
for(vari = 0; i <featureGroups.Count; i++) //Traverse all sub-layers
{
varfeatureGroup =featureGroups.Item(i);
varaltitudeType =AltitudeMethodToAltitudeType(featureGroup.GetProperty("Altitude Method"));
varfeatures =featureGroup.Features;
for(varj = 0; j <features.Count; j++) {
varret;
if(featureGroup.GeometryType != 0)
ret =callbackFunc(features.Item(j).Geometry, featureGroup.GeometryType, altitudeType);
else{
if(features.Item(j).Geometry.GeometryType == 0) //Point
{
varposition =SGWorld.Creator.CreatePosition(features.Item(j).Geometry.X, features.Item(j).Geometry.Y, features.Item(j).Geometry.Z);
ret =callbackFunc(position, featureGroup.GeometryType, altitudeType);
}
}
if(!ret)
return;
}
}
}
else{
varnode =SGWorld.ProjectTree.GetNextItem(parentNode, 11);
while(node != "") {
if(SGWorld.ProjectTree.IsGroup(node) ||SGWorld.ProjectTree.IsLayer(node))
searchObjectsLeaf2(node, callbackFunc);
else{
varObject =SGWorld.Creator.GetObject(node);
if(Object != null) {
varaltitudeType =Object.Position.AltitudeType;
varret;
if(Object.ObjectType == 1 ||Object.ObjectType == 2)
ret =callbackFunc(Object/*.Geometry*/, Object.ObjectType, altitudeType);
elseret =callbackFunc(Object/*.Position*/, Object.ObjectType, altitudeType);
if(!ret)
return;
}
}
node =SGWorld.ProjectTree.GetNextItem(node, 13);
}
}
}
//--------------//EmptytrackedObjArray
functionEmptytrackedObjArray() {
while(trackedObjArray.length > 0) {
trackedObjArray.pop();
}
}
//--------------//PushtrackedObj2Array
functionPushtrackedObj2Array(object) {
trackedObjArray.push({
"object": object,
"lineObj": null,
"distLabelObj": null,
"level": "undefined"});
}
//------------//deleteObjs
functiondeleteObjs() {//In the future move logic to deleteObj that can be called from here and from other places.
try{
//while (trackedObjArray.length > 0)
for(vari = 0; i <trackedObjArray.length; i++) {
//var item = trackedObjArray.pop();
varitem =trackedObjArray[i];
if(item.lineObj != null) {
SGWorld.Creator.DeleteObject(item.lineObj.ID);
item.lineObj = null;
}
if(item.distLabelObj != null) {
SGWorld.Creator.DeleteObject(item.distLabelObj.ID);
item.distLabelObj = null;
}
item.level = "undefined";
if(bTint) item.object.Terrain.Tint =SGWorld.Creator.CreateColor(0, 0, 0, 0);
}
}
catch(err) { alert(SGLang.i18n("Text41") +err); Reset(0, 0); }
}
//------------//displayProximityInfo
functiondisplayProximityInfo() {
//debugger;
if(!isStart ||targetObj == null) {
return false;
}
try{
for(vari = 0; i <trackedObjArray.length; i++) {
//calculate distance
vardist =SGWorld.CoordServices.GetDistance3D(targetObj.Position, trackedObjArray[i].object.Position);
if(dist <=warningRadius) {
//Create/Update polygon
if(trackedObjArray[i].lineObj == null) {
varabsoluteTargetObj =targetObj.Position.ToAbsolute(0);
varabsoluteTrackedObj =trackedObjArray[i].object.Position.ToAbsolute(0);
varpointsArray =[absoluteTargetObj.X, absoluteTargetObj.Y, absoluteTargetObj.Altitude, absoluteTrackedObj.X, absoluteTrackedObj.Y, absoluteTrackedObj.Altitude];
trackedObjArray[i].lineObj =SGWorld.Creator.CreatePolylineFromArray(pointsArray, colorLineDanger, 3, SGWorld.ProjectTree.HiddenGroupID); //leave this comment: ATC_TERRAIN_ABSOLUTE = 3
trackedObjArray[i].lineObj.SaveInFlyFile = false;
trackedObjArray[i].lineObj.SetParam(5440, 1);
trackedObjArray[i].lineObj.LineStyle.Width = -2}
else{
trackedObjArray[i].lineObj.Geometry.StartEdit()
//update second point
varabsolutePosition =trackedObjArray[i].object.Position.ToAbsolute(0);
trackedObjArray[i].lineObj.Geometry.Points.Item(1).X =absolutePosition.X;
trackedObjArray[i].lineObj.Geometry.Points.Item(1).Y =absolutePosition.Y;
trackedObjArray[i].lineObj.Geometry.Points.Item(1).Z =absolutePosition.Altitude;
trackedObjArray[i].lineObj.Geometry.EndEdit()
}
//Create/Update Text ***arik: Does it look good? what to do when below ground
if(trackedObjArray[i].distLabelObj == null) {
varabsoluteTargetObj =targetObj.Position.ToAbsolute(0);
varabsoluteTrackedObj =trackedObjArray[i].object.Position.ToAbsolute(0);
varmiddlePosition =absoluteTargetObj.MoveToward(absoluteTrackedObj, dist / 2);
middlePosition.Altitude =middlePosition.Altitude +warningRadius / 40;
varlabelStyle =SGWorld.Creator.CreateLabelStyle(0);
labelStyle.Bold = true;
//labelStyle.LineToGround = false;
labelStyle.Scale =warningRadius / 20;
labelStyle.FontSize = 10;
trackedObjArray[i].distLabelObj =SGWorld.Creator.CreateTextLabel(middlePosition, dist.toFixed(2), labelStyle, SGWorld.ProjectTree.HiddenGroupID);
trackedObjArray[i].distLabelObj.SaveInFlyFile = false;
}
else{
varabsoluteTargetObj =targetObj.Position.ToAbsolute(0);
varabsoluteTrackedObj =trackedObjArray[i].object.Position.ToAbsolute(0);
varmiddlePosition =absoluteTargetObj.MoveToward(absoluteTrackedObj, dist / 2);
middlePosition.Altitude =middlePosition.Altitude +warningRadius / 40;
trackedObjArray[i].distLabelObj.Position =middlePosition;
trackedObjArray[i].distLabelObj.Text =dist.toFixed(2);
}
//Color objects
varnewLevel =(dist >dangerRadius) ? "warning": "danger";
if(trackedObjArray[i].level !=newLevel) {
trackedObjArray[i].lineObj.LineStyle.Color =(newLevel == "danger") ?colorLineDanger : colorLineWarning;
trackedObjArray[i].distLabelObj.Style.TextColor =(newLevel == "danger") ?colorLineDanger : colorLineWarning;
if(bTint) {
trackedObjArray[i].object.Terrain.Tint =(newLevel == "danger") ?colorLineDanger : colorLineWarning;
trackedObjArray[i].object.Terrain.Tint.SetAlpha(0.5);
}
}
}
else{
if(trackedObjArray[i].lineObj != null) {
SGWorld.Creator.DeleteObject(trackedObjArray[i].lineObj.ID);
trackedObjArray[i].lineObj = null;
}
if(trackedObjArray[i].distLabelObj != null) {
SGWorld.Creator.DeleteObject(trackedObjArray[i].distLabelObj.ID);
trackedObjArray[i].distLabelObj = null;
}
trackedObjArray[i].object.Terrain.Tint =SGWorld.Creator.CreateColor(0, 0, 0, 0);
}
}
}
catch(err) { alert(SGLang.i18n("Text41") +err); Reset(0, 0); }
}
</script>
</body>
</html>