[Bf-python] a geoToUTM() function in a bpy module ?

Campbell Barton ideasman42 at gmail.com
Mon Sep 10 03:45:22 CEST 2012


IMHO its fine having only one or two functions in a module, we have to
start somewhere.

eg.
http://www.blender.org/documentation/blender_python_api_2_63_release/bpy_extras.image_utils.html

So if you can validate both functions work correctly, please provide a
patch and Ill review it.

On Mon, Sep 10, 2012 at 11:26 AM, jerome <jerome.le.chat at free.fr> wrote:
> oh I meant no time for the proposal process, if you agree for sure I can push a geospatial_utils.py module with geo_to_utm() in it.
>
> such module would need a real mathematician to improve and to address common geospatial needs, if its only me it will turn into a 2 functions module I won't be able to explain exactly ;)
>
> Jerome
>
> Le 10/09/2012 02:14, Campbell Barton a écrit :
>> Hi jerome, such functionality is indeed handy, but think it belongs in
>> its own module,
>> perhaps "bpy_extras.geospatial_utils"
>>
>> ./release/scripts/modules/bpy_extras/geospatial_utils.py
>>
>> Also, wouldn't it make sense to have a function to do the reverse conversion?,
>> geo_to_utm() / utm_to_geo()
>>
>> If you don't have time to do this, its fine, but could add in a
>> comment that its a  TODO.
>>
>> On Mon, Sep 10, 2012 at 7:16 AM, jerome <jerome.le.chat at free.fr> wrote:
>>> Hello,
>>>
>>> I'm currently programming things about city generation for a BGE project
>>> I have.
>>> open street map is a really valuable input for such need, as you know I
>>> suppose,
>>> since you can retrieve a lot about city geometry worldwide, and generate
>>> from it in Blender.
>>>
>>> in a recent commit I updated a bit the osm importer to add a better
>>> projection from lat/lon to blender units.
>>>
>>> I think this function, or an equivalent one, should be part of the bpy,
>>> maybe in mathutils.geometry, or a more suitable location as you wish :
>>>
>>> it's really a multi usage function.
>>> this could help to bridge with the osm community,
>>> and with architects too.. for now the ones I know are a bit reluctant to
>>> Blender but I'm hardly working on it, BGE helps a lot actually.
>>>
>>> the tests I'm doing with lxml xml parser are very conclusive to read
>>> write huge osm or extended osm quickly.
>>> by extended I mean extra tags about height, uvs,utm coords. a kind of
>>> .bosm format I'm writing.
>>>
>>> anyway here's the proposed function, consider it copyleft.
>>> sorry if my proposal does not respect blender guidelines, but I really
>>> have no time left :s
>>>
>>> regards,
>>>
>>> Jerome / littleneo
>>>
>>>
>>> (from math import radians, sin, cos, tan, sqrt)
>>>
>>> # given lat and longitude in degrees, returns x and y in UTM (1 KM = 1
>>> BU ) .
>>> # accuracy : supposed to be centimeter. community feedback needed.
>>> # looks ok so far
>>> # http://fr.wikipedia.org/wiki/Projection_UTM
>>> # http://fr.wikipedia.org/wiki/WGS_84
>>> # http://earth-info.nga.mil/GandG/publications/tr8350.2/wgs84fin.pdf
>>> #
>>> http://geodesie.ign.fr/contenu/fichiers/documentation/algorithmes/alg0071.pdf
>>> # wiki is your friend (don't ask me about math Im just a writing monkey.)
>>> # jerome.le.chat at free.fr
>>> def geoToUTM(lon, lat) :
>>>
>>>       # if abs(lat) > 80 : lat = 80 #wrong coords.
>>>
>>>       # UTM zone, longitude origin, then lat lon in radians
>>>       z = int( (lon + 180)  / 6 ) + 1
>>>       lon0 = radians(6*z - 183)
>>>       lat = radians(lat)
>>>       lon = radians(lon)
>>>
>>>       # CONSTANTS (see refs.)
>>>       # rayon de la terre à l'équateur
>>>       a = 6378.137
>>>       K0 = 0.9996
>>>       # flattening consts
>>>       f  = 0.0033528106647474805  # 1 / 298.257223563
>>>       e2 = 0.0066943799901413165  # 2*f - f**2
>>>       e4 = 4.481472345240445e-05  # e2**2
>>>       e6 = 3.0000678794349315e-07 # e2**3
>>>
>>>       # lat0. 10000 for South, 0 for North
>>>       N0 = 10000 if lat < 0 else 0
>>>
>>>       A = (lon - lon0) * cos(lat)
>>>       C = (e2 / (1 - e2)) * cos(lat)**2
>>>       T = tan(lat)**2
>>>       vlat = 1 / sqrt( 1 - e2 * sin(lat)**2 )
>>>       slat = (1-(e2/4)-((3*e4)/64)-((5*e6)/256))*lat -
>>> (((3*e2)/8)+((3*e4)/32)+((45*e6)/1024))*sin(lat*2) + (((15*e4)/256) +
>>> ((45*e6)/1024) )*sin(lat*4) - ((35*e6)/3072)*sin(lat*6)
>>>       E = 500 + (K0 * a * vlat) * (A + (1-T+C)*((A**3)/6) + (5 - 18 * T +
>>> T**2) * ((A**5)/120) )
>>>       N = N0 + (K0 * a) * ( slat+vlat*tan(lat)* (A**2/2 +
>>> (5-T+9*C+4*C**2) * (A**4/24) + (61-58*T+T**2) * A**6/720) )
>>>       return E,N
>>> _______________________________________________
>>> Bf-python mailing list
>>> Bf-python at blender.org
>>> http://lists.blender.org/mailman/listinfo/bf-python
>>
>>
>
> _______________________________________________
> Bf-python mailing list
> Bf-python at blender.org
> http://lists.blender.org/mailman/listinfo/bf-python



-- 
- Campbell



More information about the Bf-python mailing list