日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java判断地图范围_百度地图java 判断当前位置是否在多边形区域内

發(fā)布時間:2023/12/19 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java判断地图范围_百度地图java 判断当前位置是否在多边形区域内 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

package com.haiyisoft.cAssistant.adapter.hessian;

import java.awt.geom.Point2D;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

/**

* 根據(jù)訂單的經(jīng)緯度歸屬所在的商業(yè)區(qū)域

* @author lee

* @date: 2017年2月6日 下午2:12:02

*/

public class OrderMapTest {

public static void main(String[] args) {

// 被檢測的經(jīng)緯度點

Map orderLocation = new HashMap();

orderLocation.put("X", "217.228117");

orderLocation.put("Y", "31.830429");

// 商業(yè)區(qū)域(百度多邊形區(qū)域經(jīng)緯度集合)

String partitionLocation = "31.839064_117.219116,31.83253_117.219403,31.828511_117.218146,31.826763_117.219259,31.826118_117.220517,31.822713_117.23586,31.822958_117.238375,31.838512_117.23798,31.839617_117.226194,31.839586_117.222925";

System.out.println(isInPolygon(orderLocation, partitionLocation));

}

/**

* 判斷當前位置是否在多邊形區(qū)域內(nèi)

* @param orderLocation 當前點

* @param partitionLocation 區(qū)域頂點

* @return

*/

public static boolean isInPolygon(Map orderLocation,String partitionLocation){

double p_x =Double.parseDouble((String) orderLocation.get("X"));

double p_y =Double.parseDouble((String) orderLocation.get("Y"));

Point2D.Double point = new Point2D.Double(p_x, p_y);

List pointList= new ArrayList();

String[] strList = partitionLocation.split(",");

for (String str : strList){

String[] points = str.split("_");

double polygonPoint_x=Double.parseDouble(points[1]);

double polygonPoint_y=Double.parseDouble(points[0]);

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

pointList.add(polygonPoint);

}

return IsPtInPoly(point,pointList);

}

/**

* 返回一個點是否在一個多邊形區(qū)域內(nèi), 如果點位于多邊形的頂點或邊上,不算做點在多邊形內(nèi),返回false

* @param point

* @param polygon

* @return

*/

public static boolean checkWithJdkGeneralPath(Point2D.Double point, List polygon) {

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

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

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

polygon.remove(0);

for (Point2D.Double d : polygon) {

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

}

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

p.closePath();

return p.contains(point);

}

/**

* 判斷點是否在多邊形內(nèi),如果點位于多邊形的頂點或邊上,也算做點在多邊形內(nèi),直接返回true

* @param point 檢測點

* @param pts 多邊形的頂點

* @return 點在多邊形內(nèi)返回true,否則返回false

*/

public static boolean IsPtInPoly(Point2D.Double point, List pts){

int N = pts.size();

boolean boundOrVertex = true; //如果點位于多邊形的頂點或邊上,也算做點在多邊形內(nèi),直接返回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){//偶數(shù)在多邊形外

return false;

} else { //奇數(shù)在多邊形內(nèi)

return true;

}

}

}

總結(jié)

以上是生活随笔為你收集整理的java判断地图范围_百度地图java 判断当前位置是否在多边形区域内的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。