地圖演算法(一):判斷當前點是不是在該線上
判斷當前點是不是在該線上,適用於線路計算
//地圖演算法(一):判斷當前點是不是在該線上
public class LineAreaJudgeV2 {
//線區域判斷
private List<Double[]> lineLs = new ArrayList();
private double width = 0.0D;
//根據點與寬度建立區域
public LineAreaJudgeV2(String points, String width) {
createArea(points);
this.width = Double.parseDouble(width);
}
//建立區域
public void createArea(String points) {
String[] ps = points.split(";");
double dx1 = 0.0D;
double dy1 = 0.0D;
double dx0 = 0.0D;
double dy0 = 0.0D;
for (int i = 1; i < ps.length; i++) {
String[] cord1 = ps[i].split(",");
dx1 = Double.parseDouble(cord1[0]);
dy1 = Double.parseDouble(cord1[1]);
String[] cord0 = ps[(i - 1)].split(",");
dx0 = Double.parseDouble(cord0[0]);
dy0 = Double.parseDouble(cord0[1]);
Double[] line = new Double[4];
line[0] = Double.valueOf(dx0);
line[1] = Double.valueOf(dy0);
line[2] = Double.valueOf(dx1);
line[3] = Double.valueOf(dy1);
this.lineLs.add(line);
}
}
//判斷當前點是不是在該面積
public boolean isInArea(String x, String y) {
for (int i = 0; i < this.lineLs.size(); i++) {
Double[] linePoints = (Double[]) this.lineLs.get(i);
double r = minDistenceOfPoint2Line(linePoints[0].doubleValue(), linePoints[1].doubleValue(),
linePoints[2].doubleValue(), linePoints[3].doubleValue(), Double.parseDouble(x),
Double.parseDouble(y));
if (r <= this.width) {
return true;
}
}
return false;
}
public boolean isInArea(float x, float y) {
return isInArea(x, y);
}
//test
public static void main(String[] args) {
LineAreaJudgeV2 line = new LineAreaJudgeV2("118.126592,30.130026;118.126692,30.130126", "100");
System.out.println(line.isInArea("118.126592", "30.130026"));
}
public static double minDistenceOfPoint2Line(double x1, double y1, double x2, double y2, double x0, double y0) {
double space = 0.0D;
double a = computeLength(x1, y1, x2, y2);
double b = computeLength(x1, y1, x0, y0);
double c = computeLength(x2, y2, x0, y0);
if ((c <= 1.0E-006D) || (b <= 1.0E-006D)) {
space = 0.0D;
return space;
}
if (a <= 1.0E-006D) {
space = b;
return space;
}
if (c * c >= a * a + b * b) {
space = b;
return space;
}
if (b * b >= a * a + c * c) {
space = c;
return space;
}
double p = (a + b + c) / 2.0D;
double s = Math.sqrt(p * (p - a) * (p - b) * (p - c));
space = 2.0D * s / a;
return space;
}
public static double computeLength(double dwStartX, double dwStartY, double dwEndX, double dwEndY) {
double PI = 3.1415926535898D;
double latRadians1 = dwStartY * (PI / 180.0D);
double latRadians2 = dwEndY * (PI / 180.0D);
double latRadians = latRadians1 - latRadians2;
double lngRadians = dwStartX * (PI / 180.0D) - dwEndX * (PI / 180.0D);
double f = 2.0D * Math.asin(Math.sqrt(Math.pow(Math.sin(latRadians / 2.0D), 2.0D)
+ Math.cos(latRadians1) * Math.cos(latRadians2) * Math.pow(Math.sin(lngRadians / 2.0D), 2.0D)));
return f * 6378137.0D;
}
}
相關文章
- 地圖演算法(二):判斷當前點是不是在該多邊形上地圖演算法
- 如何判斷一個點在地圖上?如何判斷一個點在多邊形內?地圖
- 地圖 判斷點在區域內地圖斷點
- 判斷當前瀏覽器是不是微信瀏覽器瀏覽器
- javascript判斷當前瀏覽器是不是微信瀏覽器JavaScript瀏覽器
- JS在瀏覽器中判斷當前網路狀態JS瀏覽器
- Android 判斷當前系統語言Android
- 舒服的判斷當前應用是否處於前臺
- 在 Web 中判斷頁面是不是重新整理Web
- js 怎樣判斷使用者是否在瀏覽當前頁面JS
- JS判斷當前裝置是 PC IOS AndriodJSiOS
- jQuery判斷當前元素是第幾個元素jQuery
- android判斷當前系統的語言Android
- javascript如何判斷一個物件是不是陣列JavaScript物件陣列
- vue透過自定義指令判斷當前元素是否在可視區域Vue
- javascript如何判斷當前瀏覽器是否支援cookieJavaScript瀏覽器Cookie
- Android判斷當前棧頂Activity的包名Android
- Python判斷當前使用者是否是rootPython
- 如何判斷深度學習推理是不是真的跑在顯示卡上了深度學習
- 在Linux下判斷系統當前是否開啟了超執行緒Linux執行緒
- 判斷客戶端是iOS還是Android,判斷是不是在微信瀏覽器開啟客戶端iOSAndroid瀏覽器
- JavaScript判斷當前裝置和瀏覽器型別JavaScript瀏覽器型別
- 判斷Android 當前版本是否為debug版本Android
- Android判斷當前裝置是否設定了代理Android
- 如何判斷當前瀏覽器是否支援html5瀏覽器HTML
- Android 判斷當前的介面是否是桌面的方法Android
- 判斷當前viewcontroller是否是某個特定類ViewController
- chinesecalendar:判斷日期是不是工作日
- Java判斷一個正整數是不是2的乘方Java
- 百度地圖電子圍欄判斷地圖
- 判斷當前應用程式處於前臺還是後臺 ANDROIDAndroid
- 在AngularJS中使用谷歌地圖把當前位置顯示出來AngularJS谷歌地圖
- canvas判斷點是否在路徑內Canvas斷點
- 判斷點是否在多邊形內斷點
- php判斷變數是不是null的方法PHP變數Null
- 【c語言】判斷一個數是不是2的n次方C語言
- 判斷base64中是不是隻包含一種顏色
- 直播平臺軟體開發,判斷當前時間是否在規定時間內