5

Ok. Bạn nghĩ rằng điều này sẽ tương đối đơn giản, nhưng không.osmdroid, API Maps v2 và các đoạn mã

Tôi đang sử dụng bản đồ đường phố mở trên trang web của mình, vì dữ liệu miễn phí để sử dụng, chỉnh sửa và cập nhật - dự án của tôi tuân theo câu thần chú này và cùng với các hạn chế sử dụng API/tiết kiệm hạn chế dữ liệu, bản đồ google đơn giản là không phù hợp cho tôi .. ít nhất là trên web.

Với điều này tôi nghĩ rằng tôi muốn làm theo phù hợp với ứng dụng Android của tôi, và vì vậy tôi thiết lập osmdroid sử dụng dữ liệu bản đồ đường phố mở.

Tôi có thể có một bản đồ đẹp trong hoạt động của mình .. Tôi cũng đã làm theo hướng dẫn và dường như nó hoạt động ít nhất sao cho tôi có thể xem bản đồ trong một đoạn trong tabhost/viewpager. Những gì tôi thực sự muốn tuy nhiên (cho máy tính bảng), là một danh sách các cơ sở trong một mảnh bên trái, và một mảnh bản đồ bên phải cho thấy nơi các cơ sở này.

đủ đơn giản tôi sẽ phải suy nghĩ, nhưng giờ và giờ nghiên cứu đề nghị này là không thể, trừ khi bạn sử dụng một số mã phức tạp và một số phương pháp phản ..

Vì vậy .. đoạn (có chứa một cái nhìn bản đồ) tải và chạy hoàn hảo trong một tabhost .. tôi có thể truy cập các phương thức trong đoạn từ hoạt động của tôi, vv .. nhưng không có gì để chỉ đơn giản là có hai mảnh bên cạnh nhau.

Bây giờ .. Tôi biết google vừa mới ra mắt với API v2 của mình .. Tôi đã cài đặt và đã phát .. không thực sự biết cách hoạt động của osmdroid, tôi nghĩ tôi có thể cập nhật để tôi có MapFragment thay vì SherlockFragment (I sử dụng ABS) .. điều này sau đó chỉ cần ném lên các lỗi logcat yêu cầu cho các khóa API vv .. và cho rằng tôi không muốn sử dụng dữ liệu bản đồ google, tôi giả định rằng tôi đã đi sai. Vì vậy, bất cứ ai cũng có thể tư vấn về cách tôi có thể có được một mảnh danh sách, và một mảnh bản đồ cạnh nhau bằng cách sử dụng bất cứ thứ gì có sẵn trên thị trường, nhưng tốt hơn là sử dụng dữ liệu bản đồ nguồn mở sao cho chúng không bị hạn chế sử dụng.

Tôi chắc chắn tổng quan tổng thể về "những gì có sẵn và cách hoạt động" sẽ được rất nhiều người dùng đánh giá cao .. vì vậy nếu có ai đó có thể tư vấn thì điều đó thật tuyệt vời!

+0

Không có hại trong nhận được một khóa API nếu bạn không sử dụng dữ liệu của họ Kiểm tra outflow này http://stackoverflow.com/questions/13695393/open-street-maps-with-android-google-maps-api-v2 – qubz

+0

Nó có vẻ giống như con đường để đi, nhưng im tìm kiếm một lời giải thích sâu hơn ví dụ như làm thế nào tôi sẽ thực hiện một bản đồ với gạch mã nguồn mở ở dạng đơn giản nhất của nó? và như đã đề cập trong câu hỏi đó - làm hạn chế sử dụng api vẫn áp dụng. Về cơ bản tôi muốn một giải thích dept hơn bằng cách sử dụng câu hỏi đó như là một cơ sở .. Chúc mừng. –

+0

Vì đó là những ngày đầu với API mới này, rất khó có hướng dẫn/ví dụ/hướng dẫn được viết về tích hợp osm/osmdroid với nó. Điều này có thể sẽ thay đổi theo thời gian. – qubz

Trả lời

11

Trước khi API Google Maps mới xuất hiện, tôi đã bị buộc phải sử dụng OSMDroid cho mục đích của mình. Tuy nhiên, sau khi phải đào sâu nguồn nhiều lần để tìm ra lý do tại sao nó đã làm những gì nó (thường là không chính xác), tôi đã chết vì một thư viện mới.

May mắn thay, API Google Maps mới phù hợp với hóa đơn. Bạn có thể sử dụng API Google Maps phiên bản 2 trong ứng dụng của mình và không bao giờ phải sử dụng các sơ đồ cơ sở của Google, nhưng có, thật không may là trước tiên bạn phải nhận được khóa API.

Tôi giả sử bạn muốn sử dụng OpenStreetMap làm nguồn bản đồ trực tuyến, vì vậy mã bên dưới sẽ được điều chỉnh theo hướng đó.

GoogleMap map = <get-map-instance>; 

map.setMapType(GoogleMap.MAP_TYPE_NONE); 

TileOverlayOptions options = new TileOverlayOptions(); 

options.tileProvider(new UrlTileProvider(256, 256) { 
    @Override 
    public URL getTileUrl(int x, int y, int z) { 
     try { 
      String f = "http://tile.openstreetmap.org/%d/%d/%d.png"; 
      return new URL(String.format(f, z, x, y)); 
     } 
     catch (MalformedURLException e) { 
      return null; 
     } 
    } 
}); 

map.addTileOverlay(options); 

Bạn có thể tìm thấy một phiên bản hợp thức hơn của mã này trong Google Maps của tôi API v2 add-ons thư viện here.

Ngoài ra, nếu bạn đang nhắm mục tiêu các phiên bản Android phân đoạn trước, tôi tin rằng bạn dựa trên bạn bằng ABS, thay vì sử dụng MapFragment, hãy đảm bảo bạn sử dụng SupportMapFragment.

+0

Vì vậy, nó đưa tôi 4 giờ chơi - nhưng điều này hoạt động :) Chỉ có điều sai là addTileProvider nên được addTileOverlay .. Có thể bạn có thể xây dựng trên osmdroid quyết định/vấn đề của bạn? Ngoài ra - Tôi có lớp phủ OSM, nhưng biểu trưng của Google vẫn được hiển thị ở góc. Bạn có xảy ra để biết những gì được yêu cầu về phân bổ cho OSM/cho rằng tôi vẫn đang sử dụng 'bản đồ google'. Hơn nữa tôi sẽ đoán rằng tôi vẫn bị ràng buộc bởi mũ sử dụng của họ? phủ nhận một trong những lợi ích chính của OSM Bất kể, rất nhiều đánh giá cao - cảm ơn rất nhiều !! –

+1

Biểu trưng của Google theo ý kiến ​​của tôi là một lỗi và tôi đã gửi một vấn đề ở đây: http://code.google.com/p/gmaps-api-issues/issues/detail?id=4648. Về mặt lý do tại sao không phải OSMDroid, về cơ bản nó bị lu mờ xuống hiệu suất, lỗi và thiếu tài liệu. Nếu bạn muốn biết lý do tại sao mình, hãy tìm hiểu về nguồn và xem bạn có bao nhiêu no-op mà bạn tìm thấy bằng // nhận xét TODO trong đó. ;) – cocoahero

+1

Cũng đã xử lý các vấn đề với OSMdroid và đang xem xét việc sử dụng này. Làm thế nào điều này đã được làm việc ngay bây giờ mà bạn đã có một thời gian? – Patrick

3

Sample Code được phân phối với Google Maps Android API v2 chứa lớp com.example.mapdemo.TileOverlayDemoActivity. Tôi ít cập nhật cho lớp này sẽ hiển thị gạch OpenStreetMap trong khuôn khổ v2 mới. Mát mẻ! Không cần sử dụng osmdroid hoặc sherlock-fragments nữa. Tuy nhiên...gạch không được cache :(

Dù sao, tất cả các bổ sung/cập nhật đến lớp TileOverlayDemoActivity được hiển thị dưới đây:.

private static final String OPEN_STREET_MAP_URL_FORMAT = 
     "http://tile.openstreetmap.org/%d/%d/%d.png"; 

private void setUpMap() { 
    mMap.setMapType(GoogleMap.MAP_TYPE_NONE); 
    mMap.setMyLocationEnabled(true); 

    TileProvider tileProvider = new UrlTileProvider(256, 256) { 
     @Override 
     public synchronized URL getTileUrl(int x, int y, int zoom) { 
      String s = String.format(Locale.US, OPEN_STREET_MAP_URL_FORMAT, zoom, x, y); 
      URL url = null; 
      try { 
       url = new URL(s); 
      } catch (MalformedURLException e) { 
       throw new AssertionError(e); 
      } 
      return url; 
     } 
    }; 

    mMap.addTileOverlay(new TileOverlayOptions().tileProvider(tileProvider)); 
} 
Các vấn đề liên quan