sql >> データベース >  >> RDS >> Mysql

選択したポイントから特定の距離にあるすべてのアドレスを見つけるための最良のアプローチは何ですか

    これをMySQLに実装したとき(基本的に地球とは何か(地球について話していると思います!)である扁球に場所を格納するため)、データベースにできるだけ多くの事前計算された情報を格納しました。したがって、latitudeを格納する行の場合 およびlongitude 、挿入時に次のフィールドも計算します:

    • radiansLongitudeMath.toRadians(longitude)
    • sinRadiansLatitudeMath.sin(Math.toRadians(latitude)
    • cosRadiansLatitudeMath.cos(Math.toRadians(latitude)

    次に、latitudeのX単位内にある場所を検索すると /longitude 問題の、私の準備されたステートメントは次のとおりです:

    from Location l where
        acos(
            sin(:latitude) * sinRadiansLatitude + 
            cos(:latitude) * cosRadiansLatitude * 
            cos(radiansLongitude - :longitude) 
            ) * YYYY < :distance
        and l.latitude>:minimumSearchLatitude
        and l.latitude<:maximumSearchLatitude 
        and l.longitude>:minimumSearchLongitude 
        and l.longitude<:maximumSearchLongitude 
        order by acos(
                    sin(:latitude) * sinRadiansLatitude + 
                    cos(:latitude) * cosRadiansLatitude * 
                    cos(radiansLongitude - :longitude)  
            ) * YYYY asc
    

    YYYY =3965は、マイルまたはYYYYで距離を示します =6367は、km単位の距離に使用できます。

    最後に、maximumSearchLatitudeを使用しました / maximumSearchLongitude / minimumSearchLongitude / maximumSearchLongitude データベースが計算を実行する前に、結果セットからポイントの大部分を除外するためのパラメーター。これが必要な場合と不要な場合があります。これを使用する場合は、検索対象によって異なるため、これらのパラメーターにどの値を選択するかはあなた次第です。

    明らかに、データベース内のインデックスの賢明な適用が必要になります。

    このアプローチを使用する利点は、変更されることはないが毎回必要となる情報が1回だけ計算されるのに対し、radiansLongitudeの値を計算することです。 、sinRadiansLatitudecosRadiansLatitude 検索を実行するたびにすべての行が非常に高速になります。

    もう1つのオプションは、地理空間インデックス を使用することです。 、これは、これらすべてがデータベースによって処理されることを意味します。ただし、Hibernateがそれとどれほどうまく統合されているかはわかりません。

    免責事項:これを見てから長い時間が経ち、私はGISの専門家ではありません!



    1. whereステートメントの日付が変更されると、MySQLEXPLAINの「type」が「range」から「ref」に変更されますか?

    2. java.sql.SQLExceptionの取得:ResultSetを閉じた後の操作は許可されていません

    3. メールアドレスからドメイン名を選択する方法

    4. mysqli_real_escape_stringは、SQLインジェクションやその他のSQL攻撃を回避するのに十分ですか?