perangkat peta. Mendapatkan tempat terdekat dari server dan mungkin menyimpannya dalam cache (misalnya untuk penggunaan offline)

Saya sedang mengembangkan aplikasi iOS 5 yang ingin saya komunikasikan dengan server yang memberikan informasi tentang tempat terdekat untuk lokasi tertentu: lokasi tempat dan anotasi. Saya ingin menggunakan MapKit untuk mengisi peta saya dengan informasi ini.

Saya tidak menemukan informasi langsung mengenai pertanyaan-pertanyaan berikut:

  1. Apakah MapKit memiliki fungsi ubin (cara Google Maps) yang siap pakai dan apakah saya perlu mengerjakannya tambahan, jika tidak?
  2. Apa praktik terbaik dalam mengambil informasi tempat (posisi penanda dan anotasi) dari server?
  3. Apakah mungkin untuk menyimpan informasi ini dalam cache sehingga pengguna dapat melihat tempat-tempat terdekat di "kotanya" dalam mode offline?

Sebenarnya pertanyaan 2 dan 3 saling terkait: keduanya mengatasi masalah tidak diambilnya informasi (lokasi + anotasi) yang sudah ada di peta beberapa kali.

Mudah-mudahan saya tidak mengabaikan sesuatu yang jelas di sini.

Terima kasih!

Pembaruan 1: (Mengenai tempat, bukan peta) Lebih khusus lagi saya tertarik, bagaimana cara membuat ubin logis "buatan tangan" untuk wilayah yang berisi tempat yang saya ambil dari server, sehingga tidak perlu mengambil ulang sendiri saat pengguna menggulir peta? Saya tahu saya bisa terjun sendiri dalam mengimplementasikan fungsi ini. Misalnya, haruskah saya menulis tempat yang baru saja diambil ke penyimpanan lokal menggunakan Data Inti segera setelah mengambilnya atau mengatur beberapa antrean? Atau bagaimana saya bisa tahu kapan saya perlu melakukan permintaan tentang wilayah tertentu di server dan kapan saya baru saja mengambil data lokal yang sudah ada di perangkat? Saya hanya ingin tahu, apakah ada pendekatan yang direkomendasikan, praktik terbaik? Mudah-mudahan, saya menulisnya dengan jelas di sini.

Pembaruan 2: Saya bertanya-tanya tentang praktik terbaik di sini (tautan, contoh) untuk tidak mulai membuat semua ini (poin 2+3) dari awal. Apakah ada kerangka kerja yang merangkum hal ini atau tutorial yang bagus?


person Stanislav Pankevich    schedule 07.09.2012    source sumber


Jawaban (2)


@Stanislaw - Kami telah menerapkan fungsi yang Anda jelaskan dalam aplikasi bernama PreventConnect untuk salah satu klien kami. Klien sudah menyimpan beberapa data di tabel Google Fusion. Kami memperluas solusi yang ada dengan menambahkan tabel Google Fusion lainnya yang menyimpan geokoordinat untuk sejumlah lokasi. Semua ini dikatakan, untuk menjawab pertanyaan Anda...

1) Bagian petanya sendiri cukup out-of-the-box, baik ubin maupun yang lainnya, namun Anda harus melakukan beberapa pengkodean untuk mendapatkan perluasan zoom, pin drop, anotasi, dan hal-hal seperti itu agar berfungsi sesuai dengan yang Anda harapkan. .

2) Menurut kami solusi Google Fusion cukup efektif. Jika Anda tidak ingin menggunakan Google Fusion, ada penyedia database cloud lain seperti StackMob, database.com, dan masih banyak lainnya. Google gratis dan mereka memiliki SDK iOS yang membuat komunikasi dengan Google Fusion menjadi cukup sederhana.

3) Tentu saja! Kami menyimpan sebagian besar data dalam penyimpanan Data Inti secara lokal di perangkat. Ini sangat meningkatkan kinerja dan daya tanggap.

person radesix    schedule 07.09.2012
comment
rasesix, terima kasih atas jawaban Anda. Menurutku itu terlalu kabur. Pada poin 2 - Saya tidak perlu bekerja dengan penyedia basis data - Saya memiliki server jarak jauh: Saya mendapatkan informasi tentang tempat-tempat dari server tersebut menggunakan API-nya (jadi string GF sama sekali tidak relevan). Poin 1 - adalah apa yang ada dalam pikiran saya ketika mengajukan pertanyaan saya - Anda baru saja dikonfirmasi oleh pemikiran, terima kasih. Poin 3 - Saya mungkin lebih tertarik untuk mengetahui pendekatan-pendekatan yang sudah dikenal terhadapnya. Saya memperbarui pertanyaan saya dengan lebih detail - semoga pertanyaan tersebut menggambarkan apa yang saya inginkan, dengan cara yang lebih jelas. - person Stanislav Pankevich; 09.09.2012
comment
radesix, maaf jika salah mengeja nama anda. - person Stanislav Pankevich; 09.09.2012

Saatnya untuk menulis jawaban yang solid untuk pertanyaan saya ini (Saya bisa saja menulisnya setahun yang lalu tetapi entah bagaimana saya kehilangannya dari pikiran saya).


Apakah MapKit memiliki fungsi ubin (cara Google Maps) yang siap pakai dan apakah saya perlu mengerjakannya tambahan, jika tidak?

Jawabannya adalah ya: MapKit memang memilikinya. Kata kunci di sini adalah overlays (MKOverlay, MKOverlayView and others). Lihat jawaban saya yang lain.

Lihat juga:

Sesi WWDC 2010: Menyesuaikan Peta dengan Hamparan,

Apple-WWDC10-TileMap.


Apa praktik terbaik dalam mengambil informasi tempat (posisi penanda dan anotasi) dari server?

Sebenarnya sejak itu saya tidak belajar banyak tentang "praktik terbaik" - sayangnya, tidak ada yang memberi tahu saya tentang praktik tersebut :( - itu sebabnya saya akan menjelaskan "praktik saya".

Pertama-tama, ada dua strategi mengisi peta MapKit dengan tempat:

Strategi pertama adalah mengisi peta Anda dengan tempat-tempat berdasarkan permintaan: bayangkan Anda ingin menampilkan dan melihat semua tempat terdekat (misalnya, tidak lebih dari 1 km dari lokasi pengguna saat ini) - pendekatan ini mengasumsikan bahwa Anda tanyakan pada server Anda hanya tempat untuk kotak yang Anda minati. Artinya seperti: "jika saya berada di Berlin (dan saya mengharapkan 200 tempat untuk Berlin), mengapa saya harus mengambil tempat dari Rusia, Jepang, .. .(10.000+ tempat)".

Pendekatan ini mengarah pada mengandalkan fungsionalitas "ubin" yang mempertanyakan alamat N1: Peta Google dan peta Apple biasanya digambar menggunakan 'ubin' jadi untuk bagian peta "Berlin" Anda mengandalkan ubin "Berlin" yang sesuai yang digambar oleh MKMapView - Anda menggunakan dimensinya, untuk menanyakan server Anda hanya tempat di dalam kotak "Berlin" (lihat jawaban tertaut saya dan aplikasi demo di sana).

Awalnya ini adalah pendekatan yang saya gunakan dan implementasi saya bekerja dengan sempurna tetapi kemudian saya terdorong untuk menggunakan pendekatan kedua (lihat di bawah) karena muncul masalah clustering.

Strategi kedua adalah mengambil semua tempat sekaligus (ya, semuanya 10.000+ atau lebih) dan menggunakan Data Inti untuk mengambil tempat yang diperlukan untuk bagian peta yang Anda minati.

Pendekatan kedua berarti, bahwa selama proses pertama Anda mengirim permintaan ke server Anda untuk mengambil semua tempat (saya memiliki sekitar 2000 di aplikasi saya). Penting di sini adalah Anda membatasi bidang yang Anda ambil hanya pada bidang geografis yang benar-benar Anda perlukan untuk peta Anda: id, latitude, longitude.

Pengambilan 'ambil-semua' ini memiliki dampak yang signifikan pada waktu mulai pertama aplikasi saya (Pada iPhone 4 "yang tertua", saya memiliki waktu hampir 700 md untuk keseluruhan proses Fetch + Parse-JSON-into-Core-Data, dan tolok ukur ekstensif menunjukkan kepada saya bahwa itu adalah Data Inti dan sisipannya merupakan hambatan) namun Anda memiliki semua informasi geografis penting tentang tempat Anda di perangkat Anda.

Perhatikan, apa pun strategi yang Anda gunakan, Anda harus melakukan proses pengambilan titik geografis ini secara efisien:

Bayangkan entitas Data Inti Place yang memiliki struktur bidang berikut (kode preudo-Objective-C):

// Unique identificator
NSNumber *id,

// Geo info
NSNumber *latitude,
NSNumber *longitude,

// The rest "heavy" info  
NSString *name,
NSString *shortDescription,
NSString *detailedDescription, etc

Mengambil tempat secara efisien berarti Anda hanya meminta tempat Anda mencatat data geografis dari server Anda untuk membuat proses pencerminan ini secepat mungkin.

Lihat juga topik hangat ini: Meningkatkan proses pencerminan database server ke database klien melalui JSON?.

Masalah pengelompokan berada di luar cakupan pertanyaan ini tetapi masih sangat relevan dan memengaruhi keseluruhan algoritma yang Anda gunakan untuk keseluruhan proses - satu-satunya catatan yang akan saya tinggalkan di sini adalah bahwa semua solusi pengelompokan yang ada saat ini akan mengharuskan Anda menggunakan strategi kedua - Anda harus menyiapkan semua tempat sebelum Anda menjalankan algoritme pengelompokan yang akan mengatur tempat Anda di peta - artinya jika Anda memutuskan untuk menggunakan pengelompokan, Anda harus menggunakan strategi #2.

Tautan yang relevan tentang pengelompokan:

Sesi WWDC 2011: Memvisualisasikan Informasi Secara Geografis dengan MapKit,

Cara Menampilkan Data dalam Jumlah Besar di iOS secara Efisien Peta,

kingpin - Solusi pengelompokan sumber terbuka: berkinerja baik dan mudah digunakan.


Apakah mungkin untuk menyimpan informasi ini dalam cache sehingga pengguna dapat melihat tempat-tempat terdekat di "kotanya" dalam mode offline?

Ya, kedua strategi melakukan hal ini: yang pertama menyimpan cache tempat-tempat yang Anda lihat di peta - jika Anda mengamati bagian peta Berlin, bagian Berlin akan di-cache...

Saat menggunakan strategi kedua: Anda akan memiliki semua informasi geografis penting tentang tempat Anda dalam cache dan siap untuk digambar pada peta dalam mode offline (dengan asumsi MapKit menyimpan gambar peta wilayah yang Anda jelajahi dalam mode offline).

person Stanislav Pankevich    schedule 26.01.2014