Definiowanie rzutów dla wielu plików kształtów w ArcMap?

29

Mam ponad 100 plików kształtów, które nie mają pliku .prj, a więc kiedy wprowadzam je do ArcMap 10, pokazują układ współrzędnych jako nieznany. Wiem, że wszystkie układy współrzędnych plików kształtów to GCS WGS 1984. Wiem też, że mogę użyć narzędzia Define Projection GP, ​​aby indywidualnie przypisać układ współrzędnych do każdego pliku, ale zajmie to wieczność.

Miałem nadzieję, że istnieje narzędzie GP do zdefiniowania partii, ale nie widzę żadnego. Następnie pomyślałem, że może mógłbym to zrobić za pomocą Pythona, więc zajrzałem do menu pomocy i znalazłem skrypt, ale wyświetla mi się błąd.

Oto kod w Pythonie, który wypróbowałem (dotyczy pojedynczego pliku shp, więc nadal będę miał problem z wpisaniem nazwy dla każdego pliku:

import arcpy
infc = r"C:\Documents and Settings\User\My Documents\ArcGIS\shpfiles\Site_2.shp"
prjfile = r"<install directory>\Coordinate Systems\Geographic Coordinate Systems\World\WGS 1984.prj"
arcpy.DefineProjection_management(infc, prjfile)
wilbev
źródło
Ale jeśli chcę zdefiniować projekcję dla plików z wieloma rastrami, co mogę zrobić?

Odpowiedzi:

29

Myślę, że przesadzacie z tym ...

  1. Kliknij prawym przyciskiem myszy narzędzie „Definiowanie projekcji” w przyborniku,
  2. wybierz „Partia”,
  3. przeciągnij i upuść warstwy w kolumnie „Zestaw danych wejściowych”,
  4. kliknij prawym przyciskiem myszy pierwsze pole „Układ współrzędnych”, aby wypełnić prawidłową projekcję,
  5. następnie kliknij prawym przyciskiem myszy właśnie wybraną projekcję i wybierz „Wypełnij”, która wypełni wszystkie pozostałe projekcje.
  6. Naciśnij „OK” i gotowe.

alternatywny tekst

RyanDalton
źródło
Czy to faktycznie generuje plik pomocnika Shapefile .PRJ w folderze systemu operacyjnego, czy po prostu adnotuje atrybut warstwy? Musisz także uruchomić ArcGIS. Skrypt napisany przez Jona w języku Python wykona swoją pracę całkowicie poza ArcGIS, z pewnymi wynikami - dobrymi dla potrzeb innych niż ESRI.
V Stuart Foote,
Tak, narzędzie „Definiowanie projekcji” zapisuje plik PRJ dla wszystkich przetwarzanych przez niego plików kształtów. Chociaż zgadzam się, że skrypt Pytona, który Jay opublikował, prawdopodobnie będzie działał świetnie, skrypty często wykraczają poza zestaw umiejętności przeciętnego specjalisty ds. GIS, podczas gdy przycisk „Define Projection” nie jest dostępny.
RyanDalton,
1
Dzięki Ryan, nie mam pojęcia, że ​​można kliknąć prawym przyciskiem myszy narzędzie GP, aby uzyskać więcej opcji. To niezła sztuczka i właśnie tego szukałem. Bardzo mile widziane.
wilbev
13

Jeśli znajdują się w tym samym katalogu, coś takiego działałoby (wystarczy zamienić ścieżki, może dodać obsługę wyjątków):

import os, shutil

wgs84prjpath='c:/Program Files/ArcGIS/Desktop10.0/Coordinate Systems/Geographic Coordinate Systems/World/WGS 1984.prj'

def definewgs84(shpfilepath):
    tgtpath = os.path.splitext(shpfilepath)[0] + '.prj'
    shutil.copyfile(wgs84prjpath,tgtpath)


yourshapefiledirectory='C:/temp/'
extension='shp'

shpfileslist = [file for file in os.listdir(yourshapefiledirectory) if file.lower().endswith(extension)]

for filename in shpfileslist:
    definewgs84(os.path.join(yourshapefiledirectory,filename))
Jay Cummins
źródło
Próbowałem tej trasy, ponieważ chcę nauczyć się więcej korzystać z Pythona, ale nie udało mi się. Błąd w nazwie „os”. Wkleiłem poniższy komunikat o błędzie. Wszelkie pomysły, co może być nie tak?
wilbev
Przepraszam, że został dodany przed wklejeniem w błędzie, oto on: Błąd w czasie wykonywania <wyjątki „wpisz”. Nazwa Błąd ”>: nazwa„ os ”nie jest zdefiniowana
wilbev
oops ... import pomógłby !: import os, shutil (patrz zaktualizowana odpowiedź). docs.python.org/tutorial/stdlib.html powinien tam być.
Jay Cummins
9

Po prostu wykonaj kopię pliku .prj i zmień nazwę. Na przykład, jeśli masz 3 pliki kształtów:

  • one.shp,
  • two.shp,
  • three.shp.

Zdefiniuj rzut dla one.shp, a będziesz mieć plik one.prj w katalogu. Skopiuj one.prj do katalogu two.shp i zmień nazwę na two.prj, powtórz dla wszystkich plików kształtów. .Prj to tylko plik tekstowy. O ile plik .prj znajduje się w tym samym katalogu co plik .shp i ma taką samą nazwę, oprogramowanie go pobierze. Zautomatyzuj za pomocą wszystkich znanych Ci narzędzi do kopiowania i zmiany nazw plików.

Sean
źródło
4

Edytować:

Prawdopodobnie najłatwiejsza byłaby metoda. Wprowadź je wszystkie i przypisz poprawne crs do dokumentu. Byliby „nie rzucani”, ale siedzieli we właściwym miejscu. Następnie wystarczy wyeksportować (wiele) do nowej lokalizacji.

Widzę narzędzie GP do projekcji wsadowej.

partia ws

Nie może być narażony na łuk. ??

Myślę, że stworzyłbym pgdb, (plik, osobisty lub nawet sde), a następnie stworzyłem fds (zestaw danych funkcji).

Przypisz odpowiednie crs do tego fds.

Zaimportuj pliki kształtów (wiele). [wszystkie fc w fds dziedziczą crs z fds].

Następnie możesz wyeksportować do pliku kształtu (wiele).

Byłoby to zamiast projekcji wsadowej i jestem pewien, że można by ją napisać.

Brad Nesom
źródło
Chociaż ta metoda działa, zajmuje znacznie więcej czasu niż sugerował Ryan Dalton. Import ponad 100 plików kształtów do klasy elementów jest bardzo wolny.
wilbev
1

Oto, czego używam ... zdefiniuje tylko projekcję dla plików rastrowych, które nie mają projekcji. Mam nadzieję, że to pomoże. Tworzy również listę plików bez projekcji dla celów zapewnienia jakości.

Dla twoich wektorów potrzebuje tylko niewielkiej modyfikacji - FileList = arcpy.ListFeatureClasses ()

# Defines projection for all rasters with undefined projection
# CAUTION - make sure you know that the projection you are defining is the correct one
# for all files in the current directory.

#Licence: Creative Commons
#Created by: George Corea; [email protected], [email protected]

import arcpy, glob, os, sys, arcgisscripting
from arcpy import env, mapping
path = os.getcwd()
env.workspace = path
env.overwriteOutput = True

print 'Reading files from ' + path
os.chdir(path)
prjFile=r'C:\\Python26\\GDA_1994_MGA_Zone_55.prj'

x=0
z=x+1
NoProjCount=0
FileList= arcpy.ListRasters()
for File in FileList:
    desc = arcpy.Describe(File)
    SR = desc.spatialReference
    if SR.name == "Unknown":
        print "Projection of " + str(File) + " is " + SR.name + " so defining projection."
        f = open('NoProjection.txt', 'a')
        f.write(str(File)+"\n")
        f.close()
        arcpy.DefineProjection_management(File, prjFile) 
        NoProjCount=NoProjCount+1
    else:    
        print File + " is projected " + str(SR.name)
GeorgeC
źródło