/ / Comment : tracer une latitude et une longitude données sur une carte d'image fixe en utilisant quatre (4) coordonnées de l'image ? - android, carte, géolocalisation, localisation, coordonnées

Comment: tracer une latitude et une longitude données dans une carte d'image fixe en utilisant quatre (4) coordonnées de l'image? - Android, carte, géolocalisation, emplacement, coordonnées

J'ai créé ce post -> tracer une lat lon du monde réel dans une carte d'images fixes à différents angles

à partir de là, je peux marquer avec succès le donnélat&lon étant donné les deux (2) coordonnées (en haut à gauche, en bas à droite) mais en raison d'un angle incorrect de la carte de l'image fixe par rapport à l'angle de la carte du monde réel, ma marque a été déplacée.

Maintenant, je pense à en utilisant quatre (4) coordonnées (en haut à gauche, en bas à gauche, en haut à droite, en bas à droite) de l'image. Ainsi, je pouvais tracer la latitude donnée sans tenir compte de l'angle.

Je pense que même sans expérience Android pourrait répondre à cette question. Je suis juste un peu lent avec la matière mathématique.

Est-il possible de le mettre en œuvre ? si oui, tous les conseils et extraits de code sont appréciés.

MISES À JOUR1 L'objectif principal est de marquer le lat&lon donné dans une carte d'image qui a un angle différent par rapport à la carte du monde réel.

MISES À JOUR2 J'utilise les codes ci-dessous pour calculer mon angle. Voudriez-vous le vérifier s'il est fiable pour obtenir l'angle. Ensuite, convertissez-le en pixel. REMARQUE : ces codes n'utilisent que deux coordonnées de l'image plus les coordonnées de la cible.

public static double[] calc_xy (double imageSize, Location target, Location upperLeft, Location upperRight) {
double newAngle = -1;
try {
double angle = calc_radian(upperRight.getLongitude(), upperRight.getLatitude(),
upperLeft.getLongitude(), upperLeft.getLatitude(),
target.getLongitude(), target.getLatitude());
newAngle = 180-angle;

} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

double upperLeft_Target_dist = upperLeft.distanceTo(target);

double upperLeft_Right_dist = upperLeft.distanceTo(upperRight);
double distancePerPx = imageSize /upperLeft_Right_dist;

double distance = upperLeft_Target_dist * distancePerPx;

double radian = newAngle * Math.PI/180;

double[] result = radToPixel(distance, radian);
return result;
}

public static double[] radToPixel(double distance, double radian) {
double[] result = {-1,-1};
result[Functions.Location.PIXEL_X_LON] = distance * Math.cos(radian);
result[Functions.Location.PIXEL_Y_LAT] = distance * Math.sin(radian);
return result;
}

public static double calc_radian(Double x1, Double y1, Double x2, Double y2, Double x3, Double y3)
throws Exception{

double rad = 0.0;

if((Double.compare(x1, x2) == 0 && Double.compare(y1, y2) == 0) ||
(Double.compare(x3, x2) == 0 && Double.compare(y3, y2) == 0))
{
Log.d(tag, "Same place") ;
return rad;
}

/* compute vector */
double BAx = x2 - x1;
double BAy = y2 - y1;

double BCx = x3 - x2;
double BCy = y3 - y2;

double cosA =  BAx / Math.sqrt( BAx * BAx + BAy * BAy ) ;
double cosC =  BCx / Math.sqrt( BCx * BCx + BCy * BCy ) ;

double radA = Math.acos( cosA ) * 180.0 / Math.PI ;
double radC = Math.acos( cosC ) * 180.0 / Math.PI ;
if( BAy < 0.0 )
{
radA = radA * -1.0 ;
}
if( BCy < 0.0 )
{
radC = radC * -1.0 ;
}

rad = radC - radA ;


if( rad > 180.0 )
{
rad = rad - 360;
}

if( rad < -180.0 )
{
rad = rad + 360;
}

return rad ;
}

Réponses:

1 pour la réponse № 1

Si vous savez quel est l'angle, il s'agit d'une simple rotation cartésienne de l'axe.

Laisser x être l'ancienne longitude, y être l'ancienne latitude, et b être l'angle

La nouvelle longitude x" = x*cos(b) - y*sin(b)

La nouvelle latitude y" = x*sin(b) + y*cos(b)


1 pour la réponse № 2

On dirait que vous voulez tracer les utilisateursgéolocalisation actuelle sur une image, disons d'un bâtiment ou d'un campus. En supposant cela, mon approche consisterait à "mapper" l'image fixe sur l'écran, ce qui nécessitera probablement une transformation de translation, une transformation de rotation et une transformation de mise à l'échelle. De plus, vous aurez besoin de connaître les coordonnées de géolocalisation réelles d'au moins deux points sur votre image. Compte tenu de l'image de votre message précédent, je suppose que vous avez les coordonnées géographiques du coin inférieur gauche et du coin inférieur droit. Vous avez déjà les informations pour convertir une coordonnée géographique en une coordonnée d'écran afin que l'image puisse être dessinée en faisant correspondre le coin inférieur gauche de votre image avec la coordonnée en pixels que vous avez calculée. J'appellerai ce point votre point d'ancrage.

A ce stade, vous avez probablement une image avec uncoin à l'emplacement correct, mais il doit maintenant être réduit ou augmenté, puis pivoté autour de votre point d'ancrage. Vous pouvez obtenir le niveau de zoom actuel à partir de votre mapView ou vous pouvez obtenir la latitudeSpan et vous pouvez calculer le facteur d'échelle à appliquer à votre image.

Enfin, si vous avez les coordonnées géographiques dudeux coins de l'image, vous pouvez calculer l'angle de rotation de l'image. Cela peut être calculé à l'aide de Pythagore ou vous pouvez convertir des coordonnées cartésiennes en coordonnées polaires vois ici. Ce calcul n'a pas à être effectué par votre application - il peut être calculé séparément et mis en constante. Vous pouvez maintenant appliquer la transformation de rotation autour de votre point d'ancrage fixe.

Vous pouvez également utiliser des fonctions intégrées pratiques telles que mapController.zoomInFixing() qui prend les coordonnées des pixels ou l'une des autres fonctions zoomTo() ou animateTo().

Modifier: Si vous n'utilisez pas une vue cartographique pour gérer vos coordonnées géographiques, vous pouvez appliquer les transformations d'image à l'aide d'un code comme celui-ci :

// create a matrix for the manipulation
Matrix matrix = new Matrix();
// resize the bit map
matrix.postScale(scaleWidth, scaleHeight);
// rotate the Bitmap
matrix.postRotate(angle);

// recreate the new Bitmap
Bitmap resizedBitmap = Bitmap.createBitmap(bitmapOrg, 0, 0,
width, height, matrix, true);

// make a Drawable from Bitmap to allow to set the BitMap
// to the ImageView, ImageButton or what ever
BitmapDrawable bmd = new BitmapDrawable(resizedBitmap);

ImageView imageView = new ImageView(this);

// set the Drawable on the ImageView
imageView.setImageDrawable(bmd);

Modifier: Avec les coordonnées en haut à gauche et en bas à droite, vous pouvez calculer l'angle comme suit :

angle = sin-1((right.x - left.y)/sqrt((right.x - left.x)sq + (right.y - left.y)sq))

[Où sqrt = racine carrée ; carré = carré


0 pour la réponse № 3

Je ne suis pas sûr de comprendre mais il me semble quevous voulez calculer l'angle de l'image que vous voulez en utilisant deux points puis la faire pivoter et la redimensionner en fonction du nombre de pixels entre les points a et b (deux coins) en utilisant la méthode de changement de lat lon en pixels et la formule de distance