Hi,
As part of my python script, I have a spatially enabled data frame with ~1000 points in OSGB (EPSG:27700) X,Y which i would like to convert to WGS84 lat, long. Is there a way, using the ArcGIS API for Python, to transform the OSGB XY coordinates to Lat/Long? Or to transform the SHAPE field of the SDF from OSGB to WGS84?
Thanks in advance!
@markjones6 is there any reason why you can't just use arcpy.
arcpy.management.Project(in_dataset, out_dataset)
to repoject from OSGB to WGS84?
Is it possible to use arcpy.management.Project whilst keeping all the data as a SDF? My input data only exists in a SDF and I'd like to keep the output as a SDF to perform some additional processing before exporting out to a feature class.
The following script projects an SDF into a WGS84 lat long SDF:
from arcgis import GIS
gis = GIS('AGOL or Portal url', 'username', 'password')
# let's say you create an SDF from a feature layer first
item = gis.content.search("title: featureLyr")[0]
flayer = item.layers[0]
fset = flayer.query()
# project using WGS84 epsg code in the feature set
sdf_WGS84 = flayer.query(out_sr=4326).sdf
sdf_WGS84.head()
Now if you check the SHAPE you should see the coordinates in lat and long format.
------------------------------------------------------------------------------------------------------------------------------------
Please give a like if you find it helpful. If it answered your question please accept as solution.
This is really interesting @MehdiPira1 , thank you!
Is it possible to do something similar where the SDF doesn't exist as a feature layer? Basically I would like to work with my data only in my notebook as i have a number of data analysis to do before I publish out a "final" dataset to a feature layer.
I was building on the work in this post - ArcGIS API for Python - geometry.project as below, but it would be great rather than transform the coordinates in this way, we could transform the SHAPE to lat/long without the need for an "existing" dataset or feature layer.
input_geoms = [{"x": -17568824.55, "y": 2428377.35}, {"x": -17568456.88, "y": 2428431.352}]
result = project(geometries=input_geoms, in_sr=3857, out_sr=4326)
result
Then the code snippet below is the way to follow:
from arcgis import geometry
# access the SHAPE field in your SDF and create a list
shape_list=[row.rings[0] for row in rows.SHAPE]
# do the projection on the list
for shape in shape_list:
result = geometry.project(geometries=shape, in_sr=3857, out_sr=4326)
print(result)
Bear in mind that this is based on the format below:
if you couldn't get it to work, I need to see a sample of your SDF to check the format.
Hi, sorry for taking a while to reply, but thank you for your advice, it led me to a solution that's worked for my purposes.
What I did was to create a dictionary from my x,y columns and use the following to transform from OSGB to WGS84:
gis = GIS()
wgs84_coords_dict = project(geometries = osgb_coords_dict, in_sr=27700, out_sr=4326, transformation=1314)
This creates a new coordinate dictionary - wgs84_coords_dict, which can then by merged with the remainder of the dataframe.