Rumah >Java >javaTutorial >Bagaimana untuk Mencari Lokasi Terdekat dengan Cekap dalam SQLite Tanpa Fungsi Tersuai?

Bagaimana untuk Mencari Lokasi Terdekat dengan Cekap dalam SQLite Tanpa Fungsi Tersuai?

Linda Hamilton
Linda Hamiltonasal
2024-12-05 17:42:111051semak imbas

How to Efficiently Find the Nearest Locations in SQLite Without Custom Functions?

Mendapatkan Lokasi Terdekat dalam SQLite Menggunakan Formula Haversine

Menyimpan koordinat latitud dan longitud dalam pangkalan data SQLite anda membuka pelbagai kemungkinan untuk berasaskan lokasi aplikasi. Satu tugas biasa ialah mendapatkan semula lokasi terdekat ke titik tertentu berdasarkan formula Haversine. Walaupun MySQL secara asli menyokong ini dengan fungsi tersuai, SQLite memerlukan pendekatan yang lebih terlibat.

Fungsi Luar Tersuai untuk Formula Haversine

SQLite menyokong fungsi luaran tersuai untuk melaksanakan pengiraan lanjutan. Walau bagaimanapun, mencipta dan menyepadukan fungsi ini boleh memperkenalkan kerumitan yang tidak perlu dan overhed prestasi. Selain itu, mengisih hasil mengikut jarak memerlukan penambahan lajur jarak pada pangkalan data, yang kedua-duanya tidak cekap dan tidak praktikal.

Penapisan Cekap dengan Segi Empat Sempadan

Penyelesaian praktikal untuk cabaran ini melibatkan penapisan pangkalan data dengan segi empat tepat terikat. Dengan mengira empat penjuru segi empat tepat berdasarkan titik yang diberikan dan jejari yang dipratentukan, anda boleh menghapuskan kebanyakan data yang tidak berkaitan dan mengurangkan dengan ketara jumlah pemprosesan yang diperlukan. Latitud dan longitud terbitan kemudiannya boleh digunakan untuk membina klausa WHERE untuk pertanyaan SQL:

PointF center = new PointF(x, y);
final double mult = 1.1; // Mult for more reliable results
PointF p1 = calculateDerivedPosition(center, mult * radius, 0);
PointF p2 = calculateDerivedPosition(center, mult * radius, 90);
PointF p3 = calculateDerivedPosition(center, mult * radius, 180);
PointF p4 = calculateDerivedPosition(center, mult * radius, 270);

strWhere =  " WHERE "
        + COL_X + " > " + String.valueOf(p3.x) + " AND "
        + COL_X + " < " + String.valueOf(p1.x) + " AND "
        + COL_Y + " < " + String.valueOf(p2.y) + " AND "
        + COL_Y + " > " + String.valueOf(p4.y);

Mengira Jarak Dalam Keputusan Ditapis

Setelah data ditapis, anda boleh lelaran melalui keputusan dan mengira jarak sebenar menggunakan Haversine formula:

public static boolean pointIsInCircle(PointF pointForCheck, PointF center,
            double radius) {
        if (getDistanceBetweenTwoPoints(pointForCheck, center) <= radius)
            return true;
        else
            return false;
    }

public static double getDistanceBetweenTwoPoints(PointF p1, PointF p2) {
        // Haversine formula for calculating distance in meters
        // ...
    }

Dengan menggabungkan penapisan cekap dengan pengiraan jarak yang tepat, anda boleh mendapatkan semula lokasi terdekat daripada pangkalan data SQLite anda tanpa bergantung pada fungsi luaran tersuai atau lajur jarak berterusan.

Atas ialah kandungan terperinci Bagaimana untuk Mencari Lokasi Terdekat dengan Cekap dalam SQLite Tanpa Fungsi Tersuai?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn