矩形交叉点组合
Rectangular intersection scomposition
TL;DR:
将2个相交矩形的相交分解为3个矩形,其中1个为相交区域。
大家好!
我目前正在开发一些东西,需要在地图上可视化一些数据。现在发生的事情是,每次用户在地图上移动时,我都会向一个api发出请求,告诉:
给我这个矩形区域(例如ABCD)中包含的所有数据,其中每个点都是Lat-Lng对。
每当用户在地图上移动,并且新的可视化区域不包含在上次可视化区域中时,都会发出这种请求(例如用户放大)
不幸的是,这种请求有点重,我想对此进行一些优化。
通常,当用户在地图上移动时,发生的事情(Img a)是他想要可视化的新区域(例如abcd矩形)与旧的可视化区域(abcd)相交,我已经为其加载了数据
因此,与其请求整个新的abcd矩形,不如向api询问AZcX+aXYb(图B)中包含的所有数据
我很难找到一个算法来计算给定的两个相交的矩形(ABCD和ABCD)这两个矩形。
任何帮助都将不胜感激,感谢
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
我早就解决了这个问题。我目前正在使用传单来显示我的地图,因此,在算法解决方案中,我指的是一些传单类。
以下是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 [];
}
相关文章:
- 根据id将json数组组合为一个json数组
- 接受不在列表中的值-引导组合框
- 从客户端获取修改后的对象,并将其与服务器上的原始对象组合
- 组合两个javascript函数
- Telerik rad组合框多列数据绑定
- 组合 2 个 JavaScript .scroll 函数
- 如何使用jquery组合两个数组
- onChange不足以从Dojo组合框触发查询
- 组合承诺和非承诺值
- 所有控件的组合框
- 在D3中组合多个事件
- AngularJS-如何只对多个事件的组合采取行动
- 如何在服务、技能、投资组合等方面添加滑动效果
- 以编程方式填充组合框道场 (1.8) 的最佳方法是什么?
- 如何在谷歌可视化中组合数字和模式格式化程序
- 更改组合框分页后,getValue和getRawValue返回相同的值
- 类型错误:url未定义extjs 4正在填充组合框
- 我该如何组合这两个Greasemonkey脚本
- Jqgrid动态组合框填充不起作用
- 矩形交叉点组合