地圖演算法(一):判斷當前點是不是在該線上
判斷當前點是不是在該線上,適用於線路計算
//地圖演算法(一):判斷當前點是不是在該線上
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;
}
}
相關文章
- 如何判斷一個點在地圖上?如何判斷一個點在多邊形內?地圖
- 判斷當前瀏覽器是不是微信瀏覽器瀏覽器
- JS在瀏覽器中判斷當前網路狀態JS瀏覽器
- 在 Web 中判斷頁面是不是重新整理Web
- js 怎樣判斷使用者是否在瀏覽當前頁面JS
- JS判斷當前裝置是 PC IOS AndriodJSiOS
- 判斷Android 當前版本是否為debug版本Android
- vue透過自定義指令判斷當前元素是否在可視區域Vue
- 如何快速判斷是不是閉包
- Android判斷當前裝置是否設定了代理Android
- Qt 判斷滑鼠在某一控制元件上QT控制元件
- 判斷客戶端是iOS還是Android,判斷是不是在微信瀏覽器開啟客戶端iOSAndroid瀏覽器
- chinesecalendar:判斷日期是不是工作日
- JavaScript判斷當前裝置和瀏覽器型別JavaScript瀏覽器型別
- JS 射線法 判斷點是否在多邊形內部JS斷點
- ArcGIS API for JavaScript根據兩個點座標在地圖上畫線APIJavaScript地圖
- 百度地圖電子圍欄判斷地圖
- canvas判斷點是否在路徑內Canvas斷點
- Laravel-Echo 線上離線檢測判斷Laravel
- php判斷變數是不是null的方法PHP變數Null
- 判斷base64中是不是隻包含一種顏色
- 直播平臺軟體開發,判斷當前時間是否在規定時間內
- 如何判斷深度學習推理是不是真的跑在顯示卡上了深度學習
- 在點雲上計算兩點之間的測地線
- 判斷難點
- 帝國CMS利用PHP判斷當前頁面是否為首頁PHP
- 百度地圖開發-在地圖上實現路線導航 09地圖
- 判斷一個字串/整數是不是迴文 2020-11-10字串
- 斷點(上線版) - 阿韋斷點
- 用程式碼判斷當前系統是否支援某個版本的feature
- 演算法學習記錄02-判斷輸入數字是不是質數演算法
- “當前不會命中斷點 還沒有為該文件載入任何符號”解決方法斷點符號
- 【解決方案】當前不會命中斷點,還沒有為該文件載入任何符號斷點符號
- 判斷一個數是不是質數(素數),3種方式介紹
- JZ79 判斷是不是平衡二叉樹二叉樹
- 如何判斷Linux系統安裝在VMware上?Linux
- 而井教你判斷當前Javascript執行環境是否支援async函式JavaScript函式
- 如何通過Java程式碼判斷當前的環境是否支援JRE 9Java
- Java程式設計:通過獲取當前時間,判斷今天星期幾Java程式設計