Как я могу показать местоположение пользователя на карте, которая не является Google Maps? - PullRequest
1 голос
/ 05 января 2012

Я создаю приложение, которое покажет текущее местоположение на карте, но эта карта является изображением (а не картами Google).Как я могу это сделать?Используйте карту, не являющуюся картами Google.

Мне интересно, возможно ли каким-либо образом связать координаты карт Google с этой картой, которую я хочу использовать, используя базовое местоположение для получения этих координат.

Есть идеи?

Ответы [ 3 ]

1 голос
/ 05 января 2012
  1. Ваше изображение должно быть с географической привязкой.

  2. Вам нужно будет знать параметры проекции карты.

  3. Если изображение не в проекции долготы / широты, вам придется спроецировать координаты, которые базовое местоположение предоставляет для той же проекции, которую использует ваша карта.

0 голосов
/ 07 января 2012

Вот класс, который я создал для преобразования широты / долготы как для глобуса FAI, так и для проекций WGS-84.Вы инициализируете его базовой географической точкой (скажем, центром вашей карты), и она будет вычислять расстояние в метрах между этой точкой и другими точками.Если вы затем знаете разрешение в метрах / пикселях своей карты, вы можете легко преобразовать ее в значения в пикселях.

Класс не очень задокументирован, но я знаю, что вы можете это выяснить.Он использует мой другой класс (Vector), но вы легко сможете заменить его на CGPoint.

CAVEAT: он не будет работать с картами небольшого масштаба.Он оптимизирован для быстрого вычисления времени, принимая крупномасштабную карту (скажем, менее 100 км в поперечнике).

.h файл:

//
//  Earth.h
//
//  Created by René Dekker on 01/10/2011.
//  Copyright 2011. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <CoreLocation/CoreLocation.h>
#import "Vector.h"

enum EarthModel {
    EarthModelFAI = 0,
    EarthModelWGS84 = 1
};

@interface Earth : NSObject {
    enum EarthModel theModel;
    double theLongitudeScale;
    double theLatitudeScale;
    CLLocationCoordinate2D baseLocation;
}

@property CLLocationCoordinate2D baseLocation;

+ (Earth *)earthModel:(enum EarthModel)model atLatitude:(double)baseLatitude;
- (void) rebaseAtLatitude:(double)baseLatitude;

+ (Earth *)earthAtLocation:(CLLocationCoordinate2D)location model:(enum EarthModel)model;
- (void) rebaseAtLocation:(CLLocationCoordinate2D)location;

- (Vector *) differenceBetween:(CLLocationCoordinate2D)first and:(CLLocationCoordinate2D)second;
- (double) distanceBetween:(CLLocationCoordinate2D)first and:(CLLocationCoordinate2D)second;
- (CLLocationCoordinate2D) addTo:(CLLocationCoordinate2D)location vector:(Vector *)vector;
- (double) addToLongitude:(double)longitude distance:(double)distance;
- (double) addToLatitude:(double)latitude distance:(double)distance;

- (Vector *) vectorFromBase:(CLLocationCoordinate2D)location;
- (double) distanceFromBase:(CLLocationCoordinate2D)location;
- (CLLocationCoordinate2D) addToBase:(Vector *)vector;

@end

.m файл:

//
//  Earth.m
//
//  Created by René Dekker on 01/10/2011.
//  Copyright 2011. All rights reserved.
//
// The information and formulas used in the WGS84 computations come mainly from:
// http://en.wikipedia.org/wiki/World_Geodetic_System
// http://en.wikipedia.org/wiki/Meridian_arc#Meridian_distance_on_the_ellipsoid
// http://www.holoscenes.com/cgi-bin/moin.cgi/Ellipsoid
// http://www.movable-type.co.uk/scripts/gis-faq-5.1.html
// http://williams.best.vwh.net/avform.htm
// 

#import "Earth.h"

#define WGS_EQUATOR_R   6378137.0
#define WGS_POLAR_R     6356752.314245
#define F               (1/298.257223563)
#define E2              (F * (2 - F))
#define FAI_R           6371000

@implementation Earth

double modTo(double x, double lower, double upper)
{
    double range = upper - lower;
    double result = fmod(x - lower, range);
    if (result < 0) {
        result += range;
    }
    return result + lower;
}


- (void) rebaseAtLatitude:(double)baseLatitude
{
    baseLatitude *= PI_DEGREE;
    if (theModel == EarthModelWGS84) {
        double sinLat = sin(baseLatitude);
        double factor = sqrt(1 - E2*sinLat*sinLat);
        theLatitudeScale = PI_DEGREE * WGS_EQUATOR_R * (1-E2) / pow(factor, 3);
        theLongitudeScale = PI_DEGREE * WGS_EQUATOR_R * cos(baseLatitude) / factor;
    } else {
        theLatitudeScale = PI_DEGREE * FAI_R;
        theLongitudeScale = PI_DEGREE * FAI_R * cos(baseLatitude);
    }
}

- (void) rebaseAtLocation:(CLLocationCoordinate2D)location
{
    baseLocation = location;
    [self rebaseAtLatitude:location.latitude];
}

- (CLLocationCoordinate2D) baseLocation
{
    return baseLocation;
}

- (void) setBaseLocation:(CLLocationCoordinate2D)location
{
    baseLocation = location;
    [self rebaseAtLatitude:location.latitude];
}

- (Earth *) initWithModel:(enum EarthModel)model atLocation:(CLLocationCoordinate2D)location
{
    if (!(self = [super init])) {
        return nil;
    }
    theModel = model;
    [self rebaseAtLocation:location];
    return self;
}

+ (Earth *)earthModel:(enum EarthModel)model atLatitude:(double)baseLatitude
{
    CLLocationCoordinate2D location = CLLocationCoordinate2DMake(baseLatitude, 0);
    return [[[Earth alloc] initWithModel:model atLocation:location] autorelease];
}

+ (Earth *)earthAtLocation:(CLLocationCoordinate2D)location model:(enum EarthModel)model
{
    return [[[Earth alloc] initWithModel:model atLocation:location] autorelease];
}

- (Vector *) differenceBetween:(CLLocationCoordinate2D)first and:(CLLocationCoordinate2D)second
{
    double dx = modTo(first.longitude - second.longitude, -180, 180) * theLongitudeScale;
    double dy = (first.latitude - second.latitude) * theLatitudeScale;
    return [Vector withX:dx y:dy];
}

- (double) distanceBetween:(CLLocationCoordinate2D)first and:(CLLocationCoordinate2D)second
{
    double dx = modTo(first.longitude - second.longitude, -180, 180) * theLongitudeScale;
    double dy = (first.latitude - second.latitude) * theLatitudeScale;
    return hypot(dx, dy);
}

- (CLLocationCoordinate2D) addTo:(CLLocationCoordinate2D)location vector:(Vector *)vector
{
    location.latitude += vector.y / theLatitudeScale;
    location.longitude += modTo(vector.x / theLongitudeScale, -180, 180);
    return location;
}

- (Vector *) vectorFromBase:(CLLocationCoordinate2D)location
{
    return [self differenceBetween:location and:baseLocation];
}

- (double) distanceFromBase:(CLLocationCoordinate2D)location
{
    return [self distanceBetween:location and:baseLocation];
}

- (CLLocationCoordinate2D) addToBase:(Vector *)vector
{
    return [self addTo:baseLocation vector:vector];
}

- (double) addToLongitude:(double)longitude distance:(double)distance
{
    return modTo(longitude + distance / theLongitudeScale, -180, 180);
}

- (double) addToLatitude:(double)latitude distance:(double)distance
{
    return latitude + distance / theLatitudeScale;
}

- (NSString *) description
{
    return NSStringFromCLLocationCoordinate2D(baseLocation);
}

@end
0 голосов
/ 07 января 2012

Я смущен вопросом;координаты широта + долгота не являются уникальными для Google Maps.У вас будет и карта Google, и ваше изображение на одной странице?Или вы просто хотите отобразить изображение?Google также предоставляет такую ​​услугу, используя Static Maps API

...