Визначення проекцій для декількох файлів у 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)

Але якщо я хочу визначити проекцію для декількох растрових файлів, що я можу зробити?

Відповіді:


29

Я думаю, ви, хлопці, переосмислили цю ...

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

alt текст


Це насправді генерує файл-помічник Shapefile .PRJ у папці ОС, чи просто анотувати атрибут шару? І вам також доведеться запустити ArcGIS. Сценарій Python, який поставив Джей, зробить свою роботу повністю поза ArcGIS, з певними результатами - корисними для потреб, що не належать до ESRI.
V Stuart Foote

Так, інструмент "Визначити проекцію" записує файл PRJ для всіх файлів форм, які обробляються через нього. Хоча я погоджуюся, що опублікований Джеєм сценарій, ймовірно, буде чудовим, сценарій часто виходить за рамки навичок середнього спеціаліста з ГІС, тоді як утиліта кнопки "Визначити проекцію" не є.
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

Вибачте, що додано перед тим, як я вставив помилку, ось це: Помилка виконання <тип 'винятків.
Ім'яError

oops ... імпорт допоможе !: import os, shutil (див. оновлену відповідь). docs.python.org/tutorial/stdlib.html якщо ви там.
Jay Cummins

9

Просто зробіть копії .prj та перейменуйте. Так, наприклад, якщо у вас є 3 файли форм:

  • one.shp,
  • two.shp,
  • три.шп.

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


4

Редагувати:

Напевно, найпростішим був би метод. Введіть їх усіх і призначте правильний crs документу. Вони були б "непроектованими", але сиділи в потрібному місці. Потім просто експортуйте (кілька разів) на нове місце.

Я бачу інструмент GP для пакетної проекції.

партія proj

Він може не піддаватися дузі. ??

Я думаю, я створив би pgdb (Файл, персональний або навіть sde), а потім створив би FDS (набір даних про функції).

Призначте відповідні crs до цього FDS.

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

Тоді ви можете експортувати файл у форму (кілька).

Це було б замість пакетної проекції, і я впевнений, що це могло б бути сценарієм.


Хоча цей метод і працює, це займає набагато більше часу, ніж те, що запропонував Райан Далтон. Імпорт понад 100 файлів форми в клас функцій відбувається дуже повільно.
wilbev


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)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.