ArcPy kullanarak yansıtılan noktanın enlem ve boylamını mı alıyorsunuz? [kapalı]


13

ArcPy tarafından erişilen bir özellik sınıfında bir nokta özelliği var. Nokta öngörülüyor, ancak bu nokta için öngörülmemiş enlem ve boylamı elde etmek için etkili bir yol bulmam gerekiyor.

Yeni özellik sınıfında bir arama imleci almak, özelliği bulmak, daha sonra lat / lon özelliğin şeklini almaktan başka bir şey yapmamaktan (projeksiyon yapmaktan) başka bir yöntem var mı?

Yanıtlar:


6

SearchCursor, uzamsal bir referans belirtmeyi destekler; bu durumda, WGS 1984 gibi bir Coğrafi Koordinat Sistemi istersiniz. Sonra imleç üzerinden yinelenir ve x & y şeklinden alınır, buraya bakın .


6

Diğer cevapların çoğu ArcGIS 10.0 en son yazılım olduğunda yayınlandı. ArcGIS 10.1'de çok sayıda yeni ArcPy işlevselliği kullanıma sunuldu. Bu yanıt, bu yeni işlevsellikten yararlanır. 10.0 için uygun olmayacak, ancak 10.1 ve sonrası için daha yüksek performans ve işlevsellik sunuyor.

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

Bu kod parçacığını kullanarak wkid için uzamsal bir referans nesnesi yaratmak yerine bir dizi gösterimi üzerinden yazmak yerine, daha modern kullanan veri erişim imleçler ve proje tek geometri () metodu projectAs kullanılarak nesneleri .


güzel cevap. Baskıda X ve Y'yi değiştirmenizi öneririm, çünkü
WGS84'te

daha basit, sadece bunu yap. srs = arcpy.SpatialReference (4326) xy_coords = arcpy.da.FeatureClassToNumPyArray (input_feature_class, 'SHAPE @ XY', uzamsal_referans = srs) print (xy_coords)
dfresh22

5

James'in önerisini detaylandırmak için Python / arcpy kullanarak minimal bir kod örneği:

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

İster projeksiyon olsun ya da olmasın, tanım gereği, koordinat değerlerini bir uzamsal referans sisteminden diğerine çevirirken, yeniden projelendirdiğinizden eminim.

ArcPy'ye aşina değilim, ancak 9.3'te arcgisscripting yaparken, tüm özellik sınıfını yansıtmanız gerekir.

Bir projeksiyon / aktarım algoritmasının ne kadar karmaşık olduğuna bağlı olarak, temel python matematiğinde koordinatlar için her zaman kendi projeksiyonunuzu yuvarlayabilirsiniz. Bu, değer projeksiyonunu özellik düzeyinde koordine etmenize olanak tanır.

OGR python bağlarını kullanmaya açıksanız, 'arama imleci' gibi bir şey içinde özellik düzeyinde yansıtabilirsiniz.


Ne yazık ki kullandığım komut dosyası ile ESRI olmayan şeyler kullanamıyorum. ESRI bile OGR ve GDAL kullanıyor olsa bile (kimseye söyleme, değil mi?) ...
Kenton W

Aslında, daha iyi bir yol, bir şekilde doğrudan giriş koordinatlarında PROJ4'ün nasıl kullanılacağını bulmak olabilir.
Kenton K

@Kenton - Bu, kendi özel algoritmanızı da içeriyor mu (mevcut koda göre)? Eğer UTM -> WGS84 dönüştürmek gerekiyorsa, ben gönderebilir python bunu yapmak için kod var. Alternatif olarak, gerekli algoritmayı Proj4'ten ayıklayabilir ve bunun yerine kullanabilirsiniz. Veya ESRI kodunu kullanmakla gerçekten kısıtlıysanız (ve önerilen gibi tüm bir özellik sınıfını yansıtmak istemiyorsanız), ArcObjects kullanarak projeye basit bir C kütüphanesi yazın, sonra ctypes kullanarak Python'dan çağırın. Veya arcpy ile sopa ve tüm bir özellik sınıfını yansıtmak :(
Sasa Ivetic

@Kenton - Hızlı arama pyproj ( code.google.com/p/pyproj ) döndürür , buna Proj4 kütüphanesini aramak için python'un nasıl kullanılacağına dair bir örnek görebilirsiniz.
Sasa Ivetic

@Kenton - Veri dönüşümü olmayan bir UTM NAD83 => coğrafi WGS84 projeksiyonu ise, algoritmayı saf python'da uygulayabilmeniz gerekir. Denklemler Snyder kitabında: onlinepubs.er.usgs.gov/djvu/PP/PP_1395.pdf Kod istiyorsanız bunu yapan bir Oracle PL / SQL işlevim var. Bu işlevi Python'a taşımak için anlam taşıyordum, ancak genellikle sadece ogr / osr kullanın ...
DavidF

4

ArcPy 10.0'da bireysel geometrileri yansıtma yeteneği yoktur. Ancak, bir özellik kümesi (veya bir bellek içi özellik sınıfı) oluşturabilir ve bunu diskteki bir çalışma alanında veya başka bir yerde bir veritabanında tam gelişmiş bir özellik sınıfı yerine yansıtabilirsiniz.


kaçınmayı umduğum tam da bu. ArcObjects ile .Net'e girebileceğiniz güç için diliyorum ...
Kenton W

0

Bir özellik sınıfı oluşturmak istemememin ana nedeni arcpy.CreateFeatureclass_management yavaş olabileceğidir. Ayrıca bellek içi özellik sınıfları için az çok anlık olan arcpy.da.NumPyArrayTofeatureClass öğesini de kullanabilirsiniz:

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.