Converter pontos XY em uma linha?


12

Alguém salvou por engano uma trilha de GPS como pontos de referência e depois as enviou para mim em um arquivo .csv. Eles querem uma linha de volta (shapefile). Qual é o método mais simples de converter isso em uma linha? As ferramentas disponíveis são Arcmap, gdal / ogr e qgis mais ou menos em ordem de preferência. Prefiro não instalar uma ferramenta adicional; um serviço de conversão online ficaria bem.

Latitude,Longitude,Date,Time,ampm,,,
60.71586,-135.07476,25/07/2010,9:26:15,PM,,,,,
60.71637,-135.07563,25/07/2010,9:26:12,PM,,,,,
60.71648,-135.07612,25/07/2010,9:26:11,PM,,,,,
60.71664,-135.07707,25/07/2010,9:26:09,PM,,,,,
60.71672,-135.07756,25/07/2010,9:26:08,PM,,,,,

O arquivo .csv tinha algumas dezenas de linhas de dados de lixo (mensagens ativas de início / parada de log etc.), das quais me livrei do expediente de classificar todas as colunas e, em seguida, excluindo as linhas que não eram de dados que flutuavam para o topo. Burro, eu sei (deve dormir mais!), Caso contrário, o plugin qgis Point2one provavelmente funcionaria, e os outros também. Graças às habilidades python da fmark, ambos os erros podem ser corrigidos, embora eu tenha que esperar até que eu volte ao escritório na próxima semana para verificar.
8118106

Respostas:


23

Parece que a coisa crucial que você deseja aqui é que os pontos na linha sejam classificados pelo tempo da captura, espalhados por três linhas da coluna. Embora você possa organizar os dados em uma planilha, geralmente acho que escrever um script rápido oferece a maior flexibilidade:

import csv
from datetime import datetime
try:
    from osgeo import ogr
except ImportError:
    import ogr

SHP_FILENAME = "output.shp"
CSV_FILENAME = "input.csv"

r = csv.reader(open(CSV_FILENAME, 'r'), delimiter=',', quotechar=None)
header = dict(((str, i) for i, str in enumerate(r.next())))

# load data rows into memory
rows = [row for row in r]

# sort by date and time ascending
rows.sort(key=lambda row: datetime.strptime(
        (row[header['Date']] + ' ' + row[header['Time']] + ' ' + 
         row[header['ampam']]), 
        '%d/%m/%Y %I:%M:%S %p'))

# Create new shapefile
ogr.UseExceptions()
ds = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource(SHP_FILENAME)
layer = ds.CreateLayer("data", None, ogr.wkbLineString)

# Create a new line geometry
line = ogr.Geometry(type=ogr.wkbLineString)

# Add GPS points to line
lon_idx, lat_idx = header['Longitude'], header['Latitude']
for row in rows:
    line.AddPoint(float(row[lon_idx]), float(row[lat_idx]))

# Add line as a new feature to the shapefile
feature = ogr.Feature(feature_def=layer.GetLayerDefn())
feature.SetGeometryDirectly(line)
layer.CreateFeature(feature)

# Cleanup
feature.Destroy()
ds.Destroy()

Agradável! Mantendo aquele.
Nathan W

este é o melhor tutorial para OGR, que eu já vi
dassouki

8

QGIS Plugin "Points2One" deve ser o que você está procurando.

Se você não marcar "Classificar pontos por este campo", o plug-in os conectará na ordem interna de pontos da camada. Usei sua amostra, organizei os pontos em uma ordem em zigue-zague e funcionou conforme o esperado:

insira a descrição da imagem aqui


Não, ele corresponde ponto a ponto com base na latitude e não seqüência de tempo, consulte imgur.com/d2Ycg.jpg Talvez com um pouco de massagem do csv para transformar a data e hora em 24 horas que pode funcionar melhor
Matt Wilkie

Diga-me onde posso baixar o plug-in points2one, se ainda estiver disponível. Quero fazer uma linha composta por pontos GPS e pontos adicionados manualmente (para suavizar as curvas).
Grey Shaw


3

O ArcGIS 10.0 possui uma ferramenta Points To Line .

Eu recomendo a leitura da documentação do ArcGIS 10.2 for Desktop , mas em resumo:

Cria recursos de linha a partir de pontos.

...

Cada recurso na saída será baseado em valores exclusivos no campo Linha.

...

Por padrão, os pontos usados ​​para criar cada recurso da linha de saída serão usados ​​na ordem em que forem encontrados. Se uma ordem diferente for desejada, especifique um Campo de Classificação.


Essa foi uma ferramenta útil para mim. É importante usar o campo de linha ou o campo de classificação para acertar (depende dos atributos). No meu caso, eu tive que usar a opção Campo da Linha (usando apenas o campo com o atributo de data e não data + hora) para que os dados entendessem que cada data criava uma nova linha.
Sue Deforest


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.