Več

Kako izračunati razdaljo med črto in točko (z uporabo koordinat lat / lon)

Kako izračunati razdaljo med črto in točko (z uporabo koordinat lat / lon)


V svoji aplikaciji za Android moram izračunati razdaljo od točke (lokacije naprave, ki je koordinata širina / dolžina) do črte (določeno z dvema koordinatama širina / dolžina) in rezultat dobiti v metrih.

Ogledal sem si to stran in tam kodo Java, vendar se zavedam, da je ne morem uporabiti (vsaj ne s koordinatami lat / lon), ker mi bo dala razdaljo / razliko v stopinjah točka in črta, in ne v metrih, in če ugibam prav, razlike v stopinjah ni mogoče pretvoriti v metre, kajne?

Zato se sprašujem, kako lahko to storim na drug način, da dobim razdalja v metrih med a črta in točka, obe opredeljeni z vrednostmi lat / lon.

UREDI: S problemom sem se lotil še enega pristopa. Zdaj imam namesto tega metodo, ki najde točko na črti, ki je najbližja lokaciji naprave.
Vendar ta formula ne deluje natančno tako, kot je bilo predvideno, če jo hranite s koordinatami lat / lon Ko je lokacija naprave na črti, kaže desno, toda ko se naprava oddalji od črte, se napaka veča in povečuje, dokler se na koncu vrstice ne ustavi.

Tu je funkcija (ki temelji na kodi v prvi alternativi tega odgovora):

/ ** * Poiščite najbližjo točko na premici. * * @param a Prva točka vrstice. * @param b Druga točka vrstice. * @param p Bistvo za začetek. * * @return Točka na premici a-> b, ki je najbližja točki p. * / javna statična lokacija najbližjePointOnLine (Lokacija a, Lokacija b, Lokacija p) {// Shrani vektor a-> p Vektor a_to_p = nov Vektor (a, p); // Shrani vektor a-> b Vektor a_to_b = nov vektor (a, b); // Poiščimo kvadratno velikost a-> b dvojni kvadratMagnituda = kvadrat (a_to_b.x) + kvadrat (a_to_b.y); // izračunamo pikčasti zmnožek a-> p in a-> b double atp_dot_atb = a_to_p.x * a_to_b.x + a_to_p.y * a_to_b.y; // izračunamo normalizirano razdaljo od a do najbližje točke double t = clamp (atp_dot_atb / squareMagnitude, 0d, 1d); // Ustvari novo lokacijo za shranjevanje vrednosti rezultatov v Location location = new Location (LocationManager.PASSIVE_PROVIDER); // Nastavimo vrednosti koordinat rezultatov location.setLatitude (a.getLatitude () + a_to_b.x * t); location.setLongitude (a.getLongitude () + a_to_b.y * t); // Vrni lokacijo za vrnitev lokacije; }

TheVektorrazred je le razred, ki vsebuje dvadvojnovrednosti in predstavljajo vektor.
Theobjemka (dvojni v, dvojni min, dvojni maks)metoda vpenja vrednost (v) med najmanjšim (min) in največ (maks) vrednost, v tem primeru 0 in 1.
Thekvadrat (dvojni v)metoda izračuna kvadrat vrednosti (preprostov * v).

Vesel bi bil, če bi mi lahko kdo pomagal bodisi nekoliko spremeniti to kodo, da bi vrnil pravilno točko za koordinate WGS84 / lat-lon, bodisi predlagal drug način.
Rezultat mora biti čim bolj natančen, recimo, napaka manjša od 5 metrov.


pretvorjene razdalje v stopinjah ne morete pretvoriti v metre, saj se velikost stopinje spreminja, ko se približujete polovom. pretvorite svoje lokacije v projicirani koordinatni sistem in nato izračunajte svoje razdalje.


Problem sem uspel rešiti s pretvorbo vseh koordinat, ki jih vsebuje formula, v SWEREF99TM, preden sem izračunal najbližjo točko. Nato sem najbližjo točko, ki smo jo našli s formulo, pretvoril nazaj v WGS84.

Uporabil sem SWEREF99TM, ker gre za mrežni sistem, zato bo formula delovala pravilno.
Upoštevajte, da zunaj Švedske to verjetno ne bo delovalo, saj se uporablja koordinatni sistem SWEREF99TM, za katerega menim, da deluje le na Švedskem.
Če mora izračun delovati samo v določeni državi, je ključ za rešitev tega problema poiskati mrežni sistem za to državo in pred uporabo formule pretvoriti koordinate v ta sistem.


Poglej si posnetek: Latitude and Longitude in Google Earth