2011-01-24 75 views
6

Tôi có một "xã hội" ứng dụng nhận thức địa lý Tôi đang phát triển, và câu hỏi triệu đô la là làm thế nào để tôi liệt kê một loạt các mặt hàng được "trong X dặm" ​​của "vị trí của tôi" kể từ khi có hàng triệu ứng dụng làm điều đó, tôi đã rất ngạc nhiên khi thấy rằng chỉ API Google Maps có dịch vụ web miễn phí cho điều đó và tệ hơn, nó chỉ được hỗ trợ nếu được sử dụng trong Google Map. Vậy tôi có phải phát triển máy tính khoảng cách của mình không? là có bất kỳ dịch vụ miễn phí/trả tiền mà sẽ cho phép tôi ít nhất biến đổi một địa chỉ đến một tọa độ XY?Cách tìm khoảng cách giữa hai địa chỉ? (Phía máy chủ Java)

Tôi chắc rằng có là một giải pháp tiêu chuẩn công nghiệp (miễn phí hoặc thương mại) nhưng tôi chưa thấy nó

Trả lời

4

Thực tế, Google có web services bạn có thể sử dụng phía máy chủ để đạt được điều này.

Trước tiên, bạn sẽ muốn sử dụng Geocoding API để dịch địa chỉ sang các cặp tọa độ vĩ độ/kinh độ. Sau đó, bạn có thể sử dụng những thứ đó tuy nhiên bạn thấy phù hợp (ví dụ với cơ sở dữ liệu của riêng bạn nếu bạn lưu trữ chúng)

Nếu các mục gần đó bạn muốn tìm là những địa điểm thực tế trên thế giới mà Google có thể đã biết, bạn có thể thử Google mới Places API có thể cung cấp cho bạn kết quả trong một bán kính nhất định. Bạn cần lưu ý rằng bản dịch từ vĩ độ/kinh độ đến khoảng cách đòi hỏi một số toán, nhưng tôi nghĩ nó được thực hiện tốt nhất cục bộ (trên máy chủ mà ứng dụng của bạn đang chạy) thay vì được nuôi ra một số máy chủ bên ngoài kể từ khi chỉ chỉ có toán học. Googling đã sản xuất this.

4

nếu bạn đang sử dụng SQL (bạn không nói) ... Tôi nghĩ rằng tôi sao chép này từ dự án NerdDinner:

ALTER FUNCTION [dbo].[DistanceBetween] (@Lat1 as real, 
       @Long1 as real, @Lat2 as real, @Long2 as real) 
RETURNS real 
AS 
BEGIN 

DECLARE @dLat1InRad as float(53); 
SET @dLat1InRad = @Lat1 * (PI()/180.0); 
DECLARE @dLong1InRad as float(53); 
SET @dLong1InRad = @Long1 * (PI()/180.0); 
DECLARE @dLat2InRad as float(53); 
SET @dLat2InRad = @Lat2 * (PI()/180.0); 
DECLARE @dLong2InRad as float(53); 
SET @dLong2InRad = @Long2 * (PI()/180.0); 

DECLARE @dLongitude as float(53); 
SET @dLongitude = @dLong2InRad - @dLong1InRad; 
DECLARE @dLatitude as float(53); 
SET @dLatitude = @dLat2InRad - @dLat1InRad; 
/* Intermediate result a. */ 
DECLARE @a as float(53); 
SET @a = SQUARE (SIN (@dLatitude/2.0)) + COS (@dLat1InRad) 
       * COS (@dLat2InRad) 
       * SQUARE(SIN (@dLongitude/2.0)); 
/* Intermediate result c (great circle distance in Radians). */ 
DECLARE @c as real; 
SET @c = 2.0 * ATN2 (SQRT (@a), SQRT (1.0 - @a)); 
DECLARE @kEarthRadius as real; 
/* SET kEarthRadius = 3956.0 miles */ 
SET @kEarthRadius = 6376.5;  /* kms */ 

DECLARE @dDistance as real; 
SET @dDistance = @kEarthRadius * @c; 
return (@dDistance); 
END 


ALTER FUNCTION [dbo].[NearestPeople] 
    (
    @lat real, 
    @long real, 
    @maxdist real 
    ) 
RETURNS TABLE 
AS 
    RETURN 
    SELECT  Person.ID 
    FROM  Person 
    WHERE dbo.DistanceBetween(@lat, @long, Latitude, Longitude) < @maxdist 

sau đó tôi sử dụng các chức năng SQL từ máy chủ như thế này trong C#:

public IQueryable<Person> FindNearbyPeople(float latitude, float longitude, float maxdistance) 
{ 
    var people = from person in FindAllPeople() 
       join i in db.NearestPeople(latitude, longitude, maxdistance) 
       on person.ID equals i.ID 
       select person; 

    return people; 
} 

mà nói với tôi người (trong trường hợp này, người) gần tôi trong một khoảng cách tối đa.

đây là phiên bản miễn phí. Tôi nghĩ rằng SQL Server 2008 có thể thực hiện điều này với gói Địa lý

4

Nếu bạn may mắn và bạn đang sử dụng mysql hoặc postgresql mà cả hai đều là cơ sở dữ liệu không gian, bạn có thể thực hiện truy vấn không gian đối với chúng.Đối với mysql có spatial extensions và đối với postgresql có postgis.
Nếu bạn quyết định sử dụng, vui lòng xem tại đây question để đăng ký. Ngoài ra tôi không hiểu cách api của địa điểm google có thể giúp bạn vì bạn đang tìm kiếm dữ liệu của bạn trong bán kính chứ không phải địa điểm google. Chúc mừng

3
  1. Bạn có muốn khoảng cách "As The Crow Flies" (đường thẳng) hoặc khoảng cách lái xe/thời gian lái xe không?

  2. API của Mapquest có vẻ dễ dàng hơn vì bạn chỉ có thể sử dụng chuỗi truy vấn.

Một tùy chọn khác là geocoder.us (hoặc .ca nếu Canada)

Các vấn đề liên quan