รับละติจูดและลองจิจูดของจุดที่ฉายโดยใช้ ArcPy? [ปิด]


13

ฉันมีคุณสมบัติจุดในคลาสคุณลักษณะที่ ArcPy เข้าถึงได้ คาดว่าจะมีจุด แต่ฉันต้องหาวิธีที่มีประสิทธิภาพเพื่อให้ได้ละติจูดและลองจิจูดที่ไม่มีโครงการสำหรับจุดนี้

มีวิธีอื่นนอกเหนือจากการปฏิเสธ (ไม่ได้คาดการณ์) รับเคอร์เซอร์ค้นหาในคลาสคุณลักษณะใหม่การค้นหาสถานที่จากนั้นนำ lat / lon ออกจากรูปร่างของสถานที่หรือไม่

คำตอบ:


6

SearchCursor สนับสนุนการระบุ reference- เชิงพื้นที่ในกรณีนี้คุณจะต้องการภูมิศาสตร์ระบบพิกัดเช่น WGS 1984 แล้วคุณย้ำผ่านเคอร์เซอร์และคว้า x & Y จากรูปร่างดูที่นี่


6

คำตอบอื่น ๆ ส่วนใหญ่ถูกโพสต์เมื่อ ArcGIS 10.0 เป็นซอฟต์แวร์ล่าสุด ที่ ArcGIS 10.1 ฟังก์ชั่นใหม่ของ ArcPy นั้นมีวางจำหน่ายแล้ว คำตอบนี้ใช้ประโยชน์จากฟังก์ชั่นใหม่นั้น มันจะไม่เหมาะสำหรับ 10.0 แต่มีประสิทธิภาพและการทำงานที่เพิ่มขึ้นสำหรับ 10.1 และใหม่กว่า

import arcpy

input_feature_class = 'C:\your_feature_class.shp'
wkid = 4326 # wkid code for wgs84
spatial_reference = arcpy.SpatialReference(wkid)

fields_to_work_with = ['SHAPE@']

with arcpy.da.SearchCursor(input_feature_class,
                           fields_to_work_with) as s_cur:
    for row in s_cur:
        point_in_wgs84 = row[0].projectAs(spatial_reference)
        print point_in_wgs84.firstPoint.X, point_in_wgs84.firstPoint.Y

ข้อมูลโค้ดนี้ใช้wkidที่จะสร้างวัตถุอ้างอิงเชิงพื้นที่มากกว่าการพิมพ์ออกมาเป็นตัวแทนสตริงใช้ที่ทันสมัยมากขึ้นเคอร์เซอร์การเข้าถึงข้อมูลและโครงการเรขาคณิตแต่ละวัตถุที่ใช้ projectAs วิธี


คำตอบที่ดี ฉันก็จะแนะนำให้สลับ X และ Y ในการพิมพ์เพราะใน WGS84 คำสั่งที่พบบ่อยคือ lat / ยาว
radouxju

ง่ายยิ่งขึ้นเพียงแค่ทำสิ่งนี้ srs = arcpy.SpatialReference (4326) xy_coords = arcpy.da.FeatureClassToNumPyArray (input_feature_class, 'SHAPE @ XY', spatial_reference = srs) พิมพ์ (xy_coords)
dfresh22

5

เพื่ออธิบายรายละเอียดเกี่ยวกับข้อเสนอแนะของ James ต่อไปนี้เป็นตัวอย่างโค้ดขั้นต่ำโดยใช้ Python / arcpy:

import arcpy

def main():
    projectedPointFC = r'c:\point_test.shp'
    desc = arcpy.Describe(projectedPointFC)
    shapefieldname = desc.ShapeFieldName

    rows = arcpy.SearchCursor(projectedPointFC, r'', \
                              r'GEOGCS["GCS_WGS_1984",' + \
                              'DATUM["D_WGS_1984",' + \
                              'SPHEROID["WGS_1984",6378137,298.257223563]],' + \
                              'PRIMEM["Greenwich",0],' + \
                              'UNIT["Degree",0.017453292519943295]]')

    for row in rows:
        feat = row.getValue(shapefieldname)
        pnt = feat.getPart()
        print pnt.X, pnt.Y

if __name__ == '__main__':
    main()

4

ไม่ว่าคุณจะเรียกมันว่าฉายภาพหรือไม่ก็ตามผมค่อนข้างแน่ใจว่าตามคำนิยามเมื่อคุณกำลังแปลค่าพิกัดจากระบบอ้างอิงเชิงพื้นที่หนึ่งไปยังอีกระบบหนึ่งคุณก็กำลังฉายอีกครั้ง

ฉันไม่คุ้นเคยกับ ArcPy แต่ใน arcgisscripting ที่ 9.3 คุณจะต้องฉายคลาสฟีเจอร์ทั้งหมด

ขึ้นอยู่กับความซับซ้อนของอัลกอริธึมการฉายภาพ / การเปลี่ยนรูปแบบที่คุณต้องการคุณสามารถหมุนการฉายภาพของคุณเองเพื่อหาพิกัดในคณิตศาสตร์ไพ ธ อนขั้นพื้นฐาน สิ่งนี้จะช่วยให้คุณสามารถประสานการประมาณการค่าที่ระดับคุณสมบัติ

หากคุณเปิดให้ใช้การผูก Python ของ OGR คุณสามารถฉายภาพที่ระดับสถานที่ภายในบางสิ่งเช่น 'เคอร์เซอร์ค้นหา'


น่าเสียดายที่ฉันไม่สามารถใช้สิ่งที่ไม่ใช่ ESRI กับสคริปต์ที่ฉันใช้ แม้ว่า ESRI จะใช้ OGR และ GDAL (อย่าบอกใครเลยใช่ไหม) ...
Kenton W

ในความเป็นจริงเส้นทางที่ดีกว่าอาจจะหาวิธีใช้ PROJ4 โดยตรงบนพิกัดอินพุตอย่างใด
Kenton W

@Kenton - นั่นรวมถึงอัลกอริทึมที่กำหนดเองของคุณเอง (ตามรหัสที่มีอยู่) หรือไม่? หากคุณต้องการแปลง UTM -> WGS84 ฉันมีรหัสที่จะทำเช่นนั้นในหลามฉันสามารถโพสต์ได้ อีกวิธีหนึ่งคุณสามารถแยกอัลกอริทึมที่ต้องการจาก Proj4 และใช้สิ่งนั้นแทน หรือถ้าคุณถูก จำกัด ให้ใช้รหัส ESRI (และไม่ต้องการฉายคลาสคุณลักษณะทั้งหมดตามที่แนะนำ) ให้เขียนไลบรารี C อย่างง่ายไปยังโปรเจ็กต์โดยใช้ ArcObjects แล้วเรียกมันจาก Python โดยใช้ ctypes หรือติดกับ arcpy และฉายคลาสฟีเจอร์ทั้งหมด :(
Sasa Ivetic

@Kenton - การค้นหาอย่างรวดเร็วส่งคืน pyproj ( code.google.com/p/pyproj ) คุณสามารถดูตัวอย่างของวิธีใช้ไพ ธ อนเพื่อเรียกไลบรารี Proj4
Sasa Ivetic

@Kenton - ถ้าเป็น UTM NAD83 => การคาดการณ์ทางภูมิศาสตร์ WGS84 ที่ไม่มีการแปลงตัวเลขคุณควรจะสามารถใช้อัลกอริทึมในไพ ธ อนบริสุทธิ์ได้ สมการอยู่ในหนังสือของสไนเดอร์: onlinepubs.er.usgs.gov/djvu/PP/PP_1395.pdf ฉันมีฟังก์ชั่น Oracle PL / SQL ที่ทำสิ่งนี้ถ้าคุณต้องการรหัส ฉันได้รับหมายที่จะพอร์ตฟังก์ชันนี้เพื่อหลาม แต่มักจะใช้เพียง OGR / OSR ...
DavidF

4

ที่ ArcPy 10.0 ไม่มีความสามารถในการแสดงรูปทรงเรขาคณิตของแต่ละบุคคล อย่างไรก็ตามคุณสามารถสร้างชุดคุณลักษณะ (หรือคลาสคุณลักษณะในหน่วยความจำ) และโครงการที่แทนคลาสฟีเจอร์เต็มรูปแบบในพื้นที่ทำงานบนดิสก์หรือในฐานข้อมูลบางแห่ง


ซึ่งเป็นสิ่งที่ฉันหวังว่าจะหลีกเลี่ยง ทำให้ฉันต้องการพลังที่คุณจะได้รับใน. Net ด้วย ArcObjects ...
Kenton W

0

เหตุผลหลักที่ฉันไม่เห็นว่าต้องการสร้างคลาสคุณลักษณะเป็นเพราะ arcpy.CreateFeatureclass_management อาจช้า คุณยังสามารถใช้ arcpy.da.NumPyArrayTofeatureClass ซึ่งเป็นอินสแตนซ์ที่เพิ่มมากขึ้นหรือน้อยลงสำหรับคลาสคุณสมบัติ in_memory:

In [1]: import arcpy

In [2]: import numpy as np

In [3]: geosr = arcpy.SpatialReference('Geographic Coordinate Systems/Spheroid-based/WGS 1984 Major Auxiliary Sphere')

In [4]: tosr = arcpy.SpatialReference('Projected Coordinate Systems/World/WGS 1984 Web Mercator (auxiliary sphere)')

In [5]: npai=list(enumerate(((-115.12799999956881, 36.11419999969922), (-117, 38.1141))))

In [6]: npai
Out[6]: [(0, (-115.12799999956881, 36.11419999969922)), (1, (-117, 38.1141))]

In [7]: npa=np.array(npai, np.dtype(([('idfield', np.int32), ('XY', np.float, 2)])))

In [8]: npa
Out[8]: 
array([(0, [-115.12799999956881, 36.11419999969922]),
       (1, [-117.0, 38.1141])], 
      dtype=[('idfield', '<i4'), ('XY', '<f8', (2,))])

In [9]: fcName = arcpy.CreateScratchName(workspace='in_memory', data_type='FeatureClass')

In [10]: arcpy.da.NumPyArrayToFeatureClass(npa, fcName, ['XY'], geosr)

In [11]: with arcpy.da.SearchCursor(fcName, 'SHAPE@XY', spatial_reference=tosr) as cur:
    ...:     print list(cur)
    ...:     
[((-12815990.336048, 4316346.515041453),), ((-13024380.422813002, 4595556.878958654),)]

-1
import arcpy
dsc = arcpy.Describe(FC)
cursor = arcpy.UpdateCursor(FC, "", "Coordinate Systems\Geographic Coordinate   Systems\World\WGS 1984.prj")
for row in cursor:
  shape=row.getValue(dsc.shapeFieldName)
  geom = shape.getPart(0)
  x = geom.X
  y = geom.Y
  row.setValue('LONG_DD', x)
  row.setValue('LAT_DD', y)
  cursor.updateRow(row)

del cursor, row
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.