GSM小区(经度,纬度),它的扇区和一些物体(经度,纬度)
Posted
技术标签:
【中文标题】GSM小区(经度,纬度),它的扇区和一些物体(经度,纬度)【英文标题】:GSM cell (longitude, latitude), it's sector and some object (with longitude, latitude) 【发布时间】:2013-02-04 06:39:37 【问题描述】:我的任务比较简单,想请教一下。我希望有一个Java库可以帮助我。
说明
给定
-
具有经度、纬度、方位角、最大和最小距离的 GSM 小区。借助这些参数,我可以描述一个扇区(圆圈的一部分)
对象的经度、纬度和半径。
含义
每个 GSM 小区由多个扇区组成(它们从一个点开始)。每个对象都表示为一个圆圈(经度、纬度、半径)。一个圆圈可以
-
触摸一个扇区
截取一个扇区
拦截给定 GSM 小区的多个扇区
任务: 我得到一个 GSM 单元列表和一个对象。我需要找到具有某些扇区的对象的所有迭代/触摸。我需要按拦截平方的拦截结果列表排序。
看起来像典型的数学/几何任务。 Java中有没有可以帮助我的库?
【问题讨论】:
看起来像您想要实现的纯领域相关用例。我不认为,你会得到一个相当免费的库。 可以概括为:用地理坐标找一些扇区的交点,用地理坐标找圆。它看起来不像与域相关的东西。 lat lon 转换为 x,y itbis 简单学校数学后 【参考方案1】:1) 将所有纬度、经度坐标转换为以米为单位的笛卡尔 x,y。 (您可以使用简单的 EuqiDistant 投影)在此处或在 wiki、google 上搜索
2) 一旦都在 x,y 坐标中,那就是学校数学: 点在圈内? : 点到圆心的距离 圆段中的点?点在圆内,从点到中心点的角度在扇形方位角范围内。
使用
计算从 point1 到 point2 的角度angleRad = atan2(dy/dx);
其中 dy = p2.y - p1.y dx 模拟
【讨论】:
【参考方案2】:所以这是我的解决方案。 我们决定二维投影的“中心”应该是相对的。它确实适合我们的任务。 以下是一些代码示例:
public final class GeometryUtil
/**
https://www.cfa.harvard.edu/~dfabricant/huchra/ay145/constants.html
1 Earth Radius = 6.37814x108 cm = 6.37814x10^6 m (Equatorial)
*/
public static final double EARTH_RADIUS_IN_METERS = 6.37814e+6;
private GeometryUtil()
/**
* @param geoPoint is a point of some object you want to translate to Cartesian.
* @param geoPointRelative is a point of relative center.
* We suppose that this relative GeoPoint is a center for the first parameter.
* */
public static Coordinate toCoordinate(GeoPoint geoPoint, GeoPoint geoPointRelative)
return new Coordinate(toX(geoPoint, geoPointRelative.getLongitude()),
toY(geoPoint, geoPointRelative.getLatitude()));
public static double toX(GeoPoint geoPoint, double relativeLongitude)
return EARTH_RADIUS_IN_METERS *
cos(toRadians(geoPoint.getLatitude())) *
toRadians(geoPoint.getLongitude()- relativeLongitude);
public static double toY(GeoPoint geoPoint, double relativeLatitude)
return EARTH_RADIUS_IN_METERS * toRadians(geoPoint.getLatitude() - relativeLatitude);
这是一个几何图形的构建器:
public final class GeometryBuilder
private static final int DIAMETER_MULTIPLIER = 2;
private static final int TURN_LEFT = 90; //We should start to roll to the right from "North"/"Up"/12 o'clock
private GeometryBuilder()
public static Circle buildCirlce(GeoPoint centerOfCircle, GeoPoint relativeCenter, Distance radiusDistance)
GeometricShapeFactory geometricShapeFactory = new GeometricShapeFactory();
geometricShapeFactory.setCentre(GeometryUtil.toCoordinate(centerOfCircle, relativeCenter));
geometricShapeFactory.setSize(radiusDistance.getMeters() * DIAMETER_MULTIPLIER);
return new Circle(geometricShapeFactory.createEllipse());
public static Sector buildGSMCellSector(GSMCellLocation gsmCellLocation, GeoPoint relativeCenter)
GeometricShapeFactory geometricShapeFactory = new GeometricShapeFactory();
geometricShapeFactory.setCentre(GeometryUtil.toCoordinate(gsmCellLocation.getGeoPoint(), relativeCenter));
geometricShapeFactory.setSize(gsmCellLocation.getMidDist() * DIAMETER_MULTIPLIER);
return new Sector(geometricShapeFactory.createArcPolygon(-toRadians(gsmCellLocation.getEndAngle()- TURN_LEFT),
toRadians(gsmCellLocation.getAngleWidth())));
我应该提到 TURN_LEFT 是特定的。我的对象的角度从 12 点开始。几何库从 3 点开始计数。这就是为什么我必须将其转回 3 小时(90 度)。
问题解决了。 我还使用 LiteShape 将一些图像绘制到 PNG 文件中。一切正常。
【讨论】:
以上是关于GSM小区(经度,纬度),它的扇区和一些物体(经度,纬度)的主要内容,如果未能解决你的问题,请参考以下文章