矩形交叉分组

时间:2015-03-31 11:07:01

标签: javascript geometry maps geometry-surface

TL; DR:

分解3个矩形中2个交叉矩形的交集,其中1个是交叉区域。


大家好!

我目前正在开发一些需要在地图上可视化某些数据的东西。现在发生的事情是每次用户在地图上移动时我都会向api发出请求:

给我这个矩形区域(Ex ABCD)中包含的所有数据,其中每个点都是Lat-Lng对。

每次用户在地图上移动时都会发出这种请求,并且新的可视化区域不包含在最后一个可视化区域中 (例如,用户放大了)

不幸的是,这种请求有点沉重,我想对此进行一些优化。

通常当用户在地图上移动时发生的事情(图A)是他想要显示的新区域(Ex abcd矩形)与旧的可视化区域(ABCD)相交,我已经加载了数据

因此,不要求全新的abcd矩形,而是要求api AZcX + aXYb中包含的所有数据(图B),这样会很酷而且不那么重。

我正在努力寻找一个算法来计算给定2个交叉矩形(ABCD和abcd)这2个矩形。

任何帮助将不胜感激, 感谢


User see and fecth data for this area

      A+------------+B
       |            |
       |            |
       |            |
      D+------------+C

Img A ( the user has moved to the new abcd area)
a+-----------+c
 |           |      B
 |    A+-----|------+
 |     |     |      |
b+-----|-----+d     |
       |            |
      D+------------+C



Img B
a+-----X-----+c
 |     |     |      B
 |    A+-----Z------+
 |     |     |      |
b+----Y|-----+d     |
       |            |
      D+------------+C

1 个答案:

答案 0 :(得分:0)

我刚刚解决了这个问题。 我目前正在使用leaflet来显示我的地图,因此,在算法解决方案中,我指的是一些传单类

这是javascript代码,其中2个区域呈现给传单L.LatLngBounds个对象,返回一个L.LatLngBounds数组,它们是互补区域,必须加载的区域。

遵循js算法:

function getComplementaryBounds(oldBounds, newBounds){
  if (!((oldBounds instanceof L.LatLngBounds) && (newBounds instanceof L.LatLngBounds))){
    return [];
  }

  var buildLatLngBound = function (nwlng, nwlat, selng, selat){
    return new L.LatLngBounds(new L.LatLng(nwlat,nwlng),new L.LatLng(selat,selng));
  }

   var nwiix = newBounds.getNorthWest().lng;
   var nwiiy = newBounds.getNorthWest().lat;
   var nwix =  oldBounds.getNorthWest().lng;
   var nwiy =  oldBounds.getNorthWest().lat;

   var seiix = newBounds.getSouthEast().lng;
   var seiiy = newBounds.getSouthEast().lat;
   var seix =  oldBounds.getSouthEast().lng;
   var seiy =  oldBounds.getSouthEast().lat;

  if (!(newBounds.contains(oldBounds))){
    switch (true) {
     case (nwiix >= nwix && nwiiy >= nwiy):
       return [buildLatLngBound(nwiix, nwiiy, seix, nwiy), buildLatLngBound(seix, nwiiy, seiix, seiiy)];
     case (nwiix <= nwix && nwiiy >= nwiy):
       return [buildLatLngBound(nwix, nwiiy, seiix, nwiy), buildLatLngBound(nwiix, nwiiy, nwix, seiiy)];
     case (nwiix <= nwix && nwiiy <= nwiy):
       return [buildLatLngBound(nwiix, nwiiy, nwix, seiiy), buildLatLngBound(nwix, seiy, seiix, seiiy)];
     case (nwiix >= nwix && nwiiy <= nwiy):
        return [buildLatLngBound(nwiix, seiy, seix, seiiy), buildLatLngBound(seix, nwiiy, seiix, seiiy)];
      }
    } else {
      return[
            buildLatLngBound(nwiix, nwiiy,    seiix,  nwiy),
            buildLatLngBound(nwiix, nwiy,     nwix,   seiy),
            buildLatLngBound(seix,  nwiy,     seiix,  seiy),
            buildLatLngBound(nwiix, seiy,     seiix,  seiiy)
            ];
    }
    return [];
  }