package transform;
public class GisCheckUtils {
private static final Logger log = new Logger();
/**
* 地球周长
*/
private static final double L = 6381372 * Math.PI * 2;
/**
* 平面展开后,x轴等于周长
*/
private static final double W = L;
/**
* y轴约等于周长一半
*/
private static final double H = L / 2;
/**
* 米勒投影中的一个常数,范围大约在正负2.3之间
*/
private static final double mill = 2.3;
public static void main(String[] args) {
/* 拾取坐标系统 可直接复制坐标测试
http://api.map.baidu.com/lbsapi/getpoint/index.html
*/
//线段一
SegmentLatLon segmentLatLonOne = new SegmentLatLon();
segmentLatLonOne.setStartLatLon(new LatLon(104.514, 30.7787));
segmentLatLonOne.setEndLatLon(new LatLon(104.53, 30.7776));
//线段二
SegmentLatLon segmentLatLonTwo = new SegmentLatLon();
segmentLatLonTwo.setStartLatLon(new LatLon(104.529, 30.7621));
segmentLatLonTwo.setEndLatLon(new LatLon(104.52412,30.78412));
//判断是否相交(延长线相交不算)
boolean b = segIntersect(segmentLatLonOne, segmentLatLonTwo);
log.info("判断是否相交: " + b);
//交点坐标(延长线相交不算)
LatLon intersectPoint = getIntersectPoint(segmentLatLonOne, segmentLatLonTwo);
log.info("交点坐标:" + intersectPoint);
}
/**
* 将经纬度转换成X和Y轴
* 米勒投影算法
*
* @param lat 纬度
* @param lon 经度
* @return
*/
private static Point latLonToXy(double lat, double lon) {
// 将经度从度数转换为弧度
double x = lon * Math.PI / 180;
// 将纬度从度数转换为弧度
double y = lat * Math.PI / 180;
// 米勒投影的转换
y = 1.25 * Math.log(Math.tan(0.25 * Math.PI + 0.4 * y));
// 弧度转为实际距离
x = (W / 2) + (W / (2 * Math.PI)) * x;
y = (H / 2) - (H / (2 * mill)) * y;
return new Point(x, y);
}
/**
* xy轴转坐标
*
* @param x
* @param y
* @return 坐标点
*/
private static LatLon xyToLatLon(double x, double y) {
//实际距离 转为弧度
x = (x - (W / 2)) / (W / (2 * Math.PI));
y = -1 * (y - (H / 2)) / (H / (2 * mill));
// 米勒投影的转换反转
y = (Math.atan(Math.pow(Math.E, y / 1.25)) - 0.25 * Math.PI) / 0.4;
//将经度从弧度转换为度数
double lon = 180 / Math.PI * x;
//将纬度从弧度转换为度数
double lat = 180 / Math.PI * y;
return new LatLon(lon, lat);
}
/**
* 获取两条直线相交的点
*
* @param segmentLatLonOne 线段一
* @param segmentLatLonTwo 线段二
* @return 相交点坐标 为null 不相交
*/
public static LatLon getIntersectPoint(SegmentLatLon segmentLatLonOne, SegmentLatLon segmentLatLonTwo) {
//先判断有没有相交 (延长线不算) 不相交返回null 相交执行获取交点坐标 (如需获取延长线交点注释此方法)----
if (!segIntersect(segmentLatLonOne, segmentLatLonTwo)) {
return null;
}
//----
//转换对象
Point[] points = segmentLatLonToPoint(segmentLatLonOne, segmentLatLonTwo);
//获取两条直线相交的点
Point latLon = getIntersectPoint(points[0], points[1], points[2], points[3]);
if (latLon != null) {
return xyToLatLon(latLon.x, latLon.y);
}
return null;
}
/**
* 获取两条直线相交的点
*
* @param p1 线段一 开始点
* @param p2 线段一 结束点
* @param p3 线段二 开始点
* @param p4 线段二 结束点
* @return
*/
public static Point getIntersectPoint(Point p1, Point p2, Point p3, Point p4) {
double A1 = p1.getY() - p2.getY();
double B1 = p2.getX() - p1.getX();
double C1 = A1 * p1.getX() + B1 * p1.getY();
double A2 = p3.getY() - p4.getY();
double B2 = p4.getX() - p3.getX();
double C2 = A2 * p3.getX() + B2 * p3.getY();
double det_k = A1 * B2 - A2 * B1;
if (Math.abs(det_k) < 0.00001) {
return null;
}
double a = B2 / det_k;
double b = -1 * B1 / det_k;
double c = -1 * A2 / det_k;
double d = A1 / det_k;
double x = a * C1 + b * C2;
double y = c * C1 + d * C2;
return new Point(x, y);
}
/**
* 验证两条线有没有相交
*
* @param segmentLatLonOne 线段1
* @param segmentLatLonTwo 线段2
* @return true 相交
*/
public static boolean segIntersect(SegmentLatLon segmentLatLonOne, SegmentLatLon segmentLatLonTwo) {
//转换对象
Point[] points = segmentLatLonToPoint(segmentLatLonOne, segmentLatLonTwo);
//验证两条线有没有相交
return segIntersect(points[0], points[1], points[2], points[3]) > 0;
}
/**
* 线段转换为点对象
*
* @param segmentLatLonOne 线段一
* @param segmentLatLonTwo 线段二
* @return 点对象数组
*/
private static Point[] segmentLatLonToPoint(SegmentLatLon segmentLatLonOne, SegmentLatLon segmentLatLonTwo) {
//线段1
Double oneStartLat = segmentLatLonOne.getStartLatLon().getLat();
Double oneStartLon = segmentLatLonOne.getStartLatLon().getLon();
Double oneEndLat = segmentLatLonOne.getEndLatLon().getLat();
Double oneEndLon = segmentLatLonOne.getEndLatLon().getLon();
// 线段2
Double twoStartLat = segmentLatLonTwo.getStartLatLon().getLat();
Double twoStartLon = segmentLatLonTwo.getStartLatLon().getLon();
Double twoEndLat = segmentLatLonTwo.getEndLatLon().getLat();
Double twoEndLon = segmentLatLonTwo.getEndLatLon().getLon();
Point[] points = new Point[4];
//将经纬度转换成X和Y轴
points[0] = latLonToXy(oneStartLat, oneStartLon);
points[1] = latLonToXy(oneEndLat, oneEndLon);
points[2] = latLonToXy(twoStartLat, twoStartLon);
points[3] = latLonToXy(twoEndLat, twoEndLon);
return points;
}
/**
* 验证两条线有没有相交
*
* @param A 线段一 开始点
* @param B 线段一 结束点
* @param C 线段二 开始点
* @param D 线段二 结束点
* @return
*/
public static int segIntersect(Point A, Point B, Point C, Point D) {
Point intersection = new Point();
if (Math.abs(B.getY() - A.getY()) + Math.abs(B.getX() - A.getX()) + Math.abs(D.getY() - C.getY())
+ Math.abs(D.getX() - C.getX()) == 0) {
if ((C.getX() - A.getX()) + (C.getY() - A.getY()) == 0) {
log.info("ABCD是同一个点!");
} else {
log.info("AB是一个点,CD是一个点,且AC不同!");
}
return 0;
}
if (Math.abs(B.getY() - A.getY()) + Math.abs(B.getX() - A.getX()) == 0) {
if ((A.getX() - D.getX()) * (C.getY() - D.getY()) - (A.getY() - D.getY()) * (C.getX() - D.getX()) == 0) {
log.info("A、B是一个点,且在CD线段上!");
} else {
log.info("A、B是一个点,且不在CD线段上!");
}
return 0;
}
if (Math.abs(D.getY() - C.getY()) + Math.abs(D.getX() - C.getX()) == 0) {
if ((D.getX() - B.getX()) * (A.getY() - B.getY()) - (D.getY() - B.getY()) * (A.getX() - B.getX()) == 0) {
log.info("C、D是一个点,且在AB线段上!");
} else {
log.info("C、D是一个点,且不在AB线段上!");
}
return 0;
}
if ((B.getY() - A
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
java基础 编辑器IntelliJ IDEA(1).zip (98个子文件)
java-master
src
thread
TestThread.java 1003B
VolatileCase.java 1KB
LockWithLock.java 2KB
SleepTools.java 226B
CAS.java 1KB
ThreadLocalTest.java 1KB
VolatileTest.java 707B
sort
Sort.java 869B
LinkTable.java 2KB
Test5.java 465B
dataStructure
Queue.java 755B
BinaryTreeNode.java 777B
MainClass.java 2KB
BinaryTree.java 366B
Stack.java 877B
Sample.java 420B
arithmetic
SuanFa_02.java 923B
SuanFa_04.java 373B
SuanFa_01.java 696B
SuanFa_03.java 879B
demo
Test.java 1KB
transform
LatLon.java 719B
SegmentLatLon.java 821B
Logger.java 118B
GisCheckUtils.java 11KB
utils
PrintUtils.java 124B
generic
Generic_02.java 2KB
Generic.java 1KB
Generic_01.java 2KB
Java17.java 419B
Test2.java 1KB
Window.java 285B
commonObj
RegularExpression.java 560B
Test4.java 566B
Main.java 1KB
Test.java 3KB
IO
InputStreamReaderTest.java 539B
CharArrayReaderTest.java 531B
FileInputStreamTest.java 437B
ByteArrayInputStreamTest.java 485B
StringReaderTest.java 453B
ObjectStreamTest.java 860B
FilterInputStreamTest.java 1KB
PipeInputStreamTest.java 2KB
CreateJson.java 4KB
designModel
builder
WuLingCar.java 1KB
CarBuilder.java 337B
Test.java 307B
Car.java 71B
proxy
ShopProxy.java 463B
Shopping.java 125B
Shopper.java 916B
Supermarket.java 255B
DynamicShopProxy.java 2KB
factory
BaseCarFactory.java 124B
MPV_car.java 264B
Consumer.java 193B
CarType.java 97B
CarFactory.java 504B
Test.java 320B
Car.java 269B
CarColor.java 201B
SUV_car.java 263B
singleInstance
Singleton_01.java 487B
Singleton_02.java 469B
Singleton_05.java 289B
Singleton_04.java 440B
Singleton_03.java 574B
Test.java 355B
observer
Observer.java 111B
Teacher.java 607B
Observable.java 267B
Student.java 352B
Test.java 1KB
Test3.java 1KB
SingleInstance.java 423B
流程图
java输出流.png 59KB
java异常.png 70KB
java线程运行机制.png 48KB
文字文稿1
文字文稿1_01.png 96KB
java_writer类层次结构.png 50KB
image_class_loader_2.png 15KB
内部类.png 18KB
java_Reader类层次结构.png 54KB
java线程运行机制流程图.png 49KB
线程通信流程图.png 45KB
image_class_loader.png 9KB
类的变量关系图.png 16KB
java输入流层次结构.png 60KB
java垃圾回收机制.png 23KB
java集合.png 81KB
类的关系图.png 4KB
.idea
uiDesigner.xml 9KB
vcs.xml 180B
misc.xml 271B
modules.xml 248B
.gitignore 47B
java.iml 423B
共 98 条
- 1
资源评论
YOLO数据集工作室
- 粉丝: 437
- 资源: 1570
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功