Xác định các phép chiếu cho nhiều shapefile trong ArcMap?


29

Tôi có hơn 100 tệp hình dạng không có tệp .prj và do đó khi tôi đưa chúng vào ArcMap 10, chúng hiển thị hệ tọa độ là không xác định. Tôi biết tất cả các hệ tọa độ tệp hình dạng là GCS WGS 1984. Tôi cũng biết rằng tôi có thể sử dụng công cụ Define Projection GP để gán riêng hệ thống tọa độ cho mỗi tệp nhưng sẽ mất mãi mãi.

Tôi đã hy vọng có một công cụ GP để xác định hàng loạt những cái này nhưng tôi không thấy cái nào cả. Tiếp theo tôi đã nghĩ có lẽ tôi có thể sử dụng python để làm điều này vì vậy tôi đã xem trong menu trợ giúp và tìm thấy một tập lệnh nhưng nó gây ra lỗi cho tôi.

Đây là mã python tôi đã thử (đây là cho một tệp shp duy nhất vì vậy tôi vẫn cảm thấy khó khăn khi gõ tên cho mỗi tệp:

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)

Nhưng nếu tôi muốn xác định phép chiếu cho các tệp raster, tôi có thể làm gì?

Câu trả lời:


29

Tôi nghĩ rằng các bạn đang xem xét lại điều này ...

  1. Nhấp chuột phải vào công cụ "Xác định phép chiếu" trong hộp công cụ,
  2. chọn "Mẻ",
  3. kéo và thả các lớp của bạn vào cột "Bộ dữ liệu đầu vào",
  4. nhấp chuột phải vào hộp "Hệ thống tọa độ" đầu tiên để điền vào hình chiếu chính xác,
  5. sau đó nhấp chuột phải vào hình chiếu bạn vừa chọn và chọn "Điền" sẽ điền vào tất cả các phần còn lại của các hình chiếu cho bạn.
  6. Nhấn "OK" và bạn đã hoàn tất.

văn bản thay thế


Điều đó thực sự tạo ra tệp trợ giúp Shapefile .PRJ trong thư mục HĐH hay chỉ chú thích một thuộc tính lớp? Và bạn cũng phải khởi chạy ArcGIS. Kịch bản Python mà Jay đưa ra sẽ thực hiện công việc của nó hoàn toàn bên ngoài ArcGIS, với một số kết quả nhất định - tốt cho các nhu cầu không phải ESRI.
V Stuart Foote

Có, công cụ "Xác định phép chiếu" ghi tệp PRJ cho tất cả các shapefile được xử lý thông qua nó. Mặc dù tôi đồng ý rằng kịch bản python mà Jay đã đăng có thể sẽ hoạt động rất tốt, nhưng kịch bản thường nằm ngoài bộ kỹ năng của một chuyên gia về GIS trung bình, trong khi tiện ích "Xác định dự đoán" bằng nút nhấn thì không.
RyanDalton

1
Cảm ơn Ryan, tôi không biết rằng bạn có thể nhấp chuột phải vào công cụ GP để có thêm tùy chọn. Đó là một mẹo hay và chỉ là những gì tôi đang tìm kiếm. Nhiều đánh giá cao.
wilbev

13

Nếu chúng nằm trong cùng một thư mục, một cái gì đó như thế này sẽ hoạt động (chỉ cần thay thế đường dẫn của bạn, có thể thêm vào một số xử lý ngoại lệ):

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))

Tôi đã thử tuyến đường này vì tôi muốn học cách sử dụng Python nhiều hơn nhưng tôi đã không thành công. Đó là lỗi trên tên 'os'. Tôi dán trong thông báo lỗi dưới đây. Bất kỳ ý tưởng những gì có thể sai?
wilbev

Xin lỗi đã được thêm trước khi tôi dán lỗi, đây là: Lỗi thời gian chạy <loại 'ngoại
lệ.NameError

Rất tiếc ... việc nhập khẩu sẽ giúp!: import os, shutil (xem câu trả lời được cập nhật). docs.python.org/tutorial/stdlib.html nếu bạn ở đó.
Jay Cummins

9

Chỉ cần tạo các bản sao của .prj và đổi tên. Vì vậy, ví dụ, nếu bạn có 3 shapefiles:

  • một.shp,
  • hai.shp,
  • ba.shp.

Xác định phép chiếu cho one.shp và bạn sẽ có one.prj trong thư mục. Sao chép one.prj vào thư mục của Two.shp và đổi tên thành hai.prj, lặp lại cho tất cả các shapefiles. .Prj chỉ là một tệp văn bản. Miễn là có .prj trong cùng thư mục với .shp và có cùng tên, phần mềm sẽ chọn nó. Tự động hóa với bất kỳ công cụ nào bạn quen thuộc để sao chép và đổi tên tệp.


4

Chỉnh sửa:

Có lẽ phương pháp dễ nhất sẽ là. Mang tất cả vào và gán crs chính xác cho tài liệu. Họ sẽ "không được cung cấp" nhưng ngồi đúng chỗ. Sau đó, chỉ cần xuất (nhiều) đến một vị trí mới.

Tôi thấy một công cụ GP để chiếu hàng loạt.

lô proj

Nó có thể không được tiếp xúc trong arcpy. ??

Tôi nghĩ rằng tôi sẽ tạo một pgdb, (Tệp, cá nhân hoặc thậm chí là sde) và sau đó tạo một fds (tập dữ liệu tính năng).

Chỉ định các crs thích hợp cho fds đó.

Nhập tệp hình dạng (nhiều). [tất cả fc trong một fds thừa hưởng crs của fds].

Sau đó, bạn có thể xuất thành hình dạng tập tin (nhiều).

Điều này sẽ thay cho phép chiếu theo đợt và tôi chắc chắn có thể được viết kịch bản.


Mặc dù phương pháp này không hiệu quả, nhưng nó mất nhiều thời gian hơn những gì Ryan Dalton đề xuất. Việc nhập hơn 100 tệp hình dạng vào một lớp đối tượng là rất chậm.
wilbev


1

Đây là những gì tôi sử dụng ... nó sẽ chỉ xác định phép chiếu cho các tệp raster không có phép chiếu. Hy vọng nó giúp. Nó cũng tạo ra một danh sách các tệp mà không cần chiếu cho mục đích Đảm bảo chất lượng.

Đối với các vectơ của bạn, nó chỉ cần một mod nhỏ - FileList = arcpy.ListFeatureC Cầu ()

# 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)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.