# How to read a csv file and use the values as x and y points in blender?

How can i use the value in column 'lon' and 'lat' as the position of my uv_sphere? For example,read the values from line 4, (116.4559081, 39.9139083), and make these 2 numbers as my uv_sphere x and y position in blender? and gives different colors for different mode, for example i have 4 modes in the csv , i want to make the uv sphere that represents the bus mode to be red, and subway to be green , rail to be blue and tram to be yellow., and use the row ['from'] and ['to'] to connect the nodes with a cylinder with x scale 0.5 , y scale 0.5 and the z scale with the value in ['length'] value.

• Are the x and y positions going to be vertices or objects? – Ray Mairlot Jan 16 '17 at 12:08
• @RayMairlot, hi...thank you for responding , i want to make a uv sphere at with those numbers . – JeffFederick Jan 16 '17 at 12:34
• Also look into: github.com/domlysz/BlenderGIS and github.com/vvoovv/blender-osm You may find way to do a correct mapping of lat long to x y, otherwise it may appear stretched vertically or horizontally... and one or both of those links may let you link concordances to an actual map. Also you might find QGIS to be a better tool for what you're trying to do. – James Thomas Jan 16 '17 at 14:19
• I have just seen that this is the second time you have asked this question (blender.stackexchange.com/questions/71458/…). You shouldn't have asked the same question again. If you needed to update the original question then you should have 'edited' it. – Ray Mairlot Jan 16 '17 at 14:45
• @RayMairlot hi sir, can you help? – JeffFederick Feb 22 '17 at 12:20

You can use the csv library to read and parse CSVs. If you have a basic bus object on a different layer (or a sphere called bus), this script will duplicate it and then assign the longitude and latitude values from your CSV as the new object's x and y values, for each row in your CSV.

import bpy, csv

fp = "C:/csvs/buses.csv"

with open( fp ) as csvfile:
for i, row in enumerate( rdr ):
if i == 0: continue # Skip column titles
lon, lat = row[3:5]

# Generate UV sphere at x = lon and y = lat (and z = 0 )
bpy.ops.mesh.primitive_uv_sphere_add( location = ( float(lon), float(lat), 0 ) )


I used this CSV to test this code:

mode,country/city,ID,lon,lat
bus,CN/Beijing,bus81254,65.98592786,51.75899959
bus,CN/Beijing,bus73859,92.83295925,87.98592343
bus,CN/Beijing,bus52924,88.43513405,88.79596166
bus,CN/Beijing,bus52141,92.68713387,15.49215037
bus,CN/Beijing,bus8170,36.0964094,42.77106261
bus,CN/Beijing,bus46545,84.46655319,43.23791824
bus,CN/Beijing,bus60033,66.14547792,61.71886078
bus,CN/Beijing,bus63664,35.46744528,4.412149752
bus,CN/Beijing,bus62759,89.04704861,93.61280167
bus,CN/Beijing,bus72522,25.00040058,9.672330218
bus,CN/Beijing,bus55786,96.79310251,73.2168682
bus,CN/Beijing,bus55381,44.75153181,23.6187773
bus,CN/Beijing,bus21913,39.26107112,98.37814343
bus,CN/Beijing,bus2981,35.8751682,23.26682901
bus,CN/Beijing,bus52068,56.09661959,97.26439994
bus,CN/Beijing,bus59329,54.47486082,87.98768438
bus,CN/Beijing,bus40450,6.994144595,29.2284396
bus,CN/Beijing,bus51603,95.90526567,26.46823662

• hey thank you for responding :D, that looks awesome, but somehow when i try to copy your code, i have an error on line 7. the one that " for i, row in enumerate( rdr ): ", how should i change it to make it work? please help. and i want to make a uv_sphere with it – JeffFederick Jan 16 '17 at 12:36
• Can you specify the error you're getting from the console? – TLousky Jan 16 '17 at 12:38
• it just says " Python script fail, look in the console now . . . " import bpy, csv with open('C:\\Users\\Jeff\\Desktop\\Thesis\\nodes.csv') as csvfile: rdr = csv.reader( csvfile ) for i, row in enumerate( rdr ): if i == 0: continue # Skip column titles mode, ctry, id, lon, lat = row[:] # Duplicate basic bus object o = bpy.data.objects["uv_sphere"].copy() o.layers = [ i == 0 for i in range(20) ] bpy.context.scene.objects.link( o ) o.location.x = float( lon ) o.location.y = float( lat ) – JeffFederick Jan 16 '17 at 12:40
• You can open a console window through the Window menu --> Toggle System Console. The console output should be more explicit. – TLousky Jan 16 '17 at 12:41
• @JeffFederick Is there a column "F" in your data. The code is only trying to unpack 5 vars, if there are more or less you need to adjust accordingly. – batFINGER Jan 16 '17 at 15:35

If you have your data in a .txt file in Rows of points like x1,y1,z1 but also want to align the Object to an end point or a specific rotation you could try this approach. Here x1,y1,z1 is the start point of a cylinder, then x2,y2,z2 is the end point of the cylinder and the last value is the Diameter of that cylinder.

The code is for Blender 2.80:

import bpy
import csv
from mathutils import Vector

with open('inputfile.txt', newline='') as inputfile:

for numberCylinders in range(0,len(results)):
myCylinderData=[0,0,0, 0,0,0, 0]
for i in range(1,7):
myCylinderData[i]=float(results[numberCylinders][i])

myStartLoc = Vector((myCylinderData[0],myCylinderData[1],myCylinderData[2]))
myEndLoc = Vector((myCylinderData[3],myCylinderData[4],myCylinderData[5]))
myLengthVec = (myEndLoc - myStartLoc)
myLength = myLengthVec.length
myDiameter = myCylinderData[6]

upVector = Vector((0,0,1))
myRotQuaternion=upVector.rotation_difference(myEndLoc)
myRotEulerAngles=myRotQuaternion.to_euler()
myRotEulerAnglesVec=((myRotEulerAngles.x,myRotEulerAngles.y,myRotEulerAngles.z))