微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何对复杂的谷歌多边形坐标进行排序?

如何解决如何对复杂的谷歌多边形坐标进行排序?

这是我的第一个问题,所以我会尽力解释我自己?

我在一家餐厅外卖公司担任前端开发人员,使用 ReactJS。

我正在展示商店在确定城市的覆盖范围。因此显示了两个多边形:

  1. 商店覆盖面
  2. 城市覆盖面

现在为了做到这一点,我使用了“google-maps-react”库。我从服务接收商店和城市覆盖面的坐标。商店覆盖面的多边形适用于给定的坐标,但城市覆盖面的情况并非如此。城市的坐标使多边形边界相互交叉,因此我必须对它们进行排序。

在这里找到了关于如何对坐标进行排序的答案...How to create Polygon by joining outer points in Google Maps。我试过这个答案,但事实证明,它对简单的多边形最有效。

我会保留坐标,因为它们在视觉上确实代表了覆盖范围,但是,当我为商店创建覆盖多边形时,我必须验证城市多边形内是否有覆盖。我使用 google.maps.geometry.poly.containsLocation() 方法执行此操作。由于边界相互交叉,因此会产生覆盖范围存在但实际上不存在的效果。这是一个问题,因为它使用户感到困惑。我找到的最佳解决方案是对坐标进行排序,使多边形边界线不会相互交叉。

我用来获取坐标并对它们进行排序的代码

// receive coordinates
  const getRappiCoverageCoordinates = allZones => {
    const storeCityRappiCoverageZones = allZones
      .filter(rappiZone => rappiZone.city_id === storetoEdit.storeCityId)
      .map(rappiZone => {
        return { ...rappiZone,zone: JSON.parse(rappiZone.zone) };
      });

    let cityCoordinates = [];
    storeCityRappiCoverageZones.forEach(rappiZone => {
      cityCoordinates = [...cityCoordinates,...rappiZone.zone];
    });

    cityCoordinates = getSortedCityCoordinates(cityCoordinates);

    setStoreCityRappiCoverageCoordinates(cityCoordinates);
  };

// sort coordinates
  const getSortedCityCoordinates = cityCoordinates => {
    const sortCityCoordinates = (a,b) => {
      const beara = google.maps.geometry.spherical.computeheading(centerPt,a);
      const bearB = google.maps.geometry.spherical.computeheading(centerPt,b);
      return beara - bearB;
    };

    const bounds = new google.maps.LatLngBounds();

    const googleLatLngCityCoordinates = cityCoordinates.map(coordinate => {
      const { lat,lng } = coordinate;
      const googleMapsLatLingCoordinate = new google.maps.LatLng(lat,lng);
      bounds.extend(googleMapsLatLingCoordinate);
      return googleMapsLatLingCoordinate;
    });

    const centerPt = bounds.getCenter();
    const sortedCityCoordinates = googleLatLngCityCoordinates
      .sort(sortCityCoordinates)
      .map(googleCoordinate => {
        const coordinate = {
          lat: googleCoordinate.lat(),lng: googleCoordinate.lng(),};
        return coordinate;
      });

    console.log(sortedCityCoordinates);
    return sortedCityCoordinates;
  };

我认为这种坐标排序应该在后端完成,因为它是繁重的逻辑,但上面的顺序是在前端弄清楚。

这是不排序城市多边形坐标的样子:

unsortedCityCoveragePolygon

这是对城市多边形的坐标进行排序时的样子:

sortedCityCoveragePolygon

我如何对这些坐标进行排序以创建一个完美的多边形,即使它是 5000 多个坐标?谢谢!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?