JavaScript地图手动输入起始与终点位置搜索

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
    <style type="text/css">
        body, html{width: 100%;height: 100%;margin:0;font-family:"微软雅黑";font-size:14px;}
        #l-map{height:300px;width:300px;margin-left: 50px;}
        #r-result{width:100%;}
    </style>
    <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=g0hrUacEObGE5H4yOGxRE55Dnvoc5A8O"></script>
    <title>关键字输入提示词条</title>
</head>
<body>
   <div id="l-map"></div>
   <div id="r-result">
       开始位置:<input type="text" id="suggestId" size="20" style="width:150px;" />
       结束位置:<input type="text" id="ee" size="20" style="width: 150px;">
   </div>
   <div id="driving_way">
       <select>
           <option value="0">最少时间</option>
           <option value="1">最少换乘</option>
           <option value="2">最少步行</option>
           <option value="3">不乘地铁</option>
       </select>
       <input type="button" id="result" value="查询"/>
   </div>
   <div id="searchResultPanel" style="border:1px solid #C0C0C0;width:150px;height:auto; display:none;"></div>
</body>
</html>
<script type="text/javascript">
    // 百度地图API功能
    function G(id) {
        return document.getElementById(id);
    }

    var map = new BMap.Map("l-map");
    map.centerAndZoom("合肥",12);                   // 初始化地图,设置城市和地图级别。

    var ac = new BMap.Autocomplete(    //建立一个自动完成的对象
            {"input" : "suggestId"
                ,"location" : map
            });
    var ab = new BMap.Autocomplete(    //建立一个自动完成的对象
            {"input" : "ee"
                ,"location" : map
            });

    map.addEventListener("onhighlight", function(e) {  //鼠标放在下拉列表上的事件
        var str = "";
        var _value = e.fromitem.value;
        var value = "";
        if (e.fromitem.index > -1) {
            value = _value.province +  _value.city +  _value.district +  _value.street +  _value.business;
        }
        str = "FromItem<br />index = " + e.fromitem.index + "<br />value = " + value;

        value = "";
        if (e.toitem.index > -1) {
            _value = e.toitem.value;
            value = _value.province +  _value.city +  _value.district +  _value.street +  _value.business;
        }
        str += "<br />ToItem<br />index = " + e.toitem.index + "<br />value = " + value;
        G("searchResultPanel").innerHTML = str;
    });
    var myValue;
    var start = ac.addEventListener("onconfirm", function(e) {    //鼠标点击下拉列表后的事件
        var _value = e.item.value;
        myValue = _value.province +  _value.city +  _value.district +  _value.street +  _value.business;
        G("searchResultPanel").innerHTML ="onconfirm<br />index = " + e.item.index + "<br />myValue = " + myValue;
        setPlace();
    });
    var myValue;
    var end = ab.addEventListener("onconfirm", function(e) {    //鼠标点击下拉列表后的事件
        var _value = e.item.value;
        myValue = _value.province +  _value.city +  _value.district +  _value.street +  _value.business;
        G("searchResultPanel").innerHTML ="onconfirm<br />index = " + e.item.index + "<br />myValue = " + myValue;
        setPlace();
    });

    function setPlace(){
        map.clearOverlays();    //清除地图上所有覆盖物
        function myFun(){
            var pp = local.getResults().getPoi(0).point;    //获取第一个智能搜索的结果
            map.centerAndZoom(pp, 18);
            map.addOverlay(new BMap.Marker(pp));    //添加标注
        }
        var local = new BMap.LocalSearch(map, { //智能搜索
            onSearchComplete: myFun
        });
        local.search(myValue);
    }
    var routePolicy = [BMAP_TRANSIT_POLICY_LEAST_TIME,BMAP_TRANSIT_POLICY_LEAST_TRANSFER,BMAP_TRANSIT_POLICY_LEAST_WALKING,BMAP_TRANSIT_POLICY_AVOID_SUBWAYS];
    var transit = new BMap.TransitRoute(map, {
        renderOptions: {map: map},
        policy: 0
    });
    var rst = document.getElementById("result");
   rst.click(function(){
        map.clearOverlays();
        var i=$("#driving_way select").val();
        search(start,end,routePolicy[i]);
        function search(start,end,route){
            transit.setPolicy(route);
            transit.search(start,end);
        }
    });

</script>

运行结果:

### 关于 `subMoveGripPointsAt` 方法中起始点动态变化的实现 在 Unity 或其他图形处理框架中,`subMoveGripPointsAt` 的核心逻辑通常是基于某种插值算法来计算目标位置的变化。为了使起始点能够动态变化,可以通过实时更新起始点的位置变量并将其传递给插值函数的方式实现。 以下是具体的实现思路: #### 1. 使用线性插值 (Lerp) 更新起始点 Unity 中的 `Vector3.Lerp` 是一种常见的线性插值方法,用于平滑地从一个向量过渡到另一个向量。通过不断改变起始点的位置,可以实现动态的效果[^1]。 ```csharp // 定义起始点和终点 private Vector3 startPoint; private Vector3 endPoint; void UpdateStartPointDynamically() { // 动态设置新的起点 startPoint = new Vector3(Random.Range(-5, 5), Random.Range(0, 3), 0); // 插值计算当前位置 float t = Time.time * speed; // 时间作为插值因子 transform.position = Vector3.Lerp(startPoint, endPoint, Mathf.PingPong(t, 1)); } ``` 上述代码展示了如何通过随机生成新起点的方式来模拟动态变化的行为。 --- #### 2. 批量修改几何对象中的起始点 如果涉及的是更复杂的场景(例如 GIS 数据中的图斑),可以参考 FME 工具的操作流程。FME 提供了一种灵活的方法来重新定义几何对象的起始点及其顺序[^2]。虽然这主要适用于地理信息系统领域,但在某些情况下也可以借鉴其思想,在程序中手动调整顶点数组的第一个元素。 ```csharp public void ModifyGeometryStartPoint(List<Vector3> vertices) { if (vertices.Count == 0) return; // 将第一个顶点替换为指定的新起始点 int newIndex = FindLeftTopCornerIndex(vertices); // 假设这是寻找左上角索引的函数 Vector3 temp = vertices[newIndex]; vertices.RemoveAt(newIndex); vertices.Insert(0, temp); } int FindLeftTopCornerIndex(List<Vector3> vertices) { // 寻找 y 最大且 x 较小的点作为左上角 int index = 0; for (int i = 1; i < vertices.Count; i++) { if (vertices[i].y > vertices[index].y || (vertices[i].y == vertices[index].y && vertices[i].x < vertices[index].x)) { index = i; } } return index; } ``` 此代码片段实现了将多边形的起始点移动至左上角的功能,并保持其余节点按顺时针排列。 --- #### 3. 地图导航中的动态路径规划 对于 Mapbox GL Directions API 来说,动态更改起始点通常意味着允许用户交互式输入或自动检测 GPS 信号以刷新当前位置[^3]。以下是一个简单的 JavaScript 示例: ```javascript const map = new mapboxgl.Map({ container: 'map', style: 'mapbox://styles/mapbox/streets-v11' }); const directions = new MapboxDirections({ accessToken: mapboxgl.accessToken, unit: 'metric', profile: 'driving' }); document.getElementById('map').appendChild(directions.onAdd(map)); function updateOrigin(latlng) { const originInput = document.querySelector('.mapbox-directions-origin .mapbox-input'); originInput.value = `${latlng.lat}, ${latlng.lng}`; directions.setOrigin([latlng.lng, latlng.lat]); } ``` 在此示例中,`updateOrigin` 函数可以根据传入的经纬度坐标动态更新地图上的起始点。 --- ### 总结 无论是 Unity 游戏开发还是 GIS 数据处理,甚至是 Web 地图应用,都可以通过不同的技术手段实现起始点的动态变化。关键是找到适合特定需求的数据结构和算法,并合理利用现有库或工具提供的接口完成任务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值