Mais

Determine o deslocamento XY em metros entre dois pontos de latitude / longitude (EPSG: 4326) e recrie com precisão as localizações dos pontos usando o deslocamento XY


Tenho duas tabelas no EPSG: 4326, uma para locais residenciais e outra para locais. Preciso ser capaz de gerar o deslocamento XY em metros entre o local inicial e os locais do local. Em seguida, preciso ser capaz de regenerar com precisão os locais do site, com base no deslocamento XY do local de origem. Atualmente, quando utilizo ST_Project para recriar um local do site usando o deslocamento XY especificado do local inicial. Os resultados estão ligeiramente errados na direção Y. Gerar linhas usando a mesma lógica usada para calcular o deslocamento é preciso. Meu ambiente é PostgreSQL 9.4.1 PostGIS 2.1.

O script SQL são meus dados de teste para esse problema. As tabelas de teste inicial e local são as duas tabelas armazenadas em EPSG: 4326. A tabela de sites contém um campo delta_x e delta_y que representa o deslocamento X e Y em metros. A visualização offset_lines contém linhas geradas usando uma lógica semelhante à usada para calcular o deslocamento. Essas linhas parecem precisas e terminam no local exato do site. A visualização points_using_offsets é uma visualização dos locais do site gerados usando os deslocamentos do local inicial e o comando ST_Project. Esses locais estão todos ligeiramente deslocados na direção Y.

CREATE TABLE home (gid integer, geog geography (Point, 4326)); CREATE TABLE sites (gid integer, geog geography (Point, 4326), delta_x float, delta_y float); inserir valores iniciais (gid, geog) (1, ST_MakePoint (-78.9570, 41.6241) :: geografia); inserir em sites (gid, geog) valores (1, ST_MakePoint (-79.1133, 41.7690) :: geografia); inserir em sites (gid, geog) valores (2, ST_MakePoint (-78.7726, 41.7801) :: geografia); inserir em sites (gid, geog) valores (3, ST_MakePoint (-78.7753, 41.4041) :: geografia); inserir em sites (gid, geog) valores (4, ST_MakePoint (-79.4226, 41.5032) :: geografia); ATUALIZAR sites AS st set delta_x = foo.delta_x, delta_y = foo.delta_y FROM (SELECT CASE WHEN ST_X (s.geog :: geometry)  0 e delta_y> 0 THEN ST_Project (ST_Project (h.geog, abs (s.delta_x), radianos (90)), abs (s.delta_y), radianos (0)) WHEN delta_x> 0 e delta_y <0 THEN ST_Project (ST_Project (h.geog, abs (s.delta_x), radianos (90)), abs (s.delta_y), radianos (180)) WHEN delta_x <0 e delta_y <0 ENTÃO ST_Projeto (ST_Projeto (h.geog, abs (s.delta_x), radianos (270)), abs (s.delta_y), radianos (180)) QUANDO delta_x <0 e delta_y> 0 ENTÃO ST_Projeto (ST_Projeto (h.geog , abs (s.delta_x), radianos (270)), abs (s.delta_y), radianos (0)) END as geom, s.gid as gid FROM home as h, sites as s;

Você está pensando em cartesiano e operando em geodésica. Se você realmente deseja fazer delta_x / delta_y, faça o trabalho em geometria em algum espaço projetado, não em geografia. Se você quiser usar geografia, não use delta_x / delta_y, use distância / direção, gerada usando ST_Distance (geog, geog) e ST_Azimuth (geog, geog).

(Às vezes é difícil de visualizar, mas se você quiser chegar a um ponto diretamente a oeste de você, em geodética, você não define sua direção "oeste". Se você estiver no hemisfério norte, defina seu direção "verdadeiro oeste e um pouco norte" e se você estiver no sul, "verdadeiro oeste e um pouco sul". Quanto mais longe estiver o seu ponto de destino, mais pronunciado será o efeito, até chegar a rotas aéreas transcontinentais, onde você pode voar sobre o pólo para chegar entre dois locais que estão na mesma latitude. Tudo isso porque a distância mais curta entre dois pontos na geodética é um grande círculo, que segue linhas long / lat se seus dois pontos forem exatamente ao norte / sul um do outro.)


Assista o vídeo: Convert List Koordinat UTM ke Geographic Long, Lat menggunakan ArcGis (Outubro 2021).