Мне нужно написать парсер, который сможет анализировать OSM-файлы, и мне было интересно, как оптимизировать его с точки зрения производительности и читаемости. У меня есть две версии одного и того же парсера. Один самодельный, а другой использует собственный XML-парсер Java. Может ли кто-нибудь мне помочь?
Заранее спасибо.
//HOMEMADE PARSER
public class Parser implements IParser {
private final String fileName;
private final List boundingBox = new ArrayList();
private final HashMap osmNodeMap = new HashMap();
private final HashMap osmWayMap = new HashMap();
private final HashMap osmRelationMap = new HashMap();
public Parser(String filename) {
this.fileName = filename;
}
@Override
public void parse() {
try {
InputStream is = Parser.class.getResourceAsStream("/data/" + fileName);
BufferedReader br = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8));
String line;
while ((line = br.readLine()) != null) {
//System.out.println(line);
line=line.trim();
if (line.startsWith(" {
long id = getAttrLong(r, "id");
double lat = getAttrDouble(r, "lat");
double lon = getAttrDouble(r, "lon");
osmNodeMap.put(id, new OsmNode(id, lat, lon));
}
case "way" -> {
currentWayId = getAttrLong(r, "id");
currentWayNodes = new ArrayList();
currentWayTags = new HashMap();
}
case "nd" -> {
if (currentWayId != null) {
long ref = getAttrLong(r, "ref");
OsmNode n = osmNodeMap.get(ref);
if (n != null) currentWayNodes.add(n);
}
}
case "relation" -> {
currentRelId = getAttrLong(r, "id");
OsmRelation currentRelation = osmRelationMap.get(currentRelId);
if (currentRelation == null) {
currentRelation = new OsmRelation(currentRelId, new ArrayList(), new HashMap());
osmRelationMap.put(currentRelId, currentRelation);
}
currentRelMembers = new ArrayList();
currentRelTags = new HashMap();
}
case "member" -> {
if (currentRelId != null) {
String type = getAttr(r, "type");
long refId = getAttrLong(r, "ref");
String role = getAttr(r, "role");
switch (type) {
case "node" -> {
OsmNode node = osmNodeMap.get(refId);
if (node != null) currentRelMembers.add(new Member(node, role));
}
case "way" -> {
OsmWay way = osmWayMap.get(refId);
if (way != null) currentRelMembers.add(new Member(way, role));
}
case "relation" -> {
OsmRelation refRel = osmRelationMap.get(refId);
if (refRel == null) {
refRel = new OsmRelation(refId, new ArrayList(), new HashMap());
osmRelationMap.put(refId, refRel);
}
currentRelMembers.add(new Member(refRel, role));
}
default -> {
}
}
}
}
case "tag" -> {
String k = getAttr(r, "k");
String v = getAttr(r, "v");
if (currentWayId != null) {
currentWayTags.put(k, v);
} else if (currentRelId != null) {
currentRelTags.put(k, v);
} else {
}
}
default -> {
}
}
}
if (event == XMLStreamConstants.END_ELEMENT) {
String name = r.getLocalName();
switch (name) {
case "way" -> {
if (currentWayId != null) {
OsmWay way = new OsmWay(currentWayId, currentWayNodes, currentWayTags);
osmWayMap.put(currentWayId, way);
currentWayId = null;
currentWayNodes = null;
currentWayTags = null;
}
}
case "relation" -> {
if (currentRelId != null) {
OsmRelation rel = osmRelationMap.get(currentRelId);
if (rel == null) {
rel = new OsmRelation(currentRelId, new ArrayList(), new HashMap());
osmRelationMap.put(currentRelId, rel);
}
rel.setMembers(currentRelMembers);
rel.setTags(currentRelTags);
currentRelId = null;
currentRelMembers = null;
currentRelTags = null;
}
}
default -> {
}
}
}
}
r.close();
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
private static void safeConfigure(XMLInputFactory factory) {
try {
factory.setProperty(XMLInputFactory.SUPPORT_DTD, false);
} catch (IllegalArgumentException ignored) {}
try {
factory.setProperty("javax.xml.stream.isSupportingExternalEntities", false);
} catch (IllegalArgumentException ignored) {}
}
private static String getAttr(XMLStreamReader r, String name) {
return r.getAttributeValue(null, name);
}
private static long getAttrLong(XMLStreamReader r, String name) {
String v = getAttr(r, name);
return (v == null) ? 0L : Long.parseLong(v);
}
private static double getAttrDouble(XMLStreamReader r, String name) {
String v = getAttr(r, name);
return (v == null) ? Double.NaN : Double.parseDouble(v);
}
@Override
public List getBoundingBox() {
return boundingBox;
}
@Override
public HashMap getOsmNodeMap() {
return osmNodeMap;
}
@Override
public HashMap getOsmWayMap() {
return osmWayMap;
}
@Override
public HashMap getOsmRelationMap() {
return osmRelationMap;
}
}
Подробнее здесь: https://stackoverflow.com/questions/799 ... ile-parser
Оптимизация парсера OSM-файлов ⇐ JAVA
Программисты JAVA общаются здесь
1772982188
Anonymous
Мне нужно написать парсер, который сможет анализировать OSM-файлы, и мне было интересно, как оптимизировать его с точки зрения производительности и читаемости. У меня есть две версии одного и того же парсера. Один самодельный, а другой использует собственный XML-парсер Java. Может ли кто-нибудь мне помочь?
Заранее спасибо.
//HOMEMADE PARSER
public class Parser implements IParser {
private final String fileName;
private final List boundingBox = new ArrayList();
private final HashMap osmNodeMap = new HashMap();
private final HashMap osmWayMap = new HashMap();
private final HashMap osmRelationMap = new HashMap();
public Parser(String filename) {
this.fileName = filename;
}
@Override
public void parse() {
try {
InputStream is = Parser.class.getResourceAsStream("/data/" + fileName);
BufferedReader br = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8));
String line;
while ((line = br.readLine()) != null) {
//System.out.println(line);
line=line.trim();
if (line.startsWith(" {
long id = getAttrLong(r, "id");
double lat = getAttrDouble(r, "lat");
double lon = getAttrDouble(r, "lon");
osmNodeMap.put(id, new OsmNode(id, lat, lon));
}
case "way" -> {
currentWayId = getAttrLong(r, "id");
currentWayNodes = new ArrayList();
currentWayTags = new HashMap();
}
case "nd" -> {
if (currentWayId != null) {
long ref = getAttrLong(r, "ref");
OsmNode n = osmNodeMap.get(ref);
if (n != null) currentWayNodes.add(n);
}
}
case "relation" -> {
currentRelId = getAttrLong(r, "id");
OsmRelation currentRelation = osmRelationMap.get(currentRelId);
if (currentRelation == null) {
currentRelation = new OsmRelation(currentRelId, new ArrayList(), new HashMap());
osmRelationMap.put(currentRelId, currentRelation);
}
currentRelMembers = new ArrayList();
currentRelTags = new HashMap();
}
case "member" -> {
if (currentRelId != null) {
String type = getAttr(r, "type");
long refId = getAttrLong(r, "ref");
String role = getAttr(r, "role");
switch (type) {
case "node" -> {
OsmNode node = osmNodeMap.get(refId);
if (node != null) currentRelMembers.add(new Member(node, role));
}
case "way" -> {
OsmWay way = osmWayMap.get(refId);
if (way != null) currentRelMembers.add(new Member(way, role));
}
case "relation" -> {
OsmRelation refRel = osmRelationMap.get(refId);
if (refRel == null) {
refRel = new OsmRelation(refId, new ArrayList(), new HashMap());
osmRelationMap.put(refId, refRel);
}
currentRelMembers.add(new Member(refRel, role));
}
default -> {
}
}
}
}
case "tag" -> {
String k = getAttr(r, "k");
String v = getAttr(r, "v");
if (currentWayId != null) {
currentWayTags.put(k, v);
} else if (currentRelId != null) {
currentRelTags.put(k, v);
} else {
}
}
default -> {
}
}
}
if (event == XMLStreamConstants.END_ELEMENT) {
String name = r.getLocalName();
switch (name) {
case "way" -> {
if (currentWayId != null) {
OsmWay way = new OsmWay(currentWayId, currentWayNodes, currentWayTags);
osmWayMap.put(currentWayId, way);
currentWayId = null;
currentWayNodes = null;
currentWayTags = null;
}
}
case "relation" -> {
if (currentRelId != null) {
OsmRelation rel = osmRelationMap.get(currentRelId);
if (rel == null) {
rel = new OsmRelation(currentRelId, new ArrayList(), new HashMap());
osmRelationMap.put(currentRelId, rel);
}
rel.setMembers(currentRelMembers);
rel.setTags(currentRelTags);
currentRelId = null;
currentRelMembers = null;
currentRelTags = null;
}
}
default -> {
}
}
}
}
r.close();
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
private static void safeConfigure(XMLInputFactory factory) {
try {
factory.setProperty(XMLInputFactory.SUPPORT_DTD, false);
} catch (IllegalArgumentException ignored) {}
try {
factory.setProperty("javax.xml.stream.isSupportingExternalEntities", false);
} catch (IllegalArgumentException ignored) {}
}
private static String getAttr(XMLStreamReader r, String name) {
return r.getAttributeValue(null, name);
}
private static long getAttrLong(XMLStreamReader r, String name) {
String v = getAttr(r, name);
return (v == null) ? 0L : Long.parseLong(v);
}
private static double getAttrDouble(XMLStreamReader r, String name) {
String v = getAttr(r, name);
return (v == null) ? Double.NaN : Double.parseDouble(v);
}
@Override
public List getBoundingBox() {
return boundingBox;
}
@Override
public HashMap getOsmNodeMap() {
return osmNodeMap;
}
@Override
public HashMap getOsmWayMap() {
return osmWayMap;
}
@Override
public HashMap getOsmRelationMap() {
return osmRelationMap;
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79903203/optimization-of-an-osm-file-parser[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия