php判断坐标在不在范围,6、根据坐标,判断该坐标是否在地图区域范围内

最近在写配送区域相关的代码,具体需求如下:

根据腾讯地图划分配送区域,总站下边设多个配送分站,然后将订单中的收货地址将其分配给不同的配送分站。

1、地图区域划分(腾讯地图)

1.1、HTML

重置地图

1.2、JS //初始化新地图

initNewMap:function(){

var map = new qq.maps.Map(document.getElementById("container"), {

center: new qq.maps.LatLng(36.05562,103.88191),// 地图的中心地理坐标。

zoom:13// 地图的中心地理坐标。

});

var drawingManagerOpt = new qq.maps.drawing.DrawingManager({

drawingMode: qq.maps.drawing.OverlayType.POLYGON,

drawingControl: true,

drawingControlOptions: {

position: qq.maps.ControlPosition.TOP_CENTER,

drawingModes: [

qq.maps.drawing.OverlayType.POLYGON

]

},

circleOptions: {

fillColor: new qq.maps.Color(255, 208, 70, 0.3),

strokeColor: new qq.maps.Color(88, 88, 88, 1),

strokeWeight: 3,

clickable: false

}

});

drawingManagerOpt.setMap(map);

var points = "";

qq.maps.event.addListener(drawingManagerOpt, 'overlaycomplete', function(event) {

event.overlay.getPath().forEach(function(e){

var lng=e.getLng();

var lat=e.getLat();

points+=lng+","+lat+"-";

});

points=points.substring(0, points.length-1);

vm.getPeopleDataByPolygon(points);

});

},

//初始化老的地图

initOldMap:function(value){

var map = new qq.maps.Map(document.getElementById("container"), {

center: new qq.maps.LatLng(36.05562,103.88191),// 地图的中心地理坐标。

zoom:13// 地图的中心地理坐标。

});

//获取旧坐标

let data = $("#jqGrid").jqGrid('getRowData', getSelectedRow("#jqGrid"));

var areaCoordinateArray = new Array();

areaCoordinateArray = data.areaCoordinate.split("-");

var path = new Array();

for(var i=0;i

var coarray = areaCoordinateArray[i].split(",");

path.push(new qq.maps.LatLng(coarray[1],coarray[0]));

}

var polygon = new qq.maps.Polygon({

map: map

});

polygon.setPath(path);

var drawingManagerOpt = new qq.maps.drawing.DrawingManager({

drawingMode: qq.maps.drawing.OverlayType.POLYGON,

drawingControl: true,

drawingControlOptions: {

position: qq.maps.ControlPosition.TOP_CENTER,

drawingModes: [

qq.maps.drawing.OverlayType.POLYGON

]

},

circleOptions: {

fillColor: new qq.maps.Color(255, 208, 70, 0.3),

strokeColor: new qq.maps.Color(88, 88, 88, 1),

strokeWeight: 3,

clickable: false

}

});

drawingManagerOpt.setMap(map);

var points = "";

qq.maps.event.addListener(drawingManagerOpt, 'overlaycomplete', function(event) {

event.overlay.getPath().forEach(function(e){

var lng=e.getLng();

var lat=e.getLat();

points+=lng+","+lat+"-";

});

points=points.substring(0, points.length-1);

vm.getPeopleDataByPolygon(points);

});

},

1.3、结果:

381216

2、判断坐标是否在多边形区域内 /**

* 判断是否在多边形区域内

*

* @param pointLon

* 要判断的点的纵坐标

* @param pointLat

* 要判断的点的横坐标

* @param lon

* 区域各顶点的纵坐标数组

* @param lat

* 区域各顶点的横坐标数组

* @return

*/

public static boolean isInPolygon(double pointLon, double pointLat, double[] lon,

double[] lat) {

// 将要判断的横纵坐标组成一个点

Point2D.Double point = new Point2D.Double(pointLon, pointLat);

// 将区域各顶点的横纵坐标放到一个点集合里面

List pointList = new ArrayList();

double polygonPoint_x = 0.0, polygonPoint_y = 0.0;

for (int i = 0; i < lon.length; i++) {

polygonPoint_x = lon[i];

polygonPoint_y = lat[i];

Point2D.Double polygonPoint = new Point2D.Double(polygonPoint_x, polygonPoint_y);

pointList.add(polygonPoint);

}

return check(point, pointList);

}

/**

* 一个点是否在多边形内

*

* @param point

* 要判断的点的横纵坐标

* @param polygon

* 组成的顶点坐标集合

* @return

*/

private static boolean check(Point2D.Double point, List polygon) {

java.awt.geom.GeneralPath peneralPath = new java.awt.geom.GeneralPath();

Point2D.Double first = polygon.get(0);

// 通过移动到指定坐标(以双精度指定),将一个点添加到路径中

peneralPath.moveTo(first.x, first.y);

polygon.remove(0);

for (Point2D.Double d : polygon) {

// 通过绘制一条从当前坐标到新指定坐标(以双精度指定)的直线,将一个点添加到路径中。

peneralPath.lineTo(d.x, d.y);

}

// 将几何多边形封闭

peneralPath.lineTo(first.x, first.y);

peneralPath.closePath();

// 测试指定的 Point2D 是否在 Shape 的边界内。

return peneralPath.contains(point);

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值