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
答案 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 [];
}