小帅包 2024-03-29 17:00 采纳率: 20%
浏览 84

vue怎么判断一个坐标点在不在地图围栏里面

vue高德地图怎么判断一个坐标点在不在电子围栏里面,是需要判断纵坐标的距离吗,还是取相邻的两个点做比较

  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-03-29 17:00
    关注

    引自免费微信小程序:皆我百晓生

    要解决 Vue 中在地图上判断某个坐标点是否在电子围栏内的问题,我们可以根据高德地图的 API 规则和一些基本的地理概念来实现。以下是步骤和代码示例:

    1. 首先,我们需要在 Vue 中引入依赖项 @highcharts@highmaps/destinations。确保已经安装了这两个库。
    import Highcharts from 'highcharts';
    import Destinations from '@highmaps/destinations';
    
    // 假设我们已经有了一个 map 属性
    const map = {
      center: { lat: 37.7749, lng: -122.4194 },
      zoom: 12,
    };
    
    export default {
      mounted() {
        const mapOptions = {
          markers: [
            // 在这里添加你想要的电子围栏位置(这里假设为:(x1, y1), (x2, y2))
            {
              type: 'Feature',
              geometry: {
                type: 'Point',
                coordinates: [37.7685, -122.4195],
              },
              title: {
                text: 'Electric Fence Location',
              },
              data: [
                {
                  name: 'Fence Post 1',
                  lat: 37.7685,
                  lng: -122.4195,
                  featureId: 'feature_1',
                },
                {
                  name: 'Fence Post 2',
                  lat: 37.7705,
                  lng: -122.4222,
                  featureId: 'feature_2',
                },
                // ...
              ],
            },
          ],
        };
    
        new Highcharts.Map(mapOptions);
      },
    };
    
    1. 接下来,我们需要定义函数 isOutsideVirtualPolygon 来检查坐标点是否在虚拟包围圈内(在这个例子中是一个包含多个框的数据结构)。
    function isOutsideVirtualPolygon(fencePoints) {
      let inside = true;
    
      fencePoints.forEach((fencePost) => {
        if (!fencePost.featureId || !Highcharts.isFeatureWithinPolygon(fencePost.geometry.coordinates, {
          latitude: fencePost.lat,
          longitude: fencePost.lng,
        })) {
          return;
        }
    
        inside &= !Highcharts.isFeatureWithinPolygon(fencePost.geometry.coordinates, {
          latitude: fencePost.lat + fencePost.width / 2,
          longitude: fencePost.lng + fencePost.height / 2,
        });
      });
    
      return inside;
    }
    
    // 在 mounted 函数之前,将你期望的虚拟包围圈添加到 fencePoints 数组中
    map.options.markers.forEach((marker) => {
      marker.geometry.coordinates = [marker.geometry.coordinates[0], marker.geometry.coordinates[1]];
    });
    
    // 使用 map 的 add方法 添加虚拟包围圈
    map.add({
      type: 'FeatureCollection',
      features: fencePoints,
    });
    
    1. 现在,在 Vue 组件的 <div> 或者其他视图元素中,你可以使用以下方式来获取特定点的位置并调用 isOutsideVirtualPolygon 函数:
    <template>
      <div>
        <h2>Electric Fence Location</h2>
    
        <!-- 在此处找到包含你想要检查的点的位置 -->
        <span v-for="post in fencePoints" :key="post.id">
          <label>{{ post.name }}</label>
          <p>Lat: {{ post.lat }}</p>
          <p>Lng: {{ post.lng }}</p>
          <br>
          <div>
            <button @click="checkOutsideVirtualPolygon(post)">Check Inside</button>
          </div>
        </span>
      </div>
    </template>
    
    <script>
    export default {
      methods: {
        checkOutsideVirtualPolygon(post) {
          if (this.isOutsideVirtualPolygon(post)) {
            // 如果点不在虚拟包围圈内,显示一条消息提示用户
            console.log(`The point ${post.id} is not within the virtual fence`);
          } else {
            // 否则,可以正常渲染点的属性和内容
            // ...(在此处编写实际处理点内容的代码)
          }
        },
      },
    };
    </script>
    
    <style scoped>
    .features {
      position: relative;
      padding-bottom: 20px;
    }
    

    注意:在上述代码中,add 方法用于向地图中添加标记,并且我们假设每个标记都有一个 id 属性作为唯一的标识符。你需要根据实际情况修改 map.add 方法中的参数,以便正确地传递标记数据和地理位置信息。此外,如果你的地图是按列表方式进行渲染的,你需要提供相应的数据结构来表示你的围栏列表,例如:

    const fencePoints = [
      {
        id: 1,
        name: 'Fence Post 1',
        lat: 37.7685,
        lng: -122.4195,
        featureId: 'feature_1',
      },
      {
        id: 2,
        name: 'Fence Post 2',
        lat: 37.7705,
        lng: -122.4222,
        featureId: 'feature_2',
      },
      // ...
    ];
    

    这样,你就可以通过遍历围栏列表并调用 checkOutsideVirtualPolygon 函数来验证某个坐标点是否在围栏内了。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 3月29日

悬赏问题

  • ¥30 关于#java#的问题,请各位专家解答!
  • ¥30 vue+element根据数据循环生成多个table,如何实现最后一列 平均分 合并
  • ¥20 pcf8563时钟芯片不启振
  • ¥20 pip2.40更新pip2.43时报错
  • ¥15 换yum源但仍然用不了httpd
  • ¥50 C# 使用DEVMOD设置打印机首选项
  • ¥15 麒麟V10 arm安装gdal
  • ¥20 OPENVPN连接问题
  • ¥15 flask实现搜索框访问数据库
  • ¥15 mrk3399刷完安卓11后投屏调试只能显示一个设备