İleri Düzey Kavramlar

Veri edinme

Toplanan konum verilerini almanın birçok yolu vardır. Burada iki rolün yollara hızlı tutturma özelliğiyle kullanılacak veri elde etme teknikleri Roads API.

GPX

GPX, rotaları, parkurları ve ara noktaları paylaşmak için kullanılan açık XML tabanlı bir biçimdir yakalanan verileri kullanır. Bu örnekte XmlPull ayrıştırıcısı kullanılmaktadır. hem Java sunucusu hem de mobil ortamlar için kullanılabilen hafif XML ayrıştırıcısı.

/**
 * Parses the waypoint (wpt tags) data into native objects from a GPX stream.
 */
private List<LatLng> loadGpxData(XmlPullParser parser, InputStream gpxIn)
        throws XmlPullParserException, IOException {
    // We use a List<> as we need subList for paging later
    List<LatLng> latLngs = new ArrayList<>();
    parser.setInput(gpxIn, null);
    parser.nextTag();

    while (parser.next() != XmlPullParser.END_DOCUMENT) {
        if (parser.getEventType() != XmlPullParser.START_TAG) {
            continue;
        }

        if (parser.getName().equals("wpt")) {
            // Save the discovered latitude/longitude attributes in each <wpt>.
            latLngs.add(new LatLng(
                    Double.valueOf(parser.getAttributeValue(null, "lat")),
                    Double.valueOf(parser.getAttributeValue(null, "lon"))));
        }
        // Otherwise, skip irrelevant data
    }

    return latLngs;
}

Aşağıda, haritaya yüklenmiş bazı ham GPX verileri verilmiştir.

Harita üzerinde ham GPX verileri

Android konum hizmetleri

Bir Android cihazdan GPS verilerini yakalamanın en iyi yolu ne kadar iyi karşıladığını görebileceksiniz. Alma Konumu ile ilgili Android eğitim dersine göz atın. Güncellemeler ve GitHub'ı tıklayın.

Uzun yollar işleniyor

Yollara tuttur özelliği, konumu tam yola dayalı olarak tahmin ettiğinde tek tek noktalara değil, uzun süreli işlemeye yolları (yani, istek başına 100 nokta sınırını aşan yollar).

Tek tek istekleri tek bir uzun yol olarak değerlendirmek için Bazı örtüşmeler (ör. önceki talepteki son noktalar dahil edilir) bir sonraki talebin ilk noktası olarak kabul edilecek. Dahil edilecek puan sayısı verilerinizin doğruluğuna bağlıdır. Daha fazla puan eklemelisiniz otomatik olarak devre dışı bırakabilirsiniz.

Bu örnekte, sayfa içeren istekler göndermek amacıyla Google Haritalar Hizmetleri için Java İstemcisi ardından, ara değer alınan noktalar da dahil olmak üzere verileri döndürülen listeye yeniden birleştirir.

/**
 * Snaps the points to their most likely position on roads using the Roads API.
 */
private List<SnappedPoint> snapToRoads(GeoApiContext context) throws Exception {
    List<SnappedPoint> snappedPoints = new ArrayList<>();

    int offset = 0;
    while (offset < mCapturedLocations.size()) {
        // Calculate which points to include in this request. We can't exceed the API's
        // maximum and we want to ensure some overlap so the API can infer a good location for
        // the first few points in each request.
        if (offset > 0) {
            offset -= PAGINATION_OVERLAP;   // Rewind to include some previous points.
        }
        int lowerBound = offset;
        int upperBound = Math.min(offset + PAGE_SIZE_LIMIT, mCapturedLocations.size());

        // Get the data we need for this page.
        LatLng[] page = mCapturedLocations
                .subList(lowerBound, upperBound)
                .toArray(new LatLng[upperBound - lowerBound]);

        // Perform the request. Because we have interpolate=true, we will get extra data points
        // between our originally requested path. To ensure we can concatenate these points, we
        // only start adding once we've hit the first new point (that is, skip the overlap).
        SnappedPoint[] points = RoadsApi.snapToRoads(context, true, page).await();
        boolean passedOverlap = false;
        for (SnappedPoint point : points) {
            if (offset == 0 || point.originalIndex >= PAGINATION_OVERLAP - 1) {
                passedOverlap = true;
            }
            if (passedOverlap) {
                snappedPoints.add(point);
            }
        }

        offset = upperBound;
    }

    return snappedPoints;
}

Yola geçirme istekleri çalıştırıldıktan sonra yukarıdan alınan verileri burada bulabilirsiniz. Kırmızı satır ham veri, mavi çizgi ise toplanan veridir.

Yollara tutturulan verilere örnek

Kotanın verimli kullanımı

Yollara hızlı geçiş isteğine verilen yanıt, yer kimliklerinin listesini içerir sağladığınız noktalarla eşlenen bu noktalarda ek puanlar interpolate=true ayarla.

Hız sınırı isteği için izin verilen kotanızdan verimli bir şekilde yararlanmak amacıyla İsteğinizde yalnızca benzersiz yer kimliklerini sorgulamanız gerekir. Bu örnekte, Google Haritalar Hizmetleri için Java İstemcisi'ni kullanarak bir yer listesinden hız sınırlarını sorgulayabilirsiniz Kimlikler.

/**
 * Retrieves speed limits for the previously-snapped points. This method is efficient in terms
 * of quota usage as it will only query for unique places.
 *
 * Note: Speed limit data is only available for requests using an API key enabled for a
 * Google Maps APIs Premium Plan license.
 */
private Map<String, SpeedLimit> getSpeedLimits(GeoApiContext context, List<SnappedPoint> points)
        throws Exception {
    Map<String, SpeedLimit> placeSpeeds = new HashMap<>();

    // Pro tip: Save on quota by filtering to unique place IDs.
    for (SnappedPoint point : points) {
        placeSpeeds.put(point.placeId, null);
    }

    String[] uniquePlaceIds =
            placeSpeeds.keySet().toArray(new String[placeSpeeds.keySet().size()]);

    // Loop through the places, one page (API request) at a time.
    for (int i = 0; i < uniquePlaceIds.length; i += PAGE_SIZE_LIMIT) {
        String[] page = Arrays.copyOfRange(uniquePlaceIds, i,
                Math.min(i + PAGE_SIZE_LIMIT, uniquePlaceIds.length));

        // Execute!
        SpeedLimit[] placeLimits = RoadsApi.speedLimits(context, page).await();
        for (SpeedLimit sl : placeLimits) {
            placeSpeeds.put(sl.placeId, sl);
        }
    }

    return placeSpeeds;
}

Yukarıda, her bir benzersiz yer kimliğinde işaretlenmiş hız sınırlarına sahip verileri burada bulabilirsiniz.

Haritada hız sınırı tabelaları

Diğer API'lerle etkileşim kurun

Yer kimliklerinin yollara hızlı tutturma içinde döndürülmesinin faydalarından biri pek çok yerde yer kimliğini kullanabileceğiniz Google Haritalar Platformu API'leri. Bu örnekte, Google Haritalar Hizmetleri için Java İstemcisi kullanılmaktadır. yukarıdaki ek yol tarifi isteğiyle döndürülen bir yerin coğrafi kodunu kodlamak için de kullanılır.

/**
 * Geocodes a snapped point using the place ID.
 */
private GeocodingResult geocodeSnappedPoint(GeoApiContext context, SnappedPoint point) throws Exception {
    GeocodingResult[] results = GeocodingApi.newRequest(context)
            .place(point.placeId)
            .await();

    if (results.length > 0) {
        return results[0];
    }
    return null;
}

Burada, hız sınırı işaretçisine Coğrafi Kodlama API'si.

İşaretçide gösterilen coğrafi kodlu adres

Örnek kod

Dikkat edilmesi gereken noktalar

Bu makaleyi destekleyen kod, yalnızca örnek olarak verilebilir. Pratikte sunucu tarafınızı Anahtarınız yetkisiz erişime karşı korunamadığı için bir Android uygulamasındaki API anahtarları üçüncü taraftan erişimi. Bunun yerine, anahtarlarınızın güvenliğini sağlamak için Sunucu tarafı proxy olarak API'ye yönelik kod kullanma ve Android uygulamanızın istek göndermesini sağlama proxy üzerinden kontrol ederek isteklerin yetkilendirildiğinden emin olun.

İndir

GitHub'dan kodu indirin.