Jeśli jest to plik csv, czy możesz użyć opcji Dodaj dane XY w aplikacji ArcMap, aby utworzyć warstwę, a następnie wyeksportować jako plik kształtu (warstwa kliknij i kliknij dane, eksportuj dane)?
mkennedy
Dzięki, ale chciałbym to zrobić, tworząc skrypt w języku Python. Nie ma potrzeby GIS
Trochę spóźniony, ale może też przydatny dla innych. Tak, można to zrobić za pomocą shapelyi geopandas.
Załóżmy, że twoja ramka danych pand wygląda tak:
import pandas as pd
data =[{'some_attribute':'abc','lat':'50.1234','lon':'10.4023'},{'some_attribute':'def','lat':'40.5678','lon':'8.3365'},{'some_attribute':'ghi','lat':'60.9012','lon':'6.2541'},{'some_attribute':'jkl','lat':'45.3456','lon':'12.5478'},{'some_attribute':'mno','lat':'35.7890','lon':'14.3957'},]
df = pd.DataFrame(data)print(df)=>
lat lon some_attribute050.123410.4023 abc140.56788.3365def260.90126.2541 ghi345.345612.5478 jkl435.789014.3957 mno
Po pierwsze, upewnij się, że geopandasi shapelysą poprawnie zainstalowane, co czasem nie jest łatwe, ponieważ mają pewne zależności (np. GEOS i GDAL). Jeśli nie działa za pierwszym razem, spróbuj pip install geopandas shapelywyszukać błąd w Google lub StackOverflow / Gis.Stackexchange, ponieważ najprawdopodobniej będzie dostępna odpowiedź rozwiązująca ten problem.
Następnie wystarczy utworzyć nową kolumnę geometrii w ramce danych, która łączy wartości lat i lon w shapely Point()obiekt. Zauważ, że Point()konstruktor oczekuje krotności wartości zmiennoprzecinkowych, więc konwersja musi zostać uwzględniona, jeśli typy kolumn kolumny ramki danych nie są jeszcze ustawione na float.
from shapely.geometry importPoint# combine lat and lon column to a shapely Point() object
df['geometry']= df.apply(lambda x:Point((float(x.lon), float(x.lat))), axis=1)
Teraz przekonwertuj pandy DataFrame na GeoDataFrame. Konstruktor geopandas oczekuje kolumny geometrii, która może składać się z kształtnych obiektów geometrii, więc stworzona przez nas kolumna jest w porządku:
Aby zrzucić ten GeoDataFrame do pliku kształtu, użyj to_file()metody geopandas (inne sterowniki obsługiwane przez Fiona, takie jak GeoJSONpowinny również działać):
Cześć, mam podobną sytuację, ale zamiast punktów mam wielokąty. Można zrobić coś podobnego df ['geometria'] = df.apply (lambda x: Point ((float (x.lon), float (x.lat))), axis = 1) ale z wielokątami?
Valerio D. Ciotti
4
W przypadku ArcMap musisz zdefiniować Projekcję przed eksportowaniem do Shapefile.
Zrobiłem coś podobnego, korzystając df.crs= "+init=epsg:27700"z projektu mojego pliku kształtu zgodnie z British National Grid. Jednak po otwarciu go w ArcGIS układ współrzędnych jest nieznany. Co ja robię źle?
Odpowiedzi:
Trochę spóźniony, ale może też przydatny dla innych. Tak, można to zrobić za pomocą
shapely
igeopandas
.Załóżmy, że twoja ramka danych pand wygląda tak:
Po pierwsze, upewnij się, że
geopandas
ishapely
są poprawnie zainstalowane, co czasem nie jest łatwe, ponieważ mają pewne zależności (np. GEOS i GDAL). Jeśli nie działa za pierwszym razem, spróbujpip install geopandas shapely
wyszukać błąd w Google lub StackOverflow / Gis.Stackexchange, ponieważ najprawdopodobniej będzie dostępna odpowiedź rozwiązująca ten problem.Następnie wystarczy utworzyć nową kolumnę geometrii w ramce danych, która łączy wartości lat i lon w
shapely Point()
obiekt. Zauważ, żePoint()
konstruktor oczekuje krotności wartości zmiennoprzecinkowych, więc konwersja musi zostać uwzględniona, jeśli typy kolumn kolumny ramki danych nie są jeszcze ustawione nafloat
.Teraz przekonwertuj pandy DataFrame na
GeoDataFrame
. Konstruktor geopandas oczekuje kolumny geometrii, która może składać się z kształtnych obiektów geometrii, więc stworzona przez nas kolumna jest w porządku:Aby zrzucić ten GeoDataFrame do pliku kształtu, użyj
to_file()
metody geopandas (inne sterowniki obsługiwane przez Fiona, takie jakGeoJSON
powinny również działać):I tak wygląda wynikowy plik kształtu, gdy jest wizualizowany za pomocą QGIS :
źródło
W przypadku ArcMap musisz zdefiniować Projekcję przed eksportowaniem do Shapefile.
źródło
df.crs= "+init=epsg:27700"
z projektu mojego pliku kształtu zgodnie z British National Grid. Jednak po otwarciu go w ArcGIS układ współrzędnych jest nieznany. Co ja robię źle?