自由离线地图提供商(非OpenStreetMap)

3
我正在制作一款使用Android操作系统的低价导航设备,我需要一个地图提供商(例如OpenStreetMap),可以离线使用,包含可搜索街道名称(不仅是渲染图像),并且可以用于商业用途,免费或价格低廉。我尝试了本地Google的地图视图控件,但它只能在线使用。OpenStreetMap的问题在于它没有为埃及大多数城市提供详细地图。

2
你既想要“免费”,又希望用于商业用途,也就是说,有人应该投入资金来开发一些你可以免费获得并出售给人们的东西?除了像OpenStreetMaps这样的开源项目,你不会找到其他任何东西。而且你总是可以为埃及街道地图做出贡献——那就是该项目的目的。 - Traveling Tech Guy
他还希望所有这些都可以离线工作,尤其是在安卓上?祝你好运啊。你最好创建一个安卓应用程序来存储OpenStreetMaps图像,并在毕业项目中离线使用它。 - Shawn Mclean
2
@旅行科技人:Android是免费的..虽然我可以卖使用Android的设备,但无论如何..我说的是免费或低价..因为我的项目侧重于低成本。 - tabdulradi
1
@Shawn Mclean 我已经知道一些免费的程序可以下载OSM以供离线使用,例如contentDroid...但是OSM本身在埃及很差。 - tabdulradi
2个回答

3
您希望使用类似MapDroyd的东西,可以考虑与他们讨论使用他们的代码。或者从这里http://code.google.com/p/osmdroid/获取OpenStreetMap小部件并添加缓存区域的方法。对于街道名称索引,您可以下载world.osm(或只是其中的一部分以节省时间),然后通过像这样的Python脚本运行它:(请注意,这需要一些工作:它无法处理重复的街道名称,因此您需要进行一些修改。它还会找到酒吧和ATM。)
#!/usr/bin/python

from xml.dom import pulldom

doc = pulldom.parse("england.osm")
#outFile = open("england.txt", "w")

nodes = {}
ways = {}
pubs = []
atms = []

i = 0
for event, node in doc:
    if event == pulldom.START_ELEMENT:
        if node.localName == "node":
            doc.expandNode(node)

            nodeID = node.getAttribute("id")
            nodeLat = node.getAttribute("lat")
            nodeLon = node.getAttribute("lon")

            amenity = "";
            for tag in node.getElementsByTagName("tag"):
                if tag.getAttribute("k") == "amenity":
                    amenity = tag.getAttribute("v")

            nodes[int(nodeID)] = ( float(nodeLat), float(nodeLon) )

            if amenity == "pub":
                pubs.append(int(nodeID))
            elif amenity == "atm" or amenity == "bank":
                atms.append(int(nodeID))

        elif node.localName == "way":
            doc.expandNode(node)

            name = "";
            for tag in node.getElementsByTagName("tag"):
                if tag.getAttribute("k") == "name":
                    name = tag.getAttribute("v")
            if name == "":
                continue;

            wayName = name.encode("latin-1", "replace")
            refList = [nd.getAttribute("ref") for nd in node.getElementsByTagName("nd")]

            if ways.has_key(wayName):
                ways[wayName].append([int(x) for x in refList])
            else:
                ways[wayName] = [int(x) for x in refList]

        i = i + 1
        if i % 100 == 0:
            print(i / 100)

print(nodes)
print(ways)
print(pubs)
print(atms)

#outFile.close()

MapDroyd使用来自OSM的地图,而OSM本身在大多数埃及城市中并没有提供详细的地图。问题是关于除OSM之外的提供者,即使它没有Android API,我也可以尽一切努力使其在Android上运行。 - tabdulradi
听起来更像是一个商业问题而不是编程问题。你可能想尝试在地图论坛上提问,而不是在stackoverflow上提问。我真的怀疑除了OSM之外,是否会有任何免费的地图提供者。 - Timmmm

2

2
Mobile Atlas Creator使用OpenStreetMap和Google地图数据。它违反了许可证和使用条款。请不要使用此应用程序! - guerda

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接