`
blackbat
  • 浏览: 8909 次
  • 来自: 重庆
社区版块
存档分类
最新评论

关于map的问题 clip和边界

    博客分类:
  • Ajax
阅读更多
这2天一直在弄这个map的问题,希望各位给点建议或者意见,帮忙一下~~
1 如何判断当图片移出了蓝色框范围外,使它回到蓝色框内?
      也就是说超出边界。回到能显示的范围内。不要让人看见出现白色的底色。
2 如何使图片只显示在可见范围内【即显示层的那个大小】的那部分,我知道用clip ,但是一直没试出来。
      (就如maps.baidu.com的那个效果)
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> Cqupt CM </TITLE>
        <style type="text/css">
            h1 {
                font: 20pt sans-serif;
            }

			/*外部窗口层,用于显示地图。*/
            #outerDiv {
                height: 200px;
                width: 300px;
                border: 1px solid blue;
                position: relative;
                overflow: hidden;	
            }

			/*内部层,用于装载地图图片,图片就放在里面。*/
            #innerDiv {
                position: relative;
                left: 0px;
                top: 0px;
            }
        </style>       
		
		<script type="text/javascript">

		    var dragging = false;   //  是否在拖动标志 false:不是 true :是
            var top;                     //  内部层的顶部坐标 即Y
            var left;                     //  内部层的左边坐标 即X
            var dragStartTop;        //  拖放开始时的坐标
            var dragStartLeft;       //   拖放结束时的坐标

            function init() {
                // make inner div big enough to display the map
                // 使内部层足够大,可以显示地图
                setInnerDivSize('800px', '700px');

                // 设置监听器 监听事件 
                var outerDiv = document.getElementById("outerDiv");
                
                outerDiv.onmousedown = startMove;              //鼠标按下
                outerDiv.onmousemove = processMove;          //鼠标移动
                outerDiv.onmouseup     = stopMove;              //鼠标弹起
                
				// necessary to enable dragging on IE
                outerDiv.ondragstart = function() { return false; }
				
				var innerDiv = document.getElementById("innerDiv");
				
				img = document.createElement("img");
				img.src = "http://mappng.baidu.com/maplite/mapbank/baidu/1/0_0/5_1.png";
				img.style.position = "absolute";
				img.style.left = "0px";
				img.style.top = "0px";
				img.style.zIndex = 0;
				img.setAttribute("id", "pb01");
				innerDiv.appendChild(img);

            }      
          function startMove(event) {
                // necessary for IE
                if (!event) event = window.event;

                dragStartLeft = event.clientX;
                dragStartTop = event.clientY;
                var innerDiv = document.getElementById("innerDiv");
                innerDiv.style.cursor = "-moz-grab";
                top = stripPx(innerDiv.style.top);
                left = stripPx(innerDiv.style.left);

                dragging = true;
                return false;
            }

            function processMove(event) {
                if (!event) event = window.event;  // for IE
                var innerDiv = document.getElementById("innerDiv");
                if (dragging) {
                    innerDiv.style.top = top + (event.clientY - dragStartTop);
                    innerDiv.style.left = left + (event.clientX - dragStartLeft);
                }

            }

            function stopMove() {
                var innerDiv = document.getElementById("innerDiv");
                innerDiv.style.cursor = "";
                dragging = false;
				
				status='在当前窗口中的X, Y坐标 : ( '+event.clientX+', '+event.clientY +')'+' 内部层的Top:'+innerDiv.style.top+' 内部层的Left:'+innerDiv.style.left;
            }
            function stripPx(value) {
                if (value == "") return 0;
                return parseFloat(value.substring(0, value.length - 2));
            }

            function setInnerDivSize(width, height) {
                var innerDiv = document.getElementById("innerDiv");
                innerDiv.style.width = width;
                innerDiv.style.height = height;
            }			
			</script>

</HEAD>

<BODY onload="init()">
  <div id="outerDiv">
        <div style="position: absolute; top: 10px; left: 10px; z-index: 1">

        <div id="innerDiv" style="z-index: 0">
        </div>
   </div>

</BODY>
</HTML>
分享到:
评论
6 楼 blackbat 2007-04-06  
这几天一直在类似baidumap(maps.baidu.com)的一个应用,之前听说当用户移动地图时向服务器异步取图片,以为这里用了xmlhttp,其实没有,只是在js里计算好,移到需要的图片,直接向服务器下载摆了。不知道这样和用xmlhttp取有何好坏之处?

另外一直搞不懂,baidumap在拖动时,只显示固定大小的图片,其实它是一张整的图片,但是为什只显示一部份?用了Clip这个属性,这样做只是为了好看一点?
5 楼 blackbat 2007-04-05  
@7thbyte
多出来的那个层是拿来放东南西北4个方向移动的图片,只是没加进去啊。
非常感谢啊.

如果继续改,问题又出来了,现在的情况是只用了一张大的地图,
但是实际上应该是由许多小的图片拼凑起来的,这样就会更烦琐,需要计算每张图片的clip的大小。


如下图:
4 楼 7thbyte 2007-04-04  
好了,在lz的程序基础上写的,判断是否移出并调整位置

由于那个padding:10px的存在,所以若干地方有-10..

function setImagePlace(){
	var innerDiv = document.getElementById("innerDiv");
	var outerDiv=document.getElementById("outerDiv");
	var img=document.getElementById("pb01");
	var l=parseInt(innerDiv.style.left);
	var t=parseInt(innerDiv.style.top);
	if(l>-10) innerDiv.style.left="-10px";
	if(t>-10) innerDiv.style.top="-10px";
	if(parseInt(outerDiv.clientWidth)-l-10>img.width)
		innerDiv.style.left=parseInt(outerDiv.clientWidth)-10-img.width+"px";
	if(parseInt(outerDiv.clientHeight)-t-10>img.height)
		innerDiv.style.top=parseInt(outerDiv.clientHeight)-10-img.height+"px";
}
3 楼 7thbyte 2007-04-04  
先第二个问题

代码里面outterDiv和innerDiv中间还隔着一层Div

由于它的存在写起来颇费一番周折
估计lz也是卡在这上面

针对lz的程序 第二个问题试试看应该可以这样:
function setImageClip(){
	var innerDiv = document.getElementById("innerDiv");
	var outerDiv=document.getElementById("outerDiv");
	var img=document.getElementById("pb01");
	var v1=parseInt(innerDiv.style.top)+10;
	var v2=parseInt(innerDiv.style.left)+10;
	
	var v3=parseInt(outerDiv.clientWidth)-v2;
	var v4=parseInt(outerDiv.clientHeight)-v1;
	
	v1=v1<0?-v1:0;
	v2=v2<0?-v2:0;
	
	img.style.clip="rect("+v1+"px,"+v3+"px,"+v4+"px,"+v2+"px)";
	
}


这里是让图片沿outerDiv被切割的,而中间的div的padding是10 所以v1和v2都加了10
另外中间的div右边界超越了outerdiv,所以v3和v4的计算参考的是outerDiv的宽高

以前写过类似的例子,还可以把图片的上一层div的position设置成absolute,overflow设为hidden
然后动态改变div大小,可以取得类似效果
2 楼 blackbat 2007-04-04  
@7thbyte
1.图片移出,是指图片图片移动使得蓝色框露出白底,也就是说那边根本就没图片了。在移动结束,鼠标松开(up)后将其移回。
还有bug就是图片是移动的过程中,如果鼠标移动出了蓝色框,当你移回来时,图片直接又跟着鼠标动。你应该看到了吧。

2.应该是这样吧,取那几个相对坐标,然后算距离,一直没试出来...
1 楼 7thbyte 2007-04-04  
问题1:

图片移出,指的是图片完全移出蓝色框,
还是指图片移动使得蓝色框露出白底

是移动过程中始终保持不能移出,
还是移动结束,鼠标松开后将其移回?

可以用取得innerDiv.style.left和innerDiv.style.top,
再根据层和图片的style.width和style.height来判断图片位置是否符合要求,再行处理

问题2:
同样是取得几个值,然后根据情况更改style.clip的值

相关推荐

    SuperMap Objects Java 地图裁剪

    3. **执行裁剪操作**:使用Map的clip()方法,传入裁剪范围对象,即可完成裁剪。此方法会返回一个新的Layer,包含裁剪后的地图数据。 4. **显示裁剪结果**:将裁剪后的新Layer添加到地图视图中,或者保存为新的数据...

    叠加分析和DEM建立

    2. 添加并激活矢量数据:在视图目录表中添加并激活边界数据(boundary.shp)和高程点数据(peak.shp)。 3. 裁剪分析:使用Clip命令对高程数据进行裁剪,去除边界外的数据。 二、DEM建立 DEM(Digital Elevation ...

    arcgis-10操作总结1

    请注意,上述C#代码示例需要对ArcObjects API有深入了解,并且需要正确处理Esri对象,如图层、数据框、边界和几何对象。在实际应用中,确保已安装ArcObjects SDK,并根据项目需求进行调整。 总的来说,ArcGIS 10中...

    arcgis按比例切割图版教程

    在这个教程中,我们将需要用到两个主要的工具:Clip和Make Feature Layer。 1. Clip工具:此工具用于从源数据中提取一部分区域,这部分区域由定义的边界(或“clipper”)决定。在我们的案例中,这个边界将是我们想...

    quaddemo_open_LOD_viewi4n_3d_

    通过这些文件,我们可以推测开发者首先从"quadtest.map"和"demdata"读取地形信息,然后利用"quadtree.cpp"和"quadtree.hpp"构建四叉树结构。"geometry.hpp"和"geometry.cpp"中的函数用于处理3D几何信息。"quadtest....

    GIS练习资料——澳大利亚

    4. **.mxd** 文件:这是ArcGIS的Map Document文件,保存了地图布局、图层、图例、比例尺等信息,用户可以通过打开.mxd文件来查看和编辑GIS地图。 5. **.pdf** 文件:这里可能是关于SLU(可能指的是土地使用单元)...

    比较新的版本PCI常用操作

    描述中提到的“显示矢量层 (file) 显示矢量层 (map)”是指在GIS软件中加载和查看存储在文件中的矢量数据,并将其叠加到地图上显示。这通常涉及到地图投影的选择,以确保不同来源的数据能够正确地对齐和融合。 接...

    arcgis统计面积使用攻略

    通过以上步骤,我们不仅制作了土地利用类型图,还完成了村庄名称标注、评估边界导入、自定义符号应用以及面积统计和导出,为土地复垦提供了详细的数据支持。在实际操作中,根据具体的数据格式和项目需求,可能需要对...

    AS3地图转动

    这可以通过比较地图的当前位置和边界值来实现。 ```actionscript if (matrix.tx &gt; 0) { matrix.tx = 0; } else if (matrix.tx ) { matrix.tx = maxLeftBound; } if (matrix.ty &gt; 0) { matrix.ty = 0; } else if...

    ArcGIS engine接口详细说明

    31. **复制MapControl中的Map到PageLayoutControl**:在地图控件和布局控件之间移动地图内容。 32. **判断编辑状态**:检查IWorkspaceEdit接口的IsEditing属性,确认是否在编辑模式。 33. **用点创建Polygon**:...

    ArcInfo命令使用.rar

    - `CLIP`: 用一个覆盖作为剪切边界,裁剪另一个覆盖,仅保留剪切边界内的部分。 - `IDENTIFY`: 在地图上选择特定位置,获取该位置的详细属性信息。 4. 分析命令 - `SUMMARY`: 提供统计信息,如点、线、面的数量,...

    ArcMap9.3使用技巧(终结版)

    10. **画岛图**:两种方法可以实现,一是利用Sketch工具完成外部和内部轮廓,二是通过Intersect和Clip工具处理两个图斑,实现岛的创建。 11. **连接外界属性数据**:JOIN工具允许将外部属性数据(如.XSL文件)与...

    ArcGIS10 花边图框制作

    例如,可以使用“Draw”工具来绘制边框图形,或者使用“Buffer”工具创建具有一定距离的边界,再通过“Clip”或“Erase”工具与地图数据结合,形成花边效果。 5. **自定义工具**:如果内置工具不能满足需求,可以...

    arcmap使用技巧

    或者使用Intersect和Clip工具结合,创建交集并剪切。 11. **共享属性数据**:JOIN工具可以将外部属性数据(如.xsl文件)关联到图层,但关联依赖于原始数据。Excel数据需满足特定格式,如第一行包含字段名,且字段名...

    arcengien多边形裁剪.txt

    - **获取图层**:使用`axMapControl2.Map.get_Layer`方法获取到地图控件中的第一层。 - **转换为特征图层**:将获取到的图层转换为`IFeatureLayer`接口。 #### 4.3 多边形裁剪逻辑 - **判断条件**:检查是否已有一...

    ArcGIS接口详细说明之个人开发心得

    31. **将MapControl中的Map复制到PageLayoutControl中**:通过IMap和IActiveView接口实现地图的复制和显示。 32. **判断是否出于编辑状态**:检查IWorkspaceEdit的IsEditing属性以确定是否在编辑模式。 33. **用点...

    ArcMap常用矢量工具使用技巧

    此外,利用`Intersect`和`Clip`工具可以创建基于多个图斑的复杂图形,而`Union`、`Merge`和`Split`等工具则用于图斑的组合、合并与分割,满足不同场景下的需求。 #### 10. 连接外界属性数据 ArcMap的`JOIN`功能...

    Arcmap技巧总结

    另一种方法则是利用`Editor`工具栏中的`Intersect`和`Clip`工具,来创建和剪切图斑。 #### 十一、连接外界属性数据 在需要将外部属性数据(如`.xls`文件)与GIS数据关联时,可以使用`JOIN`工具。需要注意的是,...

    arcgis工具

    arcgis工具总结 1. 要素的剪切与延伸 实用工具 TASK 任务栏 Extend/Trim feature 剪切所得内容与你画线的方向有关。 2. 自动捕捉跟踪工具 ...例如,使用包含(Contain)方法,即使湖泊的边界和包含该...

    在VC++窗体内实现文字滚动的实例

    font.CreateFont(-24, 0, 0, 0, FW_NORMAL, FALSE, FALSE, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, FF_DONTCARE, _T("Arial")); dc.SelectObject(&font); CString text = ...

Global site tag (gtag.js) - Google Analytics