[Python] Converting between projections using pyproj in Pandas dataframe

Discussão em 'Python' iniciado por Stack, Julho 22, 2025.

  1. Stack

    Stack Membro Participativo

    This is undoubtedly a bit of a "can't see the wood for the trees" moment. I've been staring at this code for an hour and can't see what I've done wrong. I know it's staring me in the face but I just can't see it!

    I'm trying to convert between two geographical co-ordinate systems using Python.

    I have longitude (x-axis) and latitude (y-axis) values and want to convert to OSGB 1936. For a single point, I can do the following:

    import numpy as np
    import pandas as pd
    import shapefile
    import pyproj

    inProj = pyproj.Proj(init='epsg:4326')
    outProj = pyproj.Proj(init='epsg:27700')

    x1,y1 = (-2.772048, 53.364265)

    x2,y2 = pyproj.transform(inProj,outProj,x1,y1)

    print(x1,y1)
    print(x2,y2)


    This produces the following:

    -2.772048 53.364265
    348721.01039783185 385543.95241055806


    Which seems reasonable and suggests that longitude of -2.772048 is converted to a co-ordinate of 348721.0103978.

    In fact, I want to do this in a Pandas dataframe. The dataframe contains columns containing longitude and latitude and I want to add two additional columns that contain the converted co-ordinates (called newLong and newLat).

    An exemplar dataframe might be:

    latitude longitude
    0 53.364265 -2.772048
    1 53.632481 -2.816242
    2 53.644596 -2.970592


    And the code I've written is:

    import numpy as np
    import pandas as pd
    import shapefile
    import pyproj

    inProj = pyproj.Proj(init='epsg:4326')
    outProj = pyproj.Proj(init='epsg:27700')

    df = pd.DataFrame({'longitude':[-2.772048,-2.816242,-2.970592],'latitude':[53.364265,53.632481,53.644596]})

    def convertCoords(row):
    x2,y2 = pyproj.transform(inProj,outProj,row['longitude'],row['latitude'])
    return pd.Series({'newLong':x2,'newLat':y2})

    df[['newLong','newLat']] = df.apply(convertCoords,axis=1)

    print(df)


    Which produces:

    latitude longitude newLong newLat
    0 53.364265 -2.772048 385543.952411 348721.010398
    1 53.632481 -2.816242 415416.003113 346121.990302
    2 53.644596 -2.970592 416892.024217 335933.971216


    But now it seems that the newLong and newLat values have been mixed up (compared with the results of the single point conversion shown above).

    Where have I got my wires crossed to produce this result? (I apologise if it's completely obvious!)

    Continue reading...

Compartilhe esta Página