Anda bisa melakukan lebih buruk daripada melihat GEOGRAPHY
tipe data, misalnya:
CREATE TABLE Places
(
SeqID INT IDENTITY(1,1),
Place NVARCHAR(20),
Location GEOGRAPHY
)
GO
INSERT INTO Places (Place, Location) VALUES ('Coventry', geography::Point(52.4167, -1.55, 4326))
INSERT INTO Places (Place, Location) VALUES ('Sheffield', geography::Point(53.3667, -1.5, 4326))
INSERT INTO Places (Place, Location) VALUES ('Penzance', geography::Point(50.1214, -5.5347, 4326))
INSERT INTO Places (Place, Location) VALUES ('Brentwood', geography::Point(52.6208, 0.3033, 4326))
INSERT INTO Places (Place, Location) VALUES ('Inverness', geography::Point(57.4760, -4.2254, 4326))
GO
SELECT p1.Place, p2.place, p1.location.STDistance(p2.location) / 1000 AS DistanceInKilometres
FROM Places p1
CROSS JOIN Places p2
GO
SELECT p1.Place, p2.place, p1.location.STDistance(p2.location) / 1000 AS DistanceInKilometres
FROM Places p1
INNER JOIN Places p2 ON p1.SeqID > p2.SeqID
GO
geography::Point
mengambil garis lintang dan bujur serta SRID (Nomor ID Referensi Khusus). Dalam hal ini, SRID adalah 4326 yang merupakan standar lintang dan bujur. Karena Anda sudah memiliki garis lintang dan garis bujur, Anda cukup ALTER TABLE
untuk menambahkan kolom geografi lalu UPDATE
untuk mengisinya.
Saya telah menunjukkan dua cara untuk mengeluarkan data dari tabel, namun Anda tidak dapat membuat tampilan yang diindeks dengan ini (tampilan yang diindeks tidak dapat bergabung sendiri). Anda dapat membuat tabel sekunder yang secara efektif merupakan cache, yang diisi berdasarkan hal di atas. Anda kemudian hanya perlu khawatir tentang mempertahankannya (bisa dilakukan melalui pemicu atau proses lainnya).
Perhatikan bahwa gabungan silang akan memberi Anda 250.000,000,000 baris, tetapi pencarian sederhana karena Anda hanya perlu melihat salah satu kolom tempat (yaitu, SELECT * FROM table WHERE Place1 = 'Sheffield' AND distance < 100
, yang kedua akan memberi Anda lebih sedikit baris, tetapi kueri kemudian perlu mempertimbangkan kolom Place1 dan Place2).