Calculando coordenadas de milhas quadradas x do ponto central?

11

Estou tentando criar um quadrado de milha axial (ou círculo) em torno de um ponto central, onde todos os lados da praça estejam x milhas do centro. Eu preciso das coordenadas dos 4 cantos.

Está mexendo no meu cérebro tentando colocar minha cabeça em volta? Eu posso calcular a distância entre dois pontos usando a fórmula Haversine, mas a matemática não é o meu ponto forte e eu não entendo o pecado, porque etc .. e tentar resolver isso me perdeu!

Me deparei com Calculando latitude / longitude X milhas a partir do ponto? mas eu simplesmente não entendo!

Alguém teria a gentileza de explicar como eu faço isso em termos de maçãs e peras?

Explicar exatamente o que estou tentando fazer;

Eu tenho um site, onde os usuários podem procurar por edifícios em uma área específica. Eles entrarão em uma cidade ou local (do qual saberei até o final) e pesquisam em um raio específico de, digamos, 10 milhas do local.

Eu preciso encontrar o mínimo / máximo de lat e longs do raio de 10 milhas para que eu possa consultar meu banco de dados usando uma cláusula where semelhante a:

Where buildingLat <= maxLat 
  and buildingLat <= minLat 
  and buildingLong >= minLong 
   or buildingLong >= maxLong

Eu preciso de algum tipo de fórmula!

Minhas coordenadas estão em graus decimais

Bex
fonte

Respostas:

10

Para esse fim, aproximações simples são mais que boas o suficiente. Norte ou sul, um grau tem cerca de 69 milhas, mas leste ou oeste, são apenas 69 * cos (latitude). Como as latitudes não mudam muito em uma extensão de dez milhas, você pode usar com segurança o cosseno da latitude central do "quadrado". Portanto, as coordenadas desejadas para vértices quadrados à distância r milhas de um local central (f, l), dado em lat-lon, são computadas como

df = r/69        // North-south distance in degrees
dl = df / cos(f) // East-west distance in degrees
{(f-df,l-dl), (f+df,l-dl), (f+df,l+dl), (f-df,l+dl)} // List of vertices

Por exemplo, suponha que r = 10 milhas e a localização central estejam a latitude 50 graus norte, longitude 1 grau oeste, de modo que (f, l) = (50, -1) graus. Então

df = 10/69 = 0.145
dl = 0.145 / cos(50 degrees) = 0.145 / 0.6428 = 0.225
f - df = 50 - 0.145 = 49.855 (southernmost latitude)
f + df = 50 + 0.145 = 50.145 (northernmost latitude)
l - dl = -1 - 0.225 = -1.225 (western longitude)
l + dl = -1 + 0.225 = -0.775 (eastern longitude)

e as coordenadas são (49.855, -1.225), (50.145, -1.225), (50.145, -0.775) e (49.855, -0.775) enquanto você marcha no sentido horário ao redor da praça, começando no canto sudoeste.

Não use essa aproximação perto dos pólos ou para quadrados maiores que alguns graus de um lado. Além disso, dependendo das limitações do SIG, alguns cuidados podem ser necessários em relação ao corte global em longitude, geralmente tomado a + -180 graus.

whuber
fonte
4

Pegue a coordenada X do centro e subtraia x milhas; este é o lado esquerdo do seu quadrado. Em seguida, pegue a coordenada Y do centro e subtraia X milhas dele, este é o fundo do seu quadrado. Repita essas etapas, mas adicionando, em vez de subtrair, para obter a mão direita e as bordas superiores. Agora você pode construir os quatro cantos do seu quadrado.

Observe que o item acima pressupõe que seu ponto central esteja em milhas. Se não for o primeiro, reprojecte-o. Caso contrário, todas as apostas estão desativadas e seu quadrado não será quadrado.

Ian Turton
fonte
Você está se referindo à página de exemplo? Como subtraio milhas de uma coordenada e não preciso levar em consideração a curvatura da Terra?
Bex
Não, é tão simples que não há necessidade real de ter um exemplo trabalhado. Talvez você precise especificar qual software você está usando? Como eu disse a minha solução pressupõe que você tenha projetado o seu coordenadas para um SRS locais (se você não tem, então, que deve ser a sua primeira pergunta)
Ian Turton
Estou realmente confuso agora! Atualizei minha pergunta para dizer exatamente o que estou tentando fazer. Eu meio que preciso criar uma caixa delimitadora para encontrar o mínimo e o máximo de lat e long.
Bex
3
proj4js ( proj4js.org ) deve ajudar então
Ian Turton
1
Minhas coordenadas ficam assim: 51.498485, -0.129089 ou seja, graus, não é?
Bex
4

Finalmente, minha resposta é: (em c #)

Provavelmente não preciso das 4 coordenadas, mas acho que são bastante precisas.

 public static void GetBoundingCoords(double centerLat, double centerLong,  double distance)
    {
     Coordinate top=   MaxLatLongOnBearing(centerLat, centerLong,45,10);
     Coordinate right = MaxLatLongOnBearing(centerLat, centerLong, 135, 10);
     Coordinate bottom = MaxLatLongOnBearing(centerLat, centerLong, 225, 10);
     Coordinate left = MaxLatLongOnBearing(centerLat, centerLong, 315, 10);
    }

    public static Coordinate MaxLatLongOnBearing(double centerLat, double centerLong, double bearing, double distance)
    {

        var lonRads = ToRadian(centerLong);
        var latRads = ToRadian(centerLat);
        var bearingRads = ToRadian(bearing);
        var maxLatRads = Math.Asin(Math.Sin(latRads) * Math.Cos(distance / 6371) + Math.Cos(latRads) * Math.Sin(distance / 6371) * Math.Cos(bearingRads));
        var maxLonRads = lonRads + Math.Atan2((Math.Sin(bearingRads) * Math.Sin(distance / 6371) * Math.Cos(latRads)), (Math.Cos(distance / 6371) - Math.Sin(latRads) * Math.Sin(maxLatRads)));

        var maxLat = RadiansToDegrees(maxLatRads);
        var maxLong = RadiansToDegrees(maxLonRads);

        return new Coordinate(){Latitude=maxLat, Longitude=maxLong};
    }

EDITAR

Tendo acabado de perceber, se eu definir os cantos do meu quadrado x milhas a partir do ponto central, as bordas do meu quadrado não serão as mesmas x milhas. (disse que a matemática não era meu ponto forte). Para obter a distância dos pontos de canto do ponto central, se eu quiser as bordas dos quadrados em x milhas, usei o Teorema de Pitágoras para calcular a distância da diagonal. (em um triângulo retângulo, o quadrado da hipotenusa (a diagonal) é igual ao quadrado dos outros dois lados)

Bex
fonte
isso não será um quadrado.
Ian Turton
I alteraram o rumo, foi um diamante .. agora é quadrado
Bex
No que diz respeito à edição, o Teorema de Pitágoras é bom para pequenos quadrados, mas em geral não vale para triângulos retos esféricos. É estranho, então, que seu código use trigonometria esférica juntamente com essa aproximação com base na geometria plana.
whuber
Minha distância nunca será superior a 160 quilômetros, então acho que não importa. Como as imprecisões serão pequenas com essa distância menor.
Bex
1
Acho que o que o @whuber está argumentando é que não há benefício em usar um cálculo complexo de distância ao longo de Lat e Long, já que você os combina com o teorema de Pitágoras. Em vez disso, você poderia usar um cálculo muito mais simples, como o whuber, ou como Ewan Todd . Use fórmulas lineares simples para converter longitude em milhas e latitude em milhas, ou vice-versa. A única parte "complicada" é saber que a fórmula da longitude precisa do ajuste * cos(lat)ao converter graus em milhas e / cos(lat)ao converter milhas em graus.
Home
0

Se você estiver usando um banco de dados com reconhecimento espacial, poderá converter sua área de interesse no mesmo sistema de coordenadas em que seus dados são armazenados e, em seguida, fazer uma comparação de maçãs com maçãs.

Por exemplo:

  1. O usuário escolhe um local, resultando em lat / lon.
  2. Peça ao banco de dados espacial para converter esse ponto em um sistema de coordenadas projetado apropriado para a área (unidades de pés ou metros, etc.).
  3. Crie sua área de interesse em torno do ponto projetado.
  4. Peça ao banco de dados espacial para converter essa área de interesse novamente em lat / lon.
  5. Faça as comparações que você precisa fazer.
Raven
fonte
0

Eu usei o que está nesta página

Ponto de destino dado a distância e rumo do ponto inicial

Fórmula:
lat2 = asin (sin (lat1) * cos (d / R) + cos (lat1) * sin (d / R) * cos (θ))
lon2 = lon1 + atan2 (sin (θ) * sin (d / R) * cos (lat1), cos (d / R) - sin (lat1) * sin (lat2))

θ é o rumo (em radianos, no sentido horário do norte); d / R é a distância angular (em radianos), onde d é a distância percorrida e R é o raio da Terra

Para θ, usei -45 graus (em radianos) para o "ponto superior esquerdo" e 135 graus para o "canto inferior direito"

(Recentemente, fiz a mesma pergunta no site de matemática )

juan
fonte
O problema com esta solução é que primeiro você precisa descobrir a distância para as diagonais do quadrado. É mais fácil mover-se ao longo da geodésica do centro para os pontos médios dos lados e, girando 90 graus, mover-se pelos lados do quadrado.
whuber
@ whuber, se a distância é pequena o suficiente, você não pode usar trigonometria simples para isso? (d = lado oposto / sin (lado adjacente). Faço isso porque não preciso que essa distância seja exata. Caso contrário, você poderia aplicar essa fórmula duas vezes para fazer exatamente o que diz (primeiro com θ = 0 e depois com θ = -90 para o canto superior esquerdo, por exemplo)
juan
Isso está correto, Juan. Mas fica-se perguntando por que você usa as fórmulas mais complicadas da geometria esférica quando começa com uma aproximação que supõe que as fórmulas euclidianas funcionem em primeiro lugar. Não há nada errado em usar as fórmulas esféricas, mas é desnecessário e computacionalmente ineficiente.
whuber
@whuber, para o segundo caso, não é aproximado (aplicando a fórmula duas vezes para cada lado). Você está certo que não faria sentido misturá-los. Na verdade, tenho esta implementado, mas vou mudá-lo (oh, ea razão é porque eu não sou tão bom em matemática :))
juan