亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

百度地圖PC端判斷用戶是否在配送范圍內

2020-07-26 03:28:58
字體:
來源:轉載
供稿:網友

最近接了個項目,其中有項目需求是這樣的:

在pc端設置商家的配送范圍,用戶在下單時,根據用戶設置的配送地點判斷是否在可配送范圍內,并給用戶相應的提示。

下面說下我的實現思路:

1.用百度地圖在PC端設置配送范圍,可拖拽選擇

2.根據用戶設置的配送地址判斷是否在配送范圍內

一、百度地圖PC端獲取范圍

 改動百度地圖官網的demo,設置配送范圍。

 思路:獲取多邊形的頂點,以json的形式保存到數據庫。

 百度API關于多邊形覆蓋物:

 構造函數:

Polygon(points:Array<Point>[, opts:PolygonOptions]) 創建多邊形覆蓋物

方法:

setPath(path:Array<Point>)  none    設置多邊型的點數組(自1.2新增)
getPath()   Array<Point>    返回多邊型的點數組(自1.2新增)

實現:

主要代碼:

 //設置配送范圍function setRange(_point, _ppoints){  var polygon = new BMap.Polygon(_ppoints, {strokeColor:"blue", strokeWeight:2, strokeOpacity:0.5}); //創建多邊形    map.addOverlay(polygon);  //增加多邊形  polygon.enableEditing();  //允許編輯    polygon.addEventListener("lineupdate",function(e){    var rangeArr = polygon.getPath();    $("#distributeRange").val(JSON.stringify(rangeArr));  });}

以上代碼主要是監聽 lineupdate 事件,每一次拖拽百度地圖回調函數將返回的多邊形的頂點,然后通過JSON.stringify方法轉為string類型存在一個標簽里面,以待后續的表單提交操作。

二、判斷點是否在范圍內

去網上看了一下,判斷點是否在配送范圍內的方法很多,大概采用的是射線法。
 但是有一些方法沒有考慮全面,導致有的情況判斷不夠準確。
 在百度地圖的GeoUtils里面找到了“判斷點是否多邊形內”這個方法。
 因為我是需要在后端做判斷,然后直接把js轉化成了java,測試百發百中,欣喜?。ê竺娓缴蠝y試方法)

 /** * 判斷點是否在多邊形內 * @param point 檢測點 * @param pts  多邊形的頂點 * @return   點在多邊形內返回true,否則返回false */public static boolean IsPtInPoly(Point2D.Double point, List<Point2D.Double> pts){  int N = pts.size();  boolean boundOrVertex = true; //如果點位于多邊形的頂點或邊上,也算做點在多邊形內,直接返回true  int intersectCount = 0;//cross points count of x   double precision = 2e-10; //浮點類型計算時候與0比較時候的容差  Point2D.Double p1, p2;//neighbour bound vertices  Point2D.Double p = point; //當前點  p1 = pts.get(0);//left vertex      for(int i = 1; i <= N; ++i){//check all rays          if(p.equals(p1)){      return boundOrVertex;//p is an vertex    }    p2 = pts.get(i % N);//right vertex          if(p.x < Math.min(p1.x, p2.x) || p.x > Math.max(p1.x, p2.x)){//ray is outside of our interests              p1 = p2;       continue;//next ray left point    }    if(p.x > Math.min(p1.x, p2.x) && p.x < Math.max(p1.x, p2.x)){//ray is crossing over by the algorithm (common part of)      if(p.y <= Math.max(p1.y, p2.y)){//x is before of ray                  if(p1.x == p2.x && p.y >= Math.min(p1.y, p2.y)){//overlies on a horizontal ray          return boundOrVertex;        }        if(p1.y == p2.y){//ray is vertical                      if(p1.y == p.y){//overlies on a vertical ray            return boundOrVertex;          }else{//before ray            ++intersectCount;          }         }else{//cross point on the left side                      double xinters = (p.x - p1.x) * (p2.y - p1.y) / (p2.x - p1.x) + p1.y;//cross point of y                      if(Math.abs(p.y - xinters) < precision){//overlies on a ray            return boundOrVertex;          }          if(p.y < xinters){//before ray            ++intersectCount;          }         }      }    }else{//special case when ray is crossing through the vertex              if(p.x == p2.x && p.y <= p2.y){//p crossing over p2                  Point2D.Double p3 = pts.get((i+1) % N); //next vertex                  if(p.x >= Math.min(p1.x, p3.x) && p.x <= Math.max(p1.x, p3.x)){//p.x lies between p1.x & p3.x          ++intersectCount;        }else{          intersectCount += 2;        }      }    }          p1 = p2;//next ray left point  }  if(intersectCount % 2 == 0){//偶數在多邊形外    return false;  } else { //奇數在多邊形內    return true;  }}

主要是判斷和這個方法的可行性。

 為此寫了個測試方法。

 思路:獲取一個多邊形的頂點,然后隨機點一個點

 1.調用百度地圖的方法,判斷該點是否在范圍內
 2.根據百度地圖獲取的那個店的經緯度,自己程序判斷是否在范圍內

 調用百度地圖的方法:

 <html><head>  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  <title>GeoUtils示例</title>  <script type="text/javascript" src="http://api.map.baidu.com/api?v=1.2"></script>  <script type="text/javascript" src="http://api.map.baidu.com/library/GeoUtils/1.2/src/GeoUtils_min.js"></script>  <style type="text/css">  table {    font-size: 14px;  }  </style></head><body>  <div style="float:left;width:600px;height:500px;border:1px solid gray" id="container"></div>  <div style="float:left;width:300px;height:500px;border:1px solid gray" id="control">    <table style="width:100%;">      <tr>        <td colspan="2">判斷點是否在多邊形內:</td>      </tr>      <tr>        <td><input type="button" value="多邊形1" onclick="polygon1()" /></td>      </tr>      <tr>        <td><input type="button" value="多邊形2" onclick="polygon2()" /></td>      </tr>      <tr>        <td>經度<input type="text" value="" id="lng"></td>      </tr>      <tr>        <td>緯度<input type="text" value="" id="lat"></td>      </tr>      <tr>        <td>結果:</td>      </tr>      <tr>        <td><p id="result" style="color:red"></p></td>      </tr>    <table>  </div></body></html><script type="text/javascript">  var map = new BMap.Map("container");  var pt = new BMap.Point(116.404, 39.915);  var mkr = new BMap.Marker(pt);  var ply; //多邊形  map.centerAndZoom(pt, 16);  map.enableScrollWheelZoom(); //開啟滾動縮放  map.enableContinuousZoom(); //開啟縮放平滑  //初始化為多邊形1  polygon1();  //生成多邊形1  function polygon1() {    var pts = [];    var pt1 = new BMap.Point(116.395, 39.910);    var pt2 = new BMap.Point(116.394, 39.914);    var pt3 = new BMap.Point(116.403, 39.920);    var pt4 = new BMap.Point(116.402, 39.914);    var pt5 = new BMap.Point(116.410, 39.913);    pts.push(pt1);    pts.push(pt2);    pts.push(pt3);    pts.push(pt4);    pts.push(pt5);    ply = new BMap.Polygon(pts);    //演示:將面添加到地圖上    map.clearOverlays();    map.addOverlay(ply);  }  //生成多邊形2  function polygon2() {    var pts = [];    var pt1 = new BMap.Point(116.395, 39.910);    var pt2 = new BMap.Point(116.394, 39.914);    var pt3 = new BMap.Point(116.396, 39.919);    var pt4 = new BMap.Point(116.406, 39.920);    var pt5 = new BMap.Point(116.410, 39.913);    pts.push(pt1);    pts.push(pt2);    pts.push(pt3);    pts.push(pt4);    pts.push(pt5);    ply = new BMap.Polygon(pts);    //演示:將多邊形添加到地圖上    map.clearOverlays();    map.addOverlay(ply);  }  map.addEventListener("click", function (e) {    mkr.setPosition(e.point);    map.addOverlay(mkr);    //將點擊的點的坐標顯示在頁面上    document.getElementById("lng").value = e.point.lng;    document.getElementById("lat").value = e.point.lat;    InOrOutPolygon(e.point.lng, e.point.lat);  });  function InOrOutPolygon(lng, lat){    var pt = new BMap.Point(lng, lat);    var result = BMapLib.GeoUtils.isPointInPolygon(pt, ply);    if (result == true) {      document.getElementById("result").innerHTML = "點在多邊形內";    } else {      document.getElementById("result").innerHTML = "點在多邊形外";    }  }</script> 

界面如下:

在頁面上點擊一個點后,獲取了該點的坐標(用于自己的方法測試),并調用了 InOrOutPolygon 來判斷了該店是否在此范圍內。

后臺的測試方法:

// 測試一個點是否在多邊形內public static void main(String[] args) {  Point2D.Double point = new Point2D.Double(116.404072, 39.916605);  List<Point2D.Double> pts = new ArrayList<Point2D.Double>();  pts.add(new Point2D.Double(116.395, 39.910));  pts.add(new Point2D.Double(116.394, 39.914));  pts.add(new Point2D.Double(116.403, 39.920));  pts.add(new Point2D.Double(116.402, 39.914));  pts.add(new Point2D.Double(116.410, 39.913));  if(IsPtInPoly(point, pts)){    System.out.println("點在多邊形內");  }else{    System.out.println("點在多邊形外");  }} 

經過測試,結果滿意。

 總結,實現的過程最重要是保存那些頂點,并根據那些保存的頂點(有一定的順序),來判斷一個點是否在這些頂點圍成的多邊形內。

感覺百度地圖還是很好用的。API很全,而且都配有demo,非常利于我們開發者。

以上內容是針對百度地圖PC端判斷用戶是否在配送范圍內的相關知識,希望對大家有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久视频免费观看| 亚洲国产精品yw在线观看| 欧美日产国产成人免费图片| 国产精品视频导航| 九九视频这里只有精品| 国产亚洲综合久久| 精品福利一区二区| 一本一本久久a久久精品牛牛影视| 亚洲最大的网站| 日韩一区av在线| 亚洲人成网站色ww在线| 18久久久久久| 亚洲国产精品久久91精品| 国产精品精品视频一区二区三区| 日韩中文字幕免费视频| 欧美一级淫片videoshd| 5566日本婷婷色中文字幕97| 国产美女被下药99| 精品动漫一区二区| 国产欧美日韩免费看aⅴ视频| 久色乳综合思思在线视频| 97超级碰碰碰久久久| 欧美性xxxx极品hd满灌| 黄色精品在线看| 97成人精品视频在线观看| 国产精品扒开腿做爽爽爽的视频| 国产精品久久久久久久7电影| 国产精品2018| 久久久久久一区二区三区| 一本色道久久综合亚洲精品小说| 欧美日韩国产一区在线| 精品中文视频在线| 福利二区91精品bt7086| 最好看的2019年中文视频| 91精品国产九九九久久久亚洲| 国产精品天天狠天天看| www.亚洲成人| 一区二区欧美久久| 国产在线a不卡| 亚洲最大av网站| 欧美肥婆姓交大片| 国产噜噜噜噜久久久久久久久| 欧美激情免费视频| 久久久精品免费视频| 国产精品精品视频一区二区三区| 亚洲国产一区二区三区在线观看| 亚洲国产另类久久精品| 亚洲欧美激情视频| 亚洲成人黄色网址| 国产精品露脸自拍| 亚洲欧美日韩区| 午夜精品国产精品大乳美女| 国产精品久久久亚洲| 亚洲综合中文字幕在线| 国内精品久久久久久影视8| 亚洲第一页在线| 欧美亚洲免费电影| 欧美日韩加勒比精品一区| 亚洲色图狂野欧美| 欧美日韩亚洲成人| 欧美激情第1页| 91香蕉国产在线观看| 国外成人在线视频| 国产在线不卡精品| 日韩av电影中文字幕| 欧美视频不卡中文| 亚洲已满18点击进入在线看片| 日韩av网址在线观看| 国产亚洲在线播放| 欧美性高潮在线| 国产一区av在线| 亚洲人成在线观看网站高清| 97人人模人人爽人人喊中文字| 精品久久久在线观看| 久久九九亚洲综合| 欧美性感美女h网站在线观看免费| 日韩免费电影在线观看| 欧美一级成年大片在线观看| yellow中文字幕久久| 国产亚洲欧洲高清一区| 亚洲午夜精品视频| yellow中文字幕久久| 最好看的2019的中文字幕视频| 欧美制服第一页| 性色av一区二区三区在线观看| 97国产suv精品一区二区62| 久久久久久久久久久91| 久久久久久久影院| 亚洲国产一区二区三区四区| 日韩精品免费在线播放| 亚洲美女av在线| 91精品国产沙发| 欧美激情一二三| 国产美女精彩久久| 国产精品美女午夜av| 97超碰国产精品女人人人爽| 最近2019中文字幕mv免费看| 欧美激情第99页| 国产欧美精品va在线观看| 国产精选久久久久久| 国产精品v片在线观看不卡| 欧美性xxxx在线播放| 国产高清视频一区三区| 亚洲一区999| 久久久精品2019中文字幕神马| 亚洲japanese制服美女| 欧美在线亚洲在线| 日韩免费在线看| 欧美一级片在线播放| 欧美性xxxxx极品娇小| 91亚洲精品在线| 亚洲精品久久久久久下一站| 国产精品1区2区在线观看| 欧美在线一区二区视频| 亚洲欧美中文日韩v在线观看| 亚洲精品电影在线| 日韩成人激情在线| 97免费在线视频| 九九视频直播综合网| 久久久久北条麻妃免费看| 免费av一区二区| 午夜精品蜜臀一区二区三区免费| 96精品视频在线| 中文字幕精品www乱入免费视频| 久久久国产精品视频| 国产精品欧美激情在线播放| 国产精品爱久久久久久久| 国产aⅴ夜夜欢一区二区三区| 色777狠狠综合秋免鲁丝| 欧美日韩国产在线看| 亚洲石原莉奈一区二区在线观看| 久久成人综合视频| 亚洲自拍偷拍色图| 91国产美女在线观看| 国产在线播放91| 中文字幕亚洲欧美一区二区三区| 欧美电影免费观看电视剧大全| 亚洲品质视频自拍网| 最新日韩中文字幕| 国产美女扒开尿口久久久| 亚洲乱码国产乱码精品精| 久久久99久久精品女同性| 精品国产乱码久久久久久虫虫漫画| 91国内产香蕉| 午夜精品久久久99热福利| 久久成人人人人精品欧| 国产精品成人国产乱一区| 91香蕉嫩草神马影院在线观看| 国产一区二区三区高清在线观看| 精品久久久久久久久久久久久久| 国产精品日韩电影| 国产精品劲爆视频| 在线视频欧美性高潮| 亚洲开心激情网| 久久综合伊人77777蜜臀| 亚洲一区二区三区四区在线播放| 97人洗澡人人免费公开视频碰碰碰| 亚洲最大福利视频| 亚洲免费影视第一页| 日本精品免费观看| 国产女同一区二区| 精品日韩美女的视频高清| 欧美体内谢she精2性欧美| 国产一区二区三区精品久久久|