Определение проекций для нескольких шейп-файлов в ArcMap?

29

У меня есть более 100 файлов форм, которые не имеют файла .prj, и поэтому, когда я переносу их в ArcMap 10, они показывают систему координат как неизвестную. Я знаю, что все системы координат файлов форм - это GCS WGS 1984. Я также знаю, что могу использовать инструмент «Определить проекцию GP», чтобы индивидуально назначить систему координат каждому файлу, но это займет вечность.

Я надеялся, что есть инструмент GP для пакетного определения, но я его не вижу. Затем я подумал, может быть, я мог бы использовать Python для этого, поэтому я заглянул в меню справки и нашел скрипт, но он выдает ошибку.

Вот код Python, который я пробовал (это для одного файла shp, поэтому мне все равно придется набирать имя для каждого файла:

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
источник
Но если я хочу определить проекцию для нескольких растровых файлов, что я могу сделать?

Ответы:

29

Я думаю, что вы, ребята, задумываетесь над этим ...

  1. Щелкните правой кнопкой мыши инструмент «Определить проекцию» на панели инструментов,
  2. выберите «Пакет»,
  3. перетащите слои в столбец «Исходный набор данных»,
  4. щелкните правой кнопкой мыши в первом поле «Система координат», чтобы заполнить правильный прогноз,
  5. затем щелкните правой кнопкой мыши на выбранной вами проекции и выберите «Заполнить», чтобы заполнить все остальные проекции для вас.
  6. Нажмите «ОК», и все готово.

альтернативный текст

RyanDalton
источник
Создает ли это на самом деле вспомогательный файл Shapefile .PRJ в папке ОС или просто аннотирует атрибут слоя? И вам нужно будет запустить ArcGIS. Сценарий Python, который поставил Jay, будет работать полностью вне ArcGIS, с определенными результатами - хорошо для нужд не ESRI.
V Стюарт Фут
Да, инструмент «Определить проекцию» записывает файл PRJ для всех шейп-файлов, которые обрабатываются через него. Хотя я согласен с тем, что сценарий Python, который выложил Джей, будет, вероятно, работать отлично, сценарии часто выходят за рамки навыков среднего специалиста по ГИС, а кнопка «Определить проекцию» - нет.
RyanDalton
1
Спасибо, Райан, я не представляю, что вы можете щелкнуть правой кнопкой мыши на инструменте GP, чтобы получить больше опций. Это хороший трюк, и это было именно то, что я искал. Очень признателен.
wilbev
13

Если они находятся в одном и том же каталоге, будет работать что-то вроде этого (просто замените ваши пути, возможно, добавьте некоторую обработку исключений):

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))
Джей Камминс
источник
Я попробовал этот маршрут, потому что я хочу научиться использовать Python больше, но у меня не получилось. Ошибка в имени 'os'. Я вставил в сообщение об ошибке ниже. Есть идеи, что может быть не так?
wilbev
Извините, что был добавлен до того, как я вставил ошибку, вот она: Ошибка времени выполнения <тип 'exceptions.NameError'>: имя 'os' не определено
wilbev
упс ... импорт помог бы !: import os, shutil (см. обновленный ответ). docs.python.org/tutorial/stdlib.html если вы там.
Джей Камминс
9

Просто сделайте копии .prj и переименуйте. Так, например, если у вас есть 3 шейп-файла:

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

Определите проекцию для one.shp, и вы получите one.prj в каталоге. Скопируйте one.prj в каталог two.shp и переименуйте в two.prj, повторите для всех шейп-файлов. .Prj - это просто текстовый файл. Пока .prj находится в том же каталоге, что и .shp и с тем же именем, программное обеспечение будет его забирать. Автоматизируйте с помощью любых знакомых вам инструментов для копирования и переименования файлов.

Шон
источник
4

Редактировать:

Вероятно, самый простой способ будет. Принесите их все и назначьте правильный документ для документа. Они были бы "непроектированными", но сидели бы в правильном месте. Затем просто экспортируйте (несколько) в новое место.

Я вижу инструмент GP для групповой проекции.

пакетный проект

Это не может быть выставлено в arcpy. ??

Я думаю, что я создал бы pgdb (File, personal или даже sde), а затем создал fds (набор данных функций).

Назначьте соответствующие crs для этого fds.

Импортируйте файлы форм (несколько). [все fc в fds наследуют crs of fds].

Затем вы можете экспортировать в файл формы (несколько).

Это будет вместо пакетного проецирования, и я уверен, что можно было бы написать сценарий.

Брэд Несом
источник
Хотя этот метод работает, он занимает гораздо больше времени, чем предложил Райан Далтон. Импорт более 100 файлов форм в класс пространственных объектов выполняется очень медленно.
Уилбев
1

Вот что я использую ... он будет определять проекцию только для растровых файлов, у которых нет проекции. Надеюсь, это поможет. Он также создает список файлов без проекции в целях обеспечения качества.

Для ваших векторов просто нужен небольшой мод - 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; georgec@atgis.com.au, coreagc@gmail.com

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
источник