2014-12-16 2 views
0

У меня есть круговой оверлей, который может меняться в соответствии с предпочтениями пользователя: вокруг них окружен радиус «r», а ползунок может изменить «r» соответственно. Пока это работает отлично.Оверлей круга для преобразования карты-расстояния

Моя проблема: я не знаю, как найти правильное преобразование из радиуса круга в метрику карты. В качестве примера, учитывая круг ниже, каково расстояние, покрытое заданным радиусом?

enter image description here

+0

На самом деле, я сортирую следующее [это] (https://code.google.com/p/osmdroid/source/browse/trunk/osmdroid-android/src/main/java/org/osmdroid/views/ overlay/ScaleBarOverlay.java? r = 1152) прямо сейчас, и я думаю, что это решение моей проблемы ... Я обновлю этот поток, когда/если я его выясню. – Matt

ответ

1

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

0

Так вот как вы это делаете ...

Jedil правильно вы должны найти свою ширину экрана/высоту, точки на дюйм экрана и т.д. Таким образом, глядя через this old osmdroid источник I Сорт выяснял это:

//Get the x and y dpi 
this.xdpi = this.context.getResources().getDisplayMetrics().xdpi; 
this.ydpi = this.context.getResources().getDisplayMetrics().ydpi; 

//Get the screen width/height 
this.screenWidth = this.context.getResources().getDisplayMetrics().widthPixels; 
this.screenHeight = this.context.getResources().getDisplayMetrics().heightPixels; 

// DPI corrections for specific models 
String manufacturer = null; 
try { 
     final Field field = android.os.Build.class.getField("MANUFACTURER"); 
     manufacturer = (String) field.get(null); 
     } catch (final Exception ignore) { 
     } 

if ("motorola".equals(manufacturer) && "DROIDX".equals(android.os.Build.MODEL)) { 

// If the screen is rotated, flip the x and y dpi values 
WindowManager windowManager = (WindowManager) this.context 
         .getSystemService(Context.WINDOW_SERVICE); 
if (windowManager.getDefaultDisplay().getOrientation() > 0) { 
    this.xdpi = (float) (this.screenWidth/3.75); 
    this.ydpi = (float) (this.screenHeight/2.1); 
} else { 
     this.xdpi = (float) (this.screenWidth/2.1); 
     this.ydpi = (float) (this.screenHeight/3.75); 
} 

} else if ("motorola".equals(manufacturer) && "Droid".equals(android.os.Build.MODEL)) { 
    // http://www.mail-archive.com/[email protected]/msg109497.html 
    this.xdpi = 264; 
    this.ydpi = 264; 
} 

// set default max length to 1 inch 
maxLength = 2.54f; 

Вот как вы получаете «константы» (по крайней мере, в глазах устройства). Для того, чтобы преобразовать ...

// calculate dots per centimeter 
int xdpcm = (int) ((float) xdpi/2.54); 
int ydpcm = (int) ((float) ydpi/2.54); 

// get length in pixel 
int xLen = (int) (maxLength * xdpcm); 
int yLen = (int) (maxLength * ydpcm); 


// Two points, xLen apart, at scale bar screen location 
IGeoPoint p1 = projection.fromPixels((screenWidth/2) - (xLen/2), yOffset); 
IGeoPoint p2 = projection.fromPixels((screenWidth/2) + (xLen/2), yOffset); 

// get distance in meters between points 
final int xMeters = ((GeoPoint) p1).distanceTo(p2); 

... и это похоже, если не почти идентичны, независимо от того, чтобы получить yMeters (подсказка: используйте ScreenHeight).

Понятно, что я не совсем уверен в том, что делают линии IGeoPoint..., но я понимаю, что преобразование есть. Надеясь, что это поможет кому-то в будущем. Для лучшего понимания приведенного выше кода см. Ссылку, которую я опубликовал.

0

Я думаю, что то, что вы ищете, является вычислением в метрах. Вы можете получить это от проекции:

// Get projection 
Projection proj = mMapView.getProjection(); 
// How many pixels in 100 meters for this zoom level 
float pixels = proj.metersToPixels(100); 
// How many meters in 100 pixels for this zoom level 
float meters = 1/proj.metersToPixels(1/100); 
// You could also get a raw meters-per-pixels value by using TileSystem.GroundResolution() 

Две вещи, чтобы помнить - это значение будет меняться не только на каком уровне детализации, но основываясь на какой широте вы находитесь на картах.

Смежные вопросы