0

私はかなり単純な仕事をしています。推薦をお願いしたいと思います。私を助けることができるJavaライブラリがあることを願っています。

説明

与えられた

  1. 経度、緯度、方位角、最大および最小距離を含む GSM セル。これらのパラメーターの助けを借りて、セクター (円の一部) を記述することができます
  2. オブジェクトの経度、緯度、および半径。

意味

各 GSM セルは複数のセクターで構成されています (それらは 1 点から始まります)。各オブジェクトは円 (経度、緯度、半径) として表されます。サークルはできます

  1. 1つのセクターに触れる
  2. 1セクターを傍受
  3. 特定の GSM セルのいくつかのセクターを傍受する

タスク: GSM セルのリストとオブジェクトを取得します。いくつかのセクターを持つオブジェクトのすべての反復/タッチを見つける必要があります。切片の二乗による切片の結果リストで注文する必要があります。

典型的な数学/幾何学のタスクのように見えます。私を助けることができるJavaのライブラリはありますか?

4

2 に答える 2

0

だからここに私の解決策があります。2D 投影の「中心」は相対的であるべきだと判断しました。それは私たちの仕事に合っています。いくつかのコード サンプルを次に示します。

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);
    }

}

以下は、Geometry フィギュアのビルダーです。

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 ファイルに描画しました。大丈夫です。

于 2013-02-07T12:55:45.177 に答える
0

1) すべての緯度、緯度座標をメートル単位のデカルト x、y に変換します。(単純な EuqiDistant Projection を使用できます) こちらまたは wiki、google で検索してください

2) すべてが x,y 座標に入ったら、それは学校の数学です:
点は円の中にありますか? : 点と円の中心の間の距離 <
円セグメントの半径点? ポイントは円の内側にあり、ポイントから中心点までの角度は扇形の方位角の範囲内です。

を使用して、point1 から point2 までの角度を計算します。

angleRad = atan2(dy/dx);

ここで、dy = p2.y - p1.y
dx アナログ

于 2013-02-04T12:42:03.630 に答える