2009-09-12 39 views
16

Cách tốt nhất để có được vị trí địa lý trong Java (tự do nếu có thể) là gì?Cách tốt nhất để có được vị trí địa lý trong Java

Cập nhật: Không phải từ thiết bị GPS. Về cơ bản cách Firefox 3.5/HTML 5 hoạt động như thế nào

+0

Chính xác những gì bạn có nghĩa là gì? Bạn có muốn truy xuất tọa độ từ thiết bị GPS hoặc tìm vị trí dựa trên địa chỉ IP hoặc tra cứu tọa độ của một số đích nhất định trong cơ sở dữ liệu hay cái gì khác không? – Wolfgang

+0

Đây có phải là ứng dụng dành cho máy tính để bàn cần thực hiện ngoại tuyến không? Hoặc là các dịch vụ web OK để sử dụng? –

+0

dịch vụ web là tốt – yxk

Trả lời

6

Cơ sở dữ liệu lớn nhất của WiFi-to-location có lẽ là SkyHook Wireless, được Apple và Google sử dụng cho vị trí địa lý của chúng. Có sẵn các SDK - xem http://skyhookwireless.com/developers/.

+0

Dường như là cho C++, có phiên bản Java không? – yxk

+0

Nếu bạn muốn sử dụng điều đó, bạn có thể sử dụng JNI để gọi mã C++ gốc, tuy nhiên điều đó có thể sẽ làm giảm khả năng đa nền tảng của ứng dụng Java của bạn. –

+3

Những ngày này nên sử dụng JNA thay vì JNI –

2

Nếu bạn cần một cơ sở dữ liệu cục bộ, bạn có thể xem những gì IPInfoDB cung cấp.

Nếu bạn có thể sử dụng dịch vụ web, có một số ngoài đó, nhưng tôi không chắc chắn Điều khoản dịch vụ của họ cho phép. A Google search for "ip geolocation lookup web service" sẽ bật lên một số nội dung, nhưng nhiều trong số đó là các sản phẩm thương mại và bạn sẽ phải đọc kỹ ToS của chúng để đảm bảo bạn sử dụng chúng trong các nguyên tắc.

+0

"Hơn 99,5% ở cấp quốc gia và khoảng 80% ở cấp thành phố cho Hoa Kỳ trong bán kính 25 dặm. Cơ sở dữ liệu được sử dụng cho API này được biên dịch từ cơ sở dữ liệu Maxmind CSV miễn phí (Geolite City) và sắp xếp lại với nhiều kịch bản. " Hm, dường như có được thành phố phù hợp, bản đồ của Google thực hiện nó khá chính xác, chỉ mất khoảng một dặm hoặc lâu hơn. – yxk

+0

Tất nhiên, bạn sẽ cần cập nhật định kỳ các tệp CSV hoặc SQL của bạn bằng IPInfoDB. Nhưng đó là tất cả về sự cân bằng. Cập nhật thủ công cơ sở dữ liệu IP so với việc có thể búa nó với các truy vấn. –

1

Nếu bạn muốn biết làm thế nào Firefox 3.5 (hoặc Google Chrome) nhận được định vị, sau đó xin hãy xem ở đây: How Google/Firefox Geolocation API works

Về cơ bản, những gì Firefox 3.5 (cũng như Chrome) làm là để có được danh sách của các mạng Wi-Fi lân cận và gửi danh sách đó bằng cách sử dụng JSON đến một dịch vụ web của Google, sau đó sẽ trả về các tọa độ gần đúng.

Nhân tiện, không có Java tham gia vào quá trình này. Để có được vị trí địa lý từ Firefox/Chrome, bạn chỉ cần gọi một vài phương thức JavaScript. (Tôi thực sự hy vọng rằng bạn biết rằng Java khác với JavaScript)

+0

Liên kết được thêm vào trong câu trả lời này đã chết ngay bây giờ – SpringLearner

+0

@SpringLearner: Cảm ơn! Tôi thực sự nên đưa blog của mình trở lại trực tuyến. Trong khi đó, tôi cập nhật liên kết đến Wayback Machine. –

+0

Hey @ DenilsonSáMaia Tôi muốn chính xác cùng một giải pháp bằng cách sử dụng phương pháp java trong đó có ip là đối số. Bạn có thể cung cấp một số con trỏ? Nếu bạn có thể cung cấp việc triển khai javascript, điều đó cũng sẽ giúp ích. –

1

Nếu tôi hiểu đủ rõ, bạn muốn có được vị trí địa lý của khách truy cập vào trang web hoặc ứng dụng web của bạn. Các phương án mà tôi biết là:

Google Gears có một số chức năng để làm cho định vị (http://code.google.com/apis/gears/api_geolocation.html), nhưng cần phải cài đặt Gears

Sử dụng chức năng JavaScript mà gọi một dịch vụ trực tuyến như IP Location Tools (www chấm iplocationtools dot com). Trang web có các ví dụ và thậm chí có video hướng dẫn.

+0

Hey @Mig Liên kết này dường như đã chết. Bất kỳ con trỏ nào khác có cùng giải pháp giống nhau? –

4

Thư viện mã nguồn mở tốt nhất cho Định vị trong Java tại là http://geo-google.sourceforge.net/index.html, dựa trên google maps API (bạn chỉ cần một chìa khóa bản đồ google API để sử dụng nó)

+0

Rất tiếc, không có hỗ trợ GeoLocation tại đây. Chỉ mã hóa địa lý. – Reno

15

Cách dễ dàng là với GeoLite (http://dev.maxmind.com/geoip/legacy/geolite/). Bởi vì nó sử dụng một cơ sở dữ liệu cục bộ, không cần các cuộc gọi dịch vụ web và việc mã hóa địa lý các số IP lớn sẽ nhanh hơn nhiều.

Sau đây là cách:

Thêm vật Maven này:

<dependency> 
    <groupId>com.maxmind.geoip</groupId> 
    <artifactId>geoip-api</artifactId> 
    <version>1.2.11</version> 
</dependency> 

Tải tập tin dữ liệu định vị từ http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz

Giải nén tập tin vào bất kỳ thư mục.Sau đó, hãy thực hiện:

LookupService cl = new LookupService("/var/geolite/GeoLiteCity.dat", 
        LookupService.GEOIP_MEMORY_CACHE | LookupService.GEOIP_CHECK_CACHE); 

Location location = cl.getLocation("some ip address"); 

Kết quả sẽ nằm trong đối tượng Vị trí ở vĩ độ, kinh độ, thành phố, vùng và quốc gia Thuộc tính cột.

Vui lòng xem ước tính độ chính xác của chúng để đảm bảo ước tính đáp ứng nhu cầu của dự án của bạn: http://www.maxmind.com/en/geolite_city_accuracy.

0

Bạn nói rằng bạn đã đồng ý với các dịch vụ web, vì vậy bạn có thể sử dụng API http://ipinfo.io của mình. Dưới đây là ví dụ về đầu ra JSON cho địa chỉ IP:

$ curl ipinfo.io 
{ 
    "ip": "24.6.61.239", 
    "hostname": "c-24-6-61-239.hsd1.ca.comcast.net", 
    "city": "Mountain View", 
    "region": "California", 
    "country": "US", 
    "loc": "37.3845,-122.0881", 
    "org": "AS7922 Comcast Cable Communications, LLC", 
    "postal": "94040" 
} 

Xem https://ipinfo.io/developers để biết thêm chi tiết.

0

Dưới đây là ví dụ dựa trên API https://ipdata.co miễn phí tối đa 1500 yêu cầu/ngày.

Thay 8.8.8.8 với ip bạn muốn để tra cứu

// Maven : Add these dependecies to your pom.xml (java6+) 
// <dependency> 
//  <groupId>org.glassfish.jersey.core</groupId> 
//  <artifactId>jersey-client</artifactId> 
//  <version>2.8</version> 
// </dependency> 
// <dependency> 
//  <groupId>org.glassfish.jersey.media</groupId> 
//  <artifactId>jersey-media-json-jackson</artifactId> 
//  <version>2.8</version> 
// </dependency> 

import javax.ws.rs.client.Client; 
import javax.ws.rs.client.ClientBuilder; 
import javax.ws.rs.client.Entity; 
import javax.ws.rs.core.Response; 
import javax.ws.rs.core.MediaType; 

Client client = ClientBuilder.newClient(); 
Response response = client.target("https://api.ipdata.co/8.8.8.8") 
    .request(MediaType.TEXT_PLAIN_TYPE) 
    .header("Accept", "application/json") 
    .get(); 

System.out.println("status: " + response.getStatus()); 
System.out.println("headers: " + response.getHeaders()); 
System.out.println("body:" + response.readEntity(String.class)); 
Các vấn đề liên quan